4. hét: pointerek, sztringek

Czirkos Zoltán, Nagy Gergely, Pohl László · 2025.08.28.

Gyakorlófeladatok az előadás anyagához kapcsolódóan.

1. Tömbök és függvények

Tömb eleme

Vizsgán volt

Írj függvényt, amely átvesz egy double tömböt, és visszatér a 4-es indexű elemével, ha az létezik, különben 0-val!

Tömb összege

Készíts függvényt, mely egy valós számokból álló tömb elemeit összegzi!

Alig változik

Készíts függvényt, mely a paraméterben kapott egész tömbről megvizsgálja, hogy elemeinek értéke szomszédos elemek E sugaron belül helyezkednek el (különbségük nem nagyobb, mint E vagy -E) A függvény bemenő paramétere a tömbre mutató pointer, a tömb elemeinek száma, valamint az E értéke. Visszatérési értéke logikai típusú legyen, amely azt mutatja, teljesült-e a feltétel!

Legalább kettő előfordulás

Kis ZH volt

Írj függvényt, amely paraméterként vesz át egy egészekből álló tömböt, és visszaadja az első olyan tömbelem címét, amelyből legalább kettő található a tömbben! Ha nincs ilyen tömbelem, adjon vissza NULL pointert!

Minden második

Írj függvényt, ami egy tömböt átvesz paraméterként, és hátulról indulva kiírja minden második elemét! Ügyelj arra, hogy nehogy túl/alulindexeld a tömböt!

Rendezett-e

Kis ZH volt

Írj függvényt, amely paraméterként vesz át egy valós értékekből álló tömböt, melyről biztosan tudjuk, hogy elemei különbözőek! A függvény ellenőrizze, hogy a tömb rendezett-e (akár növekvő, akár csökkenő sorrendben; a feltételezett rendezettség iránya az első két tömbelem vizsgálatával eldönthető). Ha a tömb nem rendezett, a függvény adja vissza az első olyan tömbelem címét, amelyik elrontja a rendezettséget! Ha a tömb rendezett, adjon vissza NULL pointert! Pl. be: {-8.11, -5.3, 0.1, 2.5, 1.4, 6.9, 12.0, 5.7}, a visszaadott érték az 1.4-et tartalmazó tömbelem címe. Pl. be: {7, 1, 2, 3, 4, 5}, a visszaadott érték a 2-t tartalmazó tömbelem címe.

Legnagyobb

Készíts függvényt, amely paraméterként vesz át egy egész számokból álló tömböt, és visszaadja a tömb legnagyobb elemének indexét! Egészítsd ki teljes programmá, amely kiírja a legnagyobb tömbelemet! (A kiírást ne a maximumkereső függvény végezze!)

Alakítsd át a programot úgy, hogy ne a legnagyobb elem indexét, hanem annak memóriacímét adja vissza a függvény!

Alakítsd át úgy is a programot, hogy a ciklusok tömbindexek helyett pointerekkel dolgozzanak, az előadáson bemutatott módon.

Legkisebb és legnagyobb

Kis ZH volt

Írj függvényt, amely paraméterként vesz át egy egészekből álló tömböt! A függvény adja vissza címükkel átvett változókban a tömb legkisebb és legnagyobb elemének indexét! Ha több egyforma érték a legkisebb/legnagyobb, akkor ezek közül bármelyik indexét visszaadhatja.

Súlypont

Készíts struktúratípust, amely alkalmas egy térbeli pont koordinátáinak eltárolására (x, y, z koordinálta). Írj függvényt, amely átvesz egy térbeli pontokból álló tömböt, és visszaadja a pontok súlypontját (azaz azt a pontot, amelynek a koordiátáit a bemenő pontok megfelelő koordinátáinak átlagai)! Próbáld ki a függvényt teljes programmá kiegészítve!

2. Tömbök és összetett függvények

Hány egyedi elem van?

Készíts függvényt, mely egy adott tömbben megszámolja, hogy hány olyan elem van, amely csak egyszer fordul elő! Pl. a { 2, 7, 5, 8, 9, 5, 7, 5, 5, 3 } tömbre a visszatérési érték legyen 4, mert a { 2, 3, 8, 9 } számok mind csak egyszer szerepeltek! (Használhatod a Legalább kettő feladatban elkészült függvényt.)

A leggyakoribb elem

Készíts függvényt, mely meghatározza egy adott (véletlen számokkal feltöltött) tömbben, hogy melyik értékből található benne a legtöbb! Pl. ha a tömb elemei { 2, 7, 5, 8, 9, 5, 7, 5, 5, 3 }, akkor a függvény visszatérési értéke legyen 5, mivel az a leggyakoribb elem.

