Kihagyás

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
  1. Í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

  2. Módosítsuk úgy az előbbi programot, hogy az elkészítse a kép inverzét, és azt írjuk ki az kimenetre!

  3. 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

  4. 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?

  5. 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

  1. 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!

  2. 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!

  3. 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?

  4. 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 helyett double típust használsz a programban?

  5. 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.

  6. 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.

  7. Írasd ki egy egész számokból álló 0 végű sorozat elemeinek átlagát!

  8. Írasd ki egy egész számokból álló 0 végű sorozat három legnagyobb elemét!

  9. Döntsd el egy karakterről, hogy kis- vagy nagybetű, szám, esetleg egyéb karakter ("kisbetű", "nagybetű", "számjegy", "egyéb")!

  10. 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, ?: és switch közül csak az if szerkezetet használhatod.

    • Az if, ?: és switch közül csak a ?: kifejezést használhatod.

    • Az if, ?: és switch közül csak a switch szerkezetet használhatod.
    • Azif, ?: és switch közül egyiket sem használhatod.
  11. Í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.

  12. 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?

  13. Elhagyható-e C nyelvben egy if igaz ága úgy, hogy a hamis ágat meghagyjuk? Pontosabban, lehet-e C nyelven olyan if-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?

  14. 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!