Warning
This page is located in archive.

Ing. Petr Podhorský

Email: podhope1@fit.cvut.cz

Konzultace: po dohodě mailem

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

Aktuální stav

Ddocházka, bodování, kdo má jakou semestrální práci (formát .xlsx; aktuálnost dokumentu poznáte snadno podle toho, kdy je napsaná docházka):

dochazka.15.12.2010.zip

Pokud zjistíte, že jsem Vám nezapočítal domácí úkol, zkontrolujte si, že jste ode mne nedostali nějakou přípomínku. Pokud si myslíte, že je z Vaší strany vše ok a body přesto chybí, napište mi.

Test

Hodnocení

Již potvrzeno od přednášejícího: ze cvičení bude 50 bodů, zbylých 50 bodů pak u zkoušky.

Semestrální práce - 20 bodů (nutné minimum pro zápočet - 10 bodů)

Test u počítače - 20 bodů (nutné minimum pro zápočet - 10 bodů)

Aktivita, domácí úkoly - 10 bodů (nutné minimum pro zápočet - 5 bodů)

Domácí úkoly

  • Od 3. týdne dále budou zadávány domácí úkoly.
  • Každý úkol je třeba odvezdat emailem do začátku dalšího cvičení (tzn. máte na vypracování necelých 7 dnů). Počítá se datum a čas odeslání zprávy.
  • Do předmětu zprávy pište “A7B36ALG den a čas cvičení”, například: “A7B36ALG utery 12:45”, a úkol posílejte ze své školní adresy (…@fel.cvut.cz)
  • Za odevzdaný domácí úkol (fungující) dostanete x bodů (x bude stanoveno během/na konci semestru podle celkového počtu domácích úkolů tak, aby to vyšlo i s možnou aktivitou na 10 bodů).
  • Za každý další započatý týden, kdy úkol neodevzdáte, máte -0,5x bodů (to znamená za odevzdání o týden později máte již jen 0,5x, pak 0 a pak -0,5x; pak už je jedno, jestli úkol odevzdáte nebo ne - méně než -0,5x bodů nedostanete).
  • Pokud něco není jasné, napište mi email, nečekejte na další cvičení.
  • Zadání úkolu bude vždy na cvičení a poté jej hodím také sem.
  • Pokud to půjde (Váš projekt bude obsahovat pouze jeden soubor), vkládejte zdrojový kód přímo do těla emailu (nebalit ani nedávat jako přílohu) - aby se to celé dalo označit, zkopírovat, vložit do netbeans a zkompilovat.
  • Rada: neopisujte, přijďte na to sami. I když si toho nevšimnu, tak je to minus pro Vás, protože tohle jsou základy, které budete potřebovat v dalších předmětech.

Domácí úkol (3. týden, 5.10.2010, odevzdat do 12.10.2010)

  • Napište program, který načte od uživatele tři čísla a následně vypíše minimum, maximum a průměr z těchto 3 čísel.
  • Jak by to mohlo například vypadat z pohledu uživatele:
  Zadejte číslo 1: 2
  Zadejte číslo 2: 5
  Zadejte číslo 3: 4
  
  Minimum: 2, maximum: 5, průměr: 3,66. </code>

Domácí úkol na for a while (4. týden, 12.10.2010, odevzdat do 19.10.2010)

Napište program, který se bude ptát uživatele na celá čísla (int) a pro každé zadané číslo vypíše, zda-li jde o prvočíslo nebo ne. Při zadání 0 (nuly) program končí.

Definice prvočísla: číslo je prvočíslem tehdy, pokud je dělitelné pouze samo sebou a jedničkou. Nápověda: otestujte všechny čísla mezi 1 a zadaným číslem (bez nich), jestli je zbytek po celočíselném dělení nenulový (pokud bude nenulový, jde o prvočíslo; pokud Vám vyjde alespoň jednou nula, znamená to, že číslo je dělitelné a nejde o prvočíslo). Zbytek po celočíselném dělení zajišťuje operátor % (tedy například 4 % 3 == 1 a 6 % 2 == 0).

