Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29.
Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { p r i n t f ( " T e r m e s z e t e s szamok n e g y z e t e i \n\n" ) ; p r i n t f ( "1^2=1\n" ) ; p r i n t f ( "2^2=4\n" ) ; p r i n t f ( "3^2=9\n" ) ; p r i n t f ( "4^2=16\n" ) ; p r i n t f ( "5^2=25\n" ) ; p r i n t f ( "6^2=36\n" ) ; p r i n t f ( "7^2=49\n" ) ; p r i n t f ( "8^2=64\n" ) ; p r i n t f ( "9^2=81\n" ) ; p r i n t f ( "10^2=100\n" ) ; r e t u r n 0 ; }
Kimenet Termeszetes szamok negyzetei 1^2=1 2^2=4 3^2=9 4^2=16 5^2=25 6^2=36 7^2=49 8^2=64 9^2=81 10^2=100 Problémák: Most mi számoljuk ki az eredményt, nem a számítógép! Nagyon sok ismétl d kódrészlet Könny hibát ejteni a kódban, de nehéz felfedezni
Feladat: próbáljuk elérni, hogy a számítógép számolja ki a hatványokat! 1 #i n c l u d e <s t d i o. h> 2 3 i n t main ( v o i d ) { 4 p r i n t f ( " T e r m e s z e t e s szamok n e g y z e t e i \n\n" ) ; 5 p r i n t f ( "%d^2=%d\n", 1, 1 1 ) ; 6 p r i n t f ( "%d^2=%d\n", 2, 2 2 ) ; 7 p r i n t f ( "%d^2=%d\n", 3, 3 3 ) ; 8 p r i n t f ( "%d^2=%d\n", 4, 4 4 ) ; 9 p r i n t f ( "%d^2=%d\n", 5, 5 5 ) ; 10 p r i n t f ( "%d^2=%d\n", 6, 6 6 ) ; 14 p r i n t f ( "%d^2=%d\n", 10, 1 0 1 0 ) ; 15 r e t u r n 0 ; 16 }
Kimenet Termeszetes szamok negyzetei 1^2=1 2^2=4 3^2=9 4^2=16 5^2=25 6^2=36 7^2=49 8^2=64 9^2=81 10^2=100 Literálok: forrásszövegbe gépelt konstansok Egész konstansok Karakter konstansok: '-ok között Karakterlánc (string) konstansok: "-ek között Műveleti jel (operátor) printf("%d^2=%d\n", 5, 5*5); Kifejezés { Karakterlánc konstans Egész konstansok
{ { Kifejezés (expression): értéket állít el konstansok, változók, m veletek (operátorok) segítségével Ua. további paraméter, formátumsztring mint ahány form. spec. printf("%d^2=%d\n", 5, 5*5); formátumspecifikátor { Néhány aritmetikai operátor { { Escape szekvencia Operátor Leírás Példa + Összeadás 5 + 3 == 8 - Kivonás 5 3 == 2 * Szorzás 5 3 == 15 / Egészosztás 5/3 == 1 % Maradék képzés 5%3 == 2
1 #i n c l u d e <s t d i o. h> 2 3 i n t main ( v o i d ) { 4 i n t a l a p ; 5 p r i n t f ( " T e r m e s z e t e s szamok n e g y z e t e i \n\n" ) ; 6 a l a p = 1 ; 7 p r i n t f ( "%d^2=%d\n", a l a p, a l a p a l a p ) ; 8 a l a p = a l a p + 1 ; 9 p r i n t f ( "%d^2=%d\n", a l a p, a l a p a l a p ) ; 10 a l a p = a l a p + 1 ; 11 p r i n t f ( "%d^2=%d\n", a l a p, a l a p a l a p ) ; 12 a l a p = a l a p + 1 ; 25 p r i n t f ( "%d^2=%d\n", a l a p, a l a p a l a p ) ; 26 r e t u r n 0 ; 27 }
Változók Pl.: int alap; típus az adat jellege (numerikus, szöveges) hogyan tárolják a memóriában milyen m velet végezhet vele memóriaterület értéket tárolja típusnak megfelel en lokális változók ({ és } közötti blokkokban) kezd értéke deniálatlan, memóriaszemét név, vagy azonosító (funkcióra utaló, beszédes elnevezés)
Azonosítóképzési szabályok Els karakter: kis- vagy nagybet, ill. _ További karakterek: u. a., és számjegyek Nem lehet kulcsszó vagy védett azonosító Kis- és nagybet re érzékenyek Ajánlás: ne kezd djön egy vagy két _ karakterrel Szignikáns karakterek száma Mi lehet a gond? Gipsz Jakab 66_os_ut Men _Manó auto OK meno_mano Meno_Mano sokreszbolosszeteve
Fontosabb egész típusok (xpontos ábrázolás) Típus Leírás char Ált. el jeles, 8 bites egész signed char El jeles 8 bites egész unsigned char El jel nélküli, 8 bites egész short signed short El jeles rövid egész signed short int unsigned short unsigned short int El jel nélküli rövid egész signed int El jeles egész signed int unsigned unsigned int El jel nélküli egész long signed long El jeles hosszú egész signed long int unsigned long unsigned long int El jel nélküli hosszú egész
Megjegyzések: Típusmódosítók: signed/unsigned, short/long Egész literál ábrázolása: int char típus mérete: mindig 1 bájt, de a karakter literál int-ben! char típus el jel-kezelése: platformtól és fordítótól függ, de ált. el jeles és beállítható 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long), ahol sizeof a típus/változó méretét bájtban megadó operátor
Változó deníció Általános alak: típus azonosítólista; Azonosító, típus megadása, memóriaterület foglalása Pl.: int x; int i, j, k; unsigned int y; Értékadás Operátor: = balérték = jobbérték; balérték értékét jobbértékre változtatja balérték: többnyire változó (nem lehet pl. konstans vagy tömb, de a tömb egy konkrét eleme már igen) Eredmény: a programunk sorai nagyon hasonlóak, másolással sokszorosíthatók Probléma: túl sok ismétl d kódrészlet meg kellene kérni a gépet, hogy az azonos részeket ismételje!
#i n c l u d e <s t d i o. h> i n t main ( v o i d ) { i n t a l a p ; p r i n t f ( " T e r m e s z e t e s szamok n e g y z e t e i \n\n" ) ; a l a p = 1 ; w h i l e ( a l a p <= 10) { p r i n t f ( "%d^2=%d\n", a l a p, a l a p a l a p ) ; a l a p = a l a p + 1 ; } r e t u r n 0 ; }
Relációs operátorok Operátor Leírás == egyenl!= nem egyenl < kisebb <= kisebb, vagy egyenl > nagyobb >= nagyobb, vagy egyenl
Elöltesztel ciklus while(feltétel kifejezése) { } tevékenységek A ciklusmag (ismételt rész) lehet egyetlen egyszer utasítás összetett utasítás: több utasításból képzett blokk
Folyamatábra elemei Start Stop Kezd pont és végpont jelei. Háromszöges változat: részalgoritmus leírására. Egy programban egyetlen kezd -, és egyetlen végpont lehet. Kezd pontban egyetlen kimen nyíl lehet, beérkez nem. Végpontban... Haladási irány jele. Csak szelekciónál (feltételes végrehajtás) ágazhat el. Végrehajtási sorrendet rögzíti.
Folyamatábra elemei v = kifejezés n feltétel i tevékenységek Értékadó tevékenység jele. Egy nyíl be, egy ki. Meghatározandó a kifejezés értéke és típusa, majd v változó felveszi ezt az értéket. Több értékadás összevonható. Elöltesztel ciklus Az ismétlend tevékenységet ciklusmagnak nevezik. Ciklusmagnak hatással kell lennie a feltétel értékére végtelen ciklus? Lehet, hogy a ciklusmag egyszer sem hajtódik végre.
Folyamatábra elemei Ki: k, v, kif Kiírás (output tevékenység) jele. Egy nyíl be, egy ki. Kijelzend a k konstans, v változó és kif kifejezés értéke.
Start Ki: "Természetes számok négyzetei" alap = 1 alap <= 10 n Stop Ki: alap, alap*alap i alap = alap+1
Adatszerkezeti táblázat: a folyamatábra nem árul el eleget a változók típusáról, alkalmazásuk céljáról. Funkció Azonosító Típus Jelleg A hatvány alapja alap egész munka/output
Páros, páratlan Egy egész számról döntsük el, hogy páros-e! #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { i n t szam ; szam = 4 2 ; i f ( szam%2 == 0) { p r i n t f ( "A szam p a r o s. \ n" ) ; } e l s e { p r i n t f ( "A szam p a r a t l a n. \ n" ) ; } r e t u r n 0 ; }
Páros, páratlan Szelekció feltétel n feltétel n tevékenység1 i tevékenység1 i tevékenység2 if(kifejezés) utasítás1 if(kifejezés) utasítás1 else utasítás2 Utasítások lehetnek összetettek többirányú elágazás
Mutatók Mi az a mutató (pointer), és mire használható? Memóriacím tárolására használható típus Többféle típusa létezik, hogy kifejezze az ott tárolt adat típusát Technikai megvalósítása hasonlít az egész számokéhoz Mutatódeníció: alaptípus* azonosító; Például int i; int* pi; // egész típusú változó // egészet címz mutató
Mutatók Memóriacím képzése az & operátorral lehetséges Adott címen lév érték elérése (indirekció): * operátorral #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { i n t i ; i n t p i ; i = 4 2 ; p r i n t f ( " ' i ' e r t e k e : %d\n", i ) ; p r i n t f ( " ' i ' cime : %p\n", &i ) ; p i = &i ; p r i n t f ( "A ' p i ' cimen l e v o e r t e k : %d\n", p i ) ; p r i n t f ( " ' p i ' e r t e k e : %p\n", p i ) ; p r i n t f ( " ' p i ' cime : %p\n", &p i ) ; r e t u r n 0 ; }
Mutatók Kimenet 'i' erteke: 42 'i' cime: 0x7ffc6d188df4 A 'pi' cimen levo ertek: 42 'pi' erteke: 0x7ffc6d188df4 'pi' cime: 0x7ffc6d188df8 A mutató formátumspecikátora: %p p r i n t f ( " ' i ' cime : %p\n", &i ) ;
Mutatók 0x7ffc6d188df3 0x7ffc6d188df4 0x7ffc6d188df5 0x7ffc6d188df6 0x7ffc6d188df7 0x7ffc6d188df8 0x7ffc6d188df9 0x7ffc6d188dfa 0x7ffc6d188dfb 0x7ffc6d188dfc i memóriaterülete, tartalma: 42 pi memóriaterülete, tartalma: 0x7ffc6d188df4 } }
Páros, páratlan Feladat: dolgozzon a program felhasználó által adott értékkel! #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { i n t szam ; p r i n t f ( " Adjon meg egy e g e s z szamot, a m i r o l " " e l d o n t h e t j u k, hogy p a r o s e vagy " " p a r a t l a n! \ n\n" ) ; s c a n f ( "%d", &szam ) ; i f ( szam%2 == 0) { p r i n t f ( "A szam p a r o s. \ n" ) ; } e l s e { p r i n t f ( "A szam p a r a t l a n. \ n" ) ; } r e t u r n 0 ; }
Páros, páratlan p r i n t f ( " Adjon meg egy e g e s z szamot, a m i r o l " " e l d o n t h e t j u k, hogy p a r o s e vagy " " p a r a t l a n! \ n\n" ) ; Az el feldolgozó egyesíti a karakterlánc konstansokat, ha csak fehér karakterek (white space) választják el ket egymástól. s c a n f ( "%d", &szam ) ; Beolvasás a szabvány bemenetr l scanf függvénnyel történik Els paramétere a formátumsztring (hasonló a printf-hez), amit annyi további paraméter követ, ahány formátumspecikátort használtunk. A beolvasott, konvertált értékeket tároló változók címeit kell átadni!
Páros, páratlan Start Ki: "Adjon meg egy számot,..." Be: szam szam%2 == 0 n Ki: "A szám páratlan" Ki: "A szám páros" i Stop
Páros, páratlan M veleti sorrend (kifejezések) zárójelezés m veletek prioritása Operátor Asszociativitás sizeof jobbról balra * / % balról jobbra + - balról jobbra < <= > >= balról jobbra ==!= balról jobbra = jobbról balra Vezérlési szerkezetek szekvencia iteráció szelekció