Objektovˇe orientovan´e programov´an´ı Martin Pergel
11. ˇr´ıjna 2015
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pragmatick´e informace
Voliteln´y/povinn´y pˇredmˇet, z´apoˇcet: z´apoˇctov´y program (s dokumentac´ı), aktivn´ı u ´ˇcast na cviˇcen´ı (body v CodExu), praktick´y test, zkouˇska: objektov´y n´ avrh, ot´ azky. Podrobnosti moˇzn´ a s kolegou Holanem pozmˇen´ıme!
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
C´ıle pˇredmˇetu
Programov´an´ı v C, C++ a C#, objektov´e programov´ an´ı, modern´ı v´yvojov´e prostˇredky.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Souvislosti
Prv´ack´e Programov´ an´ı II s k´odem NPRG je v´yraznˇe odliˇsn´e od Programov´an´ı 2 s k´odem NPRM, resp. NMIN, proto matematici nejsou schopni navˇstˇevovat prakticky ˇza´dn´e navazuj´ıc´ı pˇredn´aˇsky o programov´ an´ı. Kolegov´e Matematici poˇz´ adali o C++, ale bez C# nelze navˇstˇevovat informatick´y druh´ ack´y C#. Budeme mas´ıvnˇe stavˇet na Pascalu. Uvid´ıme, ˇze vˇsechny jazyky jsou vlastnˇe stejn´e (pˇri troˇse ˇstˇest´ı).
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Prostˇredky
Budeme pouˇz´ıvat CodEx, vyuˇz´ıvat budeme bud’to Microsoft Visual Studio (v dostupn´e verzi), nebo prostˇred´ı MONO (oboj´ı je k dispozici leg´alnˇe zdarma aspoˇ n v omezen´e verzi). Tvoˇrit budeme pˇrev´ aˇznˇe konzolov´e aplikace (o psan´ı formul´aˇrov´ych si takt´eˇz nˇeco ˇrekneme - pˇredevˇs´ım v C#).
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Literatura
Bruce Eckel: Thinking in C++ Bruce Eckel: Mysl´ıme v jazyku C++ (Grada) Miroslav Virius: Pasti a propasti jazyka C++ Andrew Koenig, Barbara E. Moo: Accelerated C++ Stanley B. Lippman: Essential C++
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Historie
Navrˇzen v Bell Labs v r´ amci v´yvoje UNIXu, podle K. Thompsona dostali B. Kernighan a D. Ritchie uloˇzeno vytvoˇrit obfuscovan´y Pascal, navrhli jazyk A, se kter´ym nebyli spokojeni, proto navrhli jayzk B, ...., spokojeni byli aˇz s jazykem C, jazyk se ovˇsem zaˇcal mas´ıvnˇe vyuˇz´ıvat.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Vˇseobecn´e vlasntosti jazyka C
Syntax vych´az´ı z Pascalu, plno vˇec´ı je ale navrˇzeno odliˇsnˇe, jazyk povoluje vˇeci v Pascalu nemysliteln´e (konverze), jazyk je v´yraznˇe zjednoduˇsen (nen´ı string a boolean). Existuje nˇekolik norem (K & R, ANSI C89, C99, C11). Pl´ıˇzivˇe doch´az´ı k omezov´ an´ı moˇznost´ı, C++ moˇznosti omezuje jeˇstˇe v´ıce.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
C VS C++
C je jazyk podobn´y Pascalu, C++ je jazyk, ve kter´em je k vidˇen´ı t´emˇeˇr vˇse, maj´ı velk´y pr˚ unik syntaxe spoleˇcn´y, C++ podporuje objekty, C podporuje kouzlen´ı. Obvykle uvid´ıte pˇrekladaˇce C++, ale nikdy nev´ıte, kdy budete potˇrebovat C, proto si ˇrekneme o obou jazyc´ıch. Pˇrekladaˇce: GCC, G++, Visual Studio .NET,...
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Datov´e typy a promˇenn´e Ve vˇsech jazyc´ıch pracujeme s promˇenn´ymi, datov´e typy se podobaj´ı Pascalu, jen o nich v´ıme m´enˇe (a jmenuj´ı se jinak). char, byte, int, float, double modifik´atory (intu): long, short, unsigned. Napˇr´ıklad: unsigned long int. Ovˇsem staˇc´ı jen: short nebo unsigned long. Definice promˇenn´e: var a,b,c:integer; ⇒ int a,b,c; modifik´atory const a volatile. Nechybˇej´ı ve v´yˇctu nˇekter´e d˚ uleˇzit´e datov´e typy?
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Chybˇej´ıc´ı datov´e typy a jak se s nimi vypoˇr´ ad´ ame:
boolean nahrazen intem, nula je false, cokoliv jin´eho znamen´ a true. M´ısto stringu pouˇzijeme pointer na char, jednotliv´e prvky stringu budeme ukl´ adat na adresy po sobˇe jdouc´ı, pointer ukazuje na zaˇc´ atek. V C++ tyto typy jiˇz jsou, nicm´enˇe procviˇcen´ı pointer˚ u nen´ı nikdy od vˇeci. Neˇz se dostaneme k pr´ aci s pointery, nen´ı moc co cviˇcit.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Od Pascalu k C v Pascalu um´ıme pˇredevˇs´ım:
Tˇelo hlavn´ıho programu, pouˇz´ıvat bloky (begin, end), komentovat zdrojov´e texty, definovat funkce a procedury, pouˇz´ıvat (definovat a inicializovat) promˇenn´e, vracet n´avratovou hodnotu, pracovat s oper´atory, pouˇz´ıvat z´akladn´ı ˇr´ıd´ıc´ı struktury.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Case sensitivita je stejn´ a skoro u vˇsech jazyk˚ u z familie C
Oproti Pascalu je C, C++, C#, Java, Javascript... case-sensitive, tedy z´aleˇz´ı na velikosti p´ısmen. Funkce writeln, Writeln, WriteLn, writeLn a WRITELN by byly form´alnˇe r˚ uzn´e funkce (funkce s r˚ uzn´ymi jm´eny). Ovˇsem pozor, i funkce (pro vstup a v´ystup) se v r˚ uzn´ych jazyc´ıch jmenuj´ı r˚ uznˇe! Je tud´ıˇz tˇreba uˇcit se jm´ena funkc´ı i s velikost´ı p´ısmen. Modernˇejˇs´ı v´yvojov´ a prostˇred´ı naˇsept´ avaj´ı, je ale dobr´e nestat se na tˇechto prostˇred´ıch naprosto z´ avisl´ym. Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Hlavn´ı program V Pascalu je hlavn´ı program volnˇe sypan´y mezi begin a end. Jazyk C je metodiˇctˇejˇs´ı: funkce main, tato funkce bere dva argumenty: Poˇcet argument˚ u (int) a dotyˇcn´e argumenty (pole string˚ u, tedy char-pointer˚ u). Nikdo ale nekontroluje, zda hlaviˇcka odpov´ıd´ a (tedy i int main() nebo int main(void) bude fungovat. Vrac´ı int (ˇc´ımˇz m˚ uˇze ˇr´ıct, zda se program nedostal do pot´ıˇz´ı podobnˇe jako v Pascalu). Obˇcas se vstupn´ı bod programu jmenuje jinak ( tmain) nebo (wmain). Tyto funkce mohou umoˇznit pohodlnˇejˇs´ı pr´ aci napˇr´ıklad s parametry (pokud maj´ı smysl). Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Bloky a koment´aˇre V Pascalu se bloky zahajovaly a ukonˇcovaly slovy begin resp. end. V jazyku C se zahajuj´ı resp. ukonˇcuj´ı sloˇzen´ymi z´avorkami (kter´e v Pascalu slouˇzily k psan´ı koment´ aˇr˚ u). Tud´ıˇz se i koment´ aˇre musej´ı v C syntakticky liˇsit. Jsou zde dvˇe moˇznosti: Koment´aˇr obecn´y: /* Zde je komentar... a bude az do ukonceni komentare jako v Pascalu. */ Koment´aˇr jednoˇr´adkov´y (pozor, proti ANSI C89): // Komentar do konce radku.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Procedury a funkce aneb proˇc jsem uˇz v prv´ aku nerad slyˇsel o procedur´ ach
Procedura je souˇc´ ast programu, kter´ a um´ı naˇc´ıst a zpracovat zadan´e parametry. Funkce je souˇc´ast programu, kter´ a um´ı naˇc´ıst a zpracovat zadan´e parametry a vr´ atit v´ysledek. Vid´ıme, ˇze procedura je jen funkce, kter´ a nevrac´ı hodnotu, proto v C procedury nejsou. Procedura je funkce vracej´ıc´ı nic. Syntakticky tedy zavedeme pr´azdn´y datov´y typ void.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Procedury a funkce pˇr´ıklad
V Pascalu: function nazev(arg1:typ1; arg2:typ2;...):navr typ; V C: navr typ nazev(typ1 arg1, typ2 arg2,...) Pozn´amky: Typ parametru mus´ıme uv´est pokaˇzd´e zvl´aˇst’ (nefunguje pascalsk´e a,b,c:integer). Povˇsimnˇete si stˇredn´ık˚ u na konci hlaviˇcky. Uvedeme-li stˇredn´ık v C, jde o deklaraci (za kterou nebude n´ asledovat definice ekvivalent pascalsk´e direktivy forward). Funkce se volaj´ı t´emˇeˇr jako v Pascalu, jen je tˇreba vˇzdy pouˇz´ıt oper´ator zavol´an´ı (kulat´e z´ avorky s argumenty – byt’ pr´azdn´ymi)! Tˇri teˇcky lze takto v C opravdu pouˇz´ıt (ale o tom pozdˇeji). Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Definice promˇenn´ych a inicializace – definice je skoro jako v Pascalu, inicializace je u ´plnˇe jin´ a
V Pascalu: var a,b,c:integer; V C: int a,b,c; V Pascalu byl probl´em s inicializac´ı, V C nen´ı: int a=0,b=1,c=2; Podle C86 bylo tˇreba lok´ aln´ı promˇenn´e definovat na zaˇc´atku funkce, podle C99 lze prakticky kdekoliv (ale nen´ı vhodn´e toho zneuˇz´ıvat). Definice glob´aln´ıch promˇenn´ych je volnˇe sypan´a ve zdroj´aku (zdroj´ak sest´av´a pˇredevˇs´ım z definic promˇenn´ych a funkc´ı).
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
N´avratov´a hodnota funguje u ´plnˇe jinak neˇz v Pascalu, proto pozor
V Pascalu byla speci´ aln´ı write-only promˇenn´ a, do kter´e se n´avratov´a hodnota pˇriˇrazovala. Jazyk C vych´az´ı z toho, ˇze c´ılem funkce je vr´ atit n´avratovou hodnotu, tedy jak je n´avratov´a hodnota jasn´ a, funkce konˇc´ı. N´avratovou hodnotu vrac´ı return... Pˇr´ıklady: return;, return hodnota;
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pˇr´ıklad vyuˇz´ıvaj´ıc´ı oper´ atory, o kter´ych si nˇeco ˇrekneme za chv´ıli...
V Pascalu: var globpna:longint;{Globalni promenna} function secti(a,b:integer):integer; var pom:integer;{lokalni promenna} begin pom:=a+b; {Secteme} secti:=pom; {Vratime hodnotu} end; Kdeˇzto v C: long globpna; //Globalni promenna int secti(int a, int b) { int pom=a+b; //Secteme pri inicializaci return pom; //Slo by i return a+b; /* Pozor, instrukce zde uz neprobehnou! */ } Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Z´akladn´ı oper´atory nejsou uvedeny podle priorit!
Martin Pergel
aritmetick´e: +, −, ∗, /, % (souˇcet, rozd´ıl, souˇcin, pod´ıl, zbytek po dˇelen´ı – pozor, pod´ıl sleduje typy argument˚ u), logick´e: &&, ||, ! (konjunkce, disjunkce, negace) relaˇcn´ı: <, >, >=, <=, ==, ! = (menˇs´ı neˇz, vˇetˇs´ı neˇz, vˇetˇs´ı nebo rovno, menˇs´ı nebo rovno, rovno, nerovno) pˇriˇrazovac´ı: =, + =, − =, | = ... (pˇriˇrad’, pˇriˇcti, odeˇcti, vyoruj...) Pozor, pˇriˇrazovac´ı oper´ atory vracej´ı hodnotu. N´avratov´a hodnota je pˇriˇrazovan´ a hodnota a jsou asociativn´ı zprava. D˚ usledek: a=b=c=1; a=(b=(c=1)+1); Bitov´e: &, |, ˆ, <<, >> (bitov´e and, or, xor, shift to left, shift to right napˇr. (16>>2) == 4) Inkrementace, dekrementace: ++, −−. Pozor na side-efekt! A pozor na priority!
Objektovˇ e orientovan´ e programov´ an´ı
Pozn´amka jej´ıˇz d˚ uleˇzitost se projev´ı za chv´ıli
Zat´ımco v Pascalu se stˇredn´ıkem statementy oddˇelovaly, v jazyc´ıch z rodiny C se stˇredn´ıkem statementy ukonˇcuj´ı.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Z´akladn´ı ˇr´ıd´ıc´ı struktury if Podm´ınky se reprezentuj´ı podobnˇe jako v Pascalu, tedy kl´ıˇcov´ymi slovy if a else. Syntax se trochu liˇs´ı. if(podm) prikaz nebo blok if(podm) prikaz nebo blok else prikaz nebo blok Pˇr´ıklad: if(teplota>25) printf("Jdu do hostince\n"); if(teplota>25) printf("Do hostince\n"); else printf("Nikam!"); if(teplota>25) { teplota=teplota-25; printf("Putyka vola!\n");} else printf("Nic nebude!\n"); Pozn: String uzav´ır´ ame do uvozovek, znak (typ char) do apostrof˚ u. Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pozor! Podm´ınky v jazyce C jsou z´ aludn´e.
V jayzku C nen´ı typ boolean. Podm´ınka se reprezentuje intem. if(0).... vˇzdy nesplnˇen´ a podm´ınka if(11).... vˇzdy splnˇen´ a podm´ınka if(11 && 1)... vˇzdy splnˇen´ a podm´ınka if(a=1)... vˇzdy splnˇen´ a podm´ınka
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Warningy a errory
Errory zn´ame z Pascalu (znamenaj´ı, ˇze jsme nˇeco pokazili), jazyk C stanov´ı, ˇze pˇrekladaˇc m˚ uˇze varovat (napˇr´ıklad pˇred jazykovou spodobou) na if(a=1) obvykle pˇrijde warning (ˇze moˇzn´ a nev´ıme, co dˇel´ame). warningu n´as obvykle zbav´ı if((a=1)) Errory jsou pˇredeps´ any normou, warningy m˚ uˇze pˇrekladaˇc vyd´avat dle uv´aˇzen´ı. Je vhodn´e k´od ladit, dokud nen´ı bez warning˚ u.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
while z´ akladn´ı ˇr´ıd´ıc´ı struktury 2
Ovl´ad´a se analogicky, tedy while(podm) prikaz nebo blok Pˇr´ıklad: while(teplota-->25)printf("Pivo!\n"); Pozor, pokud cyklus neprobˇehne, promˇenn´ a teplota se sn´ıˇz´ı o jedna (pˇrestoˇze tˇelo neprobˇehne)!
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
N´ahraˇzka repeat ... until je v podobˇe konstrukce while
do ... while(podm); Opakujeme, dokud je podm´ınka splnˇena (oproti Pascalu, kde opakujeme, dokud je podm´ınka nesplnˇena).
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
for-cyklus je v C v´yraznˇe v´ykonnˇejˇs´ı neˇzli v Pascalu
for(init;podm;increm)prikaz nebo blok Pˇr´ıklady: Pascal: for i:=1 to n do neco C: for(i=1;i
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Faktori´al uˇz radˇeji jen bez rekurze...
int faktorial(int a) { int fakt; for(fakt=1;a>1;a--) fakt*=a; return fakt; }
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Faktori´al podruh´e opˇet radˇeji bez rekurze...
int faktorial(int a) { int fakt=1; for(;a>1;fakt*=a--); return fakt; }
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Faktori´al potˇret´ı opˇet bez rekurze a jeˇstˇe zvrhleji...
int faktorial(int a) { int fakt=1; for(a++;--a;)fakt*=a; return fakt; }
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pr´azdn´y for-cyklus um´ı b´yt neˇcekanˇe u ´ˇcinn´y...
for(;;);
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
switch jak se asi udˇel´ a pascalsk´e case ... of ...?
switch(vyraz) { case prvni: break; case druhy: break; case treti: dalsi; kod; break; default: co } Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
kod; dalsi kod; jeste;
udelat jinak;
Slovo break nen´ı povinn´e a jak´epak jsou z toho d˚ usledky...
Neuvedeme-li na konci bloku slovo break, k´od pokraˇcuje dalˇs´ım blokem! Pˇr´ıklad: switch(den v tydnu) { case 7: den v tydnu-=7; case 0: printf("Pondeli\n"); break; case 1: printf("Utery\n"); break; ... } Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Header-fily I ˇcili hlaviˇckov´e soubory
C je versatiln´ı, tud´ıˇz do nˇej nejsou zadr´ atovan´e skoro ˇz´adn´e funkce. My knihovn´ı funkce pouˇz´ıvat chceme, a je to moˇzn´e. Podle K& R-normy se nic nekontrolovalo, zavol´an´ı neexistuj´ıc´ı ˇ funkce zjistil aˇz linker. Spatn´ e parametry nikdo nekontroloval. Podle novˇejˇs´ıch norem je moˇzn´e (a vhodn´e) kontrolu podstoupit. Deklarace funkce – hlaviˇcka ukonˇcen´ a stˇredn´ıkem (nam´ısto pascalsk´eho forward). Tyto deklarace (spolu s konstantami resp. makry) jsou v hlaviˇckov´ych souborech .h. Chceme-li nˇejakou funkci pouˇz´ıt, je vhodn´e (v C++ nutn´e) hlaviˇckov´y soubor naincludovat. #include<stdio.h> – soubor pro standardn´ı vstup a v´ystup. Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Header-fily I ˇcili hlaviˇckov´e soubory
Udˇel´ame-li si vlastn´ı soubor v souˇcasn´em adres´aˇri, includujeme s uvozovkami (m´ısto se zob´ aˇcky).
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Struˇcnˇe o vstupu a v´ystupu at’ m˚ uˇzeme cviˇcit v CodExu
funkce int getchar(); vrac´ı znak nebo u ´daj o chybˇe. Konec vstupu oznaˇc´ı konstantou EOF. Jak getchar tak EOF jsou v stdio.h. Funkce int putchar(int); vyp´ıˇse znak. Vypisuje se pomoc´ı int printf(char format[],...); printf("Sbohem svete!\n"); printf("%d",cislo); – vypis cisla. Vˇse je v stdio.h. Podrobnosti budou brzy.
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pˇr´ıklad
#include<stdio.h> int main(int argc, char*argv[]) { printf("Sbohem svete!\n"); return 0; }
Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı
Pˇr´ıklad dalˇs´ı
#include<stdio.h> void main(void) { int znak; printf("Zadej (1cif) cislo: "); znak=getchar(); if(znak==EOF) { printf("Ale, ale!\n"); return;} if((znak<48)||(znak>57)) { printf("Co to je!?\n"); return;} znak-=48; printf("Napsal jsi %d\n",znak); } Martin Pergel Objektovˇ e orientovan´ e programov´ an´ı