Ukázka výstupu:

  Zadejte cislo (0 pro konec): 2
  Cislo 2 JE prvocislo
  Zadejte cislo (0 pro konec): 3
  Cislo 3 JE prvocislo
  Zadejte cislo (0 pro konec): 5
  Cislo 5 JE prvocislo
  Zadejte cislo (0 pro konec): 6
  Cislo 6 NENI prvocislo
  Zadejte cislo (0 pro konec): 9
  Cislo 9 NENI prvocislo
  Zadejte cislo (0 pro konec): 11
  Cislo 11 JE prvocislo
  Zadejte cislo (0 pro konec): 0
  Program konci
  

Domácí úkol na funkce (5. týden, 19.10.2010, odevzdat do 26.10.2010)

Napište funkci, která zjistí, zda zadané číslo je celočíselnou druhou mocninou nějakého čísla (celého) - například 4 = 2*2 (4 tedy je), 9 = 3*3 (9 tedy je), 5 není (nelze rozepsat jakou součin X*X).

Dále napište funkci, která pro zadané hranice uzavřeného intervalu zjistí, kolik obsahuje druhých mocnin (tedy kolik čísel v intervalu splňuje výše uvedenou podmínku). Program na vstupu načte od uživatele dvě čísla a vypíše kolik je v zadaném intervalu celočíselných druhých mocnin (pokud tedy zadám například 9 a 12, tak výsledkem bude jedna, protože v tomto intervalu je pouze 3*3, nic dalšího).

V proceduře main bude pouze načtení hodnot (začátku a konce intervalu) od uživatele a vypsání výsledku funkce, která spočítá počet druhých mocnin.

Domácí úkol na pole (6. týden, 26.10.2010, odevzdat do 2.11.2010)

Napište program, který zinicializuje pole čísel (int nebo double), náhodně nastavených od 0 do 20. Velikost pole zadává uživatel. Program nejprve zinicializované pole vypíše, pak ho seřadí vzestupně a pak vypíše seřazené. Kód bude logicky strukturován - bude tedy obsahovat funkce/procedury na vytvoření pole (rovnou s naplněním náhodnými čísly), seřazení prvků v poli a vypsání pole.

Pro náhodné číslo použijte funkci Math.random(), která vrátí náhodné číslo typu double mezi 0.0 a 1.0.

Pokud neznáte žádný algoritmus na setřídění prvků v poli, můžete použít například tento: V poli naleznete minimální prvek a prohodíte ho s prvním. Nyní máte setříděný jeden prvek. Pak naleznete minimum ve zbytku pole (tedy od druhé pozice dál) a prohodíte toto nalezené minimum s druhým prvkem. Nyní už máte hotové dva prvky. Takto postupujete, až budete mít seřazené celé pole. Jinými slovy: při každém kroku hledáte minimum, dáte ho na správnou pozici a pak už řešíte jen zbytek.

Popis třídícího algoritmu můžete nalézt také například na Wiki: anglická verze, česká verze

Doplnění: třídění napište sami, nepoužívejte knihovní funkci Arrays.sort nebo nějakou jinou.

Domácí úkol na třídy (7. týden, 2.11.2010, odevzdat do 9.11.2010)

Vytvořte třídu reprezentující komplexní číslo (reálná a imaginární část typu double), která bude obsahovat následující:

  • konstruktor se 2 parametry reprezentující reálnou a imaginární složku,
  • konstruktor se 4 parametry (reMin, reMax, imMin, imMax), který vytvoří komplexní číslo s náhodnou reálnou složku v intervalu <reMin;reMax) a náhodnou imaginární složkou v intervalu <imMin;imMax) (pro náhodnost využijte funkce Math.random(), která vrací náhodné číslo typu double v intervalu <0;1)),
  • předefinujte funkci toString, aby vracela rozumnou interpretaci komplexního čísla (tzn. například “3+4i”, pozor na znamenénko, ať Vám nevzniká pro záporná čísla něco ve stylu “3+-4i”),
  • napište instanční funkci velikost(), která bude vracet double, což bude absolutní hodnota komplexního čísla (to znamená odmocnina ze součtu druhých mocnin jednotlivých složek; pro odmocninu využijte funkci Math.sqrt).

