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
- Í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! - Próbálj előhozni hibákat!
- preprocesszor hibát
- nyelvi hibát
- linkelési hibát
- Próbálj előhozni figyelmezetéseket!
- 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
- 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!) 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
- Készíts több object fájlból álló C++ programot! Fordísd le!
- Ugye milyen unalmas mindig azt a sok parancsot begépelni? Készíts Makefile-t, ami ezt megcsinálja helyetted!
- Készíts egy
.c
fájlt is, és írj bele egy C függvényt! Az órán tanultextern "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 agcc
-vel fordítsd. ) - 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.)
Próbáld meg Visual C++-szal lefordítani fordítási időben nem ismert méretű tömböt!
2. óra
- Próbáld ki, hogy a header fájlban levő
using namespace
a hatása a forrásfájlokba is átterjed! - Próbáld meg a legnagyobb int-et (2^31-1,
INT_MAX
,std::numeric_limits<int>::max()
)double
-lé, majdfloat
-tá konvertálni! Mi az eredmény? Írj programot, mely átvált egy
int
számot kettes számrendszerbe
2. óra – haladó feladatok
- 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!
- 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.) 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
- Írj programot, mely megszámolja a bemenet sorainak számát (Mint a
wc -l
parancs). - Írj programot, mely kiírja a bemenet első tíz sorát (Mint a
head
parancs). - 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. Írj programot, amely Caesar-kódolva írja ki a bemenetet a kimenetre.
3. óra – haladó feladatok
- Mi az
EOF
makró értéke? 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!Írj programot, mely kiírja a bemenet első
X
sorát, aholX
-et a parancsori paraméterekből olvassa a program. (Mint ahead -n X
parancs).
4. óra
- Írj függvényt, amely megkeresi egy tömb legnagyobb elemét. Teszteld egy főprogrammal.
- Írj függvényt, amely rendez egy tömböt. Teszteld egy főprogrammal.
- Í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.
- Í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.
- Írj programot, mely kiírja a parancssori argumentumait. Figyeld meg a nulladik argumentum viselkedését!
- 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. Próbálj meg dereferláni egy nullpointert.
4. óra – haladó feladatok
- 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
- Oldd meg a 4. óra 2. és 3. feladatát pointer-aritmetika segítségével.
- 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.
- Programmal is számmá lehet alakítani a pointereket
static_cast
segítségével. Ilyenkor használd azuintptr_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. Nézz utána a nullpointer különböző alakjainak. Mit lehet tudni a
NULL
-ról?
6. óra
- Próbáld ki az órán bemutatott racionális szám osztályt!
- Egészítsd ki a racionális szám osztályt további operátorokkal (szorzás,
++
operátor)! 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!
- Dátum és intervallum legyen összeadható! (Az összeadás legyen kommutatív, az eredmény legyen dátum típusú,
6. óra – haladó feladatok
- Teszteld a racionális szám osztályt gtest-tel. Megjegyzés a 4. óránál.
Oldd meg, hogy egy racionális szám objektum használható legyen ciklusfeltételben (igaz, ha nem nulla).
7. óra
- Olvass be sorokat a szabványos bemenetről. Írd ki őket, utazz vissza az időben, majd írd ki őket megint.
Í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
- 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.
- Idézz elő olyan helyzetet
std::vector
-nál, hogy az elemek címepush_back
után megváltozzon! - Miért nem lehet hasonló helyzetet előidézni
std::list
-nél?