Gyakorlat2

A MathWikiből
(Változatok közti eltérés)
(2. User)
 
(2 szerkesztő 10 közbeeső változata nincs mutatva)
1. sor: 1. sor:
== Bevezetés ==
+
=== Feladatok tagolása ===
  
* Ami mindenképpen kelleni fog a python file-od elejére:
+
Már több osztállyal dolgozunk akár egy feladaton belül is. Így egy új tagolást javasolok.
import re
+
  
* A függvények amiket használni fogunk a keresésre / átírásra:
+
* Eclipse-ben a már létezõ vagy új projectet nyissátok le, és az '''src''' mappára jobb klikk '''New''' -> '''Package'''
re.search("pattern", "string")
+
* Nevezzétek el és kész is
re.match("pattern", "string")
+
* Minden összetartozó osztályt egy ilyen package-be rakjatok
re.findall("pattern", "string")
+
* Amikor egy osztály egy '''Gyak2''' package-ben van azt jelezni kell a fájl elején a következõ módon:
re.sub("pattern", "replace", "string")
+
<java>
 +
package Gyak2;
 +
</java>
 +
* Package-eket lehet egymásba is ágyazni, késõbb a komolyabb dolgokat majd külön projectben sok package-ben fogjuk tárolni
  
* Ezek egy match objektumot adnak vissza, feltéve hogy a match változóba mentjük, akkor a kövektezõ metódusok használhatók rajta:
+
== Bemelegítõ feladatok ==
match = re.search("i.a", "cica cila")
+
match.group()
+
match.group(0)
+
match.string
+
  
* Ez egy hasznos függvény lehet a próbálgatáshoz:
+
Figyeljetek oda, hogy minden osztálynak a saját nevével megyegyezõ nevû fájlban kell lennie. Pl a '''Complex''' osztálynak a '''Complex.java''' fájlban kell lennie.
def show_match(string, pattern):
+
 
match = re.search(pattern, string)
+
Egészítsétek ki a feladatokat a '''//TODO''' részeknél. Ez van ahol csak egy parancs, máshol több sor is lehet akár.
if match:
+
 
return string[:match.start()] + "<<" + string[match.start():match.end()] + ">>" + string[match.end():]
+
=== 1. Complex kiegészítés ===
else:
+
 
