(!)

Vítejte na stránkách předmětu
Programování v jazyce C

Na těchto stránkách najdete všechny potřebné informace jednak ke zdárnému absolvování předmětu KIV/PC a jednak ke snadnému uvedení do problematiky programování v jazyce C v podobě dané zejména normou ANSI X3.159-1989 (ANSI C/C89) a ISO/IEC 9899:1999 (C99) v takovém rozsahu, abyste mohli v hlubším studiu pokračovat samostatně...
POZOR! Všechny řádně odevzdané (tj. uploadnuté na validační server s výsledkem "práce prošla") semestrální práce již byly ohodnoceny a body jsou zapsány v sekci Výsledky. Známky, které se již nemůžou změnit (ani kdyby jejich majitelé ještě přišli na další zkouškový pokus), budou nyní vyučující zadávat do STAGu. V případech, kde by ještě lepší výkon u zkoušky mohl známku změnit, počkáme se zápisem do STAGu po posledním zkouškovém termínu, který bude vypsán někdy na začátku letního semestru.

Tyto stránky spravují přímo vyučující předmětu a jsou tedy tím "nejčerstvějším" zdrojem informací. Údaje uvedené ve STAGu či Courseware1 nemusejí být aktuální. Řiďte se, prosím, pokyny uvedenými na těchto stránkách.

Důležité termíny

V zimním semestru akademického roku 2023/2024 jsou pro studenty předmětu Programování v jazyce C důležité a závazné tyto termíny:

Termín Datum
Mezní termín odevzdání semestrální práce bez penalizace
(včasné odevzdání)
Ne 07. 01. 2024, 23:59:59
Mezní termín odevzdání semestrální práce s 50%-ní penalizací
(pozdní odevzdání)
Ne 14. 01. 2024, 23:59:59

Ostatní závazné termíny se shodují s celouniverzitními (např. mezní termín získání zápočtu, mezní termín vykonání zkoušky a další).

Zajímavé související akce

Avizovaný jednorázový rychlokurz práce s profesionálním typografickým systémem TeX/LaTeX proběhne

v úterý 7. 11. 2023 od 16:30 (přibližně do 19:30) v US207 v  budově FAV

– zde si můžete stáhnout leták v PDF a v sekci LaTeX prezentaci z přednášky a některé další materiály.

Znalost LaTeXu je pro studenta naší fakulty dle našeho názoru téměř nezbytností – výhody tohoto geniálního software pro přípravu dokumentů oceníte zejména při psaní bakalářské či diplomové práce. K seznámení s LaTeXem můžete využít materiály v sekci LaTeX.

Poznámka na okraj

V minulých letech valná většina průšvihů, které skončily špatnou známkou nebo nějak hůř, vyplynula z toho, že dotyčný student nechal řešení objevivšího se problému na poslední chvíli. Rádi vám pomůžeme, pokud to bude jen trochu možné, ale řešte s námi své problémy včas...

Přejeme Vám hodně úspěchů při studiu.

Kamil Ekštein a František Pártl
(vaši vyučující)


1Stanovisko garanta předmětu Programování v jazyce C k podpoře systému Courseware: Dokud systém nebude přehlednější a jednodušší, nebude fungovat bezchybně a dostatečně rychle a nebude obsahovat všechny potřebné komponenty (jako např. sandbox k automatické validaci semestrálních prací), nebude pro potřeby předmětu využíván. Považujte, prosím, informace, které jsou v Courseware k předmětu Programování v jazyce C případně uvedené, za zastaralé a neplatné.

Informace o předmětu

Předmět Programování v jazyce C (STAG-kód KIV/PC) si klade za cíl seznámit studenty s programováním v jazyce C – tedy ve vysoce přenositelném nízkoúrovňovém kompilovaném imperativním procedurálním jazyce, který vznikl v letech 1969 – 1973 v Bellových laboratořích AT&T díky úsilí Kena Thompsona, Dennise Ritchieho a Briana Kernighana. Hlavním důvodem vzniku jazyka byl probíhající vývoj operačního systému UNIX, jehož podstatná část je v jazyce C naprogramována.

Díky relativně přímé projekci zdrojového kódu v jazyce C na strojový kód cílového počítače (a tedy snadné konstrukci překladače a rychlému překladu) s sebou nese programování v tomto jazyce řadu specifik a úskalí, kterým je věnována v předmětu KIV/PC odpovídající pozornost. Student by měl absolvováním předmětu nejen získat znalosti potřebné pro programování v jazyce C v podobě dané zejména normou ANSI X3.159-1989 (ANSI C/C89) a ISO/IEC 9899:1999 (C99), ale i mnohem obecnější přehled, který mu umožní pracovat s prakticky libovolným nízkoúrovňovým jazykem, a seznámit se s obecnými principy nízkoúrovňového a systémového programování (tedy hlavně s mechanismy přímého přístup do paměti prostřednictvím ukazatelů, alokace a dealokace paměťových bloků, atp.).

Ačkoliv řada "odborníků" již před mnoha lety prorokovala jazyku C brzký konec, stále platí (možná trochu překvapivě), že je to jeden z nejpoužívanějších programovacích jazyků na světě nebo vůbec ten nejpoužívanější – lze to ověřit např. v tzv. TIOBE Indexu na stránkách společnosti TIOBE, která se specializuje na objektivní analýzu kvality software. Jazyk C se s C++, Javou a Pythonem pravidelně již několik let střídá na prvním místě. Důvodem je mimo jiné také to, že v Javě virtuální stroj Javy nenapíšete.

Náplň předmětu

Lexika a syntax jazyka ANSI C a C99 (řídicí konstrukce, definice datových typů, deklarace proměnných, výrazy, funkce). Práce s ukazateli a správa paměti. Standardní knihovna ANSI C a (částečně) C99: Vstupně-výstupní operace, operace s řetězci a znaky (a locale), ovládání souborového systému a práce se soubory, matematické funkce, interakce programu s běhovým prostředím (datum a čas, chybové stavy, řízení života procesu, proměnné prostředí, signály). Programátorský model procesoru (a související partie assembleru procesorů rodiny Intel 80x86). Preprocesor jazyka C a podmíněný překlad, překladové moduly. Návaznost překladače na okolí, linkování modulů vytvořených v jiných jazycích (zejména assembleru), paměťové modely. Ladění programů a odstraňování chyb. Problémy přenositelnosti (zejména mezi platformami Win32/64 a UNIX/Linux). Mechanismus překladu a sestavování – makefile. Pomocné vývojové nástroje (splint, valgrind, debugger, profiler, ...).

V případě dostatku času na konci semestru: Základy programování aplikací s grafickým uživatelským rozhraním v jazyce C za pomoci frameworků na tvorbu uživatelských rozhraní – knihovny GTK, Nuklear, případně jiné.

Na předmět Programování v jazyce C logicky i obsahově navazuje předmět Programování v jazyce C++ (STAG-kód KIV/CPP). Přednášející jsou navzájem názorově kompatibilní a kamarádí se – předměty jsou tedy dobře sladěné. Pokud vás tedy jazyk C zaujme a budete chtít pokračovat ve studiu jeho objektově orientovaného nástupce, určitě si zapište i předmět KIV/CPP.

Zajištění a rozvrh předmětu v ZS 2023/2024

Přednáší, cvičí a zkouší:  Ing. Kamil Ekštein, Ph.D. — KEx 
E-mail: keksteinkiv•zcu•cz
Kancelář: UC310
Konzultační hodiny: Út 11:00 – 12:00, St 11:00 – 12:00
Telefon: (+420) 377 63 2406

Dále cvičí a zkouší:  Ing. František Pártl FPa 
E-mail: fpartlntis•zcu•cz
Kancelář: UN522
Konzultační hodiny: Po 10:00 – 11:00, St 10:00 – 11:00
Telefon: (+420) 377 63 2597

Rozvrh předmětu

 1   2   3   4   5   6   7   8   9   10   11   12   13   14 
7:30
8:15
8:25
9:10
9:20
10:05
10:15
11:00
11:10
11:55
12:05
12:50
13:00
13:45
13:55
14:40
14:50
15:35
15:45
16:30
16:40
17:25
17:35
18:20
18:30
19:15
19:25
20:10
Po FPa
UC333
FPa
UC333
Út KEx
UC333
KEx
UC333
KEx
UP104
KEx
UP104
KEx
UP104
St XXx
XX000
XXx
XX000
XXx
XX000
XXx
XX000
XXx
XX000
XXx
XX000
KEx
UC333
KEx
UC333
FPa
UC333
FPa
UC333
FPa
UC333
FPa
UC333
XXx
XX000
XXx
XX000
Čt XXx
XX000
XXx
XX000
XXx
XX000

