Programování v jazyce C++ Představení jazyků C a C++
Představení jazyka C Programovací jazyk nízké úrovně: Programovací jazyk nízké úrovně: – pracuje pouze se základními typy, Strukturovaný programovací jazyk: Strukturovaný programovací jazyk: – umožňuje strukturovat kód do bloků a funkcí, Není vázán na konkrétní operační systém nebo stroj, Není vázán na konkrétní operační systém nebo stroj, Velice úzce spjat s operačním systémem UNIX, Velice úzce spjat s operačním systémem UNIX, Existuje mnoho variant jazyka C (K&R, ANSI), Existuje mnoho variant jazyka C (K&R, ANSI), – my budeme používat ANSI C.
Představení jazyka C++ Programovací jazyk vyšší úrovně: Programovací jazyk vyšší úrovně: – podporuje objektově orientované programování (OOP), Není čistě objektový: Není čistě objektový: – podporuje i procedurální programování, Není též pouhým rozšířením jazyka C: Není též pouhým rozšířením jazyka C: – některé záležitosti řeší jinak, V pozdější době se z něho vyvinul jazyk C# V pozdější době se z něho vyvinul jazyk C#
Historie jazyků C a C – 1973 – D. Ritchie navrhl a implementoval C na počítači DEC, 1972 – 1973 – D. Ritchie navrhl a implementoval C na počítači DEC, 1978 – D. Ritchie a B. Kernighan vydali knihu Programming Language C, 1978 – D. Ritchie a B. Kernighan vydali knihu Programming Language C, 1983 – B. Stroustrup – C with Classes, 1983 – B. Stroustrup – C with Classes, 1985 – B. Stroustrup – C++, 1985 – B. Stroustrup – C++, 1989 – ANSI C, 1989 – ANSI C, 1990 – standard adoptován organizací ISO – standard adoptován organizací ISO.
Způsob zpracování programu Preprocesor – zpracuje program před předáním překladači, výstupem je textový soubor, Preprocesor – zpracuje program před předáním překladači, výstupem je textový soubor, Překladač – překládá soubor do relativního objektového kódu, výstupem je soubor.obj, Překladač – překládá soubor do relativního objektového kódu, výstupem je soubor.obj, Linker – sestavovací program, který přiřadí relativním adresám proměnných absolutní, výstupem je spustitelný soubor, Linker – sestavovací program, který přiřadí relativním adresám proměnných absolutní, výstupem je spustitelný soubor, Debugger – ladící program, slouží k odladění chyb. Debugger – ladící program, slouží k odladění chyb.
Překladač gcc Slouží ke kompilaci zdrojových kódů v C, Slouží ke kompilaci zdrojových kódů v C, Řádkově orientovaný překladač, Řádkově orientovaný překladač, Součást snad každé linuxové distribuce, Součást snad každé linuxové distribuce, Použití: gcc program.c, Použití: gcc program.c, Takto vytvoří binárku s názvem a.out, Takto vytvoří binárku s názvem a.out, Chcete-li změnit jméno souboru nebo chování překladače, musíte použít parametry z příkazové řádky, Chcete-li změnit jméno souboru nebo chování překladače, musíte použít parametry z příkazové řádky,
Překladač g++ slouží ke kompilaci zdrojových kódů v C i C++, slouží ke kompilaci zdrojových kódů v C i C++, je taktéž řádkově orientovaný a je obsažen ve většině linuxových distribucí, je taktéž řádkově orientovaný a je obsažen ve většině linuxových distribucí, při zavolání bez dalších parametrů taktéž vytvoří spustitelný soubor a.out při zavolání bez dalších parametrů taktéž vytvoří spustitelný soubor a.out
Parametry překladačů gcc a g++ -o soubor: název spustitelné binárky, -o soubor: název spustitelné binárky, -c : pouze přeložit, bez linkování, -c : pouze přeložit, bez linkování, -g : vytvořit informace pro debugger, -g : vytvořit informace pro debugger, -lknihovna : další knihovna pro linkování, -lknihovna : další knihovna pro linkování, -ansi : ctí normu ANSI 89, -ansi : ctí normu ANSI 89, -pedantic : velmi přísná kontrola souladu s normou, -pedantic : velmi přísná kontrola souladu s normou, -Wvarování : správa warningů, -Wvarování : správa warningů, další informace lze získat příkazem man. další informace lze získat příkazem man.
Používané parametry v X36PJC gcc -ansi -pedantic -o program program.c, gcc -ansi -pedantic -o program program.c, g++ -Wall -Wno-long-long g++ -Wall -Wno-long-long -pedantic -o program program.cpp. -pedantic -o program program.cpp.
Debugger gdb Je to opět řádkově orientovaný program. Je to opět řádkově orientovaný program. Slouží pro odladění chyb v programu. Slouží pro odladění chyb v programu. Odladí ale pouze chyby vzniklé za běhu programu, nikoliv chyby ve zdrojovém kódu. Odladí ale pouze chyby vzniklé za běhu programu, nikoliv chyby ve zdrojovém kódu. Pomocí něho můžete najít, kde program spadl a případně i proč. Pomocí něho můžete najít, kde program spadl a případně i proč. Použití: gdb program. Použití: gdb program. Činnost je řízena pomocí příkazů. Činnost je řízena pomocí příkazů.
Příkazy debuggeru gdb run parametry : spouští běh programu run parametry : spouští běh programu break číslo_řádku : nastaví breakpoint break číslo_řádku : nastaví breakpoint delete číslo_breaku : zruší daný breakpoint delete číslo_breaku : zruší daný breakpoint continue : pokračuje až do dalšího přerušení continue : pokračuje až do dalšího přerušení next : provede 1 řádek programu next : provede 1 řádek programu step : při volání funkce skončí na jejím začátku step : při volání funkce skončí na jejím začátku display výraz : vypíše hodnotu výrazu při každém přerušení display výraz : vypíše hodnotu výrazu při každém přerušení help : nápověda help : nápověda quit : hádejte :-) quit : hádejte :-)
Hello World v C #include #include int main(void) { int a = 0; printf("Hello World\n"); printf("%d", a); return 0; }
Hello World v C++ #include #include using namespace std; int main(void) { int a = 0; int a = 0; cout << "Hello World" << endl; cout << "Hello World" << endl; cout << a << endl; cout << a << endl; return 0; return 0;}
Lexikální elementy I identifikátory: identifikátory: – malá a velká písmena a podtržítko, klíčová slova: klíčová slova: – if, else, while, for, … – vždy malými písmeny, operátory: operátory: – {}, (), +, -, *, /, %, … celá čísla: celá čísla: – 1, -5, 065, 0x12, 0X6F, 123L, l
Lexikální elementy II desetinná čísla: desetinná čísla: – 7.8,.4, 127., 5.97e7, -7E8,.8 znaky: znaky: – ’a’, ’t’, 97, ’\n’ řetězce: řetězce: – "tohle je řetězec" – reprezentovány jako posloupnosti zakončené 0. komentáře: komentáře: – /* */, // (norma ansi uznává jen první)
Speciální a netisknutelné znaky speciální znaky: speciální znaky: – \", \’, \?, \\, netisknutelné znaky: netisknutelné znaky: – \n – nový řádek, – \r – návrat kurzoru, – \t – tabulátor, – \a – píp, – \0 – konec řetězce.
Celočíselné typy Číselné se znaménkem: Číselné se znaménkem: – short = signed short = signed short int – int = signed = signed int – long = long int = signed long = signed long int Čís elné bez znaménka: Čís elné bez znaménka: – unsigned short = unsigned short int – unsigned= unsigned int – unsigned long= unsigned long int
Reálné typy float, float, double, double, long double, long double, Norma požaduje, aby platilo float <= double <= long double. Norma požaduje, aby platilo float <= double <= long double. Pohyblivá řádová čárka: Pohyblivá řádová čárka: – znaménko, – mantisa, – exponent.
Logický typ V C neexistuje typ pro reprezentaci logických hodnot: V C neexistuje typ pro reprezentaci logických hodnot: – 0 nebo ““ reprezentují FALSE, – cokoliv jiného pak TRUE. V C++ existuje typ bool V C++ existuje typ bool
ŘetězceŘetězce V C neexistuje typ pro reprezentaci textových řetězců: V C neexistuje typ pro reprezentaci textových řetězců: – řetězce jsou reprezentovány pomocí pole charů ukončeného znakem ’\0’. V C++ existuje typ string. V C++ existuje typ string.
Výčtový typ Příklad: Příklad: – enum Color {Red, Blue, Green}; Literály jsou synonyma číselných hodnot od nuly číslovaných v daném pořadí, Literály jsou synonyma číselných hodnot od nuly číslovaných v daném pořadí, Hodnotu možno nastavit explicitně: Hodnotu možno nastavit explicitně: – enum Masky {Nula, Jedna, Dva, Ctyri = 4}; Proměnné jsou reprezentovány stejně jako int. Proměnné jsou reprezentovány stejně jako int.
StrukturaStruktura Složený nehomogenní datový typ. Složený nehomogenní datový typ. Jednotlivé položky jsou uloženy za sebou. Jednotlivé položky jsou uloženy za sebou. Velikost struktury je dána součtem velikostí dílčích hodnot. Velikost struktury je dána součtem velikostí dílčích hodnot. Vytvoření nové struktury: Vytvoření nové struktury: – struct jmeno {jednotlive polozky} promenna; Další proměnné se deklarují takto: Další proměnné se deklarují takto: – struct zlomek a, b;
UnionUnion Složený nehomogenní datový typ. Složený nehomogenní datový typ. Jednotlivé položky jsou uloženy přes sebe. Jednotlivé položky jsou uloženy přes sebe. Velikost struktury je dána velikostí největší dílčí položky. Velikost struktury je dána velikostí největší dílčí položky. Vytvoření nové struktury: Vytvoření nové struktury: – union jmeno {jednotlive polozky} promenna; Další proměnné se deklarují stejně jako u struktury. Další proměnné se deklarují stejně jako u struktury.
Další datové typy pole, pole, pointer, pointer, reference (pouze v C++), reference (pouze v C++), třída (pouze v C++), třída (pouze v C++), o nich více v průběhu semestru. o nich více v průběhu semestru.
Vytvoření vlastních datových typů K vytvoření vlastních datových typů slouží operátor typedef K vytvoření vlastních datových typů slouží operátor typedef – typedef definice_typu nazev_typu; Příklady: Příklady: – typedef struct{int cit, int jm} zlomek; – typedef enum {bila, modra, cervena} barva; – apod.
Deklarace proměnných I. Deklarace proměnných vypadá takto: Deklarace proměnných vypadá takto: – [pametova_trida] [kvalifikator] typ deklaratory ; Paměťová třída v deklaraci proměnné určuje způsob přidělení paměti: Paměťová třída v deklaraci proměnné určuje způsob přidělení paměti: – auto – dynamické přidělení paměti na zásobníku, – register – proměnná v registru, – static – statické přidělení paměti resp. lokální v souboru, – extern – bez přidělení paměti.
Deklarace proměnných II. Kvalifikátor udává další vlastnosti deklarovaného objektu: Kvalifikátor udává další vlastnosti deklarovaného objektu: – const – konstantní objekt, – volatile – proměnná může být změněna mimo náš program, Specifikace typu: Specifikace typu: – void – prázdná hodnota, – označení aritmetického typu – popis výčtového typu, struktury, sjednocení nebo třídy – identifikátor typu
Platnost proměnných Globální proměnné platí v celém souboru, Globální proměnné platí v celém souboru, – Je-li třeba sdílet proměnnou mezi více soubory, stačí ji v jednom souboru definovat jako externí. – Jsou ukládány staticky (není-li uvedeno jinak), Lokální proměnné platí pouze v daném bloku, Lokální proměnné platí pouze v daném bloku, – Jsou ukládány na zásobníku (není-li uvedeno jinak).
Znakový vstup a výstup c = getchar() – vstup, c = getchar() – vstup, putchar(c) – výstup, putchar(c) – výstup, funkce pracují s proměnnými typu int, funkce pracují s proměnnými typu int, znaky při vstupu i výstupu procházejí bufferem, znaky při vstupu i výstupu procházejí bufferem, při vstupu můžete zadat i více znaků, při zpracování je načten první a ostatní jsou ponechány, při vstupu můžete zadat i více znaků, při zpracování je načten první a ostatní jsou ponechány, klávesa enter je též brána jako znak, jejím kódem je číslo 10. klávesa enter je též brána jako znak, jejím kódem je číslo 10.
Formátový vstup a výstup scanf() – vstup scanf() – vstup printf() – výstup printf() – výstup funkce s proměnným počtem parametrů funkce s proměnným počtem parametrů příklad použití: příklad použití: – printf(”Hello World!”); – printf(”%d”, i); – scanf(”%d”, &i); V uvozovkách jsou řídící řetězce formátu. V uvozovkách jsou řídící řetězce formátu.
Řídící řetězce formátu znakové posloupnosti: znakové posloupnosti: – vypíší se tak, jak jsou zadány, – používají se pouze pro printf, formátové specifikace: formátové specifikace: – začínají znakem ”%”, – určují formát vstupu nebo výstupu, escape sekvence, escape sekvence, řetězce popisující jednotlivé znaky. řetězce popisující jednotlivé znaky.
Formátové specifikace Obecný tvar specifikace formátu: Obecný tvar specifikace formátu: % [flags] [width] [.prec] [h|l|L] type_char % [flags] [width] [.prec] [h|l|L] type_char flags – zarovnání výstupu, flags – zarovnání výstupu, width – minimální počet znaků na výstupu, width – minimální počet znaků na výstupu,.prec – maximální počet znaků na výstupu,.prec – maximální počet znaků na výstupu, h|l|L – h indikuje short, l dlouhé celé číslo, L long double, h|l|L – h indikuje short, l dlouhé celé číslo, L long double, type_char – povinný znak, určuje typ konverze. type_char – povinný znak, určuje typ konverze.
Položka type_char %c – znak, %c – znak, %d, %i, %ld, %u, %lu – desítkové číslo, %d, %i, %ld, %u, %lu – desítkové číslo, %f, %lf, %Lf – desetinné číslo, %f, %lf, %Lf – desetinné číslo, %e, %E – semilogaritmický tvar, %e, %E – semilogaritmický tvar, %g, %G – s exponentem nebo bez, %g, %G – s exponentem nebo bez, %x, %X – šestnáctkové číslo, %x, %X – šestnáctkové číslo, %o – osmičkové číslo, %o – osmičkové číslo, %s – řetězec. %s – řetězec.
Položka flags ’-’ – výsledek je zarovnán zleva ’-’ – výsledek je zarovnán zleva ’+’ – u čísla bude vždy zobrazeno znaménko ’+’ – u čísla bude vždy zobrazeno znaménko mezera – u kladných čísel mezera místo minus, mezera – u kladných čísel mezera místo minus, ’#’ : ’#’ : – pro formáty o, x, X výstup jako konstanty jazyka C, – pro formáty e, E, f, g, G vždy zobrazí desetinnou tečku, – pro g, G ponechá nevýznamné nuly, – pro c, d, i, s, u nemá význam.
Položka.prec.0 :.0 : – pro e, E, f nezobrazí desetinnou tečku, – pro d, i, o, u, x nastaví standardní hodnoty,.n :.n : – pro d, i, o, u, x min. počet číslic, – pro e, E, f počet desetinných číslic, – pro g, G počet platných míst, – pro s maximální počet znaků, * : jako šířka pole bude použit násl. parametr printf(). * : jako šířka pole bude použit násl. parametr printf().
Položka width n : minimálně n znaků, doplněno mezerami. n : minimálně n znaků, doplněno mezerami. 0n : jako předchozí, doplněno nulami 0n : jako předchozí, doplněno nulami * : jako šířka pole bude použit násl. parametr printf() * : jako šířka pole bude použit násl. parametr printf()
Proudový vstup a výstup Knihovny pro standardní vstupní a výstupní proudy jsou v hlavičkovém souboru. Knihovny pro standardní vstupní a výstupní proudy jsou v hlavičkovém souboru. Pro zápis slouží operátor <<. Pro zápis slouží operátor <<. Pro čtení slouží operátor >>. Pro čtení slouží operátor >>. Standardní proudy jsou: Standardní proudy jsou: – cin, – cout, – cerr.
Použití proudů cout << ”Ahoj svete” << endl cout << ”Ahoj svete” << endl cin >> a; cin >> a; Výraz endl je manipulátor. Výraz endl je manipulátor. Jednotlivé vstupy a výstupy se mohou řetězit: Jednotlivé vstupy a výstupy se mohou řetězit: – cout << ”Vysledek je ” << a << endl; Druh konverze při vstupu je dán typem proměnné. Druh konverze při vstupu je dán typem proměnné. Druh konverze při výstupu je dán typem výrazu. Druh konverze při výstupu je dán typem výrazu.
Příklady manipulátorů Slouží pro řízení vstupní a výstupní konverze. Slouží pro řízení vstupní a výstupní konverze. Jsou definovány v souboru. Jsou definovány v souboru. Některé manipulátory: Některé manipulátory: – dec dekadická konverze, – hex šestnáctková konverze, – oct osmičková konverze, – endl konec řádku, – setw(int n) šířka položky n znaků, – setfill(int c) plnící znak c, – setprecision(int n) n desetinných míst.
Přiřazení Např. n = 123; Např. n = 123; Obecně: l-hodnota = výraz; Obecně: l-hodnota = výraz; Přiřazení je výrazem. Přiřazení je výrazem. Příkazem se stává po přidání středníku. Příkazem se stává po přidání středníku. Návratovou hodnotou je přiřazovaná hodnota. Návratovou hodnotou je přiřazovaná hodnota. Lze použít i vícenásobné přiřazení: Lze použít i vícenásobné přiřazení: – x = z = y = 5;
Aritmetické operátory Unární operátory Unární operátory – +, -, Binární operátory Binární operátory – +, -, *, %, – / – může být celočíselné i klasické, Speciální unární operátory, Speciální unární operátory, – ++, --, – preinkrement / postinkrement (dekrement).
Logické operátory Není typ bool Není typ bool Unární: Unární: – ! – negace Binární: Binární: – && – konjunkce – || – disjunkce Zkrácené vyhodnocování. Zkrácené vyhodnocování.
Relační operátory Řeší vztah mezi dvěma výrazy. Řeší vztah mezi dvěma výrazy. Výsledkem je logická hodnota. Výsledkem je logická hodnota. Binární: Binární: – == – rovnost – !=, >, =,, =, <= – nerovnost
Bitové operátory Pracují s operandy na úrovni bitů. Pracují s operandy na úrovni bitů. Unární: Unární: – ~ – bitová negace. Binární: Binární: – & – bitový součin, – | – bitový součet, – ^ – nonekvivalence (XOR), – > – bitový posun.
Další operátory () – závorky () – závorky +=, /=, %=, >>=, &=,... – přiřazovací operátory +=, /=, %=, >>=, &=,... – přiřazovací operátory – a += b a = a + b, (typ) – přetypování, (typ) – přetypování, sizeof – velikost vyhrazené paměti, sizeof – velikost vyhrazené paměti,, – operátor čárky,, – operátor čárky, ?: – podmíněný výraz. ?: – podmíněný výraz.
Priorita operátorů Zdroj: Pavel Herout – Učebnice jazyka C
DĚKUJI ZA POZORNOST A to je pro dnešek vše
Použitá literatura Pavel Herout – Učebnice jazyka C, Pavel Herout – Učebnice jazyka C, Miroslav Virius – Od C k C++, Miroslav Virius – Od C k C++, Slajdy na předmět X36PJC z akademického roku 2008/2009 (Ladislav Vágner, Karel Müller), FEL ČVUT, Slajdy na předmět X36PJC z akademického roku 2008/2009 (Ladislav Vágner, Karel Müller), FEL ČVUT, Slajdy na předmět 36PJC z akademického roku 2004/2005 (Petr Matyáš), FEL ČVUT, Slajdy na předmět 36PJC z akademického roku 2004/2005 (Petr Matyáš), FEL ČVUT, Server Server