Program se uživatele zeptá na n (int) a intervaly, ve kterých má komplexní čísla vytvořit (půjde tedy o 4 hodnoty double, reprezentující minimální a maximální velikosti reálné a imaginární složky). Vytvoří se pole s n komplexními čísly zinicializovanými v těchto intervalech. Program tato čísla vypíše (udělejte samostatnou proceduru na výpis), pak je seřadí podle absolutního hodnoty sestupně (!) (samostatná procedura na seřazení) a znova je vypíše (voláme znovu proceduru na výpis). Při výpisu vypisujte jak komplexního číslo (jeho složky), tak i jeho absolutní hodnotu.

Rada: nezalekněte se delšího zadání, jde pouze o určitou kombinaci toho, co jsme dělali na cvičení a jaký byl minulý domácí úkol. Postupujte po jednotlivých krocích, program nebude ve výsledku o mnoho delší, než poslední úkol. V projektu budete mít dva soubory - posílejte mi zdrojové kódy jako dosud, jen je do emailu vložte za sebe, nějak si s tím poradím.

Ukázka výsledného výpisu programu (příklad):

  Zadej pocet cisel: 5
  Minimalni realna slozka: -3
  Maximalni realna slozka: 4
  Minimalni imaginarni slozka: -5
  Maximalni imaginarni slozka: 5
  Neserazena cisla:
  |0.4607010358547905-1.785884347440796| = 1.8443503861445945
  |3.7042987939700875+0.1882570933123917| = 3.7090794394553854
  |0.7737508685580314-2.044624792302161| = 2.186133790025433
  |-2.047140609352005-3.5970866880996732| = 4.138818347809188
  |0.6664080411314797+0.058721573585776454| = 0.6689902095614596
  Serazena cisla:
  |-2.047140609352005-3.5970866880996732| = 4.138818347809188
  |3.7042987939700875+0.1882570933123917| = 3.7090794394553854
  |0.7737508685580314-2.044624792302161| = 2.186133790025433
  |0.4607010358547905-1.785884347440796| = 1.8443503861445945
  |0.6664080411314797+0.058721573585776454| = 0.6689902095614596

Domácí úkol na soubory + opakování polí (8. týden, 9.11.2010, odevzdat do 16.11.2010)

Napište program, který se zeptá uživatele na rozměry dvojrozměrného pole, naplní ho náhodnými čísly od 0 do 9 (včetně) a vypíše součet “černých” čísel. Černá čísla jsou myšlena tak, že pokud byste dvojrozměrné pole vybarvili jako šachovnici (střídají se bílá a černá pole, vlevo nahoře bude bílé), půjde o čísla na černých polích. Celý program bude pracovat na dva kroky. V první kroku se program zeptá na rozměry pole, pole se vytvoří, zobrazí a uloží do souboru. Ve druhém kroku se ze souboru načte (uživatel již nezadává nic), opět se zobrazí a vypíše se zmíněný součet.

Požaduji opět program strukturovaný do rozumných logických bloků - minimálně tedy bude procedura na výpis dvojrozměrného pole, funkce na zjištění součtu černých polí a každý krok bude mít samostatnou proceduru. V proceduře main tedy bude pouze dotaz na uživatele, zda-li se má provést první nebo druhý krok, a následně if/switch se zavoláním příslušné procedury.

Příklad - 1. krok:

 Co se ma udelat? 1 pro vytvoreni, 2 pro nacteni: 1
 Pocet radku: 3
 Pocet sloupcu: 4
 2 4 8 0 
 2 7 7 2 
 8 1 9 8 

Příklad - 2. krok:

 Co se ma udelat? 1 pro vytvoreni, 2 pro nacteni: 2
 2 4 8 0 
 2 7 7 2 
 8 1 9 8 
 Soucet cernych poli je 22
 

Vysvětlení pro součet: 22 = 4 + 0 + 2 + 7 + 1 + 8 (když bych bral černá pole zleva doprava, shoru dolů).

Domácí úkol (9. týden)

Tento týden bude bez úkolu - doporučuji jej využít pro zapracování na semestrální práci. Příští cvičení bude čistě konzultační, takže Vám doporučuji si přinést Vaši práci, pracovat na ni a využít mé přítomnosti na řešení problémů. Stejně tak můžete využít tento týden a následující cvičení pro zopakování látky, která Vám nebyla jasná - zkuste si sami nějaký příklad; klidně mi jej můžete poslat, pokud si s ním nebudete vědět rady a já Vám pomohu.