Podmínky získání zápočtu a zkoušky

Student má nárok na zápočet tehdy, jestliže odevzdá včas semestrální práci dle zvoleného zadání a získá za ní (za program a dokumentaci dohromady) celkem alespoň 21 bodů. Nejvíce lze získat za semestrální práci 70 bodů. Body se při hodnocení práce odečítají od maxima, tj. student přichází s čistým štítem (a plným počtem bodů) a za nalezené chyby v práci jsou mu body vyučujícím strhávány podle předem známého chybovníku.

Studenti vypracovávají své semestrální práce samostatně. Spolupráce více studentů na semestrální práci není dovolena a ani není vhodná, neboť právě samostatným programováním řešení zadaného problému se nejlépe připravíte jak na zkoušku, tak na budoucí programátorskou praxi.

Značná pozornost je při hodnocení semestrální práce věnována její dokumentaci. Kvalita (nebo spíš nekvalita) dokumentace může představovat klidně rozdíl celého stupně výsledné známky v závěrečném hodnocení. Technická dokumentace je vizitkou inženýra, a proto její přípravě věnujte maximální úsilí. Hodnotí se i schopnost odborného vyjadřování v českém (případně anglickém) jazyce. Je to dobrá průprava k bakalářské či diplomové práci.

V případě mimořádných výkonů studenta (vynikající nadprůměrná práce, originální řešení zadaného problému, nadstandardní aktivita při cvičení, atp.) udělí vyučující v průběhu či na konci semestru další body, které se započítávají do celkového výsledku.

Bližší informace o semestrální práci

Zkouška probíhá u počítače – student dostane za úkol vytvořit nebo doplnit krátký program v jazyce C a demonstrovat jeho bezchybnou funkčnost. U zkoušky je možné získat až 30 bodů podle kvality odvedené práce (hodnotí se porozumění problému, čitelnost kódu, dodržování kultury jazyka C, efektivita řešení a správné použití konstrukcí jazyka C). Čas na vypracování je 120 minut (což je více než dostatečné – dobře připravení studenti úlohu vyřeší do hodiny); po vypršení tohoto časového limitu se strhává z hodnocení zkoušky 1 bod za každou další minutu.

Zkoušku skládá student zcela samostatně. Může ovšem používat studijní materiály, které si přinese (poznámky z přednášek, učebnice a jiné knihy, atp.). Tyto materiály si ale studenti během zkoušky nesmí mezi sebou předávat. Vzájemná komunikace studentů při zkoušce není dovolena žádným způsobem (tedy ani pomocí mobilních telefonů, e-mailu, instant messagingu ani jiných podobných prostředků) a postihuje se okamžitým ukončením zkoušky s výsledkem "nevyhověl".

Protože zkouška je silně stresující okamžik, který může významně negativně ovlivnit výkon studenta, podílí se na celkové známce jen z 30%. Student, který poctivě a pilně pracoval v průběhu semestru, a má tudíž dostatek bodů za semestrální práci, nemůže být z předmětu vyhozen, v nejhorším případě je hodnocen známkou "dobře".

Bližší informace o zkoušce

Celkové hodnocení studenta (získaná známka) je odvozeno od konečného součtu bodů získaných v průběhu semestru, za semestrálku a u zkoušky:

Počet bodů Hodnocení
50 a méně nevyhověl
51 – 70 dobře
71 – 88 velmi dobře
89 a více výborně

Bodové rozpětí zhruba respektuje gaussovskou distribuci (jedniček je nejméně). Své hodnocení (bodové i slovní vyučujícím po provedené kontrole semestrální práce) a výslednou známku najde každý student v sekci Výsledky podle svého osobního čísla.

Přednášky

Kliknutím na symbol diskety ( ) si můžete vybraný materiál uložit na disk počítače, případně otevřít přímo v prohlížeči. K zobrazení dokumentu ve formátu PDF (Portable Document Format) použijte aplikaci Adobe Acrobat Reader (na počítačích v univerzitní síti je obvykle nainstalovaná), kterou můžete získat zdarma na webu společnosti Adobe Systems Inc.

Prezentace neodpovídají zcela přesně jedné 3-hodinové přednášce z předmětu Programování v jazyce C – spíše pokrývají určité souvislé tématické celky. Obvykle se tedy nestane, že první týden semestru se odpřednáší přednáška číslo 1, druhý týden číslo 2, atd.

Prezentace z přednášek
Číslo Stručný obsah přednášky Soubor
(0) Úvodní informace – představení předmětu, jeho cíle a náplň. Rámcový program přednášek a cvičení. Organizace předmětu, průběh semestru. Požadavky k zápočtu a zkoušce, podmínky absolvování předmětu (totéž je také zde na webu). Důležité informace a zdroje studijních materiálů.
(1) Základní technické a historické informace o jazyce C. Použití, výhody a nevýhody, silné a slabé stránky. Stručný úvod do lexiky a syntaxe, nejjednodušší programy. Program typu "Hello, world!", vazba programu na operační prostředí.
(2) Bližší pohled na syntax jazyka C, klíčová slova, základní konstrukce řízení běhu programu. Podmíněné a nepodmíněné větvení programu (if – else, return, break, continue), konstrukce switch, cykly (for, while, do).
(3) Deklarace proměnných, jednoduché datové typy a jejich definice, datový typ pole, ukazatel, výčet, struktura, bitové pole, union, datový typ funkce, definice vlastního datového typu, definice konstant, definice funkcí, přiřazovací příkaz, vstupně-výstupní operace, prázdný příkaz a příkaz skoku.
(4) Výrazy, operátory, volání funkcí, předávání parametrů funkcím, přetypování čili explicitní typová konverze, podmíněný výraz, dosazovací výraz a dosazovací operátory, čárkovaný výraz.
(5) Preprocesor jazyka C, lexikální konvence preprocesoru, definice maker preprocesoru a maker s parametry, rekurze maker, předdefinovaná makra v ANSI C, vkládání hlavičkových souborů, podmíněný překlad, předávání informací překladači – příkaz #pragma.
(6) Řízený a automatizovaný překlad – nástroj make, příprava makefile, komentáře, tvorba pravidel, explicitní a implicitní pravidla, definice cílů, symbolické cíle, makra v makefile, příkazy operačního systému v makefile.
(7) Vstupně-výstupní operace, soubory a proudy, standardní proudy stdin, stdout a stderr, operace se soubory, formátovaný vstup a výstup, chyby při práci se soubory, jejich detekce a řešení, pokročilé souborové operace.
(8) Správa paměti, základní operace s pamětí – alokace a uvolnění bloku, realokace bloků, dynamická pole, pole jako argumenty funkcí, znakové řetězce, funkce pro práci s řetězci.
(9) Znakové a řetězcové konstanty, funkce pro zpracování znaků, matematické funkce, generátor náhodných čísel, technika generování náhodných čísel s jiným než rovnoměrným rozdělením.
(10) Datum a čas, měření doby běhu programu, práce s kalendářním časem, výpočet rozdílu časových údajů. Řídicí funkce a diagnostika, ladicí makra, příkazový procesor operačního systému, násilné ukončení programu, ukončovací funkce, signály. Standardní rozšíření jazyka podle normy ANSI C, ošetření chybových stavů, práce s proměnnými operačního prostředí, prohledávání bisekcí, řazení algoritmem QuickSort. Funkce s proměnným počtem argumentů.

Obsah a provedení přednášek © Kamil Ekštein, 2006 – 2024. Všechna práva vyhrazena. Žádná část přednášek nesmí být publikována a šířena žádným způsobem a v žádné podobě bez výslovného svolení autora. Přednášky, prosím, používejte v souladu se zákonem č. 121/2000 Sb., Zákon o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), v platném znění.

V přednáškách se mohou přes veškerou snahu a péči, kterou jim věnuji, vyskytovat chyby, ať už formální nebo věcné. Pokud nějakou chybu najdete, budu vám vděčný, když mě na ní upozorníte (osobně nebo e-mailem).

