- akekolvek otazky resp. hotove zapoctaky posielajte na marcincak@vsl.sk - v ulohach 1,2,3,4 vytvorte okrem pozadovanej triedy aj samostatnu triedu Tester, ktora bude mat metodu main, v ktorej vyskusate pozadovanu triedu - v ulohach 3,4 predpokladajte, ze uz je definovana trieda public class MyFileRader { public MyFileReader(String filename); public String nextLine(); public String lastError(); } // velmi primitivny 'citac' obsahu text.suboru. po skonstruovani je mozne // opakovanym volanim nextLine citat po riadkoch obsah suboru (az kym nextLine nevrati null) // ak by niekde doslo k chybe (napr. pri otvarani suboru) metoda lastError() // vrati not null string s popisom chyby (trosku hlupe, ale kedze ste este nemali exceptions, tak neviem co ine :) =================================================== 1. MyStringTokenizer - trieda umoznujuca tokenizaciu (rozbijanie) stringu podla zadaneho delimitera. - pr. string "ahoj|fero||kde|ides|" je pomocou delimitera "|" mozne rozbit na 6 resp. 4 substringy ("ahoj","fero",null,"kde","ides",null) resp. ("ahoj","fero","kde","ides") podla toho, ci ignorujeme null tokeny alebo nie. - minimalne pozadovane API konstruktor(String s, String delim) - vytvori tokenizer nad danym stringom 's' s pozadovanym delimiterom 'delim'. null tokeny sa nebudu ignorovat konstruktor(String s, String delim, Boolean skipEmpty) - analogicky, akurat je mozne specifikovat, ci sa null tokeny budu ignorovat alebo nie boolean hasMoreTokens() - vrati true/false podla toho, ci este su nejake neprecitane tokeny String nextToken() - vrati dalsi token resp. null ak uz ziadne nie su. opakovane vyvolavanie tejto metody musi davat vzdy dalsie a dalsie tokeny void reset() - nastavi tokenizer 'na zaciatok' - t.j. ako keby ani raz nebola zavolana nextToken =================================================== 2. MyStringBuffer - trieda reprezentujuca modifikovatelny string (vid cvicenie) - interne bude mat data ulozene ako pole char-ov ak niektora operacia by sposobila preplnenie pola, je potrebne toto pole realokovat - minimalne pozadovane API konstruktor(String s) - vytvori MSB rovno s naplnenou hodnotou konstruktor(int capac) - vytvori prazdny MSB s minimalnou udanou kapacitou (ak sa don neprida viac ako 'capac' znakov, nebude sa musiet realokovat) konstruktor() - prazdny s default kapacitou 10 znakov String toString() - no comment charAt(int pos) - 'pos'-ty znak (cislovat od 0) append(String s) - pridanie retazca 's' na koniec buffra prepend(String s) - .. na zaciatok insert(int pos, String s) - vlozenie na zadanu poziciu remove(int startpos, int len) - vysekne 'len' znakov od pozicie 'startPos' vratane replace(String s1, String s2) - nahradi vsetky vyskyty retazca s1 retazcom s2 int length() - dlzka aktualne vlozeneho retazca int getCapac() - aktualne alokovana velkost buffra void ensureCapac(int capac) - zabezpeci, ze minimalne 'capac' znakov bude alokovanych (ak aktualny capac je viac, necha tak, ak menej zvacsi) trim() - oseka zlava aj sprava whitespaces(medzery, tab) encode() decode() - vykona zasifrovanie/odsifrovanie ulozeneho retazca podla vami zvoleneho algoritmu =================================================== 3. MyProperties - trieda spristupnujuca properties ulozene v textovom subore - ukazka formatu suboru: [DATABASE] DBNAME = PPKLIENTI DBUSER = dbadmin DBPASSWD = heslo STOREDPROC = false LOGFILE = servers\log\dbaccess.log LOGEXECTIME = 1 [KOMUNIKACIA S SCP] IMPORT/EXPORT_ROOT = SCP TEMPLATE_DIR = conf [KOMUNIKACIA S BANKOU] IMPORT/EXPORT_ROOT = Poštová banka TEMPLATE_IMPORTU_BV = conf\bankovy vypis.xml TEMPLATE_IMPORTU_VAKUP = conf\vakup.xml TEMPLATE_EXPORTU_PP = conf\prevodny prikaz.xml - ignorovat prazdne riadky (tie co obsahuju iba whitespaces (w)) - ignorovat aj vsetky ostatne riadky, co nie su w*[
]w* resp. w*=w*w* - minimalne pozadovane API: konstruktor() load(filename) - nanovo (replace) naplni properties z file-u String getProperty(String section, String name, String default) - vrati stringovu property s menom 'name' nachadzajucu sa v sekcii 'section'. ak taka nie je, vrati default hodnotu int getProperty(String section, String name, int default) boolean getProperty(String section, String name, boolean default) - analogicky ako strigova verzia, akurat sa vykona aj automaticka konverzia na pozadovany typ. ak property neexistuje, alebo konverzia nie je mozna, vrati default pri boolean podporit format true/false aj 1/0 =================================================== 4. MyXMLFile a MyXMLTag - dvojica tried umoznujuca nacitanie zjednodusneho XML suboru - ukazka formatu suboru: - zjednodusenie zahrna: - len jeden tag na jednom riadku - tagname ide hned za < - atributy tagu su vzdy vo formate ="" (teda ziadne medzery pred ani za =) - minimalne pozadovane API: class MyXMLFile { konstruktor() String load(String filename) - nacita XML file a vybuduje strom tagov (DOM) ak pri parsingu dojde k chybe varti popis chyby inak null (trosku hlupe osetovanie chyb, ale co uz, ked ste nemali exceptions) MyXMLTag getRoot() - vrati korenovy element } class MyXMLTag { String getName() - vrati meno tagu String getAttribute(String attname) - vrati hodnotu atributu. ak taky nie je vrati null MyXMLTag getSubtag(String tagname) - vrati referenciu na (prvy) subtag s danym menom MyXMLTag[] getSubtags(String tagname) - vrati pole vsetkych subtagov s danym menom } =================================================== 5. Piskvorky - piskvorky pre dvoch hracov, ktori striedavo zadavaju svoj tah. - vystup na konzolu (System.out) vstup podobne (System.in) - pocitac musi zistit, ze hra skoncila, resp. nie je mozne urobit ziaden tah - na zaciatku je mozne zvojit velkost hracej plochy (max. zvolte tak, aby sa to voslo na konzolu 80x25) - analogicky mozte spravit sachy pre dvoch, reversi a pod. =================================================== 6. Piskvorky - piskvorky 3x3 pre jedneho hraca a pocitac, ktory bude 'aspon trosku inteligentny'