480 likes | 659 Views
IB001 – Úvod do programování skrze C. RNDr. Jaroslav PELIKÁN, Ph.D . katedra počítačových systémů a komunikací Fakulta informatiky Masarykovy univerzity Šumavská 15, 602 00 BRNO kanc.: G409, : +420 – 54 9 495 751 E-mail: pelikan@fi.muni.cz http://www.fi.muni.cz/usr/pelikan.
E N D
IB001 – Úvod do programovánískrze C RNDr. Jaroslav PELIKÁN, Ph.D. katedra počítačových systémů a komunikací Fakulta informatiky Masarykovy univerzity Šumavská 15, 602 00 BRNO kanc.: G409, : +420 – 549495751 E-mail: pelikan@fi.muni.cz http://www.fi.muni.cz/usr/pelikan
Cíl předmětu • Seznámit studenty se základními principy používanými při řešení problémů na počítači • Předmět je vyučován s pomocí programova-cího jazyka C • Na konci tohoto předmětu bude student scho-pen: • navrhnout algoritmus řešící zadaný problém • zapsat algoritmus v programovacím jazyce C • provést odladění programu
Organizace předmětu • 1 přednáška: • 2 hodiny týdně • 25 cvičebních skupin: • 2 hodiny týdně • Zakončení předmětu: • zkouška • zápočet
Požadavky ke zkoušce (1) • Zápočet: • napsání dvou průběžných písemek: • probíhá v počítačové učebně • napsání programu (na počítači), který řeší zadaný problém • čas na vypracování: u každé písemky cca 50 minut • maximální počet bodů: • za 1. písemku: 25 bodů • za 2. písemku: 35 bodů • za obě písemky je zapotřebí získat v součtu alespoň 30 bodů • hodnocení z průběžných písemek se započítává do výsledného (celkového) hodnocení zkoušky
Požadavky ke zkoušce (2) • čtyři domácí úkoly (napsání čtyř programů): • na odevzdání úkolu je jeden týden • na každý domácí úkol je jeden opravný termín (další týden) • jestliže student na opravný termín odevzdá (opět) program, ve kterém jsou chyby, pak se mu odečítají body: • podle závažnosti chyb v rozmezí –1 až – 4 body • odečítané body za chybné domácí úkoly se započítá-vají do požadovaných 30 bodů na udělení zápočtu a do výsledného (celkového) hodnocení zkoušky • maximálně dvě neomluvené neúčasti na cvičení
Požadavky ke zkoušce (3) • Zápočet musí být zapsán na ISu nejpozději 12 hodin před začátkem závěrečné zkoušky • Poznámka: • v průběhu semestru je možné využít jednoho opravného termínu průběžné písemky • opravný termín bude na konci výukového období, popř. začátkem zkouškového období • v rámci opravného termínu je možné, aby si student opravil bodové hodnocení z jedné své průběžné písemky (písemky, na níž získal men-ší bodové hodnocení)
Zkouška • Závěrečná zkouška probíhá pouze písemnou formou (bez počítačů) • Čas na vypracování: 60 minut • Maximální počet bodů: 40 bodů • Výsledné hodnocení: • dáno součtem bodů z průběžných písemek a zá-věrečné zkoušky, mínus body za chybné domá-cí úkoly: A:92 – 100 bodů D: 65 – 73 bodů B:83 – 91 bodů E: 56 – 64 bodů C:74 – 82 bodů F: méně než 56 bodů
Literatura • Pelikán, Jaroslav: Prezentace k přednáškám z předmětu IB001 Úvod do programování http://www.fi.muni.cz/usr/pelikan • Herout, Pavel: Učebnice jazyka C, KOPP, České Budějovice 1994 • Kernighan, Brian W. – Ritchie, Dennis M.: Programovací jazyk C, Computer Press, Brno 2006 • Harbison, Samuel P. – Steele, Guy L. Jr.: Referenční příručka jazyka C, SCIENCE 1996
Programovací jazyk • Prostředek (soubor pravidel) pro zápis algo-ritmů, které mohou být provedeny na počítači • Komunikační nástroj mezi programátorema počítačem • Zápis algoritmu ve zvoleném programovacím jazyce se nazývá program • Příklady programovacích jazyků: • C, C++, C#, Pascal, BASIC, Java, Prolog, Lisp
Programovací jazyky – historie • Strojový kód • Jazyk symbolických instrukcí – Assembler • vědeckotechnické výpočty • FORTRAN, ALGOL, COBOL • vědeckotechnické výpočty • hromadné zpracování dat • SIMULA, LISP, SIMSCRIPT • PL/1, ADA, Prolog, C/C++, C#, Pascal, Java
Programovací jazyk C (1) • Univerzální programovací jazyk • Není specializován pro žádnou konkrétní oblast • Nejedná se o „jazyk vysoké úrovně“: • pracuje přímo pouze se základními datovými typy (např. znaky, celá čísla, reálná čísla) • neumožňuje přímo práci s řetězci a poli • neobsahuje přímo nástroje pro vstupy a výstupy • zmíněné akce (práce s řetězci, poli, vstupy a výstu-py) je nutné provádět pomocí volání funkcí
Programovací jazyk C (2) • Jeho obecnost jej dělají vhodnějším a efektiv-nějším pro většinu úloh, než jiné jazyky • Jazyk C se vyznačuje: • úspornými výrazy • standardizací řídících struktur, které vedou k vy-tváření dobře strukturovaných a čitelných progra-mů • moderními datovými strukturami • bohatou množinou operátorů • Není vázán na konkrétní typ počítače ani na určitý operační systém
Historie jazyka C (1) • 1969 – 1973: • DennisM. Ritchie, AT&T Bell Labs • počáteční vývoj jazyka C • předchůdci jazyka C: ALGOL, CPL, BCPL, B • 1973: • většina zdrojového kódu operačního systému UNIX byla přepsána do jazyka C • 1978: • DennisM. Ritchie a Brian W. Kernighan vydáva-jí knihu The C Programming Language (K&R)
Historie jazyka C (2) • tato kniha sloužila jako první standard jazyka C • popsaná verze jazyka C bývá označována jako K&R C • 1983: • American National Standards Institute (ANSI) sestavuje komisi X3J11 s úkolem vytvořit stan-dardní specifikaci jazyka C • 1989: • standard dokončen a schválen pod označením ANSI X3.159-1989 „Programming Language C“ • zmíněný standard bývá označován jako ANSI C, Standard C nebo C89
Historie jazyka C (3) • 1990: • standard ANSI C (s drobnými změnami) byl při-jat institucí International Organization for Stan-dardization (ISO) jako ISO/IEC 9899:1990 • zmíněný standard se rovněž označuje jako C90 • 1999: • vydán dokument ISO 9899:1999 (nazývaný také C99), který byl v roce 2000 přijat i jako ANSI standard • 2011: • vydán dokument ISO 9899:2011 (nazývaný také C11)
„Životopis“ programu Systémovéknihovny *.so, *.a, *.lib Editor Objektovésoubory *.o, *.obj Hlavičkovésoubory *.h Zdrojový kód Sestavovací program linker *.c *.h Preprocesor Spustitelný program*.exe Překladač compiler Spuštění, laděníladící program – debugger
Preprocesor (1) • Program, který zpracovává (upravuje) vstupní data tak, aby výstup mohl být dále zpracovaný jiným programem • Často používán pro předzpracování zdrojové-ho kódu před vlastním překladem (kompilací) • Preprocesor jazyka C: • pracuje na základě svých direktiv (příkazů)zapsa-ných ve zdrojovém kódu • za direktivu preprocesoru je považován každý řá-dek začínající znakem #
Preprocesor (2) • za znakem # musí následovat název direktivy • mezi operace prováděné preprocesorem jazyka C patří např.: • vložení hlavičkových souborů (#include) • rozvoj maker (#define) • odstranění částí zdrojového kódu, které (v závislosti na vyhodnocených podmínkách) nemají být aktuálně pře-kládány – podmíněný překlad (#if, #else, #endif, #elif, #ifdef, #ifndef) • případné odstranění komentářů • výsledkem práce preprocesoru jazyka C je opět textovýsoubor
Překladač – compiler • Program realizující překlad zdrojového sou-boru (zpracovaného již preprocesorem) do objektového (relativního) kódu počítače • Vzniká soubor *.o nebo *.obj • V objektovém kódu ještě nejsou známy adresy proměnných a funkcí, které se nacházejí v knihovních modulech
Sestavovací program – linker • Program provádějící propojeníobjektových kódů s knihovními moduly • V průběhu sestavování jsou nalezeny dosud neznámé adresy proměnných a funkcí a odpo-vídající knihovní moduly jsou připojeny k vý-slednému programu • Výsledkem činnosti sestavovacího programu je spustitelný soubor ve strojovém kódu (*.exe), popř. knihovna, která bude později využívána jiným programem
Ladící program – debugger • Program sloužící pro ladění (nalézání) chyb, které nastávají při běhu programu • Umožňuje např.: • postupné provádění programu po jednotlivých řádcích, tzv. krokování • sledování hodnot, kterých nabývají použité pro-měnné • přerušení běhu programu na předem definovaném řádku (vložení breakpointu) a následné zahájení krokování
Programovací jazyk C v IB001 (1) • Vývojové prostředí Code::Blocks: • zaměřené na jazyky C a C++ • existují verze pro operační systémy MS Windows, Linux a Mac OS X • podporuje využití různých překladačů, např.: GCC/MinGW, MS Visual C++, Watcom, … • dovoluje spolupráci s debuggerem GDB • textový editor umožňuje např.: • zvýrazňování syntaxe • dokončování kódu • skrývání částí kódu
Programovací jazyk C v IB001 (2) • možnosti Code::Blocks lze dále rozšířit pomocí zásuvných modulů – plug-ins • http://www.codeblocks.org/ • http://www.codeblocks.org/downloads/26 • codeblocks-12.11mingw-setup.exe (cca 97 MB) • obsahuje i překladač GCC a debugger GDB z MingGW • MinGW – Minimalist GNU for Windows: • distribuceposkytující sadu nástrojů vhodnou pro vývoj aplikací pro MS Windows
Základní pojmy (1) • Identifikátor: • konečná posloupnost písmen (anglické abecedy), číslic a znaku podtržítko • nesmí: • začínat číslicí • obsahovat mezeru • být shodný s klíčovým (rezervovaným) slovem • název volíme mnemonicky • např.: teplota, tlak, x1, x2, …
Základní pojmy (2) • Klíčová (rezervovaná) slova: • slova mající v programovacím jazyce svůj speciální význam • identifikátor nesmí být pojmenovaný stejně jako klíčové slovo • neobsahují mezeru • např: while, if, else, do, switch, …
Základní pojmy (3) • Řetězcový literál (řetězcová konstanta): • posloupnost znaků uzavřená do uvozovek (”) • může obsahovat mezery a znaky národních abeced • může obsahovat řídící posloupnosti, které jsouuvozené znakem \, např.: • \npřechod na nový řádek • \t horizontální tabulátor • \\zpětné lomítko • \” uvozovky • \xhh kdehhoznačuje číslo v šestnáctkové soustavě požadovaného znaku • \ooo kde ooo označuje číslo v osmičkové soustavě požadovaného znaku
Poznámka • Dva sousedící identifikátory, klíčová slova nebo čísla musí být od sebe oddělena ales-poň jednou: • mezerou • tabulátorem • znakem konce řádku • komentářem (překladač jej nahrazuje mezerou) • Přebytečné mezery, tabulátory a znaky kon-ce řádků jsou překladačem ignorovány • Jazyk C rozlišuje velká a malá písmena (case sensitive)
Komentáře • Poznámky, které jsou překladačem ignoro-vány • Nemají žádný vliv na funkci programu • Slouží k lepší čitelnosti (lepšímu pochope-ní) programu • Zapisují se: • mezi znaky /*, */ • za znaky // • až ve standardu C99 nebo C++ • za poznámku jsou považovány všechny znaky až do konce řádku
Program v jazyce C (1) • Na nejvyšší úrovni se skládá z: • direktiv preprocesoru: • řádek začínající znakem # • globálních deklarací a definic • funkcí • Jedna z funkcí se vždy jmenuje main: • musí být v programu vždy uvedena • volána jako první po spuštění programu
Program v jazyce C (2) • Funkce je tvořena: • hlavičkou, která specifikuje: • viditelnost funkce vně souboru, ve kterém je defino-vána • návratový typ – typ hodnoty, kterou funkce vrací • jméno funkce • seznam (typ a počet) formálních parametrů, pomocí nichž funkce může komunikovat se svým okolím • tělem funkce, které obsahuje: • lokální deklarace a definice • posloupnost příkazů, která bude po vyvolání funkce provedena
Program v jazyce C (3) • Poznámky: • příkazy jsou prováděny postupně ve stejném pořadí, v jakém jsou zapsány • všechny příkazy v jazyce C jsou ukončeny středníkem – středník je nedílnou součástí příkazu • výjimku tvoří složený příkaz, který se střední-kem neukončuje
Struktura programu v jazyce C(1) /*Vložení hlavičkových souborů */ #include <soubor.h> /* Globální deklarace a definice */ návratový_typjmFunkce(seznam formálních parametrů) { /* Tělo funkce jmFunkce*/ } int main(seznam formálních parametrů) { /* Tělo funkce main */ } Hlavička funkce
Struktura programu v jazyce C(2) • #include <soubor.h>: • direktiva preprocesoru • zabezpečí vložení hlavičkového souboru soubor.h do zdrojového kódu • hlavičkové soubory mimo jiné popisují tzv. prototypy (deklarace) funkcí • prototyp funkce: • deklaruje funkci před jejím použitím a před tím, než je definována • tvořen hlavičkou funkce, za níž následuje středník • pro správné vyvolání funkce je zapotřebí, aby překla-dač znal informace uvedené v její hlavičce
Struktura programu v jazyce C(3) • návratový_typ: • udává typ hodnoty, kterou funkce vrací • jestliže funkce nevrací žádnou hodnotu, pak by návratovým typem měl být typ void • void: • představuje prázdný datový typ • používá se pro: • označení funkcí, které nevracejí žádnou hodnotu • označení prázdného seznamu formálních parametrů • vytváření obecného ukazatele
Struktura programu v jazyce C(4) • jmFunkce: • identifikátor specifikující jednoznačné jméno funkce • následně se používá pro její vyvolání • seznam formálních parametrů: • slouží k předání vstupních hodnot funkci • je-li prázdný, měl by být použitý typ void
Struktura programu v jazyce C(5) • Funkce main: • každý spustitelný program musí obsahovat právě jednu funkci main • volána jako první po spuštění programu • návratový typ by měl být vždy int (celé číslo) • konvence: • jestliže program skončí bezchybně, pak by funkce main měla vracet hodnotu 0 • v případě chybového stavu by měla vracetceločísel-nou hodnotu v rozmezí 1 až 255
Struktura programu v jazyce C(6) • seznam formálních parametrů může být využitý pro předání vstupních hodnot z příkazové řádky operačního systému
Příkaz return (1) • Používán k ukončení právě probíhající funkce • Pomocí příkazu return je možné, aby fun-kce vrátila svou hodnotu • Obecný tvar: returnvýraz; • Funkce: • způsobí ukončení právě prováděné funkce • řízení se předá na místo bezprostředně následující za voláním funkce • výraz se vyhodnotí a výsledná hodnota je funkcí vrácena • není-li uveden výraz, pak funkce nevrací žádnou hodnotu
Příkaz return (2) • Poznámka: • jestliže program dosáhne konce těla funkce, aniž by byl proveden příkaz return, pak je výsledek stejný, jako by se provedl return neobsahující žádný výraz
Funkce výstupu (1) • Funkce puts: • deklarována v: stdio.h • prototyp: int puts(const char *s); • funkce: • vypíše řetězec s na standardní výstup (obrazovka monitoru) a provede odřádkování • vrácená hodnota: • při úspěšném výpisu vrací nezápornou hodnotu • při neúspěšném výpisu vrací hodnotuEOF (-1)
Funkce výstupu (2) • Funkce printf: • deklarována v: stdio.h • prototyp: int printf(const char *format,…); • funkce: • vypíše na standardní výstup posloupnost dat specifikova-nou parametrem format • za parametrem format očekává alespoň tolik dalších argumentů, kolik je specifikováno parametremformat • vrácená hodnota: • při úspěšném výpisu vrací počet vypsaných znaků • při neúspěšném výpisu vrací záporné číslo
Funkce výstupu (3) • parametr format: • řetězec obsahující text, který se má vypsat • může obsahovat formátovací značky, za něž jsou do-sazeny a podle nichž jsou odpovídajícím způsobem formátovány hodnoty uvedené v následujících argu-mentech • Formátovací značka: • obecný tvar: %[příznaky][šířka][.přesnost][délka]specifikátor • šířka: • určuje minimální šířku pole pro výpis argumentu • argument s méně znaky bude zleva, popř. zprava doplněn výplňovými znaky (obvykle mezera)
Funkce výstupu (4) • přesnost: • u reálných čísel určuje počet číslic, které budou vypsány za desetinnou čárkou (implicitně 6) • příklady specifikátorů pro výpis číselných hodnot: • d, i celé číslo se znaménkem v desítkové soustavě • o celé číslo bez znaménka v osmičkové soustavě • x, X celé číslo bez znaménka v šestnáctkové soustavě • u celé číslo bez znaménka v desítkové soustavě • f reálné číslo v desítkové soustavě počet desetinných míst je dán částí přesnost • e, E reálné číslo v desítkové soustavě v semilogarit- mickém (exponenciálním) tvaru počet desetinných míst je dán částí přesnost • % vypíše znak %
Úprava programu • Znaky{ a } psát pod sebe • Příkazy mezi { a } odsadit o dvě až čtyři me-zery • Středník psát bezprostředně za příkaz • Záhlaví programu opatřit komentářem, který obsahuje zadání problému, jehož řešení pro-gram představuje
Konstanty (1) • Pevně dané hodnoty určitého typu (např. číslo): • čísla v jazyce C: • celá (int): 264, –1, 8765 • reálná (double): 3.14159, –427.8123, 1.0, 4E–5, 1.2E3 • Pojmenované konstanty: • lze definovat pomocí direktivy preprocesoru • obecný tvar: #define IDENTIFIKÁTOR hodnota • např: #define PI3.1415926
Konstanty (2) • takto definované konstanty nemají specifikovaný datový typ • preprocesor provede textové nahrazení všech výsky-tů identifikátoru IDENTIFIKÁTOR hodnotou hodnota • poznámka – konvence: • identifikátory za direktivou #definezapisovat vždy velkými písmeny
Výrazy (1) • Tvořeny pomocí operátorů a operandů • Příklady aritmetických operátorů: • + součet • – rozdíl • * součin • / podíl (reálný i celočíselný) • %zbytek po celočíselném dělení • Při vyhodnocování je respektována běžná prio-rita operátorů (podobně jako v matematice) • Změnu priority operátorů je možné provést pomocí kulatých závorek – (, )
Výrazy (2) • Příklady operandů: • konstanty • pojmenované konstanty • proměnné • volání funkcí: • funkce je vyhodnocena a výsledná hodnota je použita jako operand • Příklady výrazů: • 20+30*5–8/2 • 2*sin(PI/2)+6 • 4*(2+5)*(8.5+4.32)