Staré, již nepoužívané prezentace z přednášek
(jsou zde k dispozici pro případné doplnění a rozšíření poznatků)
Číslo Stručný obsah přednášky Soubor
(OI.13) Připojování externích binárních modulů – linker, příprava externího modulu v assembleru, práce se segmenty a segmentovými registry procesoru, překlad assemblerem, předávání parametrů podprogramu v assembleru.
(OI.14) Úvod do objektově orientovaného jazyka C++. Nejdůležitější změny oproti jazyku ANSI C. Nové syntaktické elementy – definice konstant, inline funkce, předávání parametrů funkcím odkazem, odkaz jako návratový typ funkce, deklarační příkaz, typový systém a třídy, datový typ bool. Přetěžování. Vytváření a rušení instancí objektů – operátory new a delete. Jmenné prostory.
(OI.15) Objekty v C++, definice třídy, deklarace objektu. Specifikátory přístupu k prvkům objektu, členské funkce čili metody, modifikátory metod. Konstruktor a destruktor. Dynamické instance objektů. Přetěžování operátorů.
(OI.16) Dědičnost tříd, specifikace dědění, význam a užití specifikátorů. Polymorfismus. Abstraktní metody. Vícenásobná dědičnost, možné kolize při ní.
(OI.18) Multiplatformní knihovny na tvorbu grafických uživatelských rozhraní (Qt a GTK+). Rámcový přehled architektury Qt a GTK+. Získání, instalace a specifika překladu programů s Qt či GTK+. Minimální aplikace v Qt a GTK+. Přidávání vizuálních komponent – widgetů. Řízení činnosti aplikace událostmi, signály a sloty. Qt Designer.
(OI.19) Genericita, šablony. Šablony funkcí pro jeden či více datových typů. Šablony tříd a jejich metod. Knihovna STL (Standard Template Library), kontejnery (třída Vector), příklady a ukázky použití.
(OII.16) Programátorský model procesoru. Registry: všeobecné registry (střadače), segmentové registry, zvláštní registry, příznakový registr. Typy dat, endian procesoru. Přerušení. Volání podprogramů. Paměťové modely.

Obsah a provedení přednášek © Kamil Ekštein, 2006 – 2013. Všechna práva vyhrazena. Žádná část přednášek nesmí být publikována a šířena žádným způsobem a v žádné podobě bez výslovného svolení autora. Přednášky, prosím, používejte v souladu se zákonem č. 121/2000 Sb., Zákon o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), v platném znění.

Cvičení

Cvičení probíhají u počítačů v učebně UC333. Nenahrazují výklad – cílem cvičení je ověřit si znalosti nabyté na přednášce (příp. samostudiem) v praxi naprogramováním řešení zadaných úkolů. Cvičit je tedy možné i doma (účast na cvičení není povinná). Na cvičení se tedy píšou krátké programy v jazyce C, a oproti samostatné práci doma zde máte možnost konzultovat správnost "svého" přístupu k řešení se cvičícím a s kolegy. K získání zápočtu a úspěšnému složení zkoušky z předmětu Programování v jazyce C není účast na cvičení nutná, ale může významně napomoci. Dlouhodobě se potvrzuje významná korelace mezi účastí na cvičení a výslednou známkou.

Plán cvičení

Uvedená čísla týdnů jsou pouze orientační – v důsledků změn v rozvrhu (např. z důvodů státních svátků, apod.) se mohou uvedené úlohy řešit v jiném kalendářním týdnu.

Rozpis cvičení
Cvičení Týden Úkoly
1. 39. Úvodní informace, seznámení s předmětem, diskuse o programátorských schopnostech a dovednostech a technikách, jak je zlepšovat, vstupní dotazník.
2. 40. Ovládání překladačů jazyka C (Embarcadero Dev-C++, Microsoft Visual C/C++, GCC); tvorba jednoduchého programu ve stylu "Hello World" – základní řídicí konstrukce jazyka; překlad a sestavování jednoduchých programů (s cílem dokonale pochopit mechanismus překladu modulů a jejich propojení linkerem); stručný úvod do LaTeXu (volitelně).
3. 41. Psaní jednoduchých programů s využitím základních datových typů a řídicích konstrukcí jazyka C; převody čísel mezi polyadickými soustavami; převody reprezentací čísel (IEEE float a bitový zápis) – využití ukazatelů na základní datové typy; práce s polem.
4. 42. Procvičení práce s ukazateli – na typ funkce (program "jednoduchá kalkulačka") a na typ struktura (jednosměrně zřetězený spojový seznam).
5. 43. Překlad výrazů s prefixovým/postfixovým operátorem snížení/zvýšení hodnoty – ověření chování překladače; dynamická správa paměti, práce s pointery, binární vyhledávací strom.
6. 44. make, hlubší procvičení práce s ukazateli – tvorba knihovny maticových operací a demonstrační program, který ověří její správnou funkčnost.
7. 45. Implementace zásobníku, práce s řetězci, převod textu na číslo, zpracování aritmetických výrazů – konstrukce jednoduchého zásobníkově orientovaného parseru.
8. 46. Implementace prefixového stromu (trie), ověření funkčnosti vytvořením frekvenčního slovníku z rozsáhlého textu a/nebo uložením rozsáhlého existujícího slovníku.
9. 47. Použití standardního rozšíření jazyka ANSI C – funkcí void *bsearch(...) a void qsort(...) z knihovny stdlib.h, práce s rozsáhlejšími soubory dat.
10. 48. Linkování modulů v různých jazycích na úrovni .obj souborů, práce s debuggerem obecně, x32dbg/x64dbg (nebo podobný nástroj), základy reverzního inženýrství – lokalizace určitého úseku kódu, jeho úprava/odstranění.
11. 49. rezerva/konzultace (obsah bude upřesněn)
12. 50. rezerva/konzultace (obsah bude upřesněn)
13. 51. "zkouška na nečisto"

Zadání úkolů k samostatnému procvičení

Řešení (nebo jeho nástin) níže uvedených úkolů na jednotlivá cvičení najdete na konci této stránky – v části Řešení úkolů. K co nejlepšímu zvládnutí jazyka C je však žádoucí, abyste úkoly zpracovávali opravdu pokud možno samostatně a přiložená řešení použili až jako poslední pomoc nebo k ověření správnosti svého postupu.

Úkoly k samostatnému procvičení – 2

  1. Napište minimalistický program hello.c, který nedělá nic – pouze vrací nějakou návratovou hodnotu pomocí příkazu return ve funkci int main(). Otestujte návratovou hodnotu (vypsáním na obrazovku) v dávkovém souboru. Vyzkoušejte tento program přeložit různými dostupnými překladači.
  2. Upravte program hello.c tak, aby návratovou hodnotu převzal jako parametr z příkazového řádku.
  3. Prozkoumejte důkladně mechanismus překladu a sestavování spustitelného souboru. Připravte dva zdrojové soubory v jazyce C. První nechť obsahuje pouze funkci int main(), v níž se volá zatím nikde nedefinovaná funkce int disp(). Druhý soubor nechť obsahuje pouze funkci int disp(). Ověřte, že oba tyto programy lze přeložit a po sestavení do spustitelného souboru i spustit (linker převedl tzv. symboly na adresy skutečného výkonného kódu).
  4. Napište program na konverzi teploty ze stupňů Fahrenheita na stupně Celsia. Program si vyžádá vstup číselného údaje o teplotě ve stupních Fahrenheita a následně vypíše ekvivalentní hodnotu ve stupních Celsia. Převodní vztah lze nalézt např. na Wikipedii.

Úkoly k samostatnému procvičení – 3

  1. Napište program, který bude převádět celé dekadické číslo předané jako parametr na příkazové řádce do binární soustavy. Je-li parametr na příkazové řádce ve špatném formátu (není to číslo, obsahuje nesmyslné znaky, apod.), nechť program vypíše srozumitelné chybové hlášení. K převodu ze znakové reprezentace (char *argv[i]) do celočíselné můžete využít funkci int atoi(const char *str); z knihovny stdlib.h.
  2. Napište program, který bude převádět dekadické číslo s pohyblivou desetinnou čárkou ve formátu IEEE (datový typ float) předané jako parametr na příkazové řádce do šestnáctkové a dvojkové soustavy. Je-li parametr na příkazové řádce ve špatném formátu (není to číslo, obsahuje nesmyslné znaky, apod.), nechť program vypíše srozumitelné chybové hlášení. K převodu ze znakové reprezentace do číselné využijte funkci double atof(const char *str); z knihovny stdlib.h. V binární reprezentaci odlište (např. svislou čárou) bity náležející znaménku, exponentu a mantise.
  3. Kdo by se nudil, může si zkusit naprogramovat i převod opačný, tj. z šestnáctkové reprezentace na reálné číslo.
  4. Napište program bubble.c, který bude řadit prvky (typu int) pole o velikosti aspoň 20 položek algoritmem Bubble Sort. Hodnoty prvků pole vygenerujte náhodně pomocí funkcí void srand(unsigned seed) a int rand() z knihovny stdlib.h.
  5. Kdo by se nudil, může si zkusit naprogramovat i jiné metody řazení (např. Quick Sort).

