====== Ing. Ondřej Votava ====== ===== Kontakt ===== * KN:E-434 (půda budovy E na Karlově náměstí) * votavon1 (at) fel.cvut.cz * 224 35 7639 Konzultace možné po předchozí domluvě přes email. Předmět emailu pište ve tvaru - [A7B36ALG] Váš předmět. * Stránky k původní verzi předmětu (lze nalézt užitečné materiály/příklady): [[http://service.felk.cvut.cz/courses/X36ALG]] * [[http://www.linuxsoft.cz/article_list.php?id_kategory=192|Učebnice javy na serveru linuxsoft.cz]] ===== Informace pro cvičení ===== * [[courses:a7b36alg:teacher:votavon1:zs2011:109|109 - Úterý 12:45 - 14:15]] * [[courses:a7b36alg:teacher:votavon1:zs2011:101|101 - Úterý 14:30 - 16:00]] * [[courses:a7b36alg:teacher:votavon1:zs2011:113|113 - Pátek 11:00 - 12:30]] * [[courses:a7b36alg:teacher:votavon1:zs2011:116|116 - Pátek 12:45 - 14:30]] /** * [[courses:a7b36alg:teacher:votavon1:111|Úterý 16:15 - 17:45]] * [[courses:a7b36alg:teacher:votavon1:105|Čtvrtek 9:15 - 10:45]]*/ ==== Požadavky na zápočet ==== * Aktivní účast na cvičeních (tolerovány 3 absence) - 10 bodů (za domácí úlohy) * Písemný test v průběhu semestru - 20 bodů * Semestrální práce - 20 bodů Pro získání zápočtu je vyžadováno alespoň 25 bodů, viz. celkové [[courses:a7b36alg:classification:start|hodnocení předmětu]]. ==== Materiály ze cvičení ==== * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv01.pdf|Úvod}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv02.pdf|Základy programů}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv03.pdf|Práce se vstupem od uživatele}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv04.pdf|Procviceni zakladnich konstrukci}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv05.pdf|Procvičení základních konstrukcí II}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv06.pdf|Pole}} * [[courses:a7b36alg:teacher:votavon1:trycatch|Vysvětlení příkladu na try - catch]] * Test v semestru může obsahovat látku probranou v kterémkoliv materálu zobrazeném výše. * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv07.pdf|Objekty}} * [[courses:a7b36alg:teacher:votavon1:matice|Alternativní příklad na objekty - Matice.java]] * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv08.pdf|Práce se soubory}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv09.pdf|Rekurze a složitost}} * {{courses:A7B36ALG:teacher:votavon1:a7b36alg_cv10.pdf|Nástroje balíčku java.util}} ==== Písemný test ==== Test v semestru se bude psát v týdnu - 11, tedy v týdnu od 28.11. do 4.12. (úterní skupiny 29.11. a páteční skupiny 2.12.). Test se bude psát u počítače, úkolem bude napsat několik jednoduchých metod. Na test budete mít 45 minut. Nejsou povoleny žádné pomůcky, výjimkou jsou jen poznámky a projekty z minulých cvičení. Použití internetu ani intranetu není dovoleno. Test se bude psát na počítačích nainstalovaných v učebně, nikoliv na noteboocích. Způsob odevzdávání specifikuji při testu. ==== Opravný test ==== Opravný test se bude psát na cvičení 13.12.2010 (úterý) a 16.12.2010 (pátek). Získat z něj lze maximálně 15 bodů a po jeho napsání se automaticky použije výsledek z nového testu, tedy body z původního propadnou. Opravný test je dobrovolný. ==== Opakování/vynechání předmětu ==== Pokud si myslíte, že předmět již pro vás nebude přínosem, neboť jazyk Java znáte velice dobře, nemusíte na cvičení chodit. Nutnou podmínkou jsou ale následující kroky: - Napíšete na druhém cvičení program, který vám zadám -- ověřím si, že Javu umíte. - Absolvujete test v semestru. - Naprogramujete semestrální práci a vše, co s ní souvisí. Při splnění všech podmínek výše vám odpustím docházku a body za domácí úkoly získáte automaticky. ===== Domácí úkoly ===== Od 3. týdne budou zadávány domácí úkoly, jejich plnění bude bodově hodnoceno a z nich se určí výsledné body aktivity ke zkoušce. Průběžné hodnocení naleznete v tabulce u svého jména na stránkách pro vaši skupinu. Domácí úlohy jsou bodovány následovně: * 1 bod - odevzdáno včas a v pořádku, * 0 bodů - odevzdáno pozdě či v nepořádku. Z tohoto důvodu si funkčnost vašeho kódu vždy ověřte na více instancích (vstupech). Úloha je odevzdána včas, pokud ji odešlete/nahrajete do půlnoci dne předcházejícího dni cvičení, tedy pondělí či čtvrtek dle termínu cvičení. ==== DU 1 Faktoriál ==== Napiště metodu, která spočítá správně faktoriál. Kód piště do souboru ''Du1.java'', ke stažení je {{courses:A7B36ALG:teacher:votavon1:du1.zip|projekt netbeans se šablonou}} . Správnost kódu si ověřte pomocí JUnit testu. Kód -- tedy soubor ''Du1.java'' -- mi zašlete ze své školní adresy na mail. ==== DU 2 Kombinační číslo ==== Napište metodu, která spočítá kombinační číslo n nad k. Kód piště do připravené metody v {{courses:A7B36ALG:teacher:votavon1:du2.zip|předpřipraveném projektu}} pro Netbeans. Funkčnost kódu si ověřte na přiloženém JUnit testu (Test Packages -> Du2 -> Du2Test.java -> Run File (z kontextového menu, pravé tlačítko myši)). Výsledný soubor ''Du2.java'' nahrajte do systému pro odevzdávání úloh na adrese [[http://votava.felk.cvut.cz]]. ==== DU 3 Počet dnů ==== Napište metodu, která vypočítá, kolik uběhlo dnů od začátku roku do data, které zadá uživatel. Metoda bude ve tvaru: public static int pocetDnu(int rok, int mesic, int den){ int pocetDnu = 0; // reseni return pocetDnu; } Pro jednoduchost počítáme s tím, že datum vybírá uživatel z grafického rozhraní a nemůže vložit nesmyslnou hodnotu, jako např. 33. 3. 3333. Pro výpočet přestupného roku platí tato pravidla: - Roky, které jsou beze zbytku dělitelné číslem 400, jsou přestupné. - Roky, které jsou beze zbytku dělitelné číslem 100 a nejsou dělitelné číslem 400, nejsou přestupné. - Roky, které jsou dělitelné číslem 4, ale nejsou dělitelné číslem 100, jsou přestupné. - Všechny ostatní roky jsou nepřestupné. K dispozici máte {{courses:A7B36ALG:teacher:votavon1:du3.zip|projekt Netbeans}} s připraveným JUnit testem a třídou ''Du3.java''. Úkol nahrajte na [[http://votava.felk.cvut.cz]] do dne předcházejícího dni vašeho cvičení a nezapomeňte, že emailem úlohy nepřijímám. **Možné řešení** public static int pocetDnu(int rok, int mesic, int den){ int pocetDnu = 0; boolean prestupnyRok = ((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0); pocetDnu = den; for(int i = 1; i < mesic; i++){ switch(i){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: pocetDnu += 31; break; case 2: if (prestupnyRok) pocetDnu += 29; else pocetDnu += 28; break; case 4: case 6: case 9: case 11: pocetDnu += 30; break; } } return pocetDnu; } ==== DU 4 Test prvočíselnosti ==== Doplňte kód metody ''public static boolean jePrvocislo(int a)'' tak, aby pro prvočísla vracela ''true'' a pro ostatní čísla vracela ''false''. Projekt Netbeans i s JUnit testem je opět {{courses:A7B36ALG:teacher:votavon1:du4.zip|k dispozici}} . Stále se odevzdává na [[http://votava.felk.cvut.cz]]. **Možné řešení** public static boolean jePrvocislo(int a){ if(a < 2) return false; boolean vysledek = true; int limit = (int) Math.sqrt(a) + 1; for (int i = 2; i < limit; i++) { if(a % i == 0){ vysledek = false; break; } } return vysledek; } ==== DU 5 Součet polí ==== Napište metodu, jež provede jednoduchou operaci (součet) se dvěma poli. Metoda bude vracet součet prvků pole v novém poli, velikost nového pole bude určena podle většího z polí. Prvky menšího pole, které již neexistují, považujte za nulové. {{courses:A7B36ALG:teacher:votavon1:du5.zip|Projekt Netbeans}} se správnou deklarací a JUnit testem je opět k dispozici. **Možné řešení** public static int[] soucetPoli(int[] a, int[] b){ int[] vetsi = (a.length > b.length)? a:b; int[] mensi = (vetsi == a) ? b:a; int[] vysledek = new int[vetsi.length]; for(int i = 0; i < mensi.length; i++) vysledek[i] = a[i] + b[i]; for(int i = mensi.length; i < vetsi.length; i++) vysledek[i] = vetsi[i]; return vysledek; } ==== DU 6 Kružnice ==== Napište kód třídy, která bude reprezentovat kružnici. Třída se jmenuje ''Kruznice'' a nachází se jako neveřejná třída v souboru ''Du6.java'' (omezení plynoucí z odevzdávacího systému). Třída bude podporovat několik základních funkcí. Kromě konstruktoru ''Kruznice(double polomer)'' bude nabízet i metodu ''getPolomer()'', ''setPolomer(double polomer)'', ''equals(Object o)'', ''getObsah()'', ''getObvod()'' či metodu ''toString()''. Projekt se {{courses:A7B36ALG:teacher:votavon1:du6.zip|šablonou}} a testem JUnit je opět k dispozici. **Tip:** Pro velice přesnou hodnotu Ludolfova čísla můžete použít statickou proměnnou třídy Math, konkrétně ''Math.PI'' . **Možné řešení** package du6; public class Du6 {} class Kruznice { private double polomer; public Kruznice(double polomer){ this.polomer = polomer; } @Override public boolean equals(Object o){ if(o instanceof Kruznice){ Kruznice k = (Kruznice) o; if(k.polomer == this.polomer) { return true; } else { return false; } } else { return false; } } public double getObsah(){ return Math.PI * polomer * polomer; } public double getObvod(){ return 2 * Math.PI * polomer; } public double getPolomer() { return polomer; } public void setPolomer(double polomer) { this.polomer = polomer; } @Override public String toString() { return "Kruznice{" + "polomer=" + polomer + '}'; } } ==== DU 7 Šestiúhelník ==== Napište kód třídy ''Sestiuhelnik'', chování je logické z názvu funkcí. K dispozici je {{courses:A7B36ALG:teacher:votavon1:du7.zip|šablona}} projektu s kostrou třídy a metod. Jenom drobnost k chování metody ''readFile''. Tato metoda vrací pole šestiúhelníků. Formát souboru je jednoduchý. Na prvním řádku je informace kolik je v daném souboru šestiúhelníků, na každém dalším řádku je informace o straně šestiúhelníků, tedy co řádek, to šestiúhelník. Metoda ''toFile'' zapisuje do souboru 1 šestiúhelník a to ve specifikovaném formátu, takže metoda ''readFile'' vrátí pole s jedním šestiúhelníkem. **Možné řešení** class Sestiuhelnik { private double strana; public Sestiuhelnik(double strana){ this.strana = strana; } public double getObsah(){ return 3 * strana * strana * Math.sqrt(3.0) / 2; } public double getObvod(){ return 6 * strana; } public static Sestiuhelnik[] readFile(String file){ Sestiuhelnik [] pole = null; try { Scanner s = new Scanner(new FileInputStream(file)); int pocet = s.nextInt(); pole = new Sestiuhelnik[pocet]; for (int i = 0; i < pole.length; i++) { pole[i] = new Sestiuhelnik(Double.parseDouble(s.next())); } } catch (FileNotFoundException ex) { Logger.getLogger(Sestiuhelnik.class.getName()).log(Level.SEVERE, null, ex); } return pole; } public void toFile(String file){ try { FileWriter fw = new FileWriter(file); fw.write("1\n"); fw.write(""+strana); fw.close(); } catch (IOException ex) { Logger.getLogger(Sestiuhelnik.class.getName()).log(Level.SEVERE, null, ex); } } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Sestiuhelnik other = (Sestiuhelnik) obj; if (Double.doubleToLongBits(this.strana) != Double.doubleToLongBits(other.strana)) { return false; } return true; } @Override public int hashCode() { int hash = 3; hash = 41 * hash + (int) (Double.doubleToLongBits(this.strana) ^ (Double.doubleToLongBits(this.strana) >>> 32)); return hash; } } ==== DU 8 Matice ==== Napište třídu Matice, která bude mít //neznámou// vnitřní strukturu, ale bude nabízet tyto veřejné funkce: * **Konstruktor** * '' public Matice(int radku, int sloupcu)'' * **Metody** * ''public void napln(int od)'' kde ''od'' znamená, od kolika se má začít číslovat. Např. ''napl(5)'' na matici o rozměrech 2 x 5 naplní první řádek hodnotami 5 6 7 8 9 a druhý řádek hodnotami 10 11 12 13 14 * ''public String toString()'' pro snazší ladění * ''public void prohodRadky(int prvni, int druhy)'' prohodí dva řádky, zadává se index v poli, tedy pro 1. řádek bude index 0 * ''public double getPrvek(int x, int y)'' vrátí prvek v matici na pozici x - řádek, y - sloupec, opět vycházím z indexování pole, tedy 1. cokoliv má index 0 * ''public boolean equals(Object o)'' porovná 2 objekty, když je matice pak je porovná mezi sebou a vrátí true jsou-li stejné. Třída bude deklarována class Matice a bude v souboru Du8.java. Jako obvykle máte k dispozici {{courses:A7B36ALG:teacher:votavon1:du8.zip|šablonu projektu}} i s JUnit testem. Tento úkol patří mezi lehčí a doporučuji si jej zkusit naprogramovat. Úlohu podobného typu můžete očekávat i v testu. **Možné řešení** package du8; import java.util.Arrays; public class Du8 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here } } class Matice { private double[][] m; public Matice(int radku, int sloupcu) { m = new double[radku][sloupcu]; } public void napln(int od) { for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) { m[i][j] = od + i * m[0].length + j; } } } @Override public String toString() { return "Matice{" + "m=" + m + '}'; } public void prohodRadky(int prvni, int druhy) { double[] p = m[prvni]; m[prvni] = m[druhy]; m[druhy] = p; } public double getPrvek(int r, int s) { return m[r][s]; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Matice other = (Matice) obj; if (!Arrays.deepEquals(this.m, other.m)) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 67 * hash + Arrays.deepHashCode(this.m); return hash; } } ==== DU 9 Párování závorek ==== Výraz je správně ozávorkován, má-li ke každé otevírací závorce závorku uzavírací a to ve správném pořadí. Tedy výraz (abc(def)) je ozávorkován správně, stejně tak ()()abc{}[def], výraz {abc(def}gh) už není správně. Vaším úkolem je napsat metodu, který určí, zda je výraz správně ozávorkován. Berte v potaz závorky (), {} a []. Samotnou kontrolu bude dělat metoda public static boolean spravneOzavorkovan(String vyraz) přímo ve třídě Du9. K dispozici je {{courses:A7B36ALG:teacher:votavon1:du9.zip|šablona projektu}} s testem. **Možné řešení** package du9; public class Du9 { /** * Metoda pro zjisteni, zda je vyraz prvane ozavorkovan. * Uvazujte zavorky (), {} a [] * * @param vyraz retezec, ktery zkoumate * @return true pokud sedi parovani zavorek, false jinak */ public static boolean spravneOzavorkovan(String vyraz){ java.util.LinkedList z = new java.util.LinkedList(); for(int i = 0; i < vyraz.length(); i++){ switch(vyraz.charAt(i)){ case '(': z.push(')'); break; case '[': z.push(']'); break; case '{': z.push('}'); break; case ')': if(z.size() == 0) return false; if(z.pop() != ')') return false; break; case ']': if(z.size() == 0) return false; if(z.pop() != ']') return false; break; case '}': if(z.size() == 0) return false; if(z.pop() != '}') return false; break; default: } } if(z.size() != 0) return false; return true; } } ==== DU 10 Počet dnů II ==== Napište metodu, která spočítá, kolik dní uběhlo od začátku roku, který zadá uživatel. Tento úkol je rozšířením třetího úkolu. Klidně můžete využít kód, který jste již odevzdali/nalezli na této stránce. Tento úkol je na práci s uživatelským vstupem. Vašim úkolem je napsat kód metody ''pocetDnuUser'', která se bude uživatele **vždy** ptát na 3 údaje, rok, měsíc a den. Pokud uživatel zadá neplatné datum, vše se opakuje až do doby, kdy se mu povede zadat datum správně, viz ukázka níže. Zadej rok: 2000 Zadej mesic: 5 Zadej den: 1 Pocet dnu od pocatku roku je 122 Zadej rok: 16w5 Zadej mesic: 2 Zadej den: 2 Zadal jste hodnotu, ktera neni celociselna. Zadej rok: 1665 Zadej mesic: 2 Zadej den: 2 Pocet dnu od pocatku roku je 33 Zadej rok: 1 Zadej mesic: 1 Zadej den: 1 Pred rokem 1582 platil jiny kalendar. Zadej rok: 1665 Zadej mesic: 2 Zadej den: 2 Pocet dnu od pocatku roku je 33 Zadej rok: 2010 Zadej mesic: 2 Zadej den: 29 Hodnota pro den je mimo priputny rozsah. Zadej rok: 2010 Zadej mesic: 2 Zadej den: 28 Pocet dnu od pocatku roku je 59 Jako vždy je k dispozici {{courses:A7B36ALG:teacher:votavon1:du10.zip|šablona}} do Netbeans s JUnit testem. Pozn. implementace testu je založena na prohazování vstupních proudů. Scanner používá bufferování vstupu a proto používejte jedinou instanci Scanneru pro celou metodu. Pokud budete vyrábět více Scannerů, vstup, který běžně zadává uživatel, bude zahozen i s bufferem předchozího Scanneru a metoda, byť napsaná správně, testem neprojde. **Možné řešení** package du10; import java.util.Scanner; /** * * @author FIXME */ public class Du10 { /** * Metoda spocita pocet dni od zacatku daneho roku :-) */ public static void pocetDnuUser() { int[] mesice = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; boolean correct = true; Scanner s = new Scanner(System.in); while (true) { correct = true; int mesic = 0; int rok = 0; int den = 0; try { System.out.print("Zadej rok: "); String r = s.next(); System.out.print("Zadej mesic: "); String m = s.next(); System.out.print("Zadej den: "); String d = s.next(); den = Integer.parseInt(d); mesic = Integer.parseInt(m); rok = Integer.parseInt(r); boolean prestupny = (rok % 400 == 0) || (rok % 4 == 0 && rok % 100 != 0); if (mesic < 1 || mesic > 12) { System.out.println("Hodnota pro mesic je mimo pripustny rozsah."); correct = false; } if (rok < 1582) { System.out.println("Pred rokem 1582 platil jiny kalendar."); correct = false; } if ((prestupny && mesic == 2 && den > 29) || (!prestupny && den > mesice[mesic - 1]) || den < 1) { System.out.println("Hodnota pro den je mimo priputny rozsah."); correct = false; } if (correct) { System.out.println("Pocet dnu od pocatku roku je "+pocetDnu(rok, mesic, den)); break; } } catch (NumberFormatException ex) { System.out.println("Zadal jste hodnotu, ktera neni celociselna."); } catch (ArrayIndexOutOfBoundsException ex) { } } } public static int pocetDnu(int rok, int mesic, int den) { int pocetDnu = 0; boolean prestupnyRok = ((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0); pocetDnu = den; for (int i = 1; i < mesic; i++) { switch (i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: pocetDnu += 31; break; case 2: if (prestupnyRok) { pocetDnu += 29; } else { pocetDnu += 28; } break; case 4: case 6: case 9: case 11: pocetDnu += 30; break; } } return pocetDnu; } /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here //pocetDnuUser(); } } ==== DU 11 Obsah průniku dvou kruhů ==== Napište metodu ''public static double prunikKruhu(Kruh k1, Kruh k2)'', která spočítá obsah průniku dvou kruhů. Metoda bude vracet následující hodnoty: * -1, pokud se kruhy nepřekrývají * 0, pokud se dotýkají * obsah, pokud se překrývají K dispozici máte projekt {{courses:A7B36ALG:teacher:votavon1:du11.zip|Netbeans s JUnit testem}} , úkol můžete nahrávat do systému na votava.felk.cvut.cz. Tento úkol je bonusový. Body za něj mohou získat jen ti, kteří mají mezi 20 a 24 body a mají v pořádku docházku. Ti zatím nemají nárok na zápočet, pokud ale vyřeší správně tento úkol, pak mohou získat všechny potřebné body k získání zápočtu (max. ze semestru tedy bude 25). Ostatní se také mohou nad úkolem zamyslet nebo si ho i naprogramovat, odměnou jim může být uspokojení z dobře odvedené práce a malá příprava na programovací část zkoušky. ===== Zadání semestrálních prací ===== Semestrální práce je povinná, každý na ní pracuje sám. Do 7. týdne si musí každý zvolit téma své práce (nahlásíte na cvičení v týdnu od 31. 10. do 6. 11. 2011). Práce se odevzdává **osobně**, kopii práce mi pošlete na mail. Nejzazší termín pro odevzdání bez ztráty bodů je 13. týden (12. - 18. 12. 2011). Funkčnost semestrální práce předvedete osobně na cvičení, vyžaduje se taktéž důkladná znalost kódu a metod, které jste napsali (ověření proti duplikátům). **Důležité** Pojmem ztráta bodů se myslí následující. Každý započatý týden po termínu (18.12.) znamená snížení maximální možné hranice zisku bodů (20 v tomto případě) o 20%. Tedy v pondělí 19.12. již můžete získat jen 16 bodů a v pondělí 2.1. již jen 8 bodů. Termínem odevzdání se myslí: * datum, kdy mi předvedete úlohu osobně a teprve pak mi ji pošlete mailem nebo * datum, kdy mi úlohu pošlete mailem, předvádět mi pak ale budete tu úlohu, kterou budu mít na mailu. Body získáte, ale až mi práci osobně vysvětlíte. Semestrální práce by měla mít rozsah 250+ řádků bez komentářů a prázdných řádků. K práci též vypracujte **návod a doprovodnou zprávu**, v níž popíšete hlavní funkce a strukturu programu a jak tento program využít. Možné náměty na semestrální práci: - **Caesarova šifra** je založena na posuvu znaku o zadaný počet pozic v tabulce znaků (samozřejmě modulo velikost tabulky). Napište program, který umožní zašifrovat a dešifrovat soubor Caesarovou šifrou. Velikost posuvu bude zadána jako parametr. * Parametry: vstupní soubor, posuv, výstupní soubor. - **Počítání vět**: napište program, který spočte počet vět ve vstupním souboru. Věta začíná velkým písmenem a končí tečkou. * Parametry: vstupní soubor. - **Maticová kalkulačka**: napište program, který umožní násobení, inverzi a transpozici matic. Výpočet determinantu je výhodou. Matice načte ze vstupního souboru, výsledek uloží do výstupního souboru. * Parametry: vstupní soubor, výstupní soubor, operace. - **Výpočet soustavy rovnic**: napište program, který pro zadaný počet proměnných vypočte soustavu rovnic s číselnou pravou stranou. Program načte soustavu rovnic v podobě matic ze souboru, vyřešenou soustavu uloží do výstupního souboru. * Parametry: počet neznámých, vstupní a výstupní soubor. - **Morseova abeceda**: Napište program, který přečte ze vstupního souboru text zakódovaný v Morseově abecedě, převede jej do znakové podoby a výsledek zapíše do výstupního souboru. * Parametry: vstupní soubor, výstupní soubor. - **Transpoziční šifra**: napište program, který pomocí transpozice zašifruje nebo rozšifruje vstupní text ze souboru. Rozměry a přeházení sloupců zadává uživatel heslem. * Parametry: vstupní a výstupní soubory, heslo. - **Playfair šifra**: napište program, který pomocí šifry Playfair zašifruje nebo rozšifruje vstupní text ze souboru. * Parametry: vstupní soubor, výstupní soubor, heslo. - **Evidence**: naprogramuje správu položek nesoucí několik informací (Kontakty - Jméno, Číslo, Adresa atd.), která bude umožňovat přidání, odebrání a vyhledávání podle položek. Aplikace bude uchovávat data v souboru, po spuštění si načte data ze seouboru. * Parametry: vstupní soubor s daty. - **Slova**: napište program, který přečte vstupní textový soubor a vytvoří z něj výstupní soubor tak, že změní počáteční písmena všech slov na velká. * Parametry: vstupní soubor, výstupní soubor. - **Formátování textu**: napište program, který zformátuje text ze vstupního textového souboru na zadanou šířku stránky a výsledek zapíše do výstupního souboru. * Parametry: vstupní soubor, šířka stránky, výstupní soubor. - **Kalkulačka komplexních čísel**: napište program, který umožňuje počítat s komplexními čísly, součet, součin, dělení, mocnina, odmocnina. Čísla lze zadávat jak v algebraickém tak i goniometrickém tvaru, výsledek výpočtu bude vypsán v obou tvarech. - **Slovníček**: naprogramujte slovník pro překlad výrazů s možností zkoušení slovíček. Do programu půjde přidávat nové výrazy a aktuální slovník bude ukládán do souboru a po spuštění ze souboru načítán. * Parametry: soubor se slovníkem. - **Slovní vyjádření čísel**: napište program, který přečte ze souboru posloupnost čísel, každé číslo převede na jeho slovní vyjádření a výsledek zapíše do souboru. Např. 333 se převede na třistatřicettři. * Parametry: vstupní soubor. - **Počítání e na x**: napište program, který spočte hodnotu e na x z rozvoje e^x=1+x/1!+x^2/2!+x^3/3!+... a výsledek zapíše do souboru. Výpočet ukončete, jakmile absolutní hodnota posledního členu řady bude menší než zadaná hodnota epsilon. * Parametry: x, epsilon, výstupní soubor. - **Výrazová kalkulačka**: vstupem do programu bude řetězec s čísly, operátory +, -, * a / a závorkami ( a ). Program vypočte takto zadaný výraz a bude přitom respektovat prioritu operátorů, že * a / mají přednost před - a +. Závorky uzavírají podvýraz, který musí být spočten před dalším použitím. * Parametry: vstupní soubor s výrazem (alternativně možný vstup z řádky). - **Hledaní nejkratší cesty**: implementujte algoritmus pro nalezení nejkratší cesty grafem, který načtete ze souboru. * Parametry: soubor s maticí incidence či sousednosti, výstupní soubor s cestou. - **Hra "mysli si číslo"**: napište program, který bude hádat číslo podle pravidel této hry. Uživatel může odpovídat pouze ano/ne. Informace o průběhu hry se uloží do výstupního souboru. * Parametry: interval čísel, výstupní soubor. - **Vyhledání nejbližšího**: ze souboru načtěte souřadnice bodů v rovině. Uživatel zadá souřadnice a program vrátí souřadnice nejbližšího bodu. * Parametry: soubor se souřadnicemi bodů. - **Fibonacciho posloupnost** je definovaná rekurentním předpisem: F(0)=0, F(1)=1, F(n+2)=F(n+1)+F(n). Napište program, který zadané přirozené číslo n vyjádří jako součet členů Fibonacciho posloupnosti a výsledek zapíše do výstupního souboru. * Parametry: n, výstupní soubor. - **Automaty**: napište program, jenž bude imitovat chování automatu (bankomat, nápojový automat, ...). Program bude komunikovat s uživatelem přes příkazovou řádku, v automatu musí být chybové funkce typu došla hotovost, zasekl se nápoj a další, závislé na typu automatu. [[http://martin.feld.cvut.cz/~pelikano/vyuka/ALG/semestral.html|Více podrobností]]. - **IP kalkulačka**: naprogramujte kalkulačku pro práci s IP(v4) adresami. Program bude vizualizovat IP adresu v binární podobě, ze zadané adresy/masky vypočítá adresu sítě, broadcastu a určí rozsah adres pro stanice. Dále bude kalkulačka počítat optimální rozdělení sítě na podsítě, jako vstup dostane adresu sítě/masku a počty stanic v podsítích. Kalkulačka se bude volat z příkazové řádky, výstup bude na obrazovku, speciální přepínač zapíše výstup i do souboru. Jako inspiraci a ověření funkčnosti svého programu využijte program ''ipcalc''. - **Unblock Me Free Solver**: Napište program na řešení hry [[https://market.android.com/details?id=com.kiragames.unblockmefree|Unblock Me Free]]. Můžete využít hrubou sílu nebo heuristiku. Vstupem programu bude soubor s popisem levelu, výstupem bude seznam tahů kostičkami, které povedou k řešení levelu. Pokuste se najít i optimální řešení (tedy s minimálním počtem tahů). - **Vlastní zadání**: vlastní návrh semestrální práce musím schválit. Měl by obsahovat práci se souborem a poly nebo jinou datovou strukturou. Vysledný kód by měl mít minimálně 250 řádků.