Po první praktické zkoušce z PA1 jsem na základě odevzdaných programů (a toho, co jsem viděl) sepsal krátký návod na to, jak zkoušku úspěšně dokončit a čeho se vyvarovat. Snad někomu pomůže v jeho cestě za úspěšým dokončením.
Před tím, než začnete cokoliv psát, si pořádně přečtěte celé zadání a rozmyslete si, co budete dělat. Zjistit po hodině programování, že jste napsali něco jiného, než je v zadání, není úplně příjemné.
Pokud máte už nějaký termín za sebou a přijde vám, že zadání zkoušky je téměř stejné, stejně si ho pořádně přečtěte a promyslete. Zdání někdy klame...
Pro většinu z vás bude lepší nejprve napsat každý program na 75% a poté se snažit o rychlost a tedy zbývajících 25%.
Máte k dispozici manuálové stránky a offline web cppreference.com - využijte je. Spoustu věcí, které si nepamatujete (jako např. pořadí parametrů v knihovních funkcích) najdete tam.
Progtestový image beží v RAMce a to znamená, že po restartu se celý vyresetuje. Vaše soubory tam tedy již nenajdete. Není proto úplně od věci si pro jistotu řešení občas zálohovat do Progtestu.
Nespouštějte CodeBlocks. Toto IDE má závažné problémy s leakováním paměti a může způsobit i totální zamrznutí počítače (i dlouho po té, co byl vypnutý!). Pokud jste tak udělali, radši si restartujte počítač.
Naučte se pracovat s chary. Jsou to jenom čísla a dají se od sebe mimojiné odečítat. Pokud tedy chcete indexovat pole od A do Z, index jednoduše získáte přes idx = symbol - 'A';
.
Funkce na získání indexu z písmena jsou špatně!
switch(c) {
case 'A':
return 0;
case 'B':
return 1;
...
}
Pokud pracujete s malými i velkými písmeny, uvědomte si, že nejsou v ASCII za sebou a jsou mezi nimi další symboly.
Alokace pole pro všechny hodnoty ASCII zbytečně plýtvá pamětí (hlavně pokud se jich alokuje veliké množství).
Nesnažte se nahradit úplně chybějící znalosti knihou. Jestliže se s pointery seznamujete poprvé na zkoušce z Učebnice jazyka C, máte podobnou šanci na úspěch, jako kdybyste se seznamovali s pointery z posledního Pána prstenů.
Pokud s sebou už knihu máte, není úplně od věci se alespoň trochu seznámit s tím, co v knize je a kde.
Nebojte se používat struktury. Pokud se s nimi naučíte správně a rychle pracovat, ušetříte si spoustu práce a kódu, který by byl u práce s více poli. Některé problémy bez nich ani efektivně řešit nejdou (například řazení více polí dle jednoho z nich).
Správně použité struktury dělají navíc kód přehledný a tím pádem pěkně čitelný a jednoduše debuggovatelný.
Zamyslete se nad složitostí řešení, které se chystáte napsat. Cvičení na složitost nebylo jen proto, aby se mohla objevit v teoretickém testu. To platí dvojnásob pokud chcete z úkolu 100% (tedy i s testy na rychlost).
Funkce a bloky kódu, které jsou nejnáročnější, by měli být spouštěné co nejméně krát. Zrychlováním částí kódu, které zabírají malý čas výpočtu, se celý program zrychlí jen minimálně (viz. BI-APS).
Ačkoliv funkční naivní řešení většinou projde alespoň na 75%, studenti jsou často schopni vymyslet i taková, která už na druhém testu skončí na rychlosti.
Zkouškové příklady jsou většinou relativně krátké (do 200 řádků) a každý kdo přesně ví, co dělá, by je měl být schopen napsat obě do hodiny. To ale neplatí, pokud si pořádně nerozmyslíte, co děláte.
Jestliže je váš kód delší než 200 řádků a ještě se neblížíte ke konci, je dost pravděpodobné, že děláte něco špatně (to nutně neznamená, že řešení nebude fungovat, ale jde udělat o dost jednodušeji).
I v časovém pressu je dobré programovat dle nějakých dobrých zásad. V přehledném kódu se o moc lépe orientuje, lépe se debugguje a často vznikne rychleji, než zbastlené řešení.
Občasné komentáře nejsou jenom pro code review, ale pomohou i vám (tím se nemyslí extenzivní komentování funkcí, ale občas pár slov pro popis složitějších bloků).
Pokud vám vznikají obří bloky zakomentovaného kódu, které ještě nechcete mazat, není úplně od věci si je překopírovat do jiného souboru. Ve zdrojáku, kde je 75% věcí zakomentovaných se orientuje o dost hůře.
Naučte se používat quick sort funkci.
Pro řazení využijte funkci quick sort (qsort(...)
). Přes manuálové stranky se dá najít i příklad, nicméně určitě je lepší si porovnávací funkci zkusit napsat předem aby fungovala správně a prošla přes pedantic
.