3. előadás (2005. március 1.) Utasítások, tömbök utasítás: üres, összetett, feltételes utasítás, switch utasítás, ciklus utasítások, tömbök.
C utasítások kifejezés; Üres utasítás: ; Összetett utasítás (blokk vagy utasítás csoport): { .... } Belsejében változók deklarálhatók. Utána nem írunk pontosvesszőt (üres utasítás).
Vezérlési szerkezetek Elágazás 1: if (kifejezés) "igaz" utasítás else "hamis" utasítás Az else rész nem kötelező. A kifejezés csak int-re konvertálódó lehet.
Elágazás példa: Csellengő else: if (a==5) /* Hibalehetőség: a=5 */ if (...) if (...) if (...) if (...) if (...) { else else if (...) }
Elágazás: elseif if (kifejezés) "igaz" utasítás else if (kifejezés)
Több eset kezelése, switch utasítás: Formája: switch (kifejezés) { case konst_kif1: utasítás1 case konst_kif2: utasítás2 ... case konst_kifn: utasításn default: utasítás } Kifejezés: int, char, long, short típusú
Switch-default példa char c; c=getchar(); switch (c) { case 'a': case 'b': case 'c': printf("a vagy b vagy c"); return 1; default: return (0); }
Switch-break példa int i=5; switch (i%3) { case 0: printf("\nhárommal osztható"); break; case 1: printf("\nmaradék 1"); case 2: printf("\nmaradék 2"); }
A while ciklus utasítás while (kifejezés) utasítás Pl. char c; c='*'; while ((c!='n') && (c!='i')) c=getchar(); Előtesztelő ciklus utasítás, lehet, hogy a ciklusmag egyszer sem hajtódik végre.
A do ... while ciklus utasítás do utasítás while (kifejezés); Pl. char c; do c=getchar(); while ((c!='n') && (c!='i')); Utótesztelő ciklus, a ciklusmag legalább egyszer végrehajtódik.
A for ciklus utasítás for ( inicializáló_kif; ellenőrző_kif; újrainic_kif ) utasítás Működése: 1. inicializáló_kif kiszámítása 2. ha az ellenőrző_kif hamis, akkor kilépés a for utasításból 3. utasítás (ciklusmag) végrehajtása 4. újrainic_kif kiszámítása 5. visszaugrás a 2. pontra
A for utasítással egyenértékű (ekvivalens) while utasítás inicializáló_kif ; while (ellenőrző_kif ) { utasítás újrainic_kif ; }
for utasítás példák 1. for (i=0; i<N; a[i++]=0); for (c=1; c<=20; c++) printf("%d\n",c); for (c=100; c>0; c--) ... for (c=0; c<1000; c+=5) ... c=1; for (; c<1000; c++) ... for (c=1, printf("elkezdtem"); c<10; c++)... for (c=0; c<1000;) printf ("%d\n",c++);
for utasítás példák 2. for (c=0; c<1000 && a[c]!=0; c++) printf(" ", a[c]); for (c=0; c<1000 && a[c];) printf(" ", a[c++]); for (c=0; c<1000; a[c++]=5); for (i=0, j=999; i<1000; i++, j--) b[j] = a[i];
Végtelen ciklusok while (1) utasítás for (;;) utasítás Pl. hálózati szerver vagy interaktív programokban Leállítás: Adott feltétel esetén: exit(visszatérési_érték) Megszakítással: Ctrl+C, Ctrl+Break, Ctrl+\
A break utasítás for (i=0 ; ; i++) { if (getchar() == 'n') break; } printf ("\naz%d-edik leütött kar. az\'n\'!", i); Ciklusban a break-et tartalmazó ciklus megszakítására használható.
A continue utasítás int szamlalo; for (szamlalo=0, i=0; i<N; i++); /*!!!*/ { if (a[i]<0) continue; szamlalo++;/*nemnegatív elemek sz.*/ } A continue a ciklus újrainicializáló részére adja a vezérlést.
goto utasítás, címkék Hagyományőrzési céllal és néhány elkerülhetetlen esetben a hatékonyság növelésére. Pl. for ( ... ) for ( ... ) { ... if ( ... ) goto errorc; } errorc: hibakezeles ();
Egymásbaágyazott ciklusok for (i=0; i<N; i++) { for (j=0; j<M; j++) printf ("\n%d.sor %d.oszlop eleme %d", i,j,a[i][j]); } A belső ciklus befejeződése után folytatódik a külső. Fontos az utasítások megfelelő csoportosítása.
Tömbök Olyan összetett adattípus, amely azonos típusú elemekből áll és a memóriában folytonosan helyezkedik el. Tömb deklarációja típus név [elemszám1] {[elemszám2]…}; Az elemszám csak állandó kifejezés lehet. Hivatkozás egy elemre: név[indexkifejezés1]{[indexkifejezés2]…} Az index kifejezés tetszőleges egész típusú kifejezés. Az index alsó határa 0, 0 <= index <= elemszám-1. Az index érvényességét a fordítóprogram nem ellenőrzi!
A sizeof operátor használata A CPU függetlenség miatt fontos a sizeof operátor használata, pl.: int a[10]; sizeof(a[0]) sizeof(int)=4 (CPU függő) sizeof(a) 10*sizeof(int)=40 (CPU függő) sizeof(a)/sizeof(a[0]) =10 (CPU független)
Tömb elhelyezkedése a memóriában elem eltolás cím 0FFC a[0] 0 1000 a[1] 1*sizeof(int) 1004 a[2] 2*sizeof(int) 1008 a[3] 3*sizeof(int) 100C (CPU függő)
Tömb inicializálása 1. Egydimenziós: típus név [elemszám]= {konst_1, konst_2, ... , konst_elemszám-1}; Pl. double koord[3]={0.3, 0.6, 0.8}; double koord[]={0.3, 0.6, 0.8, 1.1};
Tömb inicializálása 2. Kétdimenziós: vagy int a[2][3]={{2, 3, 6}, {3, 6, 8}}; vagy int a[][3]={{2, 3, 6}, Az utolsó indexnek mindig ismertnek kell lennie, csak egy index lehet határozatlan (az első)!