Rendezettség vizsgálata

Kis ZH volt

Írj egy függvényt, amelyik egy double számokból álló tömböt vesz át paraméterként. A függvény térjen vissza egy felsorolt típussal, amelynek lehetséges értékei: csokkeno , ha a tömbben lévő számsorozat szigorúan monoton csökken; novekvo, ha szigorúan monoton nő; osszevissza, ha egyik sem igaz rá. Írj egy programrészt, amelyik definiál egy tömböt, és kiírja, hogy „növekvő”, ha a tömbben lévő számok szigmon növekvő sorban vannak. Pl. [3 2.1 0.9] → csokkeno, [3 4 2 9 5] → osszevissza, [3 4.65 9 11] → novekvo.

Párosak vagy negatívak?

Kis ZH volt

Írj egy függvényt, amelyik egy egész számokból álló tömböt vesz át paraméterként. A függvény térjen vissza az alábbi felsorolt típusból valamelyik értékkel: parosak, negativak, mindketto, egyiksem, ha a tömbben páros az összes szám, negatív az összes, illetve ha mindkét tulajdonság, vagy egyik tulajdonság sem érvényes rájuk. Írj programot, amelyik egy példaként definiált 100 elemű tömbre meghívja a függvényt, és kiírja, hogy „párosak”, ha érvényes rá ez a tulajdonság.

  • [3 4 5] → egyiksem
  • [-2 -4 -6] → mindketto
  • [4 6 10] → parosak

3. "Bittömbök" kezelése

24×21-es képecskék

Egy játékhoz, amit írunk, szükség vagy 24×21 fekete/fehér pontból álló kis képecskékre. Mivel ezekből rengeteg lesz, kitaláljuk, hogy a fekete/fehér jelleg miatt egy bit is tárolhat egy pontot, így az egy kép által lefoglalt memória (innentől feltételezve a 8 bites char-t) 3×21=63 bájtot foglal csak el a memóriából. Feladat: írni három függvényt, amelyek a következőeket tudják:

  • Kirajzolni pontokból és csillagokból egy ilyen képecskét.
  • Fehérre állítani egy pontot.
  • Feketére állítani egy pontot.

Minden szám megfordítása

Kis ZH volt

Írj C programot, amelyik definiál egy 1000 elemű, bájtokból álló tömböt. A program fordítsa meg az egyes bájtokban a biteket; a 7. helyiértékű cseréljen helyet a 0. helyiértékűvel, a 6. helyiértékű az 1-essel stb. (Feltételezzük, hogy a bájtok 8 bitesek. A tömb számokkal feltöltésével nem kell foglalkozni.) A program végezetül írja ki binárisan a tömb 0. elemét. A megfordításra példa:

76543210
10110010    bemenet
01001101    kimenet

Bitek léptetése

Kis ZH volt

Írj egy C programot, amelyik 100 elemű, bájtokból álló tömböt léptet egy bittel jobbra! A számokból jobbra kicsúszó bit jöjjön be mindig a következő számba balról. Az utolsó szám legalsó helyiértékéből kicsúszó bit pedig kerüljön az első szám legfelső helyiértékébe. (Feltételezzük, hogy a bájtok 8 bitesek. A tömb számokkal feltöltésével nem kell foglalkozni.) Például:

76543210 76543210 ... 76543210 76543210
01001010 11111101     01011110 00001101    bemenet
10100101 01111110 ... 10101111 00000110    kimenet

4. Sztringek

Sztringek, mint karaktertömbök

Hozzunk létre egy sztringet! Változtassunk meg benne néhány karaktert! Írjunk ciklust, amelyik megszámolja az 'l' betűket a sztringben!

Üdvözlés

Készíts programot, amely bekéri a felhasználó nevét, majd üdvözli őt a nevén szólítva!

Hány szóköz?

Készíts programot, mely bekér egy mondatot, majd
a.) megszámolja és kiírja, hogy a mondatban hány szóköz található.
b.) kiírja a mondatot szóközök nélkül.

Kisbetűk I.

Készíts függvényt (numLower), ami megkap egy stringre mutató pointert, és visszaadja az adott szövegben található kisbetűk számát. (Ehhez használható a ctype.h islower() függvénye is.)

Kisbetűk II.

Írj C függvényt, amely egy nullával terminált sztringben kicseréli az angol abécé nagybetűit a nekik megfelelő kisbetűkre. Ha a bemeneti sztring "Hello Vilag", módosítsa azt "hello vilag"-ra. (Tipp: A megoldáshoz a ctype.h könyvtári függvényei használhatóak.)

Hogyan kell módosítani a függvényt, hogy nagybetűkre cseréljen?

