1 / 258

PRG029 Programov ání v C a C++ ( LS 200 6 /0 7 )

PRG029 Programov ání v C a C++ ( LS 200 6 /0 7 ). RNDr. Filip Zavoral, Ph.D. Katedra softwarového inženýrství Filip.Zavoral @mff.cuni .cz http ://ulita.ms.mff.cuni.cz -> Výuka 24. 9. 2014 1:59. Studijní povinnosti. Zápočet není podmínkou složení zkoušky Požadavky na zápočet

rene
Download Presentation

PRG029 Programov ání v C a C++ ( LS 200 6 /0 7 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PRG029 Programování v C a C++(LS 2006/07) RNDr. Filip Zavoral, Ph.D. Katedra softwarového inženýrství Filip.Zavoral@mff.cuni.cz http://ulita.ms.mff.cuni.cz -> Výuka 24. 9. 2014 1:59

  2. Studijní povinnosti • Zápočet není podmínkou složení zkoušky • Požadavky na zápočet • SIS – Grupíček – každý musí být v nějaké skupině • Platí i pro 'pokročilé', repetenty, externistyajakékoliv jiné úchylky • Zkontrolujte, resp. přihlašte se do volné skupiny • Termín 4.3.2007 • Ověřte platnost e-mailu – Hladání studenta -> Změna údajů • Účast na cvičeních • 'Pokročilí' programátoři a 'externisti'– domluvit se s vyučujícím na začátku semestru • Během semestru 3 'domácíúkoly' (krátké prográmky) • DÚ lze nahradit jedním větším zápočťákem • Závěrečný test • Odladit krátký program v omezeném čase (v labu) • Konkrétní požadavky určuje a jejich plnění hodnotí cvičící • Vše nestandardní předem domluvit s cvičícím

  3. Pravidla pro budoucí neúspěšné • POZOR!! • Letos poslední běh! • Zkouška • Pokud letos složíte zkoušku se známkou 1 nebo 2a nedostanete zápočet, bude vám příští rok automaticky uznána • Tento mechanismus je implementován zkoušejícími, nikoliv studijním odd. • Zápočet • Pokud letos splníte zápočet, bude vám příští rok automaticky uznán • Pokud nedostanete zápočet, budete příští rok opakovat nesplněné části • Podmínky splněné letos se automaticky uznávají • V příštím roce se musíte na začátku semestru přihlásit • V modulu SIS Nastěnka bude upřesněno jak

  4. Obsah předmětu • PRG029 - Programování v C++ PRG032 - OOP • LS 1. ročZS 2. roč C++ C++ C C Nejdůležitější: vlastní praxe Na přednáškách se nikdo nikdy programovat nenaučil

  5. Obsah přednášky • Kurz jazyka C • Přesněji: část C++ shodná s C • Překlad programů, spojování • Základní vlastnosti C, odlišnosti od jiných programovacích jazyků • Datové typy, operátory a řídící konstrukce C • Pole a ukazatele v jazyce C, práce s řetězci • Vstup a výstup, standardní knihovy C • Programování není (jen) zápis algoritmů • Úvod do C++ • Zbývající cca 2/5 semestru • Třídy a objekty, dědičnost, virtuální funkce, polymorfismus • Povídání o C++ bude plynule pokračovat v 2. ročníku

  6. Obsah cvičení • V laboratoři SW2 • Základní vlastnosti jazyka C • Práce s datovými strukturami, triky • Standardní knihovy C • Zajímavé a záludné vlastnosti C • Cvičení z C++ až v 2. ročníku (pro ty, kteří přežijí) • Laboratoř SW2 • Microsoft Visual Studio .NET 2005 • Praktické programování • Ladění programů (!) • Prosíím, já jsem napsal správný program a ono to řeklo 'Váš program provedl neplatnou instrukci a bude ukončen '. Co mám dělat?

  7. Literatura • Základní učebnice a popis jazyka • Andrew Koenig, Barbara E. Moo: Rozumíme C++ (C++ Accelerated) • Miroslav Virius: Programování v C++ (ČVUT 2001) • Miroslav Virius: Pasti a propasti jazyka C++ • Bruce Eckel: Myslíme v jazyku C++ • Thinkinkg in C++ 2nd ed. - volně stáhnutelné • . . . • C++ In-depth • Alexandrescu, Sutter: C++ 101 programovacích technik(C++ Coding Standards) • Meyers: Effective C++ (2nd ed.), More Effective C++, Effective STL • Sutter: Exceptional C++, More Exceptional C++, Exceptional C++ Style • Josuttis: The C++ Standard Library • Josuttis: Object-Oriented Programming in C++ Jak správně C++ používatpro středně pokročilé

  8. Literatura • Pro velmi pokročilé • Alexandrescu: Modern C++ Design • Generic Programming and Design Patterns Applied • Vandevoorde, Josuttis: C++ Templates • Abrahams, Gurtovoy: C++ Template Metaprogramming • Normy • ISO/IEC 14882, ANSI:Programming languages - C++ (1998, 2003) • C++ 2003 TR1 (2005) • C++0x • ISO/IEC 9899: Programming languages - C (1999) • WWW • http://mindview.net/Books • Eckel: Thinking in C++ ... and more • http://www.parashift.com/c++-faq-lite v češtině: Moderní programování v C++

  9. Nevhodná literatura - nepoužívat! • Brian W. Kernighan, Dennis M. Ritchie:The C Programming Language • Martin Beran: Učebnice Borland C++ - hrubé chyby • Jan Pokorný: Rukověť uživatele Borland C++ - staré, BC 3.1 • Vladimír Rudolf: ABC programátora v C++ - neúplné,zastaralé • Dirk Louis: C und C++ — Programierung und Referenz - chyby • Dalibor Kačmář: Jazyk C — učebnice pro střední školy – chyby • Brodský, Skočovský: Operační systém Unix a jazyk C – neúplné, zastaralé • Eric Gunnerson: Začínáme programovat v C#– C# není C++

  10. Pascal vs. C++ • Programování I, II • heslo: programování = zápis algoritmů • algoritmické myšlení, algoritmizace problému • soustředění se na řešení problému • formulace algoritmu a jeho zápis v nějakém formalismu (jazyku) • základní datové a řídící struktury • nedůležité: kontrola vstupů, uživatelské rozhraní, obedněnost, vazba na OS a HW, přenositelnost, optimalizace, udržovatelnost • výuka (v) Pascalu • dobrý jazyk pro zápis algoritmů • nezatěžuje technickými detaily (alokace paměti, vazba na OS, ...) • slabá podpora pro kontrolu vstupů, uživatelské........

  11. Pascal vs. C a C++ • Programování v C++, OOP • heslo: programování = vývoj software • důležité: kontrola vstupů, uživatelské rozhraní, obedněnost, vazba na OS a HW, přenositelnost, optimalizace, udržovatelnost • zvládnutí knihoven a vývojových nástrojů • výuka (v)C++ • standardní jazyk pro vývoj software • další jazyky vycházejí z C++ (Java, C#, ale i PHP, ...) • dobrá podpora pro kontrolu vstupů, uživatelské........ • nutnost zvládnout technické detaily (alokace paměti, vazba na OS..) • velké množství hotového kódu (knihovny, komponenty, ...) 'Vše' již bylo naprogramováno

  12. Historie • 1970-3 první verze C, společný vývoj s UNIXem • 1973přepsání jádra UNIXu do C • 1978 Kerninghan, Ritchie:The C Programming Language • 1980 standardy – ANSIX3J11, od r. 1999 ISO 9899 • 1980 AT&T - "C with Classes" • 1983poprvé název C++ (Rick Mascitti) • 1985 Stroustrup: The C++ Programming Language • 1989 ANSI X3J16 norma C++ • 2003nejnovější ISO/ANSI normaC++ • 2005C++ 2003 TR1 • rozšíření knihoven • založeno na knihovně Boost • 2007-9plán nové normy C++ • Normy se vyvíjí, aktuální překladače o několik let zpět • Implementace novinek často nekorektní nebo neefektivní

  13. Part I - C • C přesněji společná část C a C++ se zdůrazněním odlišností

  14. hello.c • #include <stdio.h> • int main( int argc, char ** argv){ printf( "Hello\n"); return 0;}

  15. hello.c • #include <stdio.h> • int main( int argc, char ** argv){ printf( "Hello\n");return 0;} direktiva preprocesoru vložení souboru deklarace knihovních funkcí název funkce hlavička funkce typ návratové hodnoty tělo funkce formální parametry příkaz skutečné parametry

  16. Struktura programu • Program se skládá z modulů • Překládány samostatně kompilátorem • Spojovány linkerem • Modul z pohledu programátora • Soubor s příponou .cpp (.c) • Hlavičkové soubory • Soubory s příponou .h • Deklarují (a někdy i definují) identifikátory používané ve více modulech • Vkládány do modulů direktivou include • Direktivu zpracovává preprocesor čistě textově • Preprocesor je integrován v kompilátoru jako první fáze překladu • Modul z pohledu kompilátoru • Samostatná jednotka překladu • Výsledek práce preprocesoru

  17. Překlad jednoho modulu a sestavení knihovny standardní i jiné knihovní headery .h .obj .obj .obj .obj .obj .lib spustitelný program .cpp CC .obj Link .exe spojování (linkování) objektový modul (přeložený kód) kompilace

  18. Překlad více modulů – oddělený překlad vlastní headery knihovní headery knihovny .h .h .obj .obj .obj .obj .obj .lib .cpp CC .obj Link .exe kompilace jednoho modulu .obj .obj .c .obj .c .cpp další moduly

  19. Oddělený překlad - dělení na moduly • Modul - ucelená funkčí jednotka • modul.cpp - implementace • modul.h - definice rozhraní rozdělení projektu do modulů a vytváření headerů je umění, nedá se to naučit na přednášce fotbal.h hriste.h hrac.h mic.h fotbal.cpp hriste.cpp hrac.cpp mic.cpp

  20. Překladače a vývojová prostředí • Windows - překladač součástí integrovaného prostředí • MS Visual Studio - Visual C++(.Net2005) • integrovaný make, linker, debugger • klikabilní konfigurace • další překladače - Borland C++ Builder, Intel, Watcom • Unix (Linux) - samostatné programy, příkazová řádka • gcc • make - pro 'opravdové' programátory • pokusy o vývojová prostředí (kDevelop, ...) nepoužívat ! vývoj ukončen

  21. Integrované vývojové prostředí .h .h .obj .obj .obj .obj .obj .lib .c .obj .c .obj CC Link .exe .obj .cpp editor debugger projekt

  22. make .h .h .obj .obj .obj .obj .obj .lib .c .obj .c .obj CC Link .exe .obj .cpp makefile make

  23. Program a modul • Program v C++ nemá (vnořovanou) blokovou strukturu • Neexistuje "hlavní blok" • Běh programu začíná vyvoláním funkce main • Před funkcí main běží inicializace běhového prostředí, po ní úklid • Funkce main musí mít tuto hlavičku: • int main( parametry příkazové řádky) • Modul: posloupnost globálních deklarací a definic • Deklarace • Oznámení překladači, že identifikátor existuje • Určení některých vlastností (typ, parametry) • Definice • Doplnění zbývajících vlastností (kód funkce, obsah struktury) • Překladač vygeneruje kód funkce, vyhradí místo pro proměnnou

  24. Příklad - malá násobilka deklarace knihovních funkcí, ... hlavička funkce, formální parametr #include <stdio.h> int vynasob( int c) { int i = 1, v; if( c < 1 || c > 10) return -1; while( i <= 10) { v = i * c; printf( "%d * %d = %d\n", i, c, v); i = i + 1; } return 0; } int main() { int cislo = 7; vynasob( cislo); return 0; } neinicializovaná proměnná inicializovaná celočíselná proměnná okanžitý návrat z funkce kontrola parametrů 2 * 7 = 14 začátek cyklu ++i konec cyklu konec, OK hlavní program konec, OK ignorování návratové hodnoty volání funkce se skutečným parametrem The END

  25. Funkce vnořené funkce nelze! • Základní programová jednotka je funkce • Neexistují vnořené funkce • Začátek programu – funkce main int fce2( int a) { int fce1(int x, int y) { return x+y; } return fce1( 2*a+17); } int fce1(int x, int y) { return x+y; } int fce2( int a) { return fce1( 1, 2*a+5); } int main( int argc, char** argv) { ... } začátek programu argumenty z příkazové řádky později

  26. Funkce - návratový typ • Typ funkce = typ návratové hodnoty • Hodnota se vrací pomocí klíčového slova return • Speciální typ void - 'prázdný' typ • ekvivalent procedury Pascalu voidfce2( char* text) { printf( text); } voidfce3( char* text) { if( ! text) return; printf( text); } intfce1(int x, int y) { returnx+y; } návrat z funkce návrat celočíselné hodnoty

  27. Parametry funkce • Pevný počet, pevný typ • možnost proměnného počtu parametrů - printf • Parametry jsou odděleny čárkou • U každého parametru musí být uveden jeho typ • Funkce bez parametrů - void každý parametr musí mít typ int fce1(int x, int y, float z) { ... } int f2( double a[5], char* str) { ... } int f3( void) { ... } int fce1(intx, y) { ... } int fce3 { ... }

  28. Volání funkce • Shoda počtu formálních a skutečných parametrů • Kompatibilita typů formálních a skutečných parametrů • I funkce bez parametrů musí obsahovat operátor () • Návratová hodnota - lze ignorovat int fce1(int x, int y, float z) { ... } int fce3(void) { ... } int fce2( int a) { fce1( a, 1, a); fce3(); return 0; } int fce1(int x, int y, float z) { ... } int fce2( int a) { fce1; fce1( a, 1); fce1( a, 1, "ahoj"); }

  29. Předávání parametrů funkci • Všechny parametry se předávají hodnotou • 'Výstupní' parametry pouze přes ukazatele nebo reference voidswap(int x, int y) { int pom; pom = x; x = y; y = pom; } void fce(void) { int a = 1; int b = 2; int c = 0; swap( a, b); c = 2 * a + b; } vymění se jen lokální proměnné funkce předají se pouze hodnoty (1, 2) nikoliv 'proměnné'

  30. Lokální proměnné • Definice lokálních proměnných • C: na začátku těla funkce (bloku) • C++: kdekoliv v těle funkce • Možná inicializace – při každém běhu funkce • neinicializovaná proměnná – náhodná hodnota !!! hlavní blok funkce deklarace celočíselných proměnných int fce2( void) { int i = 0; while( i < 100) { int j = i + 1; i = j * i; } // j jiz neexistuje return i; } vnořený blok int fce( void) { int x, y; int z = 0; return z + x; } deklarace proměnné ve vnořeném bloku deklarace s inicializací inicializace se provádí při každém průběhu náhodná hodnota !!! po ukončení bloku již proměnná neexistuje

  31. Globální proměnné • Definice mimo tělo funkce • Viditelné v jakékolivfunkci • Možná inicializace – při startu programu • Používat s rozvahou!! • pouze pro sdílená data globální proměnná formální parametr int g = 1; void fce( int x) { int z = 2; g = g + z * x; } int main( void) { fce( 2); fce( 3); return g; } lokální proměnná co vrátí main ?? skutečný parametr

  32. Výraz • Norma: "Výraz je posloupnost operací a operátorů specifikující výpočet hodnoty" • Přiřazovací 'příkaz' je také výraz • jeho hodnotou je přiřazovaná hodnota • Výrazy mohou mít vedlejší efekty 1 a+b*sin(x) printf( "Ahoj") q = &b[17]+*++p "retezec" a = b = 0; if( (x = fnc()) != 0) ... užitečné: test přiřazované hodnoty přiřazení je také výraz

  33. Příkaz • Příkaz je • výraz ukončený ';' (středníkem) • složený příkaz- posloupnost příkazů mezi '{' a '}' • programová konstrukce { 1; a+b*sin(x); printf( "Ahoj"); q = &b[17]+*++p; "retezec"; } 1; a+b*sin(x); printf( "Ahoj"); q = &b[17]+*++p; "retezec"; složený příkaz

  34. Podmíněný příkaz • if(výraz)příkaz • if(výraz)příkazelsepříkaz if( a > 1) { b = 0; printf( "OK"); } else { printf( "nee"); } syntakticky správně, ale dělá něco jiného if( a > 1) printf( "OK"); if( a > 1) b = 0; printf( "OK"); if( a > 1) printf( "OK"); else printf( "nee"); if( a > 1){ b = 0; printf( "OK"); }else{ printf( "nee"); } if( a > 1) b = 0; printf( "OK"); else printf( "nee"); syntakticky špatně

  35. Vnořené podmíněné příkazy Syntakticky správně, ale nepřehledné Na pohled nejasné párování if( a > 1) if( b > 0) printf( "OK"); else printf( "nee"); if( a > 1){ if( b > 0) printf( "OK"); } else { printf( "nee"); } if( a > 1){ if( b > 0) printf( "OK"); else printf( "nee"); } U vnořených podmínek vždy používat { }

  36. Vícenásobné větvení – konstrukce switch • switch(výraz){ • casekonstanta: • posloupnost příkazů • break; • casekonstanta: • casekonstanta: • posloupnost příkazů • break; • default: • posloupnost příkazů • } celočíselný výraz switch( opcode) { case 0: // no op break; case 10: add(); break; case 11: case 12: cmp(opcode); break; default: error(opcode); break; } switch( opcode) { case 0: // no op case 10: ... ukončení větve zapomenutý break syntakticky OK, ale dělá něco jiného switch( ch) { case '0'..'9': x += ch - '0'; break; case 'A'..'F': x += ch - 'A'; break; } pokud výraz není roven žádné z konstant více návěští pro jednu větev interval nelze

  37. Cyklus – konstrukce while a do-while • while(výraz)příkazpodmínka na začátku • do příkazwhile(výraz) ;podmínka na konci Pozor! cyklus pokračuje pokud je podmínka platná while( a > 1) a = a / 2; tělo se vždy alespoň jednou provede do { fce( a); a = a / 2; } while( a > 1); while( a > 1) { fce( a); a = a / 2; }

  38. Cyklus – konstrukce for • for(výraz1;výraz2;výraz3)příkaz • je ekvivalentem • výraz1; • while(výraz2) { • příkaz • výraz3; • } inicializace podmínka inkrement tělo cyklu ekvivalent v jiném jazyce for( i=0; i<=9; i=i+1) { fce( i); } FOR I := 0 TO 9 DO FCE(I) i=0; while( i<=9) { fce( i); i=i+1; } for v C++: obecnější, širší možnosti použití jako inicializaci, podmínku i inkrement lze libovolný výraz init(a); while( i<9&& a[i] >0) { fce( i); a[i++]=0; } for( init(a); i<9&& a[i] >0; a[i++]=0) { fce( i); }

  39. Ukončení cyklu - break, continue • breakokamžité ukončení celého cyklu • cyklus s podmínkou uprostřed • ošetření chybových stavů • continueukončení (jednoho) běhu těla cyklu for(;;) { errc = fce(); if( errc < 0) break; jinafce(); } n = 1; while( n<1000) { val = get(); if( val == 0) continue; n = n * val; }

  40. Goto • Nepoužívat! .... pokud k tomu není dobrý důvod • Když už, tak pouze dopředu (skok dozadu = cyklus) • Dobrý důvod: výskok z vícenásobně vnořených cyklů nelze break - ukončil by pouze vnitřní cyklus, vnější cyklus by pokračoval for( i=0; i<10; ++i) { for(j=0; j<10; ++j) { if( fnc( i, j) == ERROR) goto konec_obou_cyklu; } } konec_obou_cyklu: dalsi_funkce(); label návěští

  41. Celočíselné typy • Základní celočíselné typy jsou znaménkové • Pro každý typ existuje unsigned varianta • možné využití unsigned: unsigned char, pole bitů, modulová aritmetika • pokud není dobrý důvod, unsigned raději nepoužívat • char  short  int  long  long long 1 byte -2GB .. +2GB velikost objektů rozdíl ukazatelů rozšířená znaková sada

  42. Logické a znakové hodnoty a typy • C: Až do r. 1999: neexistuje typ 'boolean' • Porovnání a logické operátory jsou celočíselné výrazy • FALSE (nepravda) 0 • TRUE (pravda) 1 (libovolná hodnota různá od 0) • důsledek: • if( x != 0)  if( x) • if( x == 0)  if( !x) • C++, C99 • celočíselnýtyp bool (C99:_Bool) • hodnoty true (=1), false (=0) • charnorma neurčuje signed / unsigned (!) • korektní porovnání na nerovnost pouze 0 .. 127 • 'a' < 'ž' ? • signed char -128 .. 127 • unsigned char 0 .. 255 - 'byte' • wchar_t stddef.h: znakrozšířené sady (Unicode) časté použití: test (ne)nulovosti záleží na implementaci většinou char = signed 40 > 200 !!!200 -56

  43. Výčtový typ • enum pohlavi { p_muz, p_zena }; • pohlavi p = p_muz; • int pp = p_zena + 1; • pohlavi q = 0; • enum flags { f1 = 1, f2 = 2, f3 = 4, f4 = 8 }; • if( x & f1) • ... • enum porty { pop3 = 111, ftp = 21, smtp = 80 }; hodnoty doplnípřekladač (od 0) lze použít jako celočíselnou hodnotu (ale většinou to nemá rozumný smysl) C++: samostatný typ - nelze (C: celočíselné konstanty - OK) test bitů explicitní hodnoty

  44. 'Reálné' typy • float  double  long double Pozor! Reálné výpočty jsou vždy nepřesné zvýšená přesnost double x = 1; double y = x / 3; if( x == 3 * y) printf( "Presne"); else printf( "Nepresne"); malá přesnost - nepoužívat! standard pro 'reálné' výpočty pro přesné hodnoty používejte přesné typy raději nepoužívat pouze pro fyzikální nebo numerické veličiny double zustatek = 15.60; long zustatek_v_halerich = 1560;

  45. Celočíselné konverze • Automatické konverze (integral promotions) • Výpočty výrazůvždy v šíři alespoň int • signed char, unsigned char, signed short  signed int • unsigned short  signed int (pokud je int delší) / unsigned int • Automatické konverze u binárních operací • signed int  unsigned int  signed long  unsigned long   float  double  long double vždy když je použit menší typ než int při nestejných operandech moudro: prostě se to zkonvertuje na ten větší

  46. Přehled operátorů, asociativita a priorita

  47. Základní aritmetické operátory • + - * / % • podle typu operandů  automatická konverze na větší typ • % - modulo int x=5, y=3; double a=5, b=3; modulo je pouze celočíselná operace celočíselné dělení reálné dělení

  48. Bitové a logické operátory • &| ^~ - bitové operace AND, OR, XOR, NOT • && || !- logické operace AND, OR, NOT oba op.  0 5 = 01012 3 = 00112 1 = 00012 7 = 01112 9 = 10012 15 = 11112 10 = 10102 alespoň jeden operand  0 neexistuje alespoň jeden operand = 0

  49. Zkrácené vyhodnocování, relační operátory • a && b - je-li a=0, b se nevyhodnocuje, výsledek = false (0) • a || b - je-li a=1, b se nevyhodnocuje, výsledek = true (1) • < <= >= > • == != • výraz typu int(bool) - výsledek vždy 0 nebo 1(false, true) • porovnávání na (ne)rovnost float/double ! • porovnání vs. přiřazení ! test mezí pole před přístupem k prvku pole int x[10]; // pole 0..9 if( i < 10 && x[i] != 0) y = y / x[i]; if( x==y && *x++) ... Pozor! operátory s vedlejšími efektyse nemusí provést ! POZOR!!!Přiřazení! (zde hodnota vždy = 1) if( x = 1) ...

  50. Přiřazení, inkrementace, bitový posun • = • += -= *= /= %= &= |= ^= <<= >>= • kombinované přiřazení • a op= b  a = a op b • ++ -- • ++a a = a + 1 , výsledkem je nová hodnota a • a++a = a + 1, výsledkem je stará hodnota a • přesněji: a++ (tmp = a, a = a + 1, tmp) • <<>> • bitový posun • C++ - časté použití pro jiné účely (streams) - přetěžování i += 2; x[ i+=1]/= 3; pokud si lze vybrat, preferujte preinkrement int sum = 0; int i, x[10]; ... for( i=0; i<9; sum += x[i++]) ; pozor - vždy si uvědomit, zda jde o pre- nebo post- inkrementaci

More Related