1
Procedur´ aln´ı programov´ an´ı a strukturovan´ e programov´ an´ı
Charakteristick´e pro procedur´aln´ı programov´an´ı je organizace programu, kter´y ˇreˇs´ı dan´y probl´em, do blok˚ u (procedur, funkc´ı, subrutin). P˚ uvodnˇe jednolit´y, a nepˇrehledn´y program, je rozdˇelen´ı u ´ lohy na d´ılˇc´ı pod´ ulohy, kter´e jsou implementov´any v jednotliv´ych funkc´ıch. Kaˇzd´y procedur´aln´ı programovac´ı jazyk m´a vnitˇrnˇe implementovan´e konstrukty pro proramov´e cykly (for cykly, while cykly). Nav´ıc je zpravidla pˇrid´ana moˇznost sestaven´ı nov´ych datov´ych struktur z vnitˇrnˇe definovan´ych.
2
Datov´ e typy v jazyce C
Z´akladn´ı jednotou informace je bit, ta nab´yv´a dvou hodnot 0 nebo 1. Prakticky si realizaci bitu m˚ uˇzeme pˇredstavit jako pˇrep´ınaˇc, kdy poloha on odpov´ıd´a 1 a poloha off odpov´ıd´a 0. V pamˇeti poˇc´ıtaˇce jsou bity organizov´any do vˇetˇs´ı struktury obsahuj´ıc´ı 8 bit˚ u. Tato jednotka je pojmenov´ana byte.
jm´eho datov´eho typu char int float double
3
Table 1: Datov´e typy v C velikost v bytech (B) obsah 1 znak 4 cel´e ˇc´ıslo 4 ˇc´ıslo s plovouc´ı desetinou ˇc´arkou 8 ˇc´ıslo s plovouc´ı desetinou ˇc´arkou
Odvozen´ e datov´ e typy
Pomoc´ı konstrukce typedef struct{<structure body>}
m˚ uˇzeme odvodit vlastn´ı typy kter´e obsahuj´ı v´ıce poloˇzek. Napˇr´ıklad definujme strukturu VECTOR.
typedef struct{float x,y,z; }VECTOR;} V programu pak deklarujete, napˇr., promˇennou v jako typ VECOR n´aslednˇe
1
VECTOR v; K jednotliv´ym prvk˚ um struktury pak pˇristupujet pˇre oper´ator teˇcka, tj., ”.”. Pod´ıvejte se na n´asleduj´ıc´ı pˇr´ıklad p.x=1.0; p.y=2.0; p.z=7.0;
4
Pole
Pro potˇreby automatick´eho zpracov´an´ı v´ıce dat stejn´eho datov´eho typu se dobˇre hod´ı pole. Pole je od ostatn´ıch promˇenn´ych odliˇsuje hranat´ymi z´avorkami za jm´enem promˇenn´e. Napˇriklad deklarujeme pole A o 10 prvc´ıch datov´eho typu int, int A[10]; Jednotliv´e prvky pole jsou od sebe odliˇseny intexem od 0 do 9, tj., prvky v´yˇse deklarovan´eho pole A jsou A[0], A[1], A[2], ... , A[9]. Takto jsem si uk´azali deklaraci jednozormˇern´eho pole. Pro pˇr´ıpad dvourozmˇern´eho pole je postup n´asleduj´ıc´ı, int B[2][10]; T´ımto pˇr´ıkladem jsme deklarovali pole B kter´e m´a 2 ˇr´adky a 10 sloupc˚ u. U v´ıcerozmˇern´ych pol´ı postupujeme analogicky.
5
Funkce main
Ve sv´em programu m˚ uˇzete definovat ”bezpoˇcet” funkc´ı. Mezi nimi vˇsak mus´ı b´yt jedna vyj´ımeˇcn´a, kter´a je vol´ana syst´emem jako prvn´ı, je to funkce main. Kaˇzd´a funkce se skl´ad´a z hlaviˇcky obsahuj´ıc´ı vr´acen´y datov´y typ, n´azev funkce a v kulat´ych z´avork´ach argumenty funkce. V pˇr´ıpadˇe funkce main budeme pouˇz´ıvat jej´ı hlaviˇcku ve tvaru 2
int main(int c, char *argv[]) kde je vidˇet, ˇze vrac´ı hodnotu typu int, prvn´ım argumentem je poˇcet argument˚ u na pˇr´ıkazov´e ˇr´adce, a jej´ım druh´ym argumentem je pole ˇretˇezc˚ u obˇ sahuj´ıc´ı hodnoty argument˚ u na pˇr´ıkazov´e ˇr´adce. Uvedmˇe jednoduch´y pˇr´ıklad programu v C.
6
Hello world
V t´eto sekci uv´ad´ım s´erii variac´ı na pˇr´ıklad HelloWorld. Zaˇcnˇeme tou nejjednoduˇsˇs´ı prvn´ı variantou #include<stdio.h> int main(int c, char *argv[]) { printf("Hello world\n"); return 0; }
Na prvn´ım ˇr´adku je tzv. direktiva preprocesoru pro vkl´ad´an´ı jin´eho souboru. V tomto pˇr´ıpadˇe je to soubor stdio.h, kter´y obsahuje hlaviˇcky ke standartn´ım vstupnˇe/v´ystupn´ım (I/0) fukc´ım. Na druh´em ˇr´adku je hlaviˇcka hlavn´ı funkce, funkce main. Tˇelo funkce je uvozeno kroucen´ymi z´avorkami. V tˇele funkce jsou dva ˇr´adky. Na prvn´ım ˇr´adku vol´ame funkci printfjej´ımˇz argumentem je ˇretˇezec, kter´y m´a b´yt vytiˇstˇen na standartn´ı v´ystup (vˇetˇsinou na obrazovku). Vˇsimnˇete si, ˇr´adek je ujonˇcen stˇredn´ıkem(”;”). Stˇredn´ık vˇzdy ukonˇcuje ˇr´adek. Na druh´em ˇr´adku je pˇr´ıkaz return, kter´ym syst´em informujeme o stavu ukonˇcen´eho programu (zda probˇehl vpoˇr´adku, pokud ne tak jak´a nastala chyba). V dalˇs´ım pˇr´ıkladu si uk´aˇzeme jak vytisknou na obrazovku poˇcet argumen˚ u na ˇr´adce taky jednotliv´e argumenty. #include<stdio.h> int main(int c, char *argv[]) { int i; printf("Hello world\n"); for(i=0;i
3
{ printf("argv[%d]=%s\n",i,argv[i]); } return 0; }
V tomto pˇr´ıkladu pˇribylo nˇekolik nov´ych ˇr´adk˚ u. Nejprve si vˇsimnˇete deklarace promˇenn´e (int i;). T´ımto ˇr´adkem jsme v pamˇeti poˇc´ıtaˇce staticky alokovali 4 byty pro celoˇc´ıselnou promˇenou i,kter´a slouˇz´ı k indexaci pole argv.Za vol´an´ım pˇr´ıkazu printfpˇribyl cyklus for, ve kter´e se bude v kaˇzd´em kroku cyklu zvyˇsovat hodnota uloˇzen´a v io jedniˇcku (i++) a to postupn´e od 0 aˇz po hodnotu uloˇzenou v promˇenn´e c. V kaˇzd´em kroku cyklu je vol´ana funkce printf, kter´a vytiskne na obrazovku hodnotu indexu ia hodnotu argumentu argv[i].
7
ˇ sen´ı kvadratick´ Reˇ a rovnice
Kdyˇz zap´ıˇseme obecnou kvadratickou rovnici ve tvaru ax2 + bx + c = 0
(1)
tak jej´ı ˇreˇsen´ı hled´ame ve tvaru x1 x2
√ −b + D = 2a√ −b − D = 2a
(2) (3)
kde je D diskriminant rovnice, jehoˇz hodnotu urˇc´ıme z v´yrazu D = b2 − 4ac
(4)
Pˇred samotn´ym programov´an´ım mus´ıme prov´est anal´yzu u ´ lohy. Jak´e hodnoty mohou nab´yvat parametry a,b,c. Jestli D m˚ uˇze b´yt libovoln´e ˇc´ıslo, atp. V naˇsem pˇr´ıpadˇe mus´ı b´yt a! = 0 a D > 0(pokud hled´ame ˇreˇsen´ı pouze v prostoru re´aln´ych ˇc´ısel). V´ysledn´y program by mohl vypadat takto #include<stdio.h> #include<stdlib.h> #include<math.h> int main(int nc, char *argv[]) {
4
float a,b,c,D,x1,x2; if(nc==4) { a=atof(argv[1]); b=atof(argv[2]); c=atof(argv[3]); if(fabs(a)>1.0e-8) { D=b*b-4.0*a*c; if(D>0.0) { x1=(-b+sqrt(D))/(2.0*a); x2=(-b-sqrt(D))/(2.0*a); printf("x1=%f
x2=%f\n",x1,x2);
}else{ printf("reseni neni v prostoru realnych cisel\n"); return -3; } }else{ printf("neni kvadraticka rovnice\n"); return -2; } }else{ printf("nedostatek argumentu\n"); return -1; } return 0; }
.... dalˇs´ı text bude v brzku n´asledovat :-) ....
5