C++ gyakorlat – Gyakorló feladatok

Útmutató

Az órákhoz tartozhatnak gyakorló feladatok. Megoldásuk opcionális, de hasznos. A feladatok megoldhatók a gyakorlati anyag alapján. Próbálom úgy kiírni őket, hogy megoldásuk során fel lehessen eleveníteni az órán elhangzottakat.

A haladó feladatok azoknak vannak, akiknek az ötös érdemjegy is kevés. Itt a tárgy követelményeiben nem szereplő (vagy azért, mert elég kevesebbet tudni, vagy azért mert nem szorosan C++-hoz kapcsolódik) ismeretek is szükségesek a feladatok megoldásához. A feladatokat a gyakolatokon elhangozttak alapján nem mindig lehet megoldani, ekkor további utánajárás szükséges.

1. óra

  1. Írd be az órán készített faktoriális programot és próbáld meg lefordítani g++-szal, parancssorból! Ne feledkezz meg a tanult kapcsolókról!
  2. Próbálj előhozni hibákat!
    1. preprocesszor hibát
    2. nyelvi hibát
    3. linkelési hibát
  3. Próbálj előhozni figyelmezetéseket!
  4. Próbáld ki a --save-temps kapcsolót, és nézd meg milyen köztes állaptokok vannak a fordítás során
    • .ii fájl - preprocesszált kód
    • .S fájl - assembly kód
    • .o fájl - lefordított object file
  5. Próbáld ki az include guardok működését! (Legegyszerűbb, ha kétszer include-olod egymás alatt a fac.h-t. Ne feledd, ha csak függvénydefiníciók vannak a fájlban, akkor nem jelent problémát többször include-olni!)
  6. Próbáld meg letiltani a szabvány által nem engedett működést letiltani a -ansi -pedantic kapcsolókkal! Próbáld meg így lefordítani a változó méretű tömböt!

1. óra – haladó feladatok

  1. Készíts több object fájlból álló C++ programot! Fordísd le!
  2. Ugye milyen unalmas mindig azt a sok parancsot begépelni? Készíts Makefile-t, ami ezt megcsinálja helyetted!
  3. Készíts egy .c fájlt is, és írj bele egy C függvényt! Az órán tanult extern "C" {...} konstrukcióval fordítsd össze a C-s object fájlodat a C++-os object fájloddal! (A C programot C fordítóval, például a gcc-vel fordítsd. )
  4. Próbáld meg lefordítani a kódod Clang és Visual C++ alatt is. (A Clang ingyenes és nyílt forráskódú, a Visual C++ pedig ingyenes program.)
  5. Próbáld meg Visual C++-szal lefordítani fordítási időben nem ismert méretű tömböt!

2. óra

  1. Próbáld ki, hogy a header fájlban levő using namespace a hatása a forrásfájlokba is átterjed!
  2. Próbáld meg a legnagyobb int-et (2^31-1, INT_MAX, std::numeric_limits<int>::max()) double-lé, majd float-tá konvertálni! Mi az eredmény?
  3. Írj programot, mely átvált egy int számot kettes számrendszerbe

2. óra – haladó feladatok

  1. Tanulmányozd a preprocesszált és az Assembly kódot! Érdemes a printf-es verziót próbálni, mert az kisebb kódot generál. Próbálgasd, milyen hatása van az optimalizáció bekapcsolásának a kódra!
  2. Hasonlítd össze a mangled nevét egy namespace-ben levő és egy namespace-en kívüli függvénynek (Az nm paranccsal megnézhető az object fájlban levő szimbólumok listája.)
  3. Miben különbözik a makrós és az inline függvényes Fahrenheit-Celsius konverziós program Assembly kódja -O2-vel fordítva?

3. óra

  1. Írj programot, mely megszámolja a bemenet sorainak számát (Mint a wc -l parancs).
  2. Írj programot, mely kiírja a bemenet első tíz sorát (Mint a head parancs).
  3. Próbáld megírni a NAGYBETŰ->kisbetű (A-Z->a-z) átalakító programot a tolower függvény segítségével is.
  4. Írj programot, amely Caesar-kódolva írja ki a bemenetet a kimenetre.