return "no match"
+
<java>
* További emlékeztetés a következõ file-ban: [http://math.bme.hu/~kkovacs/webprog/regexp.txt regexp.txt] vagy az elsõ elõadáson: [http://math.bme.hu/~kkovacs/webprog/WebprogEA1.pdf Elõadás1]
+
public class Complex {
 +
    private float realPart_;
 +
    private float imaginaryPart_;
 +
 
 +
    public Complex() {
 +
        realPart_ = 0;
 +
        imaginaryPart_ = 0;
 +
    }
 +
 
 +
    public Complex(float realPart) {
 +
        realPart_ = //TODO
 +
        imaginaryPart_ = //TODO
 +
    }
 +
 
 +
    public Complex(float realPart, float imaginaryPart) {
 +
        //TODO
 +
    }
 +
 
 +
    public Complex add(Complex other) {
 +
        float realPart = this.realPart_ + other.realPart_;
 +
        float imaginaryPart = this.imaginaryPart_ + other.imaginaryPart_;
 +
        Complex retval = //TODO
 +
        return retval;
 +
    }
 +
   
 +
    public Complex multiply(Complex other) {
 +
    //TODO
 +
    }
 +
}
 +
</java>
 +
 
 +
=== 2. User ===
 +
 
 +
Egészítsétek ki, ahogy értelmes. Érdekesség (és fontos) ez a kettõ nem ekvivalens:
 +
 
 +
<java>
 +
password_ == enteredPassword
 +
</java>
 +
 
 +
<java>
 +
password_.equals(enteredPassword)
 +
</java>
 +
 
 +
A második azt csinálja, amit az elsõre gondolna az ember. Összehasonlítja a 2 Stringet, ha megegyeznek '''true'''-t, ha különböznek '''false'''-t ad vissza.
 +
 
 +
Viszont az elsõ nem ezt csinálja. Hanem azt vizsgálja meg, hogy ugyanazon a memóriacímen vannak-e tárolva, azaz, hogy tényleg megegyeznek-e, nem csak tartalomban. Ez azért van amit már említettem, hogy itt kb minden pointer (referencia) csak rejtetten. Errõl lesz szó következõ elõadáson.
 +
 
 +
A '''passwordCheck''' metódus (függvény) kap egy jelszót, ez az amit beírt a felhasználó. Ezt hasonlítsa össze, a már tárolt jelszóval. Ha megegyezik a kettõ, akkor igazat ('''true''') különben hamisat ('''false''') adjon vissza.
 +
 
 +
A '''setNickName''' állítsa át a '''nickName_''' adattagot a kapott paraméterre '''newNickName'''-re.
 +
 
 +
<java>
 +
public class User {
 +
private String realName_;
 +
private String nickName_;
 +
private String password_;
 +
 +
public User(String realName, String nickName, String password) {
 +
realName_ = realName;
 +
nickName_ = nickName;
 +
password_ = password;
 +
}
 +
 +
public boolean passwordCheck(String enteredPassword) {
 +
if (password_.equals(enteredPassword)) {
 +
//TODO
 +
}
 +
                //TODO
 +
}
 +
 +
public void setNickName(String newNickName) {
 +
//TODO
 +
}
 +
}
 +
</java>
  
 
== Feladatok ==
 
== Feladatok ==
  
=== Pár sorosak ===
+
Érdemes minden osztályhoz gyártani egy '''main'''t, hogy kipróbáljátok jól mûködik-e. Ha lesz rá idõnk tanulunk teszt rendszert is, de nem biztos, hogy eljutunk odáig. Ezt lehet az adott osztályba írni, nem kell mindig külön '''Main''' osztályt gyártani miatta. Itt egy példa a '''Complex'''re:
 +
 
 +
<java>
 +
    public static void main(String[] args) {
 +
        Complex comp1 = new Complex(5, 6);
 +
        Complex comp2 = new Complex(4);
 +
        Complex comp3 = comp1.add(comp2);
 +
        System.out.println(comp3);
 +
    }
 +
</java>
 +
 
 +
Azt nem ellenõrzi, hogy jól számolt-e, ezt ugye már nehezebb, mivel privátak az adattagjai, de írhatnánk egy kiirató függvényt, akkor már könnyû lenne.
  
Ezeknél a feladatoknál többnyire elég a show_match függvényt használni, de nem kötelezõ. A példa bemenetek soronként értendõk, nem mint egy nagy bemenet. Mindig az elsõ találatot kell csak megtalálni a sorban.
+
Továbbá mindig emlékezzetek arra, hogy a cél, hogy minél kisebb egységekre szedjük szét a dolgokat. Így ha pl egy függvény mûködéséhez kell abszolút érték függvény, írd meg külön és használd, ne az adott függvénybe írd bele az abszolút érték megvalósítását.
  
* Írj reguláris kifejezést, ami illeszkedik a "kutya" szóra.
+
=== 3. ComplexVector szorzás ===
Volt egyszer egy kiskutya, elment a vasarba.
+
  
* Írj reguláris kifejezést, ami illeszkedik bármilyen egybefüggõ számsorozatra (pl: 540548394).
+
Írjátok meg a '''ComplexVector''' skaláris szorzatát. Ne felejtsétek el, hogy használhatjátok a '''Complex''' osztály '''multiply''' függvényét.
A meleg evszakban, amikor 5456 az idojaras-szabalyzo szatellitaknak
+
a nagy tengereken 545534tombolo szelekkel kellett megharcolnia, az este
+
gyakran hozott esot 54343 a Sareer peremen.
+
  
* Írj egy reguláris kifejezést, ami illeszkedik bármilyen számra, legyen az egész, tizedestört, vagy két szám hányadosaként felírt racionális!
+
<java>
A bosi zsilip 22547645 hibaja miatt akadozik a budapesti hajokozlekedes
+
public class ComplexVector {
546.433 eve nem oltek amerikai nagykovetet
+
    private Complex[] coords_;
Atadjuk a 65/87 nuklearis tudasunkat Vietnamnak
+
    private int dimension_;
Monda Lajos 65 a nagy 546.34 kiraly
+
  
* Írj reguláris kifejezést ami illeszkedik telefonszámokra, amik a következõ formátumban vannak: 06##-###-####
+
    public ComplexVector(int dimension) {
Egy Liga nem-hajo semleges teruleten voltak, ami mellett 0623-434-5432 Bene Gesserit- es Tleilax-monitorhajok gyulekeztek, mint ragadozo madarak a zsakmany korul.
+
        dimension_ = dimension;
A Liga 0532-323-4344 meghunyaszkodva igyekezett 06-23-545-5432 megbekiteni a Bene Gesseritet.
+
        coords_ = new Complex[dimension];
A kis ovalis 06sa-344-7654 terem, ahol 0643-43-65443 talalkoztak, szokasosan rezfalu es "kembiztos" volt.
+
    }
  
* Írj reguláris kifejezést, ami e-mail címekre illeszkedik. Azt nem kell ellenõriznie, hogy valós cím lehet-e, viszont azt ellenõrizzük, hogy a karakterek érvényesek legyenek, azaz vagy betû vagy szám, és az utolsó részben (ahol a .hu, meg .com stb van) ne lehessen szám.
+
    public ComplexVector(ComplexVector other) {
Ez legalabb@visszajelzes.volt.  
+
        this.coords_ = other.coords_.clone();
Scytale megfelelokepp@valaszolt.86, de@feszulten.figyelt kozben.
+
        this.dimension_ = other.dimension_;
Nem tetszett.neki a@helyzet. @A.e haz@egy.zsakutca vegeben allt.
+
    }
  
* Írj python scriptet, ami egy sorban kicseréli az összes elõfordulását a 42-nek vagy betûvel írt "negyvenketto"-nek vagy "negyvenket"-nek, 23-ra. Arra vigyázzunk, hogy a negyvenketto es negyvenket bárhogy állhat nagy- és kisbetûkbõl.
+
    public ComplexVector add(ComplexVector other) {
vOlt eGySzeR 42 kiskUTYa, eLMENTeK negYvenKEt vasArBA. oTt TaLaLKOZtAk 43 FARkasSAl, akIKnek Volt NEGyVeNKet HAzikOJUK, es NEgYVenkeTtO kiSkuTYAJUK.
+
        ComplexVector retval = new ComplexVector(this.dimension_);
 +
        for (int i = 0; i < retval.coords_.length; i++) {
 +
            retval.coords_[i] = this.coords_[i].add(other.coords_[i]);
 +
        }
 +
        return retval;
 +
    }
 +
}
 +
</java>
  
Bónusz:
+
=== 4. Kiírás ===
* Az elõzõ feladat példa bemenetét alakítsuk normális szöveggé, azaz mindenhol kisbetûvel legyenek a szavak, kivéve a mondatok elején (mondat eleje a sor elején van és a .-ok után). Használhatjátok az str.lower() függvényt, ami visszaadja a beadott stringet mindenhol kisbetûvel, majd ezután kellene megoldani, hogy a mondatok eleje nagybetûs legyen.
+
  
 +
Írjatok kiíró függvényt '''print''' néven a '''Complex''' és '''ComplexVector''' osztályokhoz. Nézzen ki valahogy olvashatóan. Majd ezekkel már jól tudtok tesztelni a '''main'''ekben.
  
 +
=== 4.5. Szerkezet változtatás ===
  
 +
Írjátok át a '''Complex''' osztályt, hogy ne két '''float'''ban tárolja az adatokat, hanem egy 2 elemû '''float''' tömbben. Majd értelemszerûen a konstruktorokat és függvényeket is írjátok át. Ha ez kész örüljetek, hogy a '''ComplexVector''' még mindig teljesen jól mûködik. Pedig valójában már õ is megváltozott ezzel.
  
=== Hosszabbak ===
+
=== 5. Felhasználó rendszer ===
  
* Írj python scriptet ami megszámolja hányszor szerepel az "a" és "az" névelõ a szövegben:
+
Írjatok egy osztályt (ti találjátok ki a nevét, de legyen beszédes és célratörõ, általában a programozásban ez a legnehezebb feladat) ami a korábban megírt '''User''' objektumokból tud sokat tárolni (tömb). Továbbá valamilyen módon tárol még kommenteket is. Egy komment az üzenetbõl és a készítõjébõl áll, aki egy '''User'''. Találjátok ki, hogyan tárolnátok a kommenteket, érdemes új osztályt bevezetni rá. A rendszernek magának legyen 2 függvénye, egyik amivel új '''User'''t lehet felvenni és egy amivel új kommentet lehet írni.
A hamisitas elleni kuzdelmet segitheti amerikai kutatok fejlesztese, amelyben nanoreszecskek
+
es fluoreszcens tinta felhasznalasaval allitottak elo szabad szemmel nem lathato vonalkodokat.
+
A QR-kodok fekete es feher blokkjai egyre inkabb elterjednek a kereskedelemben, mert szazszor
+
tobb informaciot hordoznak a hagyomanyos vonalkodokhoz kepest. A nyomtatott formaban megjeleno
+
hirdetesekben elhelyezett QR-kodokat okostelefonokkal lehet leolvasni es kozvetlenul a hirdeto
+
ceg honlapjara iranyitjak az erdeklodot. Kesobb kidolgoztak, hogy csak lezerfenyben legyen
+
lathato a QR-kod nyomtatasahoz alkalmazott tinta, igy a bankjegyhamisitas es mas termekek
+
hamisitasa elleni kuzdelemben is bevetheto a modszer.
+
A Del-Dakotai Egyetem es a Del-Dakotai Banyaszati es Muszaki Egyetem kutatoi az altaluk
+
kifejlesztett lathatatlan QR-kodhoz fluoreszcens tintaba kevert nanometeres meretu (a nanometer
+
a millimeter milliomod resze) reszecskeket hasznaltak. Az igy keszult kod csak akkor latszik, ha
+
infravoroshoz kozeli hullamhosszu lezerrel vilagitjak meg a feluletet. Az adott hullamhosszon a
+
nanoreszecskek kepesek elnyelni, abszorbealni a fotonokat, majd rovidebb, lathato hullamhosszon
+
kibocsatjak oket.
+
A kod, amikor megvilagitjak a lezerrel, mobiltelefonnal leolvashato es nagyobb biztonsagot nyujt
+
a korabbi eljarasnal, mert egeszen apro, csak mikroszkop alatt lathato reszleteket lehet
+
elrejteni benne az uj technika segitsegevel. Tovabbi elonye, hogy a lathatatlan kod meg akkor is
+
leolvashato, ha a hordozo papirt sokszor osszegyurtek. Raadasul papiron kivul mas anyagra is
+
nyomtathato, peldaul uvegre vagy muanyag filmre, ezert szamos kulonbozo teruleten hasznalhatjak
+
a hamisitas elleni vedekezesre. Az uj technologiat a Nanotechnology cimu szakfolyoiratban
+
ismertette Jeevan Meruga kutatasvezeto es csoportja.
+
  
* Írj python scriptet, ami kiírja az összes mondatot amiben szerepel a nano szó (bárhogy lehet nagy- és kisbetûkkel). A mondatok sor elejétõl .-ig, vagy .-tól .-ig terjednek.
 
A hamisitas elleni kuzdelmet segitheti amerikai kutatok fejlesztese, amelyben nanoreszecskek es fluoreszcens tinta felhasznalasaval allitottak elo szabad szemmel nem lathato vonalkodokat.
 
A QR-kodok fekete es feher blokkjai egyre inkabb elterjednek a kereskedelemben, mert szazszor tobb informaciot hordoznak a hagyomanyos vonalkodokhoz kepest. A nyomtatott formaban megjeleno hirdetesekben elhelyezett QR-kodokat okostelefonokkal lehet leolvasni es kozvetlenul a hirdeto ceg honlapjara iranyitjak az erdeklodot. Kesobb kidolgoztak, hogy csak lezerfenyben legyen lathato a QR-kod nyomtatasahoz alkalmazott tinta, igy a bankjegyhamisitas es mas termekek hamisitasa elleni kuzdelemben is bevetheto a modszer.
 
A Del-Dakotai Egyetem es a Del-Dakotai Banyaszati es Muszaki Egyetem kutatoi az altaluk kifejlesztett lathatatlan QR-kodhoz fluoreszcens tintaba kevert nanometeres meretu (a nanometer a millimeter milliomod resze) reszecskeket hasznaltak. Az igy keszult kod csak akkor latszik, ha infravoroshoz kozeli hullamhosszu lezerrel vilagitjak meg a feluletet. Az adott hullamhosszon a nanoreszecskek kepesek elnyelni, abszorbealni a fotonokat, majd rovidebb, lathato hullamhosszon kibocsatjak oket.
 
A kod, amikor megvilagitjak a lezerrel, mobiltelefonnal leolvashato es nagyobb biztonsagot nyujt a korabbi eljarasnal, mert egeszen apro, csak mikroszkop alatt lathato reszleteket lehet elrejteni benne az uj technika segitsegevel. Tovabbi elonye, hogy a lathatatlan kod meg akkor is leolvashato, ha a hordozo papirt sokszor osszegyurtek. Raadasul papiron kivul mas anyagra is nyomtathato, peldaul uvegre vagy muanyag filmre, ezert szamos kulonbozo teruleten hasznalhatjak a hamisitas elleni vedekezesre. Az uj technologiat a Nanotechnology cimu szakfolyoiratban ismertette Jeevan Meruga kutatasvezeto es csoportja.
 
  
* Írd át az elõzõ scriptet függvénnyé (ha még nem az), úgy hogy tetszõleges szóra tudj keresni.
+
Pár tanács:
 +
* Hogy a tömb lefoglalással ne legyenek gondok, amikor létrejön ez a rendszer foglaljatok le mondjuk 500 '''User'''nek helyet és egy számlálóval mentsétek, hogy pontosan mennyi is van valóban a rendszerben.
 +
* Az elõbbihez az kell, hogy a '''User''' osztálynak legyen '''default konstruktor'''a, csináljatok hát neki.
 +
* A '''User''' felvétele függvény talán úgy a legegyszerûbb, ha egy bemente van és az a '''User''' objektum amit be akarunk rakni a tömbbe.
 +
* A komment tárolásánál elég ha beküldõ nevét tároljátok mondjuk itt nem kell teljes '''User'''t tárolni.
 +
* Mivel kommentbõl is sokat kell tárolni ezért nagyon hasonló módon meg lehet oldani a tárolásukat, mint a '''User'''ekét.
  
 +
== Bónusz ==
  
 +
=== 6. Komment keresõ ===
  
 +
Az 5. feladat rendszeréhez írjatok olyan függvényt, ami képes egy adott '''User''' össze kommentjét kiírni. Legyen mondjuk a bemenete egy '''String''', ami a keresendõ '''User''' '''nickName''' adattagja és listázza ki az összes olyan komment tartalmát aminek õ a szerzõje.
  
=== Adat rendezés ===
+
=== 7. Complex mûveletek ===
  
* Töltsd le a következõ file-t: [http://math.bme.hu/~kkovacs/webprog/adat.txt adat.txt]
+
Írjátok meg az osztás mûveletet a '''Complex''' osztályhoz, nyugodtan írjatok hozzá segéd függvényeket, a lényeg hogy minél apróbb részekre bontsátok a programokat. Továbbá írjátok meg a vektoriális szorzatát a '''ComplexVector''' osztálynak. (Feltételezhetitek, hogy 3 dimenziós vektorokra kell csak mûködnie.)
* Véletlen adatok és szavak vannak benne, a feladat az, hogy soronként kibányásszuk az e-mailcímeket, telefonszámokat, és dátumokat és mindezt tároljuk egy 2 dimenziós listában (listák listája).
+
* Az e-mailcímek és telefonszámok a fenti feladatokban már említett módon néznek ki, míg a dátumok 00/00/0000 formátumban vannak.
+
* A kimenetet file-ba írni nem feltétlen kell, de az lenne a legszebb megoldás, ha soronként lenne a megtalált e-mailcím majd telefonszám és végül a dátum.
+
* A feladathoz olvasnod kell tudni file-ban a python segítségével, ebben a következõ kód segít.
+
bemenet = open('./adat.txt', 'r')
+
kimenet = open('./kimenet.txt', 'w')
+
+
def fuggveny(s):
+
return "valami" + s
+
+
for line in bemenet:
+
line2 = fuggveny(line)
+
kimenet.write(line2)
+
+
adat.close()
+
kimenet.close()
+
* Parancsonként leírom mi mit csinál a kódban:
+
bemenet = open('./adat.txt', 'r')
+
* Megnyitja a bemenet változóba az adat.txt file-t ami egy mappában van a python scripttel, az 'r' (read) azt mondja meg, hogy olvasni akarunk a file-ban.
+
kimenet = open('./kimenet.txt', 'w')
+
* Mint az elõbb, csak 'w' (write) segítségével írásra nyitjuk meg.
+
def fuggveny(s):
+
return "valami" + s
+
* Csak valamilyen függvény ami csinál valamit a bemenetével majd visszaad valamit.
+
for line in bemenet:
+
line2 = fuggveny(line)
+
kimenet.write(line2)
+
* Végigmegyünk a bemenet sorain (itt a line csak egy változónév, lehetne i is, vagy koafkdofd is akár), és lefuttatjuk a fuggveny-t minden sorra, a kimenetet elmentjuk a line2-be, majd a kimenet file-ba írjuk a line2-t.
+
adat.close()
+
kimenet.close()
+
* Bezárjuk mindkét file-t, ez azért kell, mert csak azután lehetünk biztosak hogy megtörténtek a file-ba írások miután így bezártuk a file-t.
+

A lap jelenlegi, 2013. szeptember 18., 17:41-kori változata

Tartalomjegyzék

Feladatok tagolása

Már több osztállyal dolgozunk akár egy feladaton belül is. Így egy új tagolást javasolok.

  • Eclipse-ben a már létezõ vagy új projectet nyissátok le, és az src mappára jobb klikk New -> Package
  • Nevezzétek el és kész is
  • Minden összetartozó osztályt egy ilyen package-be rakjatok
  • Amikor egy osztály egy Gyak2 package-ben van azt jelezni kell a fájl elején a következõ módon:
package Gyak2;
  • Package-eket lehet egymásba is ágyazni, késõbb a komolyabb dolgokat majd külön projectben sok package-ben fogjuk tárolni

Bemelegítõ feladatok

Figyeljetek oda, hogy minden osztálynak a saját nevével megyegyezõ nevû fájlban kell lennie. Pl a Complex osztálynak a Complex.java fájlban kell lennie.

Egészítsétek ki a feladatokat a //TODO részeknél. Ez van ahol csak egy parancs, máshol több sor is lehet akár.

1. Complex kiegészítés

public class Complex {
    private float realPart_;
    private float imaginaryPart_;
 
    public Complex() {
        realPart_ = 0;
        imaginaryPart_ = 0;
    }
 
    public Complex(float realPart) {
        realPart_ = //TODO
        imaginaryPart_ = //TODO
    }
 
    public Complex(float realPart, float imaginaryPart) {
        //TODO
    }
 
    public Complex add(Complex other) {
        float realPart = this.realPart_ + other.realPart_;
        float imaginaryPart = this.imaginaryPart_ + other.imaginaryPart_;
        Complex retval = //TODO
        return retval;
    }
 
    public Complex multiply(Complex other) {
    	//TODO
    }
}

2. User

Egészítsétek ki, ahogy értelmes. Érdekesség (és fontos) ez a kettõ nem ekvivalens:

password_ == enteredPassword
password_.equals(enteredPassword)

A második azt csinálja, amit az elsõre gondolna az ember. Összehasonlítja a 2 Stringet, ha megegyeznek true-t, ha különböznek false-t ad vissza.

Viszont az elsõ nem ezt csinálja. Hanem azt vizsgálja meg, hogy ugyanazon a memóriacímen vannak-e tárolva, azaz, hogy tényleg megegyeznek-e, nem csak tartalomban. Ez azért van amit már említettem, hogy itt kb minden pointer (referencia) csak rejtetten. Errõl lesz szó következõ elõadáson.

A passwordCheck metódus (függvény) kap egy jelszót, ez az amit beírt a felhasználó. Ezt hasonlítsa össze, a már tárolt jelszóval. Ha megegyezik a kettõ, akkor igazat (true) különben hamisat (false) adjon vissza.

A setNickName állítsa át a nickName_ adattagot a kapott paraméterre newNickName-re.

public class User {
	private String realName_;
	private String nickName_;
	private String password_;
 
	public User(String realName, String nickName, String password) {
		realName_ = realName;
		nickName_ = nickName;
		password_ = password;
	}
 
	public boolean passwordCheck(String enteredPassword) {
		if (password_.equals(enteredPassword)) {
			//TODO
		}
                //TODO
	}
 
	public void setNickName(String newNickName) {
		//TODO
	}
}

Feladatok

Érdemes minden osztályhoz gyártani egy maint, hogy kipróbáljátok jól mûködik-e. Ha lesz rá idõnk tanulunk teszt rendszert is, de nem biztos, hogy eljutunk odáig. Ezt lehet az adott osztályba írni, nem kell mindig külön Main osztályt gyártani miatta. Itt egy példa a Complexre:

    public static void main(String[] args) {
        Complex comp1 = new Complex(5, 6);
        Complex comp2 = new Complex(4);
        Complex comp3 = comp1.add(comp2);
        System.out.println(comp3);
    }

Azt nem ellenõrzi, hogy jól számolt-e, ezt ugye már nehezebb, mivel privátak az adattagjai, de írhatnánk egy kiirató függvényt, akkor már könnyû lenne.

Továbbá mindig emlékezzetek arra, hogy a cél, hogy minél kisebb egységekre szedjük szét a dolgokat. Így ha pl egy függvény mûködéséhez kell abszolút érték függvény, írd meg külön és használd, ne az adott függvénybe írd bele az abszolút érték megvalósítását.

3. ComplexVector szorzás

Írjátok meg a ComplexVector skaláris szorzatát. Ne felejtsétek el, hogy használhatjátok a Complex osztály multiply függvényét.

public class ComplexVector {
    private Complex[] coords_;
    private int dimension_;
 
    public ComplexVector(int dimension) {
        dimension_ = dimension;
        coords_ = new Complex[dimension];
    }
 
    public ComplexVector(ComplexVector other) {
        this.coords_ = other.coords_.clone();
        this.dimension_ = other.dimension_;
    }
 
    public ComplexVector add(ComplexVector other) {
        ComplexVector retval = new ComplexVector(this.dimension_);
        for (int i = 0; i < retval.coords_.length; i++) {
            retval.coords_[i] = this.coords_[i].add(other.coords_[i]);
        }
        return retval;
    }
}

4. Kiírás

Írjatok kiíró függvényt print néven a Complex és ComplexVector osztályokhoz. Nézzen ki valahogy olvashatóan. Majd ezekkel már jól tudtok tesztelni a mainekben.

4.5. Szerkezet változtatás

Írjátok át a Complex osztályt, hogy ne két floatban tárolja az adatokat, hanem egy 2 elemû float tömbben. Majd értelemszerûen a konstruktorokat és függvényeket is írjátok át. Ha ez kész örüljetek, hogy a ComplexVector még mindig teljesen jól mûködik. Pedig valójában már õ is megváltozott ezzel.

5. Felhasználó rendszer

Írjatok egy osztályt (ti találjátok ki a nevét, de legyen beszédes és célratörõ, általában a programozásban ez a legnehezebb feladat) ami a korábban megírt User objektumokból tud sokat tárolni (tömb). Továbbá valamilyen módon tárol még kommenteket is. Egy komment az üzenetbõl és a készítõjébõl áll, aki egy User. Találjátok ki, hogyan tárolnátok a kommenteket, érdemes új osztályt bevezetni rá. A rendszernek magának legyen 2 függvénye, egyik amivel új Usert lehet felvenni és egy amivel új kommentet lehet írni.


Pár tanács:

  • Hogy a tömb lefoglalással ne legyenek gondok, amikor létrejön ez a rendszer foglaljatok le mondjuk 500 Usernek helyet és egy számlálóval mentsétek, hogy pontosan mennyi is van valóban a rendszerben.
  • Az elõbbihez az kell, hogy a User osztálynak legyen default konstruktora, csináljatok hát neki.
  • A User felvétele függvény talán úgy a legegyszerûbb, ha egy bemente van és az a User objektum amit be akarunk rakni a tömbbe.
  • A komment tárolásánál elég ha beküldõ nevét tároljátok mondjuk itt nem kell teljes Usert tárolni.
  • Mivel kommentbõl is sokat kell tárolni ezért nagyon hasonló módon meg lehet oldani a tárolásukat, mint a Userekét.

Bónusz

6. Komment keresõ

Az 5. feladat rendszeréhez írjatok olyan függvényt, ami képes egy adott User össze kommentjét kiírni. Legyen mondjuk a bemenete egy String, ami a keresendõ User nickName adattagja és listázza ki az összes olyan komment tartalmát aminek õ a szerzõje.

7. Complex mûveletek

Írjátok meg az osztás mûveletet a Complex osztályhoz, nyugodtan írjatok hozzá segéd függvényeket, a lényeg hogy minél apróbb részekre bontsátok a programokat. Továbbá írjátok meg a vektoriális szorzatát a ComplexVector osztálynak. (Feltételezhetitek, hogy 3 dimenziós vektorokra kell csak mûködnie.)

Személyes eszközök