Semestrální práce

  • Do 6. týdne musí mít každý vybranou semestrální práci. dřív mele - pokud si něco vyberete, napište mi email nebo se o téma přihlašte na cvičení).
  • Do 6. týdne mi mailem pošlete své zadaní včetně upřesnění, co všechno budete dělat. (Např. když budete mít jako téma šachy, je třeba přesně definovat, že např. nepřipustíte neplatné tahy, rozpoznáte šach-mat a některé druhy remízy, vygenerujete PGN atd.).

Již zabraná zadání

Úterý 12:45 - 1, 2, 3, 5, 6, 9, 10, 11, 15, 16, 17.

Úterý 14:30 - 1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17.

1. Převod číslo - slovní zápis

Úkolem je napsat program, který převede zadané číslo z celočíselného formátu na textový. Přičemž nový řetězec bude slovním zápisem zadaného čísla. Slovní zápis bude načten ze souboru a tak se určí cílový jazyk.

2. Maticová kalkulačka

Napište program, který bude provádět běžné matematické operace(+, -, * a inverzi) s maticemi, jejichž velikost zadá uživatel, které půjdou načíst ze souboru.

3. 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.

4. Člověče, nezlob se

Naprogramujte hru Člověče, nezlob se

5. 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.

6. Vypočet soustavy rovnic

Napište program, který pro zadaný počet proměnných vypočte soustavu rovnic s číselnou pravou stranou.

7. 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.

8. Analýza textu

Napište program, který zjistí 10 nejpoužívanější, nejméně používaná a nejdelší slova ve vstupním textu. Slova jsou oddělena bílými znaky(mezera, tabulátor, konec řádku).

9. Šifrování

Napište program, který pomocí substituce a transpozice zašifruje nebo rozšifruje vstupní text ze souboru. Velikost posunutí využité substituce a rozměry a přeházení sloupců zadává uživatel heslem.

10. Miny

Naprogramujte hru miny.

11. Piškvorky

Naprogramujte hru pro 2 hráče podle pravidel Piškvorek.

12. 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.

13. Dáma

Naprogramujte hru Dáma pro 2 hráče.

14. Sudoku

Naprogramujte generátor nových her Sudoku a rozhraní pro jejich hraní. Hru půjde uložit na disk a případně znovu vyvolat. Hra může nabízet i pomocníka při řešení.

15. Morseova abeceda

Napišto 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.

16. Výčet platidel

Napište program, který pro zadanou částu a hodnoty bankovek načtených ze souboru najde způsob ja danou částku vyplatit. Pokud je více možností vybere tu, kde je více velkých bankovek. Výsledek zapíśe do souboru.

17. Šibenice

Napište hru Šibenice, kdy ze slovniku v souboru načtete slovo a hráč ho bude po písmenech hádat. Přineuhádnutí klesne počet bodů a hráč prohraje, když klesnou body pod 0. Modifikujte hru i pro dva hráče, kteří se budou v zadávání slov střídat, když akt. hráč prohraje získá body oponent. Takto se bude moci i rozšiřovat slovník programu.

18. Lodě

Implementujte hru pro dva hráče Lodě. Hráči nesmí vědět, jak rozdělil lodě oponent.

19. Hledaní nejkratší cesty

Implementujte algoritmus pro nalezení nejkratší cesty grafem, který načtete ze souboru.

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ů.

Příklady ze cvičení

Na tomto místě máte ke stažení zabalené projekty ze cvičení ve stavu, v jakém byly na konci cvičení. Dávat je sem budu pouze na požádání (pokud je látka všem jasná, není nutné zahlcovat server).

3. týden

4. týden

5. týden

6. týden

utery6_1245.zip

utery6_1430.zip - Jednorozměrné pole

utery6_1430b.zip - Dvourozměrné pole

7. týden

8. týden

9. týden

Další informace

Práce se soubory

Jednoduché příklady na čtení/zápis do souboru lze nalézt na http://service.felk.cvut.cz/courses/Y36ALG/alg_cviceni/cvic11.html.

courses/a7b36alg/teacher/podhope1/start.txt · Last modified: 2015/01/16 21:04 (external edit)