Felülírás és csere

Írj függvényt, amely az első paraméterében kapott sztringben megkeresi a második paraméterében adott karakter előfordulásait, és felülírja azokat a harmadik paraméterében adott karakterrel! Pl. "alma", 'a', 'e' → "elme". A függvény visszatérési értéke a kicserélt karakterek száma legyen.

Írj függvényt, amely szintén egy sztringet és egy karakterpárost kap, de ez ne felülírja az első előfordulásait a másodikkal, hanem cserélje meg őket! Pl. 'a', 'e' jelentse azt, hogy 'a'-t 'e'-re kell cserélni, 'e'-t pedig 'a'-ra. Hogyan lehet ezt megoldani az előző függvény felhasználásával?

Squeeze

Írj olyan "squeeze" függvényt, amely az első paraméterben megadott sztringből az összes olyan karaktert törli, amelyik szerepel a második paraméterben megadott sztringben. Például "megadott sztring", "gt" paraméterekkel meghívva a függvényt az első paraméter így módosul: "meado szrin".

Pontosan egyszer

Írj programot, amely beolvas egy sztringet, és megállapítja, hogy vannak-e benne olyan karakterek, amelyek pontosan egyszer fordulnak elő. A program írja ki ezeket a karaktereket, ha pedig nincsenek a sztringben egyedi karakterek, akkor közölje a felhasználóval!

5. Könyvtári sztringkezelő függvények

Decimális

Írj olyan int dec_to_int(char *s) függvényt, amelyik a megadott számjegyekből álló sztringet a neki megfelelő egész értékké alakít (tízes számrendszer szerint)! Pl. dec_to_int("256") visszatérési értéke 256. Oldd meg a feladatot a sscanf() segítségével és anélkül is!

Hexadecimális

Írj olyan int hexa_to_int(char *s) függvényt, amelyik a megadott hexadecimális számjegyekből álló sztringet a neki megfelelő egész értékké alakít! Pl. hexa_to_int("1ef") visszatérési értéke 495. Oldd meg a feladatot a sscanf() segítségével és anélkül is!

Legalább kettő – sztringre

Kis ZH volt

Írj függvényt, amely paraméterként vesz át egy sztringet, és visszaadja az első olyan karakter címét, amelyből legalább kettő található a sztringben! Ha nincs ilyen karakter, adjon vissza NULL pointert!

Része-e?

Írj egy függvényt, amely egy adott sztringben megkeresi egy másik sztring legutolsó előfordulását, és visszaadja annak pozícióját, illetve -1-et, ha nem található. A megoldáshoz ne használd a könyvtári strrstr() függvényt! Például "abcdabce"-ben keressük "abc"-t, a visszatérési érték 4, a színnel jelölt előfordulás miatt.

strcat()

Írjunk függvényt, amelyik egyik sztring végére másol egy másikat, vagyis hozzáfűzi a paraméterként kapott első sztringhez a másodikat! (Ezt csinálja a könyvtári strcat() függvény is.)

strlcat()

Kis ZH volt

Írj egy függvényt (paraméterei: cél, forrás, cél tömb mérete), amelyik egy cél sztring (1. paraméter) végére hozzáfűz egy forrás sztringet (2. paraméter); figyelembe véve azt, hogy a cél tömb maximális mérete adott (3. paraméter), amelybe már a lezáró nullának is bele kell férnie. Mindkét helyen eredendően is 0-val lezárt sztring van. Ha az összefűzött sztring nem fér el a cél helyen, akkor le kell vágnia a függvénynek – de nullával mindig legyen lezárva. Írj programrészt, amelyben bemutatod a függvény használatát. A string.h függvényei NEM használhatóak.

Összefűzés

Kis ZH volt

Írj függvényt, amely paraméterként vesz át egy cél sztringet, továbbá két másik sztringet és egy elválasztó karaktert! Másolja be a cél sztringbe a másik két sztringet úgy, hogy közéjük az elválasztó karaktert teszi.

Írj főprogramot, amelyben egy példával bemutatod a függvény használatát! A beépített sztringkezelő függvények nem használhatóak!

Példa paraméterek: „alma” és „körte”, továbbá „;”
Példa eredmény: „alma;körte”

Sztringek szétválasztása

Kis ZH volt

Írj egy függvényt, amely paraméterként vesz át egy bemeneti sztringet és egy elválasztó karaktert! Legyen még két további paramétere, amelyekbe az eredményt írja. Vágja ketté a függvény a sztringet az első elválasztó karakternél: az eleje menjen az egyik eredmény sztringbe, másik pedig a másikba!

Írj főprogramot, amelyben egy példával bemutatod a függvény használatát! A beépített sztringkezelő függvények nem használhatóak.

