Gyakorlat2

A MathWikiből
(Változatok közti eltérés)
(2. User)
 
(2 szerkesztő 14 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.
 +
 
 +
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.
 +
 
 +
<java>
 +
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;
 +
    }
 +
}
 +
</java>
 +
 
 +
=== 4. Kiírás ===
  
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.
+
Í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.
  
* Í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! (Mindig az elsõ számot találja meg a sorban.)
+
=== 4.5. Szerkezet változtatás ===
A bosi zsilip 22547645 hibaja miatt akadozik a budapesti hajokozlekedes
+
546.433 eve nem oltek amerikai nagykovetet
+
Atadjuk a 65/87 nuklearis tudasunkat Vietnamnak
+
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##-###-####
+
Í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.
Egy Liga nem-hajo semleges teruleten voltak, ami mellett 0623-434-5432 Bene Gesserit- es Tleilax-monitorhajok gyulekeztek, mint ragadozo madarak a zsakmany korul.  
+
A Liga 0532-323-4344 meghunyaszkodva igyekezett 06-23-545-5432 megbekiteni a Bene Gesseritet.
+
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.
+
=== 5. Felhasználó rendszer ===
Ez legalabb@visszajelzes.volt.
+
Scytale megfelelokepp@valaszolt.86, de@feszulten.figyelt kozben.
+
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.
+
Í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.
vOlt eGySzeR 42 kiskUTYa, eLMENTeK negYvenKEt vasArBA. oTt TaLaLKOZtAk 43 FARkasSAl, akIKnek Volt NEGyVeNKet HAzikOJUK, es NEgYVenkeTtO kiSkuTYAJUK.
+
  
* 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).
 
  
=== Hosszabbak ===
+
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.
  
* Írj python scriptet ami megszámolja hányszor szerepel az "a" és "az" névelõ a szövegben:
+
== Bónusz ==
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.
+
=== 6. Komment keresõ ===
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.
+
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., 16: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