Úkoly k samostatnému procvičení – 4

  1. Na rozcvičení napište během maximálně 10 minut funkci void swap(...), která bude navzájem zaměňovat obsah svých dvou argumentů typu int. Správnou činnost funkce ověřte jednoduchým programem.
  2. Napište program calc.c, který bude vykonávat základní matematické operace (sčítání, odčítání, násobení, dělení, umocnění) a to tak, že využijete možností datového typu ukazatel na funkci. Nadefinujete 5 funkcí pro sčítání, odčítání, atd. se dvěma parametry. V hlavním cyklu výpočtu se podle uvedeného znaménka početní operace přiřadí do proměnné typu ukazatel na funkci vracející T příslušná funkce (např. float (*comp_fn) (float a, float b); ... comp_fn = add;). Výpočetní mechanismus bude tedy stále (bez ohledu na zvolenou operaci) volat tutéž funkci – vlastně proměnnou typu ukazatel na funkci vracející T (např. result = comp_fn(a, b);).
  3. Napište program, který bude spravovat jednosměrný spojový seznam (seznam dynamicky zřetězených prvků). Položkou seznamu bude záznam struct person { char name[32]; int age; ... }. Program bude umět záznamy přidávat, rušit a vypisovat a rušit celý seznam.
  4. Kdo by se nudil, doprogramuje do úlohy z předchozího bodu řazení seznamu metodou zatřiďování.

Úkoly k samostatnému procvičení – 5

  1. Prozkoumejte chování překladače při práci s výrazy, ve kterých je obsažen operátor inkrement (++) a dekrement (--):
    1. i = i++;
    2. i = ++i;
    3. if (i++ == ++i) ...
    4. if (i++ && ++i) ...
    5. j = (j++ * --i) + ++j;
    6. apod.
    Cílem tohoto úkolu je uvědomit si nebezpečnost používání tohoto operátoru v komplexnějších výrazech vzhledem k mnohdy neočekávanému výsledku. Pokuste se nejprve odhadnout výsledek a pak teprve spusťte testovací program.
  2. Napište program bst.c, který bude pracovat s binárním vyhledávacím stromem. Naprogramujte v odděleném modulu tree.c funkce na vkládání, vyhledávání a rušení uzlu stromu. Zajistěte "rozumné" (textové pochopitelně) zobrazení stromu v konzoli.
  3. Zbude-li Vám čas, doplňte modul tree.c o funkce na vyvažování binárního vyhledávacího stromu tak, aby vytvářený strom splňoval podmínky AVL stromu.

Úkoly k samostatnému procvičení – 6

  1. Vytvořte knihovnu operací s maticemi matrix.c a k ní příslušný hlavičkový soubor matrix.h. Knihovna bude obsahovat vhodnou datovou strukturu struct matrix {...};, která umožní uchovávání matice libovolné velikosti v paměti (matice má vždy 2 rozměry – řádky a sloupce), funkce na vytvoření (alokaci) nové matice, zrušení matice, umístění prvku do matice a dále matematické funkce realizující základní maticové operace, tj. sčítání, násobení a transpozice, a pochopitelně také funkci, která matici v čitelné podobě zobrazí na konzoli. Prvky matice uvažujte reálné, tj. datový typ double. Pokud nemáte v maticích úplně jasno, zkuste odkaz http://en.wikipedia.org/wiki/Matrix_operation.
  2. Překlad a sestavení celého cvičného projektu provádějte nástrojem make. Vytvořte v pracovním adresáři projektu soubor makefile podle pokynů z přednášky. Nástroj make musí zajistit překlad knihovny i demonstračního programu a následné slinkování .obj souborů.
  3. Doplňte do makefile cíl clean, který odstraní po překladu z adresáře nepotřebné soubory.

Úkoly k samostatnému procvičení – 7

  1. Vytvořte knihovnu pro práci se zásobníkem stack.c. Nechť prvkem zásobníku je libovolný datový typ daný pouze svojí velikostí v bytech. Tato velikost bude předána funkci stack *createstack(int size, int itemlen);, která vytvoří dynamicky zásobník o size položkách, přičemž každá bude mít velikost itemlen. Samozřejmostí je implementace dvou základních funkcí zásobníku – void push(stack *s, void *data); a void pop(stack *s, void *data);
  2. Napište program, který bude pomocí zásobníku – a tedy výše popsané knihovny – zpracovávat aritmetické výrazy. Nejprve naprogramujte vyhodnocování tzv. postfixových výrazů, např. "2 3 + 5 5 + *", jehož výsledkem je 50.
  3. Až odladíte jednodušší variantu pro postfixové výrazy, naprogramujte také zpracování tzv. infixových výrazů, tedy běžných aritmetických výrazů typu "9 + 5 / 8 - 3 * 2", kde je priorita výpočtu dána prioritou operátorů.
  4. Doplňte předchozí variantu programu o zpracování priority operací, tj. naprogramujte analýzu uzávorkovaných výrazů (uvažujte pouze jeden druh závorek – kulaté).

Úkoly k samostatnému procvičení – 8

  1. Vytvořte knihovnu pro práci s prefixovým stromem (angl. trie) trie.c a k ní příslušný hlavičkový soubor trie.h. Zajistěte, aby bylo možné do trie uložit libovolný řetězec ASCII znaků, tj. každý uzel trie může mít až 256 potomků. V každém uzlu bude také informace o počtu na dané místo vložených řetězců tak, aby trie fungovala jako frekvenční slovník.
  2. V knihovně implementujte funkci pro vkládání řetězce do trie int insert(char *str); a pro zjištění frekvence daného řetězce int get_freq(char *str);. Tato funkce bude zároveň použitelná pro zjištění, zda je řetězec v trii uložen – pokud tam totiž není, bude vracet nulu. Knihovna bude samozřejmě obsahovat také funkce pro vytvoření a zrušení prefixového stromu.
  3. Ověřte funkčnost vytvořené knihovny naprogramováním jednoduché aplikace, která načte do paměti rozsáhlý slovník czech-325.dic a bude ověřovat, zda se uživatelem zadávané výrazy ve slovníku vyskytují (např. dokud uživatel nezadá "quit" apod.) nebo ne.

Úkoly k samostatnému procvičení – 9

  1. Naprogramujte aplikaci, na které si vyzkoušíte práci se standardním rozšířením ANSI C – funkcemi void *bsearch(...) a void qsort(...) z knihovny stdlib.h. Vaše aplikace nechť načte data ze seznamu studentů uloženého v souboru slist.csv ve formátu CSV (Comma-Separated Values). Uložte načtená data do vnitřní struktury vašeho programu (může to být pro jednoduchost statické pole prvků typu struct student { char id[6], char name[32], char surname[64], int t_pts, int e_pts, int w_pts, char date[10]}). Nadefinujte potřebné porovnávací funkce pro funkce void *bsearch(...) a void qsort(...).
  2. Zajistěte seřazení souboru podle příjmení studentů a uložení takto seřazeného souboru.
  3. Naprogramujte vyhledávání záznamu podle osobního čísla studenta.

