2. gyakorlat
Kapcsolódó tananyagok¶
-
vezérlési szerkezetek ismétlése
-
program standard input/output átirányítása
-
diff
program használata
Kiegészítő információk¶
A következő órákon a feladataink során speciális kép fájlokkal fogunk foglalkozni. Ezek a PBM, PGM, PPM képek nagyon egyszerű formátumban tárolnak képeket. Valamennyi állomány első sora egy szöveg mezővel kezdődik, amely megadja, hogy melyik formátummal van dolgunk. Ez PBM esetében, ami egy fekete-fehér kép a P1
szöveg, a PGM esetében, ami egy szürkeárnyalatos kép a P2
szöveg, míg a színes, PPM esetében ez a P3
szöveg. A második sortól kezdve egész értékeket tartalmaz valamennyi állomány, amely értékek whitespace karakterekkel (szóköz, tabulátor, sortörés, stb.) vannak elválasztva. Az első két érték (X és Y), a kép szélessége és magassága. PGM és PPM formátumú képek esetén a harmadik szám (M) a lehetséges legnagyobb értéke a képpontoknak. PBM esetében ez 1 mindig, ezért nem kell jelölni, hiszen itt minden képpont 0 vagy 1 lehet csak.
Ezeket az értékeket további X*Y darab [0..M] intervallumba eső érték követi, az egyes képpontok intenzitásértékei, sorfolytonosan megadva.
Órai feladatok¶
Órai segédletek
-
Írjunk egy programot, amely a standard inputról beolvas egy PBM típusnak megfelelő állományt és azt rögtön ki is írja a standard outputra!
Tipp
Ha adott egy
program
nevű futtatható állományunk, akkor annak bemenetére rá tudjuk irányítani egy fájl tartalmát is (mondjuk legyen ez a torony.pbm), és akkor nem kell az inputot manuálisan bepötyögni. Futtassuk így a programot:
./program < torony.pbm
-
Módosítsuk úgy az előbbi programot, hogy az elkészítse a kép inverzét, és azt írjuk ki az kimenetre!
-
Mentsük el a programfutás kimenetét egy fájlba!
Tipp
Hasonlóan az input kezeléshez, megtehetjük, hogy a program kimenetét átirányítjuk egy fájlba:
./program < torony.pbm >torony_inv.pbm
-
Hasonlítsuk össze a kimenetét a programnak az előzetesen kiadott .... fájl tartalmával! Használjuk ehhez a
diff
programot! Mi történik, ha a sorvége jeleket elhagyjuk? -
Ismételjük meg az előző feladatokat egy PGM típusú képpel, csak inverz művelet helyett legyen a feladat, hogy PBM képpé konvertáljuk oly módon, hogy minden olyan képpontot, aminek intenzitása nagyobb, mint a maximális intenzitás fele, azt 1-re, a többit 0-ra állítjuk!
Gyakorló feladatok¶
-
Készíts egy programot, ami bekér egy egész számot és kiírja, hogy az adott szám páros vagy páratlan-e!
-
Készíts egy programot, ami bekér két természetes számot és írja ki, hogy az első szám osztható-e a másodikkal. A nullával osztás nem megengedett, ezt külön jelezze a program!
-
Adott a két természetes szám oszthatóságát vizsgáló oszthatosag.c oszthatóság program. Nézd meg mi történik, ha a nullával osztás elkerülését célzó feltételben az = operátort alkalmazod == helyett! És ha az operátor két operandusát is felcseréled? (Így további 3, összesen 4 féle programot kapsz.) Hogyan viselkedik a négy program különböző inputok hatására?
-
A hetnapjai.c egy olyan program lenne, ami kiírja a hét hátralévő napjait (az aktuális sorszámú nap kivételével), illetve hibás sorszám esetén hibaüzenetet ad. De a megvalósítás hibás. Mi a hiba, és hogyan lehetne kijavítani a programot? Mit kellene ahhoz módosítani, hogy hétköznap esetén a hátralévő hétköznapokat (illetve az "Ez a hét utolsó hétköznapja." szöveget), hétvége esetén a hátralévő hétvégi napokat írja ki? Mi történik, ha
int
helyettdouble
típust használsz a programban? -
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ő sorrendben soronként kiírja. Ha az első szám nagyobb a másodiknál, akkor nem ír ki semmit. -
Valósítsd meg a linuxos
seq
parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd (a határértékeket is beleértve) kiírja a kettő közötti egész számokat. A kiíratás csökkenő vagy növekvő sorrendben történjen az első bekért értéktől a másodikig. -
Írasd ki egy egész számokból álló 0 végű sorozat elemeinek átlagát!
-
Írasd ki egy egész számokból álló 0 végű sorozat három legnagyobb elemét!
-
Döntsd el egy karakterről, hogy kis- vagy nagybetű, szám, esetleg egyéb karakter ("kisbetű", "nagybetű", "számjegy", "egyéb")!
-
Készíts többféle algoritmust és megvalósítást. Először oldd meg a feladatot megkötések nélkül, majd úgy, hogy az alábbi megszorítások közül kiválasztasz egyet, és azt betartod:
-
Az
if
,?:
ésswitch
közül csak azif
szerkezetet használhatod. -
Az
if
,?:
ésswitch
közül csak a?:
kifejezést használhatod. - Az
if
,?:
ésswitch
közül csak aswitch
szerkezetet használhatod. - Az
if
,?:
ésswitch
közül egyiket sem használhatod.
-
-
Írj egy programot, ami bekéri a sakktábla egy mezőjének koordinátáját, majd megmondja, hogy a normál kezdeti felállítás szerint milyen bábu van az adott helyen! A bábu színe "világos" vagy "sötét", alakja "gyalog", "bástya", huszár", "futó", "vezér", "király". (Pl. "a2" input esetén "világos gyalog", "c8" esetén "sötét futó".) Ha az adott helyen nincs bábu, akkor a mező színét írja ki (pl. "d4" esetén "üres sötét mező"). Feltételezhető, hogy az input pontosan két karakter, amik egy sakktábla-mezőt jelölnek.
-
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?
-
Elhagyható-e C nyelvben egy
if
igaz ága úgy, hogy a hamis ágat meghagyjuk? Pontosabban, lehet-e C nyelven olyanif-else
vezérlést készíteni, amelyben az igaz (if
) ág nem tartalmaz műveletet, de a hamis (else
) ág igen? Ha igen, hogyan? -
Készíts egy programot, amely logikai true/false értéket reprezentáló 1 vagy 0 értéket olvas be, majd kiírja true/1 érték esetén az 'I', false/0 érték esetén a 'H' karaktert egyetlen sorban. Más input érték esetén ne írjon ki semmit!