Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. február 18.
Minimum és maximumkeresés u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t << " Adjon meg nem n e g a t i v e g e s z szamokat, \ n" << " m e g k e r e s s u k k o z o t t u k a m i n i m a l i s a t e s a m a x i m a l i s a t. \ n" << " K i l e p e s n e g a t i v szam m e g a d a s a v a l. \ n" ; i n t db=0, a k t =1; // i n i c i a l i z a c i o i n t min, max ; w h i l e ( a k t >= 0) { c o u t << " Kovetkezo szam : " ; c i n >> a k t ; i f ( a k t >= 0) { i f ( db == 0) min = max = a k t ; // t o b b s z o r o s h o z z a r e n d e l e s e l s e i f ( a k t > max ) max = a k t ; e l s e i f ( a k t < min ) min = a k t ; db++; // n o v e l e s e g g y e l i f ( db > 0) cout << "A minimum : " << min << "\na maximum : " << max << ' \n ' ; e l s e cout << "Nem adott meg adatokat. \ n" ; r e t u r n 0 ;
Minimum és maximumkeresés Változó deklaráció típus és azonosító megadása, helye: felhasználáskor vagy el tte deníció deklaráció + memóriaterület foglalása inicializáció deníciókor kezd érték megadása, pl. int db=0; = operátor (hozzárendelés op.) asszociativitás: jobbról balra min = max = akt; max = akt; min = max; Többirányú elágazás: if(...)... else if(...)... else if(...)... else...
Minimum és maximumkeresés Növel és csökkent operátorok ++ növelés eggyel csökkentés eggyel Létezik el - és utótag (prex/postx) alak is m veleti sorrend! Az el tag/utótag operátorok hatása az eredményre int a, b; // a és b értéke definiálatlan b = 6; // b értéke mostantól 6 a = ++b; // 1) b értéke n 7-re, // 2) ezt hozzárendeli a-hoz a = b++; // 1) hozzárendeli b értékét a-hoz, // 2) növeli b értékét 8-ra
Minimum és maximumkeresés u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t << " Adjon meg nem n e g a t i v e g e s z szamokat, \ n" << " m e g k e r e s s u k k o z o t t u k a m i n i m a l i s a t e s a m a x i m a l i s a t. \ n" << " K i l e p e s n e g a t i v szam m e g a d a s a v a l. \ n" ; i n t db=0, a k t ; // akt nak nem k e l l k e z d o e r t e k i n t min, max ; c o u t << " Kovetkezo szam : " ; // kod e l s o e l o f o r d u l a s a c i n >> a k t ; w h i l e ( a k t >= 0) { i f ( db == 0) min = max = a k t ; // i n n e n v i s z o n t e l t u n t egy f e l t e t e l e l s e i f ( a k t > max ) max = a k t ; e l s e i f ( a k t < min ) min = a k t ; db++; c o u t << " Kovetkezo szam : " ; // kod masodik e l o f o r d u l a s a c i n >> a k t ; i f ( db > 0) cout << "A minimum : " << min << "\na maximum : " << max << ' \n ' ; e l s e cout << "Nem adott meg adatokat. \ n" ; r e t u r n 0 ;
Pozitív szám beolvasása u s i n g namespace s t d ; i n t main ( ) { i n t szam ; c o u t << " Adjon meg egy p o z i t i v szamot! " ; // u z e n e t c i n >> szam ; // b e o l v a s a s w h i l e ( szam <= 0) { // i s m e t l e s, ha h i b a s v o l t az i n p u t c o u t << " Adjon meg egy p o z i t i v szamot! " ; c i n >> szam ; c o u t << " B e o l v a s o t t e r t e k : " << szam << e n d l ; r e t u r n 0 ;
Pozitív szám beolvasása u s i n g namespace s t d ; i n t main ( ) { i n t szam = 1; // az i n i c i a l i z a c i o k i k e n y s z e r i t i w h i l e ( szam <= 0) { // a c i k l u s m a g f u t a s a t c o u t << " Adjon meg egy p o z i t i v szamot! " ; c i n >> szam ; c o u t << " B e o l v a s o t t e r t e k : " << szam << e n d l ; r e t u r n 0 ;
Pozitív szám beolvasása u s i n g namespace s t d ; i n t main ( ) { i n t szam ; // n i n c s s z u k s e g i n i c i a l i z a c i o r a do { // a c i k l u s m a g 1+ f u t t a t a s a h o z c o u t << " Adjon meg egy p o z i t i v szamot! " ; c i n >> szam ; w h i l e ( szam <= 0 ) ; c o u t << " B e o l v a s o t t e r t e k : " << szam << e n d l ; r e t u r n 0 ;
Háromszög szerkeszthet ségének ellen rzése Hátultesztel ciklus a ciklusmag egyszer biztosan lefut i tevékenységek feltétel do { tevékenységek while(feltétel kifejezése); n Ciklusmag futásának kikényszerítése elöltesztel ciklussal tevékenységek n feltétel i tevékenységek while(feltétel kifejezése) { tevékenységek tevékenységek
Háromszög szerkeszthet ségének ellen rzése u s i n g n a m e s p a c e s t d ; i n t main ( ) { i n t a, b, c ; b o o l m e g s z e r k e s z t h e t o = f a l s e ; c o u t << " Adja meg egy haromszog o l d a l h o s s z a i t! \ n" ; do { do { // h a t u l t e s z t e l o c i k l u s e l e j e... c o u t << "A o l d a l h o s s z a : " ; c i n >> a ; w h i l e ( a <= 0 ) ; //... e s v ege do { c o u t << "B o l d a l h o s s z a : " ; c i n >> b ; w h i l e ( b <= 0 ) ; do { c o u t << "C o l d a l h o s s z a : " ; c i n >> c ; w h i l e ( c <= 0 ) ; i f ( a+b<=c o r b+c<=a o r c+a<=b ) // a l t e r n a t i v s z i n t a k s z i s c o u t << "Ez nem s z e r k e s z t h e t o meg! \ n" ; e l s e { m e g s z e r k e s z t h e t o = t r u e ; cout << " Megszerkesztheto. \ n" ; w h i l e ( n o t m e g s z e r k e s z t h e t o ) ; r e t u r n 0 ;
Háromszög szerkeszthet ségének ellen rzése Logikai operátorok!, not: logikai nem, tagadás, or: logikai (megenged ) vagy &&, and: logikai és Igazságtáblázat a b not a a or b a and b false false true false false false true true true false true false false true false true true false true true (Rész)kifejezések kiértékelésének optimalizálása (short-circuit evaluation)
Háromszög szerkeszthet ségének ellen rzése u s i n g n a m e s p a c e s t d ; i n t main ( ) { i n t a, b, c ; c o u t << " Adja meg egy haromszog o l d a l h o s s z a i t novekvo s o r r e n d b e n! \ n" ; do { c o u t << "A o l d a l h o s s z a : " ; c i n >> a ; w h i l e ( a <= 0 ) ; do { c o u t << "B o l d a l h o s s z a : " ; c i n >> b ; w h i l e ( b < a ) ; do { c o u t << "C o l d a l h o s s z a : " ; c i n >> c ; w h i l e ( c<b o r a+b<=c ) ; r e t u r n 0 ;
Körlemez rajzolása u s i n g namespace s t d ; i n t main ( ) { i n t s o r = 5; // A k o r s u g a r a 5 w h i l e ( s o r <= 5) { i n t o s z l o p = 5; w h i l e ( o s z l o p <= 5) { i f (5 5 >= s o r s o r + o s z l o p o s z l o p ) c o u t << ' ' ; e l s e c o u t << ' ' ; o s z l o p ++; s o r ++; c o u t << ' \n ' ; r e t u r n 0 ;
Körlemez rajzolása Problémák: a kurzor pozicionálása korlátozott rengeteg helyen szerepel ugyanaz a konstans: nehézkes módosítás, hibalehet ségek a karakterek kb. 2x magasabbak, mint amilyen szélesek Kimenet * ******* ********* ********* ********* *********** ********* ********* ********* ******* *
Körlemez rajzolása #d e f i n e R 10 // A k o r s u g a r a u s i n g namespace s t d ; i n t main ( ) { i n t s o r = R ; w h i l e ( s o r <= R) { i n t o s z l o p = R ; w h i l e ( o s z l o p <= R) { i f (R R >= s o r s o r + o s z l o p o s z l o p ) c o u t << ' ' ; e l s e c o u t << ' ' ; o s z l o p ++; s o r += 2 ; // N o v e l e s k e t t o v e l c o u t << ' \n ' ; r e t u r n 0 ;
Körlemez rajzolása #define szimbolikus állandók, egyszer makrók el feldolgozó egyszer szöveghelyettesítést végez Nincs pontosvessz a végén! Összevont operátorok sor += 2; sor = sor+2; +=, =, *=, /=, %= Egyoperandusos + és operátorok Kimenet * ************* ***************** ******************* ******************* ********************* ******************* ******************* ***************** ************* *
Bet k, szavak, sorok számlálása #i n c l u d e <c s t d i o > u s i n g n a m e s p a c e s t d ; i n t main ( v o i d ) { i n t k, sordb, szodb, kardb ; b o o l s z o b a n = f a l s e ; c o u t << "A bemenet k a r a k t e r e i n e k, s o r a i n a k é s \n" << " s z a v a i n a k l e s z á ml á l á s a \n" << "A bemenet v é ge : C t r l+d vagy EOF. \ n\n" ; sordb = szodb = kardb = 0 ; w h i l e ( ( k=c i n. g e t ( ) )!= EOF){ ++kardb ; i f ( k == ' \n ' ) ++sordb ; i f ( k==' ' o r k==' \n ' o r k==' \ t ' ) s z o b a n = f a l s e ; e l s e i f ( n o t s z o b a n ){ s z o b a n = t r u e ; ++szodb ; cout << " s o r = " << sordb << ", szo = " << szodb << ", k a r a k t e r = " << kardb << e n d l ; r e t u r n 0 ;
Bet k, szavak, sorok számlálása Egy karakter beolvasása: int get() Karakter ábrázolása int típusban Bemenet vége: EOF <cstdio> M veleti sorrend! while((k=cin.get())!= EOF){ A szoban szerepe
Operátorok precedenciája és asszociativitása Operátor a++ a ++a a +a a! sizeof a*b a/b a%b a+b a b < <= > >= ==!= && Asszociativitás balról jobbra jobbról balra balról jobbra = += = *= /= %= jobbról balra, balról jobbra
Angol sorszámnevek u s i n g namespace s t d ; i n t main ( ) { c o u t << "Szam : " ; i n t szam ; c i n >> szam ; i f ( szam == 0) c o u t << ' 0 ' ; e l s e { c o u t << szam ; i f ( szam>10 and szam <21) cout << " th " ; e l s e i f ( szam%10 == 1) c o u t << " s t " ; e l s e i f ( szam%10 == 2) c o u t << " nd " ; e l s e i f ( szam%10 == 3) c o u t << " r d " ; e l s e c o u t << " t h " ; Problémák: nagyon sok irányú elágazás, felesleges osztások
Angol sorszámnevek u s i n g namespace s t d ; i n t main ( ) { c o u t << "Szam : " ; i n t szam ; c i n >> szam ; i f ( szam == 0) c o u t << ' 0 ' ; e l s e { c o u t << szam ; i f ( szam>10 and szam <21) cout << " th " ; e l s e s w i t c h ( szam%10) { case 1 : c o u t << " s t " ; break ; case 2 : cout << " nd " ; break ; case 3 : cout << " rd " ; break ; d e f a u l t : c o u t << " t h " ;
Angol sorszámnevek switch(kifejezés) utasítás kifejezés egész típusú utasítás tartalmazhat több case konstans-kifejezés: utasítás-t, nulla vagy egy default: utasítás-t végrehajtás leáll: switch blokkjának végén az els break utasításnál konstans-kifejezés egész típusú kifejezés és konstans-kifejezés értékeinek összehasonlítása több case címke is címkézheti ugyanazt az utasítást, de minden címkének egyedinek kell lennie switch utasítások egymásba ágyazhatóak
Minimum és maximumkeresés (Emlékeztet ) u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t << " Adjon meg nem n e g a t i v e g e s z szamokat, \ n" << " m e g k e r e s s u k k o z o t t u k a m i n i m a l i s a t e s a m a x i m a l i s a t. \ n" << " K i l e p e s n e g a t i v szam m e g a d a s a v a l. \ n" ; i n t db=0, a k t ; // akt nak nem k e l l k e z d o e r t e k i n t min, max ; c o u t << " Kovetkezo szam : " ; // kod e l s o e l o f o r d u l a s a c i n >> a k t ; w h i l e ( a k t >= 0) { i f ( db == 0) min = max = a k t ; // i n n e n v i s z o n t e l t u n t egy f e l t e t e l e l s e i f ( a k t > max ) max = a k t ; e l s e i f ( a k t < min ) min = a k t ; db++; c o u t << " Kovetkezo szam : " ; // kod masodik e l o f o r d u l a s a c i n >> a k t ; i f ( db > 0) cout << "A minimum : " << min << "\na maximum : " << max << ' \n ' ; e l s e cout << "Nem adott meg adatokat. \ n" ; r e t u r n 0 ;
Minimum és maximumkeresés u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t << " Adjon meg nem n e g a t i v e g e s z szamokat, \ n" << " m e g k e r e s s u k k o z o t t u k a m i n i m a l i s a t e s a m a x i m a l i s a t. \ n" << " K i l e p e s n e g a t i v szam m e g a d a s a v a l. \ n" ; i n t db=0, a k t ; i n t min, max ; w h i l e ( cout<<" Kovetkezo szam : ", c i n >>akt, akt >=0) { //, o p e r a t o r i f (! db ) min = max = a k t ; //! o p e r a t o r e l s e i f ( a k t > max ) max = a k t ; e l s e i f ( a k t < min ) min = a k t ; db++; i f ( db ) c o u t << "A minimum : " << min // l o g i k a i k i f e j e z e s << "\na maximum : " << max << ' \n ' ; e l s e cout << "Nem adott meg adatokat. \ n" ; r e t u r n 0 ;
Minimum és maximumkeresés Ki: "Kovetkezo szam: " Be: akt akt >= 0 //min, max keresés... i n Vessz operátor összetett, külön-külön is értelmes kifejezésekb l álló kifejezés szerepeltethet ott, ahol csak egy kifejezés állhat kifejezés értéke = az utolsó részkifejezés értéke
Minimum és maximumkeresés Logikai kifejezések bool típus false 0 true 1 nulla érték egész hamis nem nulla érték egész igaz if(db)... if(db!= 0)... if(!db)... if(db == 0)...