Úkoly k samostatnému procvičení – 10

  1. POZOR! U této úlohy se liší postup v případě použití balíku Microsoft Visual C/C++ od použití GCC. GCC používá jiné konvence při předávání argumentů funkcím a také linker pracuje jinak. Je třeba z archivu vybrat správné zdrojové soubory.
  2. Stáhněte si zdrojové soubory v archivu sem10.zip – soubor qsortdemo.c je program řadící náhodně vygenerované pole 20 prvků vzestupně metodou QuickSort; využívá externí funkci void swap(int *x, int *y), která je zapsaná v assembleru v souboru swap.asm.
  3. Proveďte překlad assemblerem Microsoft Macro Assembler z balíku Microsoft Visual Studio zadáním příkazu ml swap.asm /c a posléze přeložte C-soubor příkazem cl s přepínačem /Zi, který zajišťuje přidání ladicích informací a slinkujte s objektovým souborem swap.obj.
  4. V případě nejasností se pokuste vyhledat příslušné informace na Internetu nebo v nápovědě MSDN.
  5. Vyzkoušejte si práci s debuggerem  x32dbg/x64dbg podle pokynů vyučujícího nebo podle nápovědy v debuggeru či na Internetu.
  6. Dopište do programu v C ochranu heslem (stačí primitivní pomocí funkce int strcmp(const char *str1, const char *str2);) nebo si stáhněte tento program s heslem zahashovaným algoritmem MD5, program přeložte bez ladicích informací, takže v debuggeru nebudete mít k dispozici zdrojový kód, ale pouze assembler. Pokuste se nalézt strojový kód podmínky if (...) ... a zabránit přepsáním příslušných instrukcí skoku do negativní větve v případě zadání špatného hesla.

Řešení úkolů k samostatnému procvičení

V archivu se nachází vypracované úkoly ze cvičení 2 až 7. Jedná se o variany, které byly naprogramované společně na cvičení. Neznamená to, že by u řady úloh nebyl možný jiný postup – právě naopak, předložená řešení představují často jen jednu z mnoha možností.

Řešení úkolů – archiv ZIP – 9 KB

Semestrální práce

Zadání semestrální práce si student může vyzvednout kdykoli v průběhu semestru vybráním jednoho ze tří níže uvedených zadání – o vybrané semestrální práci nemusíte vyučujícího informovat. Práci je třeba odevzdat nejpozději v neděli 7. 1. 2024 ve 23:59:59 – uploadem na server. Za práci odevzdanou po tomto datu získá její autor pouze 50% bodů oproti odevzdání téže práce včas. To platí do neděle 14. 1. 2024, opět do 23:59:59. Po tomto mezním termínu již není možné práci odevzdat, resp. její případné odevzdání již nezakládá nárok na zápočet.

Pokud odevzdaná práce nesplňuje požadavky zadání, může vyučující nařídit její přepracování. O případném přepracování však vždy rozhoduje vyučující – nespoléhejte tedy na to, že odevzdáte včas pouze polotovar, a když za něj obdržíte málo bodů, přinesete vylepšenou verzi (to nebude fungovat, vyučující v takovém případě práci odmítne).

Pokud student nemůže ze závažných (např. rodinných nebo zdravotních) důvodů práci včas odevzdat, měl by o této skutečnosti co nejdříve informovat vyučujícího (e-mailem, telefonicky, zanecháním vzkazu na sekretariátu katedry, apod.), který následně stanoví odklad odevzdání nebo navrhne náhradní postup. Pokud však student vyučujícího o důvodech prodlení neinformoval (ačkoli mohl), nemůže být k důvodům přihlédnuto.

Zadání semestrální práce na ZS 2023/2024

Vyberte si, prosím, z níže uvedených témat to, které vás zajímá nebo se vám nejvíce zamlouvá. Úlohy jsou rámcově stejně složité a přibližně stejně časově náročné.

  1. Generátor dokumentace zdrojového kódu
    Podrobné zadání úlohy č. 1 – dokument PDF – 411 KB

  2. Digitální steganografie
    Podrobné zadání úlohy č. 2 – dokument PDF – 389 KB

  3. Algoritmus Minimax v deskové hře Othello
    Podrobné zadání úlohy č. 3 – dokument PDF – 244 KB

V záhlaví každého zadání semestrální práce je vpravo uvedena zkratka označující vyučujícího, který toto zadání připravil (zkratka je stejná jako v seznamu výsledků a rozvrhu předmětu). Najdete-li v zadání nějaké nejasnosti nebo budete-li se chtít zeptat na nějaké detaily, kontaktujte, prosím, právě tohoto vyučujícího.

Individuální zadání semestrální práce je možné v případě, že student pracuje na nějakém vlastním zajímavém projektu, který může (nebo jeho část) vypracovat v jazyce C. Je třeba, aby vyučující schválil, že má vaše vlastní zadání odpovídající rozsah a náročnost. V případě, že chcete pracovat na individuálním zadání, kontaktujte vyučujícího a dohodněte si podrobnosti.

Odevzdání semestrální práce

Upozornění: Po kliknutí na níže uvedený odkaz budete z bezpečnostních důvodů přesměrováni na stránku jednotného přihlašování (SSO) do portálu ZČU. Budete vyzváni k zadání svého uživatelského jména a hesla. Jde o stejné jméno a heslo, jakým se přihlašujete ve veřejných učebnách či k serveru eryx.zcu.cz.

 Elektronické odevzdání práce

Počet pokusů odevzdání práce není nijak omezen. Uvědomte si ale, že čím více se bude blížit mezní termín odevzdání, tím více lidí se bude pokoušet práci odevzdat a zatížení validačního serveru se nutně podstatně zvýší, takže validace může trvat i několik minut (nebo se také nemusí provést vůbec, bude-li server extrémně přetížen). Nenechávejte proto odevzdání na poslední chvíli.

Obecné pokyny k semestrální práci

Semestrální práce se skládá ze dvou částí: (i) samotné aplikace se zdrojovými kódy a (ii) dokumentace. Obě tyto části musí být v odevzdaném archivu typu ZIP: Archiv může obsahovat adresáře, ale Makefile musí být v kořenovém adresáři archivu – tzn. že když např. vypíšeme obsah archivu, musí být "vidět hned", nesmí být uvnitř jakéhokoliv adresáře, který je v archivu uložen. Totéž platí pro soubor PDF s dokumentací (kvůli automatické kontrole). Pokud si nejste organizací archivu jisti, podívejte se, jak je to udělané u vzorové semestrální práce.

Do odevzdávaného archivu, prosím, nepřibalujte testovací data – validační systém používá vlastní sadu testovacích dat pro každou úlohu. Ta, která případně odevzdáte v archivu spolu s programem, se stejně nepoužijou, takže se tím jen plýtvá místem na disku serveru.

Obecné pokyny k aplikaci

Programové vybavení (aplikaci), které řeší zadanou úlohu, vytvořte v jazyce ANSI C (nestanovil-li vyučující jinak) a zajistěte, aby bylo možné je přeložit pomocí běžných překladačů (určitě aspoň gcc a Microsoft Visual C/C++), které byly zmíněny v první přednášce. Aplikace by měla být přenositelná (multiplatformní) – tj. přeložitelná a spustitelná jak v prostředí Win32/64, tak UNIX/Linux (či Mac OS X).

Součástí odevzdaného ZIP archivu musí být Makefile a všechny zdrojové a jiné potřebné soubory – nepůjde-li práce přeložit voláním nástroje make v kořenovém adresáři projektu, nebude přijata k hodnocení.

V první fázi odevzdání, poté co provedete upload vaší práce na server, se práce automaticky kontroluje shellovým skriptem, který ověří, že archiv lze rozbalit a že obsahuje vše potřebné. Poté zavolá program make. Pokud překlad skončí chybou, zobrazí se vám protokol s chybovým hlášením a práce bude odmítnuta. Pokud se překlad podaří, provede se kontrolní běh programu na testovacích datech a jeho výsledek se porovná s ověřeným výsledkem. Pokud bude vše v pořádku, budete informováni o úspěšném přijetí práce. Aby to tak bylo, je ovšem nezbytně nutné dodržet všechny pokyny v zadání – zejména formáty souborů a parametrů na příkazové řádce. Pročtěte si důkladně podrobné zadání!

Uvolňujte veškerou alokovanou paměť. Pomocí vlastních funkcí pro správu paměti se přesvědčte, že jste uvolnili všechnu alokovanou paměť (alespoň počítáním alokovaných a uvolněných bloků). Přítomnost těchto funkcí s alespoň minimálním kontrolním mechanismem se také hodnotí. Prvotní ověření korektní práce s pamětí zajišťuje program splint již v kontrolním skriptu při uploadu. Detailní analýza práce s pamětí se provádí také automaticky nástrojem valgrind – tímto užitečným programem byste měli svojí práci určitě zkontrolovat před odevzdáním. Neprojde-li bez chyby testem valgrindem, nemá smysl pokoušet se jí odevzdávat.

