WebProg-2014/Gyakorlat2
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 rePart) { realPart = //TODO imaginaryPart = //TODO } public Complex(float rePart, float imPart) { //TODO } public Complex add(Complex other) { float rePart = this.realPart + other.realPart; float imPart = this.imaginaryPart + other.imaginaryPart; Complex retval = //TODO return retval; } public Complex multiply(Complex other) { //TODO } }
2. Position
- A default konstruktor rakja a (0, 0)-ba a pontot.
- A distance metódus visszaadja a pont (euklideszi) távolságát egy másik ponttól.
- A translate metódus az (xt, yt) vektorral eltolja a Position-t.
public class Position { private float x; private float y; public Position() { //TODO } public Position(Position other) { this.x = other.x; this.y = other.y; } public Position(float xn, float yn) { //TODO } public float distance(Position other) { //TODO //Math.sqrt-vel lehet gyököt számolni //viszont double-t ad vissza, ezt így lehet float-á castolni: //(float)valtozónév } public void translate(float xt, float yt) { //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.)