Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 1/22 Jazyk C++, některá rozšíření oproti C Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta informačních technologii, ČVUT v Praze Karel Müller, Josef Vogel, 2011 Programování a algoritmizace 2, BI-PA2, 2011, Přednáška 1 BI-PA2 Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Programování a algoritmizace 2 Cíl předmětu naučit se psát programy v jazyku C++ využívat technologii objektově orientovaného programování abstraktní datové typy (zásobník, fronta, seznam, množina, tabulka), metody jejich implementace Organizace předmětu 2 hod. přednášek 2 hod. cvičení v počítačové učebně 2 hod. prosemináře jednou za 14 dní 6 domácích prací, test na cvičení semestrální práce zkouška Studijní materiály a další informace budou postupně zveřejňovány na eduxu Doporučená literatura Virius: Jazyky C a C++, GRADA, Praha Virius: Od C k C++, Kopp České Budějovice, 2000. Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 2/22
Programování a algoritmizace 2 Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 3/22
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 4/22 Témata: Některá rozšíření oproti jazyku C standardní datové proudy - bezpečnější vstupní a výstupní konverze přetěžování funkcí implicitní hodnoty parametrů funkcí inline funkce parametry typu reference deklarace konstanty operátory new a delete
p1\prog1-1.cpp Bezpečnější vstupní a výstupní konverze Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 5/22 #include <stdio.h> #include <iostream> using namespace std; int main() { int x; // vstup a vystup ve stylu C printf("zadej cele cislo\n"); scanf("%d", &x); printf("zadal jsi %d\n", x); // vstup a vystup ve stylu C++ cout << "zadej cele cislo" << endl; cin >> x; cout << "zadal jsi " << x << endl; return 0; Deklarujte x jako float a vyzkoušejte (prog1-1a.cpp)
Bezpečnější vstupní a výstupní konverze Pro formátovaný vstup a výstup je bezpečnější používat proudy (streamy) a přetížené operátory << a >> Standardní proudy (streamy): cin ~ stdin cin >> proměnná cout ~ stdout cout << výraz cerr ~ stderr cerr << výraz Proč je formátovaný výstup pomocí << bezpečnější než např. printf? Příklad: co vypíše následující příkaz: float f=10.3; int i=5; printf( %d %d\n, f, i); Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 6/22
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 7/22 Přípustné typy v operacích vstupu a výstupu Výstup: cout << char short int long char * float double long double void * Vstup: cin >> char short int long char * float double long double přeskočí počáteční mezery!
p1\prog1-2.cpp Manipulátory Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 8/22 Slouží pro řízení vstupní a výstupní konverze Jsou definovány v souboru <iomanip> int x = 10; cout << "dekadicky " << x << endl; cout << "celkem 10 znaku " << setw(10) << x << endl; cout << "osmickove " << oct << x << endl; cout << "sestnactkove " << hex << x << endl; cout << "dekadicky " << dec << x << endl; Některé manipulátory: dec hex oct endl setw(int n) setfill(int c) setprecision(int n) dekadická konverze šestnáctková konverze osmičková konverze konec řádku + flush šířka položky n znaků plnící znak c n desetinných míst
p1\prog1-3.cpp Přetěžování (overloading) funkcí Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 9/22 Funkce se rozlišují nejen jménem, ale i typy parametrů a počtem parametrů int na3(int x) { return x*x*x; float na3(float x) { return x*x*x; int main() { int a = 5; float b = 4.2; cout << a << "^3 = " << na3(a) << endl; cout << b << "^3 = " << na3(b) << endl; return 0;
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 10/22 Přetěžování funkcí Při volání přetížené funkce se vyvolá ta, jejíž parametry se nejlépe spárují se skutečnými parametry Párování (matching) parametrů: 1. přesná shoda typů 2. shoda typů po roztažení (promotion) char int short int enum int float double 3. shoda typů po standardní konverzi int float float int int unsigned int long 4. shoda typů po uživatelské konverzi Pokud nejlepší párování má více než jedna funkce, ohlásí se chyba
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 11/22 Přetěžování funkcí Příklady void f(float, int); void f(int, float); f(1,1); f(1.2,1.3); void f(long); void f(float); f(1.1); f(1.1f); void f(unsigned); void f(int); void f(char); unsigned char uc; f(uc); // chyba // chyba // chyba // f(float) // f(int)
p1\prog1-4.cpp Implicitní hodnoty parametrů V hlavičce funkce lze definovat implicitní (default) hodnotu parametru, skutečný parametr pak lze vynechat Skutečné parametry lze vynechávat od konce void vypis(int x, int y=0, int z=0) { cout << "x=" << x << endl; cout << "y=" << y << endl; cout << "z=" << z << endl; int main() { vypis(10,20,30); vypis(10,20); vypis(10); system("pause"); return 0; Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 12/22
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 13/22 Implicitní hodnoty parametrů Co není dovoleno void f(int x=1, int y); chyba void f(int x, int y=10); void f(int x); f(20); nejednoznačnost
Inline funkce Volání inline funkce není skok do podprogramu, ale nahradí se tělem funkce inline int max(int x, int y) { return x>y? x : y; main() { int a,b,c; a = max(b, c); Překlad inline není zaručen Je-li inline funkce zavedena v header-souboru, měla být v něm být též definována (tj. včetně těla) Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 14/22
p1\prog1-5.cpp Inline funkce ~ makra Inline funkce je vhodnější než makro Příklad: co vypíše následující program: inline int max(int x, int y) { return x>=y? x : y; #define MAX(x,y) ((x)>=(y)? (x) : (y)) int main() { int a=10; cout << max(a++,4) << endl; cout << a << endl; cout << MAX(a++,4) << endl; cout << a << endl; return 0; 10 11 12 13 Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 15/22
p1\prog1-6.cpp Výstupní parametry funkcí Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 16/22 Parametrem může být funkci zadána proměnná, jejíž hodnotu má funkce změnit Styl C (pomocí ukazatelů): Má-li funkce změnit hodnotu proměnné typu T, parametr bude typu T*, tj. ukazatel na T Příklad: funkce pro výměnu hodnot dvou proměnných typu int void vymenac(int *px, int *py) { int pom = *px; *px = *py; *py = pom; použití: int a, b; float x, y; const int c = 10; vymenac(&a, &b); vymenac(&x, &y); // chyba při překladu vymenac(&x, &c); // chyba při překladu
p1\prog1-6.cpp Výstupní parametry funkcí Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 17/22 Styl C++ (pomocí typu reference): Má-li funkce změnit hodnotu proměnné typu T, parametr bude typu T&, tj reference na T Příklad: void swap(int& x, int& y) { int pom = x; x = y; y = pom; použití: int a, b; float x, y; const int c = 10; swap(a, b); swap(x, y); // chyba při překladu swap(x, c); // chyba při překladu
Parametr typu reference Parametr typu reference na T označuje ve funkci proměnnou, která je dána skutečným parametrem Přípustným skutečným parametrem pro parametr typu reference je pouze proměnná typu T (nemůže to být ani proměnná jiného typu, ani konstanta, ani výraz obsahující operátory) Typ reference může být použit i při deklaraci proměnné (viz později) Typ reference může být kvalifikován jako typ označující konstantu (viz později) Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 18/22
p1\prog1-7.cpp Typ bool Typ bool je určen pro prácí s logickými hodnotami Literály true (1) a false (0) S hlediska operací kompatibilní s typem int Příklad: int main() { bool a=true, b=false; int i = 100, j = 0; cout << "a=" << a << ", b=" << b << endl; cout << "a b=" << (a b) << endl; cout << "a+b=" << a+b << endl; a = i; b = j; cout << "a=" << a << ", b=" << b << endl; system("pause"); return 0; Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 19/22
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 20/22 Konstanty Konstanta jednoduchého typu může být použita jako statický výraz const int Max = 100; int pole[max]; main() { Max = 10; int *p; p = &Max; // chyba! // chyba! const int *q; q = &Max;
Deklarace je příkaz Deklarace se může vyskytovat mezi příkazy Deklarace se může vyskytovat v příkazu for, její platnost je omezena jen na tento příkaz main() { for (int i=0; i<10; i++) { // zde i neexistuje for (int i=10; i>0; i--) // nová deklarace { Pozor: Podle starší normy jazyka deklarace v příkazu for platila až do konce bloku, v němž byl příkaz for uveden. V předchozím příkladě by proto druhý příkaz for způsobil chybu. Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 21/22
Karel Müller, Josef Vogel (ČVUT FIT) Jazyk C++, některá rozšíření oproti C BI-PA2, 2011, Přednáška 1 22/22 Dynamické proměnné Pro vytvoření dynamické proměnné nepoužívat funkci malloc, ale operátor new int *p = new int; struct S {int a; char b;; S *q = new S; Operátorem new lze vytvořit pole int Pocet = 10; int *pa = new int[pocet]; Pro zrušení dynamické proměnné slouží operátor delete delete p; delete q; příznak rušení pole delete [] pa; v C++ je značka struktury jménem typu Operátorem delete lze zrušit jen to, co bylo vytvořeno operátorem new p = pa + 1; delete p; chyba