M1160 – Úvod do programování I
RNDr. Jaroslav PELIKÁN, Ph.D.
katedra počítačových systémů a komunikacíFakulta informatiky Masarykovy univerzity
Botanická 68a, 602 00 BRNO
kanc.: A209, : +420 – 549 495 751E-mail: [email protected]
http://www.fi.muni.cz/usr/pelikan
23-04-24 2
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
23-04-24 3
Organizace předmětu• 1 přednáška:
– 2 hodiny týdně• 3 cvičební skupiny:
– 2 hodiny týdně• Zakončení předmětu:
– kolokvium• Předmět pokračuje v jarním semestru před-
náškou M2160 Úvod do programování II
23-04-24 4
Požadavky ke kolokviu• Zápočet:
– „úspěšné“ napsání průběžných písemek– splnění všech domácích úkolů (v termínu)– maximálně dvě neomluvené neúčasti na cvičení
• Zápočet musí být zapsán na ISu nejpozději 12 hodin před začátkem kolokvia
• Kolokvium probíhá ve dvou částech:– vypracování programu (na počítači): 90 minut– diskuse nad řešeným problémem + další otázky
23-04-24 5
Literatura• Pelikán, Jaroslav: Prezentace k přednáškám
z předmětu M1160 Úvod do programování I – 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
23-04-24 6
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átorem
a 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
23-04-24 7
Programovací jazyky – historie • Strojový kód • Jazyk symbolických instrukcí – Assembler
– vědeckotechnické výpočty• FORTRAN, COBOL, ALGOL
– vědeckotechnické výpočty– hromadné zpracování dat
• SIMULA, SIMSCRIPT, LISP• PL/1, ADA, Prolog, C/C++, C#, Pascal, Java
23-04-24 8
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í
23-04-24 9
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
23-04-24 10
Historie jazyka C (1)• 1969 – 1973:
– Dennis M. 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:
– Dennis M. Ritchie a Brian W. Kernighan vydáva-jí knihu The C Programming Language (K&R)
23-04-24 11
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
23-04-24 12
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)
23-04-24 13
„Životopis“ programuEditor
*.c *.h
Preprocesor
Překladačcompiler
Objektovésoubory
*.o, *.obj
Systémovéknihovny
*.so, *.a, *.lib
Sestavovací programlinker
Spustitelný program*.exe
Hlavičkovésoubory*.h
Spuštění, laděníladící program – debugger
Zdrojový kód
23-04-24 14
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 #
23-04-24 15
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
23-04-24 16
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
23-04-24 17
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
23-04-24 18
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í
23-04-24 19
Programovací jazyk C v M1160 (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
23-04-24 20
Programovací jazyk C v M1160 (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-16.01mingw-setup.exe (cca 80 MB)
• obsahuje i překladač GCC a debugger GDB z MingGW
• MinGW – Minimalist GNU for Windows:– distribuce poskytující sadu nástrojů vhodnou
pro vývoj aplikací pro MS Windows
23-04-24 21
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, …
23-04-24 22
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, …
23-04-24 23
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é jsou
uvozené znakem \, např.:•\n přechod na nový řádek•\t horizontální tabulátor•\\ zpětné lomítko•\” uvozovky•\xhh kde hh označuje číslo v šestnáctkové
soustavě požadovaného znaku•\ooo kde ooo označuje číslo v osmičkové
soustavě požadovaného znaku
23-04-24 24
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)
23-04-24 25
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
23-04-24 26
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
23-04-24 27
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
23-04-24 28
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
23-04-24 29
Struktura programu v jazyce C (1)/* Vložení hlavičkových souborů */#include <soubor.h>/* Globální deklarace a definice */návratový_typ jmFunkce(seznam formálních parametrů)
{ /* Tělo funkce jmFunkce */ }
int main(seznam formálních parametrů){ /* Tělo funkce main */ }
Hlavička funkce
23-04-24 30
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
23-04-24 31
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
23-04-24 32
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
23-04-24 33
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 vracet celočísel-nou hodnotu v rozmezí 1 až 255
23-04-24 34
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
23-04-24 35
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: return vý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
23-04-24 36
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
23-04-24 37
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í hodnotu EOF (-1)