Používejte dostatek komentářů: Není třeba komentovat samozřejmé úseky kódu. Je-li ve zdrojovém kódu funkce printf(), je vyučujícímu jasné, že se píše na obrazovku. Naopak komentujte zdrojový kód tam, kde jste se uchýlili ke zkratkovitému zápisu, kde jste použili méně obvyklou konstrukci, případně tam, kde je v kódu konstrukce, která se nemá používat (nekonečná smyčka, goto, atp.). Hlavičky funkcí je nutné aspoň minimálně okomentovat.

Snažte s psát zdrojový kód co nejčitelněji. Odsazujte bloky (o tabulátor nebo 2 mezery vpravo). Aritmetické výrazy pište bezpečným, řídkým způsobem (operátor je obklopen mezerami). Úvodní příkaz a uzavírací závorka bloku (složeného příkazu) musí být pod sebou. Kvalita a čitelnost zdrojového kódu a dodržování kultury zápisu jazyka C je významnou součástí hodnocení. Prostudujte si vzorovou semestrální práci, kde je tento tzv. coding style, tj. jednotný a systematický způsob zápisu zdrojového kódu, velmi pečlivě dodržován.

Obecné pokyny k dokumentaci

Dokumentace semestrální práce z předmětu PC se odevzdává pouze elektronicky – jako soubor ve formátu PostScript nebo Portable Document Format (PDF), který je součástí ZIP archivu nahraného na server.

S ohledem na katastrofální obsahovou, jazykovou i estetickou úroveň celé řady bakalářských a diplomových prací odevzdaných v posledních letech jsme se po zralé úvaze rozhodli přistoupit k nepopulárnímu – poněkud diktátorskému – kroku a stanovit, že dokumentace semestrální práce musí být vytvořena v sázecím systému LaTeX, aby aspoň základní estetická úroveň dokumentu byla zaručena.

Dokumentace může být napsána v českém nebo v anglickém jazyce a by měla mít rozsah alespoň 8 až 10 stránek A4 původního textu (sázeného písmem velikosti nejvýše 12 pt) a musí obsahovat tyto oddíly (kapitoly):

  1. Zadání – opsané (možno zestručnit s odkazem na původní dokument zadání) znění vybraného zadání od vyučujícího nebo formulace vlastního problému, který si student vymyslel po konzultaci s vyučujícím sám.
  2. Analýza úlohy – podrobný rozbor problémů, které daná úloha přináší, nástin jejich řešení (různými postupy), posouzení vhodnosti a zvládnutelnosti nastíněných řešení a odůvodněná volba některého z nastíněných řešení. Zde je velmi žádoucí ilustrovat výklad vhodnými obrázky, grafy, apod. Za analýzu nelze považovat popis naprogramovaného řešení (viz dále)!
  3. Popis implementace – nebo také tzv. programátorská dokumentace. Popis implementace řešení, které bylo vybráno ve fázi analýzy jako vhodné k implementaci. Popis použitých významných datových struktur, použitých algoritmů (pokud to nejsou standardní algoritmy – např. Bubble Sort není třeba popisovat). Popis jednotlivých modulů programu a mechanismu jejich součinnosti (např. sdílení datových struktur, apod.). Popis případného řešení pro zajištení přenositelnosti mezi platformami (např. podmíněné připojení knihoven pro dané platformy, apod.). Podle této programátorské dokumentace by měl být jiný programátor schopen vaše dílo např. upravit nebo doplnit o nové funkce.
  4. Uživatelská příručka – Důkladný popis programu pro jeho uživatele. Postup přeložení a sestavení programu na různých platformách (pokud se liší), popis ovládání všech funkcí programu a popis formátu datových souborů (pokud jsou a pokud jejich formát není zřejmý). Ukázky běhu programu pro různá vstupní data. Měla by být doplněna screenshoty nebo jinými vhodnými obrázky.
  5. Závěr – shrnutí dosažených výsledků (např. časů běhu), zhodnocení splnění zadání, naznačení možných a žádoucích vylepšení, stručné shrnutí problémů, které se v semestrální práci vyskytly.

Stanoveným nástrojem na přípravu a úpravu dokumentu je LaTeX – vypracování dokumentace k semestrální práci může tedy být vhodnou příležitostí se tento vynikající nástroj naučit používat. Při psaní bakalářské či diplomové práce jeho přednosti v plné míře oceníte. K rychlému a snadnému uvedení do problematiky psaní dokumentace v LaTeXu můžete použít materiály v sekci LaTeX.

Estetická kvalita dokumentu je také součástí hodnocení – nemělo by tedy chybět číslování stránek, vhodné použití fontů, zarovnávání (to vše za vás udělá LaTeX, pokud mu v tom výslovně nezabráníte), znak univerzity na titulní stránce, kvalitní – nejlépe vektorové – obrázky, atd. Technický dokument bez obrázků či schémat je podezřelý!

Za dokumentaci lze získat až 20 bodů z celkového počtu 70 za semestrální práci. Věnujte tedy přípravě dokumentace také odpovídající pozornost! Ztráta bodů za dokumentaci může vést i ke snížení výsledné známky.

Hodnocení semestrální práce

Pokud práce projde automatickou kontrolou při uploadu na server (tou se zjistí, zda práce obsahuje všechny potřebné soubory, lze bez chyby přeložit a spustit, dodržuje stanovený formát vstupních/výstupních dat, atp.), pokračuje v jejím hodnocení vyučující. Každá práce, která projde automatickou kontrolou, má na počátku hodnocení plný počet bodů, tj. 70. Body se odečítají od maxima v případě nalezení chyb podle předem pevně stanoveného chybovníku.

Vzorová semestrální práce

Vzorovou práci naprogramoval přednášející podle tohoto zadání (jedná se o jedno ze zadání semestrální práce pro studenty z roku 2007). Program byl napsán částečně v editoru Cream (for Vim) a částečně ve vývojovém prostředí wxDev-C++ 6.10.2 a přeložen překladačem gcc. Testován byl i překlad pomocí Microsoft Visual C/C++. K dispozici je Makefile pro gcc (stejný pro UNIX/Linux i Win32/64) a Makefile.win pro Microsoft Visual C/C++. Zdrojový kód odpovídá normě ANSI C, a proto by měl jít přeložit libovolným překladačem ANSI C na libovolné platformě. Formát vstupu a výstupu (soubory a přepínače) je naprosto stejný na všech platformách.

Boole: vyhodnocování logických formulí – archiv ZIP – 24 KB

Algoritmické řešení úlohy, její dekompozice, zvolené techniky i zápis zdrojového kódu odpovídají představám vyučujícího o kvalitní práci – takhle nějak by mělo vypadat i vaše dílo.

Pokud si chcete prohlédnout rozkladový strom analyzované formule, potřebujete ještě program GraphViz. Generování stromu bylo naprogramováno nad rámec zadání zejména proto, aby bylo vidět, jakým způsobem probíhá syntaktická analýza formule technikou rekurzivního sestupu.

Zkouška

Cílem zkoušky je nejen ověřit úroveň a hloubku nabytých teoretických znalostí, ale také schopnost analyzovat existující zdrojový kód, která je pro programátora často klíčová a je proto také v komerční praxi vysoce hodnocená.

Zkouška probíhá u počítače – úkolem studenta je napsat či upravit existující jednoduchý program v jazyce ANSI C podle zadání vyučujícího. Nejčastěji se bude doplňovat nějaká funkce do programu drill.c, což je jakýsi primitivní souborový analyzátor, nebo se bude upravovat aplikace řešící hlavolamy sudoku, sudoku.zip.

Maximální čas na vypracování zkoušky je 120 minut. Po vypršení tohoto časového limitu se strhává z hodnocení zkoušky 1 bod za každou další minutu. Při zkoušce je povoleno používat pomůcky – knihy, skripta, záznam přednášek, apod. a samozřejmě počítač. Množství pomůcek je omezeno pouze nosností studenta – myslete ale na prostorové požadavky svých kolegů a nezavážejte učebnu náklady materiálu, obvykle kvantita nezaručuje kvalitu. Pomůcky si studenti pochopitelně nesmí v průběhu zkoušky předávat či vyměňovat, také nesmí komunikovat žádným způsobem2 spolu, ani s nikým "zvenčí".


