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
#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)
#define TRUE 1
if ( felt == TRUE ) { Printf("%d-t írtál be", N);
#define FALSE 0
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 Ide nem kell & jel! használni Pl. scanf("%s", nev); printf("%s", nev);
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, &&, ||, !)