Példa paraméterek: „alma;körte” és „;”
Példa eredmény: „alma” és „körte”

strstr()

Írj függvényt, amely két sztringet vesz át paraméterként, és az elsőben megkeresi a második első előfordulását! Ha megtalálja, adja vissza a megtalált szöveg első karakterének címét, ha nincs benne, akkor NULL pointert! A megoldáshoz nem használhatsz könyvtári függvényt. (A feladat a string.h-ban található strstr függvény saját megvalósítása.) Egészítsd ki teljes programmá, a program az "Indul a kutya s a tyúk aludni." mondatban keresse meg a "kutya" szót! (A függvény a kis és nagybetűket tekintse különbözőnek!)

6. Összetett sztringes függvények

Névelő

Készíts programot, mely adott sztringben megszámolja, hányszor fordul elő az „a” névelő. A névelő lehet mondat elején, de végén nem, viszont vessző állhat előtte is és utána is, egyébként szóköz karakterek határolják.

Caesar kódolás

A gyakorlaton volt egy olyan példa, amelyik karaktereket képes bekódolni a→b, b→c, c→d stb kódolással. Írj egy függvényt, amelyiknek megadható a kódolandó karakter, és a→d kódolást használ. Javítsd úgy az órán tárgyalt függvényt, hogy csak a kisbetűket kódolja, más karaktereket hagyjon változatlanul. Figyelj arra is, hogy a programkódban ne legyenek mágikus értékek (pl. 26, mint az abc betűinek száma).

Karakterek törlése

Kis ZH volt

Írj függvényt, amely átvesz paraméterként egy módosítandó sztringet és még egy karaktert. Alakítsa át úgy a sztringet úgy, hogy a megadott karaktert törölje a sztring elejéről és a végéről is! Mindkét oldalon lehet több is, vagy akár semennyi. A belsejében viszont tudjuk, hogy nincsen.

Írj főprogramot, amelyben egy példával bemutatod a függvény használatát! A beépített sztringkezelő függvények nem használhatóak.

Példa bemenet: „xxxHello hallo elektor kalandorxxxx” és az „x” karakter

Példa kimenet: „Hello hallo elektor kalandor”

Bevezető és lezáró karakterek

Kis ZH volt

Írj függvényt, amely paraméterként átvesz egy cél sztringet, továbbá egy forrás sztringet, egy karaktert és egy darabszámot! Másolja át a cél sztringbe a forrást úgy, hogy elé és mögé a megadott karakterből a megadott darabszámút tegye. Ezen kívül a szóközöket is cserélje ki a megadott karakterre.

Írj főprogramot, amelyben egy példával bemutatod a függvény használatát! A beépített sztringkezelő függvények nem használhatóak.

Példa bemenet: „Hello hallo elektor kalandor”, továbbá az „x” karakter és 3

Példa kimenet: „xxxHelloxhalloxelektorxkalandorxxx”

Második szó, utolsó szó

Kis ZH volt

Írj függvényt, amely paraméterként kap egy sztringet! A sztring szöveget tartalmaz, melynek szavait szóközök választják el egymástól (minden szó, ami nem szóköz). A függvény adja vissza címével átvett változókban a sztring második szavának indexét, visszatérési értékként (return-nel) pedig a sztring utolsó szavának címét! A paraméterként kapott sztringről biztosan tudjuk, hogy legalább két szóból áll, a szavakat pontosan egy szóköz választja el egymástól, és a sztring első és utolsó karaktere nem szóköz.

„The” kezdetű címek"

Könyvek, filmet címeit úgy szokás rendezni, hogy a címek elején lévő névelőket (pl. angolul a „The”, magyarul az „A” és „Az”) a rendezésben nem vesszük figyelembe. Írj egy olyan módosított strcmp_the() függvényt, amely paramétere és visszatérési értéke az eredeti strcmp()-éhez hasonló, de az összehasonlításnál figyelmen kívül hagyja a „The” kezdetet!

IP cím

Vizsga volt

Írj egy olyan szabványos ANSI C függvényt, amely paraméterként kap egy sztringet, mely egy IP címet tartalmaz a szokásos alakban: négy darab 0 és 255 közötti szám pontokkal elválasztva. A függvény állítsa elő az IP cím 32 bites reprezentációját! A visszatérési értéke legyen egy unsigned érték, amelynek legalsó bájtja az IP cím utolsó részének megfelelő értéket tartalmazza, a második az IP cím utolsó előtti részét és így tovább. Feltesszük, hogy az unsigned típus az adott architektúrán legalább 32 bites. Ha a bemenet például "0.0.2.33", akkor a kimenet: 545.