2)  Jsou zakázané veškeré prostředky elektronické i jiné komunikace (např. e-mail, SMS, ICQ, Jabber, Telegram, WhatsApp, Facebook, Twitter, apod.) – nehodláme je explicitně vyjmenovávat; to, že přijdete na nějaký, který nebyl zmíněn, neznamená, že ho smíte používat. Nesmíte!

Na zkoušku je třeba se zapsat na portálu, přičemž platí běžné podmínky pro zápis na zkoušku tak, jak jsou definovány portálem a studijním a zkušebním řádem ZČU (mezní časy odhlašování, apod.). Termínů zkoušky bude vypsán dostatek (pokud se vám jich teď zdá málo, nezoufejte – podle zájmu se budou objevovat další termíny v průběhu zkouškového), takže každý bude mít pohodlně šanci se zapsat na tři povolené pokusy. Není třeba (dle zkušeností z minulých let) se zapisovat na více termínů hned na začátku zkouškového období.

Témata zkoušky

  • Souborový analyzátor Drilldrill.c
  • Řešič hlavolamu Sudoku Solversudoku.zip

Datasety ke zkouškovým úlohám

Studijní materiály a pomůcky

V této sekci najdete vše, co začátečník (ale i celá řada pokročilých programátorů) potřebuje k úspěšnému vývoji software v jazyce C.

Podpůrné DVD pro začínající programátory v jazyce C

Zde si můžete stáhnout obraz DVD, na kterém jsou všechny důležité nástroje, které budete potřebovat k úspěšnému a relativně bezbolestnému proniknutí do programování v jazyce C. Najdete na něm několik různých překladačů, programátorských editorů, debuggerů, značné množství dokumentace (převážně anglicky) a několik užitečných pomocných nástrojů a knihoven.

Podpůrné DVD pro začínající programátory v jazyce C – ISO obraz – 3,38 GB

K namontování ISO obrazu DVD na vašem počítači (tj. aby se ISO obraz jevil systému jako DVD vložené do mechaniky a nebylo nutné jej vypalovat na fyzický nosič) můžete použít software Virtual CloneDrive.

Dokumentace – knihy a kurzy

Referenční karta jazyka C – List A4, na kterém je z obou stran shrnut jazyk ANSI C tak, aby bylo možné rychle (ale bez detailů) najít jakýkoliv element jazyka. Je vhodné si tuto kartu vytisknout na tvrdý papír A4 a případně zalaminovat – taková pomůcka pak může dobře posloužit u zkoušky (je povolena)...

C Reference Card – PDF – 100 KB

learn-c.org Free Interactive C Tutorial – Interaktivní online kurz jazyka C v anglickém jazyce (což by ale pro budoucí profesionální programátory neměl být problém), jednotlivé kapitoly pokrývají nejdůležitější tématické okruhy jazyka C. Přímo na webu je možné spouštět demonstrační zdrojové kódy a libovolně je modifikovat, tak aby bylo vidět "co to udělá".

Wikibook: Programming in C – Elektronická kniha o programování v jazyce C z projektu Wikibooks – můžete jí nalézt na adrese http://en.wikibooks.org/wiki/C_programming nebo si jí stáhnout v PDF z níže uvedeného odkazu. Kniha je napsaná celkem srozumitelně, místy však obsahuje zbytečně mnoho detailů a je orientována zejména na GCC.

Programming in C – PDF – 1234 KB

David Martinek: Nedělejte zbytečné chyby – Velice praktická a dobře napsaná příručka z pera Ing. Davida Martinka z Fakulty informačních technologií VUT Brno. Příručka obsahuje cenné rady jak pro začátečníky, tak pro pokročilejší programátory. Každopádně je velmi dobré (a doporučené) se s ní aspoň rámcově seznámit ještě před započetím práce na semestrálce.

Nedělejte zbytečné chyby při programování v C – PDF – 301 KB

Dokumentace – software

Programming reference for the Win32 API (Application Programming Interface) – Úplný popis mechanismů, datových struktur a funkcí, které operační systémy založené na jádře Win32 dávají k dispozici aplikacím. Bez této nápovědy prakticky nelze naprogramovat plnohodnotnou aplikaci pro Windows.

Programming reference for the Win32 API – odkaz na web Microsoftu
Win32 API Windows Help – instalátor pro Windows – 13 MB

Překladače a vývojová prostředí – užívaná na cvičení

Embarcadero Dev-C++ – Vynikající integrované vývojové prostředí pro jazyk C/C++ naprogramované původně v Borland Delphi 6 (zdrojový kód v Object Pascalu je pro zájemce k dispozici na webu), které je dostatečně jednoduché pro začátečníka a přitom dostatečně výkonné pro zkušeného programátora. Součástí produktu je port překladače gcc na platformu Win32/Win64 (MinGW). Velmi vhodný nástroj k výuce jazyka C v rámci předmětu KIV/PC (na části cvičení se pracuje právě s tímto prostředím a překladačem).

Microsoft Visual Studio Community – Volně dostupná verze vynikajícího překladače a vývojového prostředí, které je součástí komerčního vývojového balíku Microsoft Visual Studio. Překladač je velmi rychlý a produkuje vysoce optimalizovaný kód – i zavilí nepřátelé Microsoftu musí připustit, že je to jeden z vůbec nejlepších překladačů jazyka C/C++.

GNU Compiler Collection (GCC) – Balík, považovaný v Linuxu za naprostou klasiku, nabízí kvalitní výkonné překladače C, C++, Objective-C, Fortranu, Javy a Ady a rozsáhlou kolekci pomocných vývojových nástrojů. Kód, generovaný GCC překladačem C/C++ patří mezi nejrychlejší. Nevýhodou balíku je skutečnost, že neobsahuje žádné použitelné integrované vývojové prostředí a jeho správná instalace není úplně přímočará záležitost – chcete-li GCC provozovat na platformě Win32/64, doporučujeme vaší pozornosti port Mingw-w64, což je optimalizovaná verze kolekce překladačů pro Win32/64.

Další překladače a nástroje

MSYS2 – Velice užitečná vývojová platforma MSYS2 je vlastně – velmi zjednodušeně řečeno – jakýsi UNIX pro Windows. Veškeré součásti této platformy jsou nativní spustitelné soubory pro Win32/64, které ale přesně odpovídají stejnojmenným nástrojům z UNIXu/Linuxu. Díky tomu je možné např. ve Windows spouštět shellové sestavovací skripty zdrojových distribucí softwarových balíků (a mnohé další zajímavé věci). Také instalace překladače GCC je zde výrazně jednodušší, než v samotných Windows – stačí jen do konzole MSYS2 zadat příkaz pacman -S mingw-w64-x86_64-toolchain a balíčkový manažer pacman (tentýž, který je v některých distribucích Linuxu, např. v Archu či Manjaru) se postará o bezchybnou funkční instalaci.

Clang: C Language Front-end for LLVM – jazykový front-end pro programovací jazyky z rodiny C (C, C++, Objective-C/C++, OpenCL a CUDA) pro vysokovýkonný modulární překladač LLVM. Poslední dobou obliba (v závislosti na průběžně se zvyšující kvalitě) tohoto velmi promyšleného překladače raketově roste a v řadě projektů úspěšně nahrazuje poněkud zkostnatělý GCC.

Open Watcom C/C++ – Kvalitní překladač pro celou řadu platforem distribuovaný v rámci open source projektu. Jedná se o další (dosud živé) vývojové stádium vynikajícího a v 90. letech 20. století velmi slavného překladače společnosti Watcom, která jej posléze uvolnila k open source vývoji. Balík obsahuje kompletní sadu vývojových nástrojů v kvalitě vyšší, než je běžná u nekomerčních produktů. Podpora ANSI standardu je vynikající. Rozsáhlou dokumentaci v PDF (v angličtině) najdete na stránkách produktu.

LCC-Win: A Compiler System for Windows – Malý a zcela soběstačný systém pro vývoj programů v C/C++ na platformě Win32/64. Součástí balíku je obsáhlá dokumentace API Win32, kurz jazyka C a další užitečné věci. Tento balík je ideální pro začátečníka, který nechce na svůj počítač instalovat megabyty komplikovaných vývojových prostředků. Výsledný kód ovšem pochopitelně nedosahuje (zejména co se týče rychlosti a kvality optimalizace) úrovně "velkých" překladačů.