3. óra – haladó feladatok

  1. Mi az EOF makró értéke?
  2. reinterpret_cast segítségével írd ki azt a bitsorozatot (egész számmá konvertálva a kettes számrendszerbeli alakját), amit a double változó tartalmaz!
  3. Írj programot, mely kiírja a bemenet első X sorát, ahol X-et a parancsori paraméterekből olvassa a program. (Mint a head -n X parancs).

4. óra

  1. Írj függvényt, amely megkeresi egy tömb legnagyobb elemét. Teszteld egy főprogrammal.
  2. Írj függvényt, amely rendez egy tömböt. Teszteld egy főprogrammal.
  3. Írj függvényt, amely megszámolja, hogy hány kisbetű (a-z) található a paraméteréül kapott C-string-ben. Teszteld egy főprogrammal.
  4. Írj függvényt, amely megmondja, hogy egy C-string-ben előfordul-e egy másik C-string. Teszteld egy főprogrammal. Keresd meg, hogy a szabványos könyvtárban melyik függvény oldja meg ezt a feladatot.
  5. Írj programot, mely kiírja a parancssori argumentumait. Figyeld meg a nulladik argumentum viselkedését!
  6. Próbálj meg módosítani egy C-string-et és egy konstans karaktertömböt const_cast segítségével. Hozd elő az órán megbeszélt hibákat.
  7. Próbálj meg dereferláni egy nullpointert.

4. óra – haladó feladatok

  1. Teszteld az 1. feladatban megírt függvényeket gtest-tel. Megjegyzés: a függvényt és a teszteket célszerű külön fordítási egységbe (.cpp fájl) elhelyezni
  2. Oldd meg a 4. óra 2. és 3. feladatát pointer-aritmetika segítségével.
  3. Figyeld meg, hogy a cout-ra kiírhatók a pointerek. Ellenőrizd, hogy egy tömb elemei tényleg egymás után vannak-e.
  4. Programmal is számmá lehet alakítani a pointereket static_cast segítségével. Ilyenkor használd az uintptr_t típust, ami szabvány szerint egy pontosan akkora méretű egész szám, mint egy pointer. Írd meg az előző feladatot programmal.
  5. Nézz utána a nullpointer különböző alakjainak. Mit lehet tudni a NULL-ról?

6. óra

  1. Próbáld ki az órán bemutatott racionális szám osztályt!
  2. Egészítsd ki a racionális szám osztályt további operátorokkal (szorzás, ++ operátor)!
  3. Készíts egy dátum (év, hónap, nap adattagok) és egy dátumintervallum (nap adatag) osztályt! Készítsd el a műveleteiket:

    • Dátum és intervallum legyen összeadható! (Az összeadás legyen kommutatív, az eredmény legyen dátum típusú, += is működjön ha dátum van baloldalt.)
    • Két dátum különbége legyen intervallum!
    • Legyen kiíró operátora mindkét osztálynak!

6. óra – haladó feladatok

  1. Teszteld a racionális szám osztályt gtest-tel. Megjegyzés a 4. óránál.
  2. Oldd meg, hogy egy racionális szám objektum használható legyen ciklusfeltételben (igaz, ha nem nulla).

7. óra

  1. Olvass be sorokat a szabványos bemenetről. Írd ki őket, utazz vissza az időben, majd írd ki őket megint.
  2. Írj programot, ami kiszámolja a tribonacci számokat! Általánosítsd tetszőleges n előző szám összeadására (Polifibonacci-számok)! Próbáld meg többféle adatszerkezettel megoldani, és hasonlítsd össze a teljesítményüket! (Haladó feladat: hasonlítsd össze a memóriahasználatukat is!)

7. óra – haladó feladatok

  1. Tegyél az ismertetett szekvenciális konténerekbe néhány elemet (kb. 100-at). Nézd meg, hogy az ismertetett szekvenciális konténerekben az egyes elemek címe az órán ismertetett reprezentációnak megfelelően alakul.
  2. Idézz elő olyan helyzetet std::vector-nál, hogy az elemek címe push_back után megváltozzon!
  3. Miért nem lehet hasonló helyzetet előidézni std::list-nél?