Mit tudunk már ? Programozás alapjai C nyelv 4. gyakorlat
• • • •
Típus fogalma char, int, float, double változók deklarációja operátorok (aritmetikai, relációs, logikai, bitenkénti, léptető, értékadó, feltételes) • kifejezés, utasítás, összetett utasítás • vezérlési szerkezetek, ciklusok (if, while, do-while, for)
Szeberényi Imre BME IIT
<
[email protected]>
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
-1Programozás alapjai I. (C nyelv, gyakorlat)
Feltételes operátor (?:)
Sorrend !!
kifejezés1
kifejezés2
Példák: a=a>b?a:b y = x == 3 ? x - 2 : z - 8 Programozás alapjai I. (C nyelv, gyakorlat)
n
Algoritmus emlékeztető: Mérleg
Olyan if, aminek értéke van. 2005.10.10. .
-3-
Legnagyobb elem keresése(2)
© BME-IIT Sz.I.
Programozás alapjai I. (C nyelv, gyakorlat)
Mindig a vizsgált elemekből válasszunk a hasonlításhoz elsőt!
© BME-IIT Sz.I.
2005.10.10. .
-4-
Legnagyobb elem keresése (3) #include <stdio.h> Kezdeti érték int main() { int x, max, dbmax, db = 0; while (scanf(”%d”,&x) == 1){ ++ db++; if (db == 1 || max < x){ db = db + 1; vagy max = x; dbmax = db; db += 1; } } printf(”Max.e. sorsz.: %d\n”, dbmax); return 0; }
Vázlat: kezdeti beállítások /db = 0/ while olvas(x) db = db + 1 if db == 1 OR max < x max = x; dbmax = db kiír(max, dbmax)
Programozás alapjai I. (C nyelv, gyakorlat)
-2-
Feladat: Fájl végéig, vagy amíg tudunk, olvassunk be számokat, határozzuk meg a legnagyobbat és írjuk ki, hogy hányadikként olvastuk be.
kifejezés3
© BME-IIT Sz.I.
2005.10.10. .
Legnagyobb elem keresése
kifejezés1 ? kifejezés2 : kifejezés3 i
© BME-IIT Sz.I.
2005.10.10. .
-5-
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
-6-
1
++ és -- operátor
++ és -- operátor (2)
++ inkrementáló (növelés eggyel) -- dekrementáló (csökkentés eggyel) Prefix ++i --i és postfix i++ i-- forma
Prefix forma: int j, i = 2; j = ++i;
kifejezés kif. i (i = 5) értéke értéke i++ 5 6 i-5 4 ++i 6 6 --i 4 4
1. Mellékhatás: i értékét 1-gyel megnöveljük 2. Fő hatás: kiértékeljük az operandust: i-t, ami most 3, ez lesz a ++i kifejezés értéke 3. j-be a kiértékelt jobbérték kifejezés értékét, a 3-at másoljuk (értékadó operátor mellékhatása)
A különbség oka: a fő hatás és a mellékhatás bekövetkezésének különböző sorrendje. Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
-7-
++ és -- operátor (3)
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
-8-
2005.10.10. .
++ és -- operátor (4)
Postfix forma:
Mikor melyik formát használjuk? • A leggyakrabban csak az inkrementálás vagy dekrementálás miatt használjuk, a kiértékelés eredményét el is dobjuk - lásd a példát:
int j, i = 2; j = i++;
db++;
1. Fő hatás: kiértékeljük az operandust: i-t, ami most 2, ez lesz az i++ kifejezés értéke 2. Mellékhatás: i értékét 1-gyel megnöveljük 3. j-be a kiértékelt jobbérték kifejezés értékét, a 2-t másoljuk (értékadó operátor mellékhatása) Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
-9-
++ és -- operátor (5)
for (ch = ’0’; /* inicializálás */ ch <= ’9’; /* feltétel vizsg.*/ printf(”%c”,ch++)) /* léptetés */ ; /* üres a ciklusmag, mert mindent elvégeztünk */
2005.10.10. .
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
Operátor () [] -> . ! ~ ++ -- - (típus) * & sizeof * / + << >> < < = > >= == != & ^ | && || ?: = += -= *= /= &= |= ^= stb. ,
char ch;
© BME-IIT Sz.I.
++db;
• Ha összetett kifejezés része, nem mindegy! Ez egyébként illetlenség, mert nem átlátható a programkód működése. 2005.10.10. .
- 10 -
Percedencia és asszociativitás
Gyakori fordulat a for ciklusban: Pl. a számjegyek kiíratása:
Programozás alapjai I. (C nyelv, gyakorlat)
Itt tehát írhattuk volna azt is, hogy
- 11 -
Programozás alapjai I. (C nyelv, gyakorlat)
Asszociativitás balról jobbra jobbról balra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra balról jobbra jobbról balra jobbról balra balról jobbra
© BME-IIT Sz.I.
Sorrend
√ √ √ √ 2005.10.10. .
- 12 -
2
Kiértékelés sorrendje
Operátorok - összefoglalás (1)
• sorrend != asszociativitás • A legtöbb magas szintű nyelv, így a C sem határozza meg a kiértékelés sorrendjét. • Kivételek: – && – || – ?: –,
Amit az operátorokról tudni kell: • Operandusok száma – egy, pl.: – kettő, pl.: – három
+ - sizeof & % / && & ? :
• Operandusok típusa - lásd a / műveletet • Az eredmény típusa és értéke
b értéke nem meghatározható !
– lásd a / műveletet – lásd a logikai operátorokat
Példa: a = b + b + (b = c); Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 13 -
Programozás alapjai I. (C nyelv, gyakorlat)
Amit az operátorokról tudni kell: • Precedencia • Asszociativitás • Kiértékelési sorrend • Fő hatás, • mellékhatás • és ezek bekövetkezésének sorrendje
int = char vagy long = int értékadás - mindig OK char = int short = int int = long - OK, ha belefér signed = unsigned vagy unsigned = signed VIGYÁZNI ! - előjelbit
• egész ⇔ lebegőpontos konverziók
– lásd a ++ -- operátorkat
2005.10.10. .
int = double - OK, ha belefér, csonkolás double = int - mindig megy - 15 -
Típuskonverziók (2)
© BME-IIT Sz.I.
2005.10.10. .
- 16 -
• Használjuk az explicit típusmódosító operátort; ez a C++ esetén majd igen hasznos lesz. Pl.:
double = float - mindig OK float = double - OK, ha belefér
int a = 1, b = 2; double x; … x = (double)(a); /* 1.0 lesz */ x = (double)(a)/(double)(b) /* 0.5 */
• aritmetikai konverziók – egészeknél: a legnagyobb ábrázolású egészre kiterjesztjük az operandusokat, az eredmény a legnagyobb értelmezésű operandus típusával fog megegyezni – valósaknál: a műveleteket mindig double-ban végezzük © BME-IIT Sz.I.
Programozás alapjai I. (C nyelv, gyakorlat)
Típuskonverziók (3)
• lebegőpontos konverzió
Programozás alapjai I. (C nyelv, gyakorlat)
- 14 -
• egészek konverziója
• Egyéb: pl. a kiértékelés leáll, ha triviális az eredmény © BME-IIT Sz.I.
2005.10.10. .
Típuskonverziók
Operátorok - összefoglalás (2)
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
• Általában: (új_típus)(régi_típusú_kifejezés) - 17 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 18 -
3
Kalkulátor
Kalkulátor (2)
Feladat: Készítsünk egy egyszerű számológépet, ami beolvas 2 valós számot és egy műveleti jelet (+ - * /), és elvégzi a megfelelő műveletet.
Vázlat (algoritmus): beolvas(op1, muv, op2) if muv == ’+’ e = op1 + op2 else if muv == ’-’ . . . .
Vázlat (adatok): op1, op2 - valós operandusok muv - karakter e - valós eredmény Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 19 -
Programozás alapjai I. (C nyelv, gyakorlat)
Kalkulátor (3) #include <stdio.h> int main() { float op1, op2, e; muv char;
© BME-IIT Sz.I.
2005.10.10. .
- 20 -
Többszörös döntés if (kifejezés) utasítás else if (kifejezés) utasítás else utasítás
Szóközök jelentősége
scanf(”%f %c %f”, &op1, &muv, &op2); if (muv == ’+’) e = op1 + op2; else (if muv == ’-’) e = op1 - op2; else (if muv == ’*’) e = op1 * op2; else (if muv == ’/’) e = op1 / op2; else printf(”mit_akarsz?\n”); printf(”%f %c %f = %e\n”), op1, op2, e); return(0);
• Az else ... if szerkezet gyakori, melynek egy speciális esete, amikor az elágazások konstans feltétel alapján történnek.
} Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 21 -
Programozás alapjai I. (C nyelv, gyakorlat)
A switch utasítás
#include <stdio.h> int main() { float op1, op2, e; muv char;
switch (kifejezés) { case konstans_kifejezés1: utasítások1 case konstans_kifejezés2: utasítások2 .... ut1 default: utasítások_n }
© BME-IIT Sz.I.
- 22 -
ut2
ut3
2005.10.10. .
hogy ne folyjon tovább
scanf(”%f %c %f”, &op1, &muv, &op2); switch (muv){ case ’+’: e = op1 + op2; break; case ’-’: e = op1 - op2; break; case ’*’: e = op1 * op2; break; case ’/’: e = op1 / op2; break; default: printf(”mit_akarsz?\n”); } printf(”%f %c %f = %e\n”), op1, op2, e); return 0;
ut4 Programozás alapjai I. (C nyelv, gyakorlat)
2005.10.10. .
Kalkulátor switch utasítással
A switch utasítás:
a kifejezés értékétől függően lép be, majd továbbfolyik
© BME-IIT Sz.I.
} - 23 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 24 -
4
A break és a continue
A break és a continue (2) int i;
break - azonnal kilép a ciklusból ill. switch-ből.
for (i = 0; i++ < 10;){ if ((i & 1) = = 0) continue; printf(”%d\n”, i); }
continue - a következő iterációs lépéstől folytatja.
++
precedencia miatt
Mit csinál ez a kódrészlet? Miért ilyen furcsa a for feje? Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 25 -
A break és a continue (2)
for (i = 0; i++ < 10;) if ((i & 1) != 0) printf(”%d\n”, i);
vagy for (i = 0; i++ < 10;) if (i%2) printf(”%d\n”), i);
Van, akinek continue nélkül követhetőbb a kód! 2005.10.10. .
2005.10.10. .
- 26 -
main(l ,a,n,d)char**a;{ for(d=atoi(a[1])/10*80atoi(a[2])/5-596;n="@NKA\ CLCCGZAAQBEAADAFaISADJABBA^\ SNLGAQABDAXIMBAACTBATAHDBAN\ ZcEMMCCCCAAhEIJFAEAAABAfHJE\ TBdFLDAANEfDNBPHdBcBBBEA_AL\ H E L L O, W O R L D! " [l++-3];)for(;n-->64;) putchar(!d+++33^ l&1);}
int i;
© BME-IIT Sz.I.
© BME-IIT Sz.I.
Kötetlen formátum (WhereAmI)
Alakítsuk át continue-mentesre!
Programozás alapjai I. (C nyelv, gyakorlat)
Programozás alapjai I. (C nyelv, gyakorlat)
- 27 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.10.10. .
- 28 -
WhereAmI 47 19
!!!!!!!!!!! !!! ! !!!!!!!!!!!!!!!!! !!!!! ! !!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!! !!!!!!!!! ! !!!! ! !!!!! !!!!! !!!!!!!! !!!!!! !!!! !! !
Programozás alapjai I. (C nyelv, gyakorlat)
!
!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!"!!! !!!!!!!!!!!!!!!!! !! ! !! ! !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!! !!! ! !!!!!!!!!! ! ! ! ! !!!!! !! !!!! ! !!!!! !! !!!!!!!! !! !! !
© BME-IIT Sz.I.
2005.10.10. .
- 29 -
5