x86 Open64 Compiler Suite – Vysokovýkonný překladač optimalizovaný pro instrukční sadu procesorů řady x86 společnosti AMD (ale umí i generickou instrukční sadu, případně optimalizovaný kód pro procesory Intel) založený na open-source projektu Open64 Compiler and Tools.

Eclipse C/C++ Development Tooling – Balík vývojových nástrojů pro velmi sofistikované vývojové prostředí Eclipse, které nabízí mimořádný komfort a nesmírně rozsáhlé možnosti (synax highlighting, šablony, code completion, automatické verzování, refactoring, atp.). Bohužel je ale toto prostředí zároveň značně komplikované, a tudíž ho nelze doporučit pro začátečnické projekty. Také (protože je napsané v Javě) je na starších počítačích dost líné. Balík CDT pro přílušnou verzi Eclipse lze stáhnout ze stránky CDT Downloads webu Eclipse.org.

Na Internetu lze najít mnoho dalších překladačů jazyka C – dá se totiž říct, že každý pořádný programátor si jednou (a někteří i víckrát) za svůj profesní život zkusí napsat překladač... A proč ne zrovna jazyka C? Ovšem ne všechny na Internetu dostupné překladače jsou prakticky použitelné. Prosím, vyhněte se příliš exotickým překladačům – jsou s nimi jen zbytečné problémy, se kterými vám vyučující nepomohou.

Další zdroje informací

Jazyk C patří k nejzdokumentovanějším programovacím jazykům vůbec. Je prakticky vyloučeno, že byste na Internetu nenašli odpovědi na své otázky. Univerzitní knihovna je také dobře zásobena knihami o programování v jazyce C. Z nich lze doporučit zejména:

  1. Samuel P. Harbison, Guy L. Steele Jr.: Referenční příručka jazyka C. Veletiny: SCIENCE, 1996. ISBN 80-901475-50.
  2. Pavel Herout: Učebnice jazyka C. České Budějovice: Kopp, 2009. ISBN 978-80-7232-383-8.
  3. Miroslav Virius: Jazyky C a C++ – kompletní kapesní průvodce. 2. aktualizované vydání. Praha: Grada Publishing, 2011. ISBN 80-247-1494-9.

Informace k typografickému systému LaTeX

LaTeX (vyslovuje se [lejtech]) je zatím nepřekonaný dávkový typografický systém, pomocí kterého lze vytvářet technické dokumenty profesionální kvality. LaTeX je vlastně rozšíření původního systému TeX, vymyšleného a naprogramovaného D. E. Knuthem, o rozsáhlou sadu maker od L. Lamporta, které doplňují jeho možnosti a usnadňují výrobu dokumentů.

TeX je dávkový, tzn. funguje vlastně jako překladač zdrojového kódu dokumentu: Uživatel připraví ve speciálním (nikterak složitém) formálním jazyce zdrojový kód dokumentu, překladač TeXu ho zpracuje a vyrobí výstupní soubor ve formátu DVI (DeVice Independent), PostScript nebo PDF. To sice vypadá na první pohled velmi uživatelsky nepřívětivě, ale opak je pravdou. Skutečnost, že TeX nemá grafické uživatelské rozhraní je bohatě vyvážena faktem, že v něm všechno jde a vypadá to dobře. V TeXu se nestává, že by se najednou změnilo číslování stránek, obrázky se samy přemístily jinam, a podobné legrace, které běžně předvádí textové procesory komerčních výrobců...

Odkazy na distribuce TeXu

MiKTeX – vynikající distribuce určená primárně pro Win32/64. Hlavní výhoda spočívá v tom, že umí "dotahovat" chybějící balíky a automaticky je připojovat k existující instalaci. Další výhody jsou velmi dobrá podpora češtiny a snadná a účinná instalace...

TeX Live – velmi komplexní distribuce podporovaná TUG (TeX Users Group) a CSTUG (Czechoslovak TeX Users Group). Lze nainstalovat přímo z Internetu, podporovány jsou jak Windows, tak Unix/Linux. Lépe funguje v Linuxu...

Z vlastní zkušenosti doporučuji pro Windows spíše MiKTeX. V TeX Live je trochu komplikovanější rozchodit češtinu a některé podpůrné nástroje. V Linuxu funguje TeX Live bezchybně – v moderních distrech postavených na Debianu stačí pouze zadat v shellu příkaz apt-get install texlive a pak k doinstalování jazykového balíku s češtinou apt-get install texlive-lang-czechslovak.

Instalace ve Windows

K úspěšné práci v TeXu sice v zásadě stačí to, co nainstaluje instalátor MiKTeXu, ale pro větší uživatelský komfort je dobré mít vytvořené jakési vývojové prostředí, které sestává z několika dalších užitečných nástrojů. Co všechno a jakým způsobem nainstalovat popisuje níže zmíněná stránka Fakulty elektrotechniky a komunikačních technologoií Vysokého učení technického v Brně věnovaná LaTeXu.

Podrobná dokumentace instalace LaTeXu

Na výše zmíněné stránce jsou jako vhodné editory pro přípravu zdrojových kódu v TeXu doporučovány aplikace TeXnic Center a PSPad (proti čemuž nelze nic namítat). Z vlastní zkušenosti bych ale doporučil spíše Notepad++, ve kterém sám TeXovské zdrojáky píšu a jsem s ním velmi spokojen.

V současné době se většinou TeXovské zdrojáky už nepřekládají do metaformátu DVI (Device Independent), ale přímo do PDF. Proto je vhodný i prohlížeč PDF, který neotevírá vytvořený soubor v režimu výhradního přístupu a který načte soubor vždy znovu, když dojde k jeho změně – to umí třeba Evince. Adobe Acrobat bohužel otevírá PDF soubory ve výhradním režimu, a proto když je spuštěný, nelze TeXem překládat zdroják.

Učební materiály

Patrně nejpreciznější a nejrozsáhlejší učební text, týkající se pouze samotného základního TeXu (tedy tzv. Plain TeXu, nikoliv LaTeXu či jiných nadstaveb a sad maker), pochází přímo od grand wizarda Donalda E. Knutha, autora TeXu. Jmenuje se The TeXbook a je součástí většiny instalací TeXu, ale obvykle v záměrně upravené podobě, která znemožňuje překlad do cílového formátu. Kliknutím na níže uvedený odkaz si můžete TeXbook stáhnout v PDF.

Učebnice The TeXbook – PDF – 2,41 MB

Rychlým a efektivním způsobem, jak se vpravit do používání TeXového formátu LaTeX, který je dnes de facto standardem pro psaní technických dokumentů, je anglicky psaná příručka švýcarských autorů nazvaná The Not So Short Introduction to LaTeX 2e. Na celkem 168 stranách se lze dozvědet téměř vše, co člověk k práci s LaTeXem běžně potřebuje.

The Not So Short Introduction to LaTeX 2e – PDF – 2,49 MB

TeXbook naruby – kniha jednoho z našich předních expertů na TeX, Petra Olšáka. Nejedná se o učebnici, či referenční příručku. Jde spíš o ukázky a detailní rozbory různých "specialitek".

Velmi rozpracovaná Referenční příručka LaTeXu 2e – možná tuhle příručku někdy dokončím (pokud bude čas a lidi) –, zatím obsahuje jen opravdové základy. Až dočtete na konec, podívejte se na zdrojový kód této příručky, protože z toho bude vidět to ostatní...

Referenční příručka LaTeXu – PDF – 178 KB
Referenční příručka LaTeXu (zdrojáky) – ZIP – 181 KB

Slidy prezentace Stručný úvod do TeXu byly vyrobeny v LaTeXu s využitím třídy beamer. Kliknutím na odkaz níže je možné si stáhnout příručku k práci s touto třídou.

Referenční příručka třídy Beamer – PDF – 1,58 MB

Ukázky

Prezentace Stručný úvod do TeXu – ukázka použití třídy dokumentů beamer, která umožňuje tvorbu propracovaných, částečně interaktivních prezentací ve formátu PDF.

Prezentace (zdroják a PDF) – ZIP – 165 KB

V průběhu jedné z minulých přenášek (v roce 2009) byl vyroben (po obsahové stránce dost příšerný) dokument test.tex. Vše potřebné k jeho přeložení a vyzkoušení najdete níže.

Ukázkový dokument (zdroják v TeXu a PDF) – ZIP – 408 KB