Cvičení z programování I
Ve školním roce 2007/2008 vedu cvičení z předmětu Programování I [NPRG030]. Cvičení se koná každé sudé pondělí od 14.00 v S11, každé liché v tentýž čas v počítačové laboratoři SW2. K tomu potřebujete účet v laboratoři, založí vám ho pan Matouš (viz stránka laboratoří).
Podmínky k získání zápočtu jsou (AND):
- vypracování domácích úkolů za alespoň 100 bodů
- vypracování zápočtového programu
- zvládnutí zápočtové písemky (krátká písemka na operace s ukazateli na cvičení 17. prosince) na alespoň 12 bodů.
Zápočtový program
- Téma: libovolné, jaké si vymyslíte, má-li odpovídající obtížnost. Pokud vás ještě múza nepolíbila, podívejte se na můj seznam témat (na skladě též zdrojový text v TeXu a pěkně vysázená verze v PDF); přiměřené pro zimní semestr jsou úlohy obtížnosti 3 a vyšší. Jinými zajímavými zdroji inspirace mohou být: archiv programátorského korespondenčního semináře a archiv Matematické Olympiády kategorie P.
- Jazyk: nejlépe Pascal nebo C; pokud máte dobrý důvod použít něco jiného, ozvěte se, lze se domluvit.
- Odevzdání specifikace programu do konce listopadu. Tím mám na mysli krátký popis toho, co všechno by program měl umět. Vyhnete se tak tomu, že by váš zápočtový program odevzdaný den před koncem zkouškového období byl odmítnut jako příliš triviální nebo příliš podobný programu někoho z vašich kolegů.
- Nedílnou součástí zápočtového programu je dokumentace, a to jak uživatelská (vysvětující, jak se program ovládá), tak programátorská (ta popisuje, jak program uvnitř funguje; postrádá smysl popisovat každou funkci či proměnnou, zaměřte se spíš na celkový návrh programu a použité algoritmy, pokud jste je sami nevymysleli, je moudré uvést odkazy na zdroje, z nichž jste čerpali).
- Specifikaci i dokumentaci odevzdávejte buďto v papírové podobě nebo chcete-li šetřit naše lesy, elektronicky v libovolném otevřeném formátu (tím se myslí formát, jehož struktura je všeobecně známa a na jehož prohlížení není potřeba žádný komerční software; speciálně tedy ne MS Word!), nejlépe jako čistý text, HTML, PostScript či PDF.
- Hotový program mi mužete předat buďto na cvičení nahraný na CD či v lahvi (totiž USB flašce)
nebo jej poslat po Internetu, buďto e-mailem nebo (pokud je poněkud
větších rozměrů, řekněme nad 0.5MB) uploadem do
ftp://atrey.karlin.mff.cuni.cz/pub/priv/
(ale pak mi pošlete mail se jménem souboru). Pokud se zápočťák skládá z většího množství souborů, raději jej předtím zabalte ZIPem nebo TARem (RAR, prosím, ne). - Zápočtový program musí mít přiměřeně ošetřené vstupy. Tím se myslí, že komunikuje-li s uživatelem, měl by počítat s tím, že uživatel je nešika a občas zadá špatný vstup a nenechat se tím zmást a bez zaváhání je odmítnout. Naopak, pokud programujete knihovnu funkcí, můžete předpokládat, že všechny vstupy jsou korektní.
Domácí úkoly
Domácí úkoly jsou dvou druhů:
- Praktické – odladěné programy řešící jednoduché problémy. Odevzdávají se do CodExu, který je automaticky testuje. Jakmile si v CodExu založíte účet (pokud možno si jako kroužek nastavte 39), napište mi a já vás přidám do naší skupiny I39 a uvidíte všechny již zadané úlohy. Pozor, některé jsou platné pouze měsíc po vyhlášení!
- Teoretické – těžší problémy, kde jde daleko víc o efektivní algoritmus než implementační detaily. Řešení mi posílejte mailem, a to buď v těle zprávy nebo jako textovou přílohu. U některých úkolů je v hranatých závorkách zmíněna časová složitost, které (případně lepší) byste měli dosáhnout.
Na získání kýžené stovky bodů bohatě stačí praktické úlohy, pokud je řešíte včas.
Úkoly lze řešit v Pascalu nebo Céčku.
Datum | ID | Body | Příklady |
---|---|---|---|
15. 10. | bnim | 10 | Odebírání zápalek s jednou hromádkou. V každém tahu lze odebrat libovolnou mocninu dvojky, prohrává, kdo nemůže táhnout. Jaká je vyhrávající strategie? |
29. 10. | sqrt | 10 | Naprogramujte celočíselné odmocňování, tj. program, který pro zadané číslo N vrátí dolní celou část druhé odmocniny z N. Hint: půlení intervalu. Hint 2: nepoužívejte typ real. |
kmin | 20 | Naprogramujte hledání k-tého nejmenšího z N čísel v čase lepším než Ω(k*n). | |
5. 11. | divs | 25 | Napište program, který pro všechna čísla od 1 do N spočte, kolik mají dělitelů. Zkuste upravit Eratosthenovo síto a zachovat jeho původní časovou složitost O(n*log log n). |
12. 11. | sums | 10 | Je zadána posloupnost přirozených čísel a číslo K. Napište program, který v této
posloupnosti najde souvislý úsek, jehož součet je přesně K. [O(n)]
[+10 bodů] Totéž, ale s celými čísly místo přirozených. [O(n*log n)] |
26. 11. | loop | 20 | Napište funkci, která o zadaném jednosměrném spojovém seznamu určí, zda je či není zacyklený (tj. poslední prvek má jako další nikoliv nil, nýbrž některý z předchozích prvků). Žádá se lineární čas a konstantní pomocná paměť (to speciálně znamená, že zadaný seznam nesmíte nijak modifikovat). |
padd | 10 | Napište sčítání polynomů v řídké reprezentaci (spojový seznam dvojic (koef, exponent) uspořádaný vzestupně podle exponentu; členy s nulovými koef. chybí. [O(n)] | |
pmul | 20 | Napište násobení polynomů v téže reprezentaci. Nezapomeňte odstraňovat členy s nulovými koeficienty. [čas O(n2), prostor O(n)] |
Libovolný příklad můžete poslat vícekrát, vždy platí nejvyšší dosažené skóre.