Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek
Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő közötti egész számokat (a határértékeket is beleértve) növekvő soronként kiírja. Ha az első szám kisebb a másodiknál, akkor növekvő, ellenkező esetben csökkenő sorrendben ír ki.
Házi ellenőrzés (f0070) Kérj be a felhasználótól egy tetszőleges karaktert. Ezután döntsd el a karakterről, hogy az kisbetű, nagybetű vagy szám! Valósítsd meg ifelse, valamint switch-case szerkezettel is!
Házi ellenőrzés (f0083) Az intervallum.c program feladata ellenőrizni, hogy egész számok egy zárt intervalluma tartalmaz-e egy harmadik egész számot. Teszteld a programot különböző értékekkel! Mi a hiba a programban, miért úgy működik ahogy, és hogyan lehet javítani?
Házi ellenőrzés (f0098) Írj egy olyan programot, ami beolvas egy logikai értéket reprezentáló 0 vagy 1 értéket. Ha 0-t írtunk, akkor kiírja, hogy 'H', ha 1-et, akkor kiírja, hogy 'I'. Ettől eltérő esetben nem ír ki semmit. Úgy valósítsd meg a programot, hogy egy függvény logikai értéket várjon paraméterben és karaktert ad vissza visszatérési értékként.
Házi ellenőrzés (f0085) Lehet-e olyan szelekciós vezérlést írni C-ben, hogy az if ág nem csinál semmit, az else ág viszont igen? Ha lehet, hogyan? Ha nem, miért nem?
Konstansok Az eddigi programjainkban változókat használtunk (azaz, az értéke bármikor megváltozhatott) Bizonyos esetekben viszont hasznos, ha vannak állandó értékeink (konstansok) tudunk-e példát? C-ben nincs kimondottan konstans létrehozására szolgáló kulcsszó, preprocesszor makrókkal van megoldva #define NÉV érték Bármi lehet (akár kódrészlet is), egy az egyben behelyettesít, nem ellenőriz, csak copy-paste -el
Konstansok Példák Létrehozhatunk saját sortörés konstanst #define NL printf("\n"); Vagy akár csinálhatunk saját logikai típust is #define TRUE 1 #define FALSE 0 #include <stdio.h> #define NL printf( \n ); #define N 5 #define TRUE 1 #define FALSE 0 int main() { int i, felt; scanf("%d", &i); felt = (i==n) if ( felt == TRUE ) { Printf("%d-t írtál be", N); NL; } return 0; }
Preprocesszálás - előfeldolgozás A konstansokat (és az include-ot) is a preprocesszor dolgozza fel. A #-el jelezzük, hogy neki szól a sor. A gcc -E kapcsolójával meg tudjuk nézni, mit csinált a kódunkkal gcc -E konstans.c > konstans.i gcc konstans.i -o konstans A preprocesszor csak egy egyszerű helyettesítő, így ha valami rosszat írunk, akkor az csak fordítási/futtatási időben jelenik meg hibaként
Tömbök Több, logikailag összetartozó, azonos típusú adat tárolására alkalmas A méretét létrehozáskor meg kell adni (egyéb eset később) Mérete csak egész szám lehet (konstans vagy konkrét érték) A mérete a program során nem változhat
Tömbök Általános alakja típus nev[meret]; Pl. int pontok[10]; pontok[2] = 10; printf("%d\n", pontok[2]);
Tömbök indexelése Tömb elemére tömbindex segítségével hivatkozhatunk Tömb indexelés 0-val kezdődik, és a tömb mérete-1 -ig tart Tömbindex egész szám lehet, de itt már nem csak előre ismert érték, hanem akár egész típusú változó vagy egész visszatérési értékű függvény is lehet A C nem figyel a tömbhatárokra, ezért ezt nekünk kell megtenni (egyébként hibát kapunk)
Feladat (f0133) Nézzük meg a tombindexeles.c programot! Mi az N és az M konstans? Mi történik, ha az egyik vagy másik értéket sokkal nagyobbra veszed, mint a másikat?
Feladat (f0136) Készíts egy programot, amely beolvas legfeljebb 128 egész számot, eltárolja őket egy tömbben, lecseréli a tömbelemeket az abszolút értékeikre, majd kiírja a tömböt. Előbb csináljuk meg tömb nélkül. Mikor nem megfelelő ez a megoldás? Használjunk tömböket ugyan erre!
Tömbök, mint függvényparaméterek A függvény paraméterlistájában jelezni kell, hogy tömböt várunk a méretet nem kötelező kitenni Függvény híváskor csak a tömb nevét kell átadni paraméterben cím szerinti átadás (ld. később)
Tömbök, mint függvényparaméterek void tombos_fgv(int bemenet[]) { } int tomb[10]; tombos_fgv(tomb);
Feladat (f0136) Készíts egy programot, amely beolvas legfeljebb 128 egész számot, eltárolja őket egy tömbben, lecseréli a tömbelemeket az abszolút értékeikre, majd kiírja a tömböt. Előbb csináljuk meg tömb nélkül. Mikor nem megfelelő ez a megoldás? Használjunk tömböket ugyan erre! Oldjuk meg úgy a feladatot, hogy az egyes műveleteket (beolvasás, abszolútérték, kiíratás) egy-egy függvény valósítsa meg!
Feladat (f0143) Készíts egy programot, amely beolvas legfeljebb 256 egész számot, eltárolja őket egy tömbben, majd a tömböt úgy alakítja át, hogy a sorban egymás után ismétlődő elemek közül csak egyet hagy meg. Hogy fog kinézni az algoritmus? Milyen részei lesznek? Milyen függvényeket írjunk?
Feladat (f0144) Készíts egy programot, amely beolvas legfeljebb 255 nemnegatív egész számot, majd kiírja a sorozat elemeinek a sorozat minimumától való eltérését. A program inputja egy nemnegatív számokból álló legfeljebb 255 elemű számsorozat, melyet a -1 érték zár. A program kimenete egy ugyanennyi elemű nemnegatív számsorozat, ahol az egyes elemek az adott input elem minimumtól való eltérését mutatja. A kimenetben a számok egy-egy szóközzel vannak elválasztva, a sort pedig egy sorvége jel zárja.
Stringek C-ben nincs külön típus a szövegek (stringek) tárolására A szöveget karakterek tömbjeként tárolja Egy tömbelem = egy karakter a szövegben Szöveg végét speciális végejellel jelöli '\0' = 0 Ez bárhol lehet a tömbön belül, tehát tárolhatunk rövidebb szöveget is a tömbben, mert kiíratáskor csak eddig lesz feldolgozva
Stringek Szöveg vége jel mindig legyen máshogy nem tudnánk, meddig tart a szöveg Mindig számoljuk bele, mikor helyet foglalunk neki 10 karakteres szóhoz mekkora tömb fog kelleni?
Stringek Pl. char szo[10] = "alma"; 0 1 2 3 4 5 6 7 8 9 a l m a \0????? Ilyen esetben a méret egyébként el is hagyható, akkor pontosan akkora helyet foglal neki a C, amekkora szükséges
Stringek Nem lehet közvetlenül értéket adni neki, csak 1) Kezdeti értékadással (=inicializálással) 2) Betűnkénti megadással 3) Beolvasással 4)strcpy függvénnyel
String értékadási módok Inicializálással char szo[] = Hello World ; Karakterenkénti értékadással char szo[5]; szo[0] = 'H'; szo[1] = 'e';...
String értékadási módok Beolvasással char szo[20]; scanf( %s, szo); strcpy függvénnyel char szo[20]; strcpy(szo, Hello World!\n );
Stringek IO Beolvasáskor és kiíratáskor a %s formátumkaraktert kell használni Pl. scanf("%s", nev); printf("%s", nev); Ide nem kell & jel!
Feladat (f0134) Vizsgáld meg a sztring.c programot. Mi a hiba? Javítsd ki úgy, hogy a) az str változó inicializálással kapjon értéket, és úgy is, hogy b) az str változó NE inicializálással kapjon értéket! (ezzel dolgozz tovább)
Feladat (f0134) Mi a különbség a két kiíratás között? Mely esetben lenne látható a különbség? A kiíratások előtt cseréld le az str változó 2. karakterét '%'-ra. Mit tapasztalsz? A kiíratások előtt cseréld le az str változó 6. karakterét '\0'-ra (nullás kódú karaktere). Mit tapasztalsz? Kiíratások után cseréld vissza ugyanezt a karaktert az eredeti értékére, majd újból írasd ki a sztringet. Mit tapasztalsz? Írasd ki a teljes str tömb minden karakterét, és hasonlítsd össze a sztringként kiírt értékkel. A sztring méretét csökkentsd 4-re. Mit tapasztalsz?
Feladat (f0169) Határozd meg egy 128 karakter méretű tömbben elférő, a felhasználó által megadott sztring hosszát. Először saját ötlettel álljunk neki. Vajon hogy tudjuk megszámolni? Használjuk a <string.h> erre alkalmas függvényét.
Feladat (f0137) Készíts egy programot, amely beolvas egy legfeljebb 127 karakter hosszú sztringet, egy másik változóba megfordítja, majd kiírja a megfordított értéket.
Feladat (f0139) Készíts egy programot, amely beolvas egy legfeljebb 255 karakter hosszú sztringet, majd kiírja a sztringben található számjegyek számát. Használjunk függvényeket mik fognak kelleni? Valósítsuk meg a feladatot!
Jövő hét Jövő héten 2. mini ZH a múlt heti anyagból! Vezérlési szerkezetek (feltételes, ismétléses) műveletek (összeadás, kivonás, szorzás, valós és maradékos osztás) logikai kifejezések (relációs jelek, &&,,!)