Programozás alapjai, 2009-2010 őszi félév, szorgalmi feladatok
Lehetőség van szorgalmi feladatok beadására. Ezek a feladatok a gyakorlaton megismert feladatoknál általában egy kicsit nehezebbek, de sokszor csak egy kis ötlet elegendő ahhoz, hogy megoldjuk őket.
- A plusz pontok nem számítanak bele a minimum pont követelményekbe.
- A feladatokat tetszőleges számú ember benyújthatja, de arra kérnék mindenkit, hogy saját maga készítse el a feladatot, a megegyező munkákat nem tudom értékelni (ellenőrizni fogok).
- A szorgalmi feladatokat emailben kell beküldeni a tárgy mező kezdődjön a
PrAl szorgalmi
kifejezéssel. - Ahol a feladat az, hogy készíts C programot, ott csatolt teljes C forráskódú állományt várok, amely:
- program forduljon gcc fordítóval(különösebb kapcsolók nélkül), és helyesen fusson!
- program lehetőleg UTF-8-as kódolású legyen, és UNIX-os újsorokat tartalmazzon!
- file elején egy kommentben szerepeljen a szerző neve és h-s azonosítója!
- Nehezebb feladatok több pontot, könnyebb feladatok kevesebb pontot érnek.
- A feladatokhoz van egy-egy beküldési határidő, ezen túl is értékelek megoldásokat, de pont nem jár érte.
- A megoldáshoz használhatóak az stdio.h, stdlib.h, math.h fejlécek által deklarált függvények, kívéve, ha a feladat nem mondja másképp.
- Elegendő, ha a feladatok a specifikált bemeneteken működnek, azaz nem kell ilyen jellegű hibakezelést megvalósítani.
- A bemenet stdin, a kimenet stdout. File-ból bemenetet a '<' operátorral lehet shellből betölteni stdin-re.
Feladatok
- (határidő: 2009. 10. 18., 1 pont) Készíts C programot, amely három egész számot (A, N és M) bekér, kimenete
egy NxM-es táblázat, benne a számok A-tól A+N*M-1 -ig!
Pl. A=0, N=10, M=10 esetén:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 90 91 92 93 94 95 96 97 98 99
- (határidő: 2009. 10. 18., 2 pont) Készítsd el az előző feladat azon változatát, ahol a számok előtt megfelelő
mennyiségű szóköz található(a számokat jobbra igazítjuk), így a kimenet A=0, N=10, M=10 esetén:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 90 91 92 93 94 95 96 97 98 99
- (határidő: 2009. 10. 25., 1 pont) Készíts C programot, amely bemutatja két egész típusú(int) változó értékének cseréjét úgy, hogy nem használunk ideiglenes változót a cseréhez! (túlcsordulás megengedett)
- (határidő: 2009. 10. 25., 1 pont) Készíts C programot, amely bemutatja két egész típusú(int) változó értékének cseréjét úgy, hogy nem használunk ideiglenes változót a cseréhez! (túlcsordulás nem megengedett)
- (határidő: 2009. 10. 25., 2 pont) Készíts C programot, amely a bemeneten kapott páratlan szám paraméter(N) alapján
kiszámolja, hogy egy adott spirális felírásban mi az átlós számok összege!
Az 1..N*N számokat a következő alakban írjuk fel (jelen esetben N=5):
21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
Ebben a példában átlós számok összege 21+7+1+3+13+17+5+9+25=101.
Hatékony (gyors, de nem "előre beégetett") megoldásért további plusz pont jár. - (határidő: 2009. 11. 15., 1 pont) Készíts C programot, ami az ötöslottó sorsolását szimulálja! A programban használj egyenletes eloszlású pszeudo véletlenszám generátort (rand, srand, és társai)!
- (határidő: 2009. 11. 15., 1 pont) Készíts C nyelven írt számrendszer konvertert! A konvertáláshoz nem használhatsz beépített könyvtárbeli függvényt(pl. sprintf). A program bináris számrendszerből váltson át számokat decimális számrendszerbe, és visszafele.
- (határidő: 2009. 11. 15., 2 pont) Készíts C nyelven írt számrendszer konverter programot! A konvertáláshoz nem használhatsz beépített könyvtárbeli függvényt(pl. sprintf). A program tetszőleges számrendszerből tudjon konvertálni tetszőleges számrendszerbe, a számrendszerek alapja legalább 2, és legfeljebb 62.
- (határidő: 2009. 11. 15., 2 pont) Magyarázd meg a következő C programkódot
(egész pontosan azt, hogy miért nem írja ki a tömb elemeit):#include <stdio.h> #define ELEMSZAM (sizeof(tomb) / sizeof(tomb[0])) int tomb[] = {11, 22, 33, 44, 55, 66, 77}; int main() { int i = -1; printf("i=%d, ELEMSZAM-2 = %d, i ?<= ELEMSZAM-2 == %d\n", i, ELEMSZAM-2, i <= ELEMSZAM-2); for(; i <= (ELEMSZAM-2); i++){ printf("%d\n", tomb[i+1]); } return 0; }
- (határidő: 2009. 11. 15., 1 pont) Magyarázd meg a következő C programkódot
(egész pontosan azt, hogy miért nem a kettő nemnegatív kitevőjű hatványait írja ki rendre 2^(0..3)):#include <stdio.h> #include <stdlib.h> #define SIZEOF(tomb) (sizeof(tomb)/sizeof(tomb[0])) #define Kiir(kifejezes) printf("%s:%d\n",#kifejezes,(kifejezes)) int main(){ /* Ketto hatvanyai */ int hatv[] = { 0001, 0010, 0100, 1000 }; int i; for(i = 0; i < SIZEOF(hatv); i++) Kiir(hatv[i]); return 0; }
- (határidő: 2009. 11. 15., 1 pont) Magyarázd meg a következő C programkódot
(egész pontosan azt, hogy miért nem 10 az eredmény):#include <stdio.h> #include <stdlib.h> #define Kiir(kifejezes) printf("%s : %d\n",#kifejezes,(kifejezes)) int main(){ int y = 100; int *p; p = malloc(sizeof(int)); *p = 10; y = y/*p; /*y osztva *p -vel */; Kiir(y); return 0; }
- (határidő: 2009. 11. 15., 1 pont) Magyarázd meg a következő C programkódot!
Az otszor függvény kettővel balra léptetné a számot, majd egyszer hozzáadná az értékét, ezzel összesen a szám ötszörösét kellene kapni. Hol a hiba?#include <stdio.h> #define Kiir(kifejezes) printf("%s : %d\n",#kifejezes,(kifejezes)) int otszor(int a){ int t; t = a<<2 + a; return t; } int main() { int a = 1, b = 2, c = 3; Kiir(otszor(a)); Kiir(otszor(b)); Kiir(otszor(c)); return 0; }
- (határidő:
2009. 11. 15.2009. 12. 11., 1 pont) Írj egy C programot, amely bekér a felhasználótól N és M nemnegatív egész számokat, és egy N*M-es int tömböt deklarál dinamikusan!
A program olvasson be egy felhasználó által megadott fájlból N*M darab egész számot, töltse fel a tömböt sorfolytonosan, majd szabadítsa fel az allokált memóriaterületet! - (határidő:
2009. 11. 15.2009. 12. 11, 1 pont) Írj egy demonstrációs C programot, amely bemutatja a memóriaszivárgás veszélyeit! Milyen kellemetlen hatása lehet a sok memória allokálásának? - (határidő:
2009. 11. 15.2009. 12. 11, 2 pont) Mutass be legalább három lényegesen különböző esetet (kódrészletet vagy teljes C kódot), amikor a program memóriaszivárgást okoz. - (határidő:
2009. 11. 15.2009. 12. 11, 3 pont) Készíts egy C programot, amely bemutatja a memória kezelését! A program legyen interaktív (vár a felhasználó parancsaira, "quit" hatására kilép), a felhasználó a következő parancsokat adhatja ki:-
read RADIX CÍM MÉRET
ahol RADIX egy számrendszer formátumkarakter (d=decimális, x=hexadecimális, o=oktális) és CÍM egy adott számrendszerbeli szám, amely egy memóriacímet jelent. A read hatására a program kiírja a standard kimenetre az adott memóriaterületen kezdődő MÉRET darab bájtot. -
write RADIX CÍM ADAT
ahol RADIX egy számrendszer formátumkarakter (d=decimális, x=hexadecimális, o=oktális) és CÍM egy adott számrendszerbeli szám, amely egy memóriacímet jelent. A write hatására az adott memóriacímen elhelyezi az ADAT paraméterben megadott decimálisan kódolt (pl. unsigned char) bájtot.
-
read RADIX CÍM MÉRET
- (határidő: 2009. 12. 11., 1 pont) Készíts C programot, amely egy moduláris hatványozót valósít meg! Azaz számold ki az b^e (mod n) értéket tetszőleges b, e>0, n>0 egészekre! Vigyázz, a b^e értéke nagy is lehet! Tipp: Moduláris hatványozás
- (határidő: 2009. 12. 11., 1 pont) Készíts C programot, amely meghatározza egy a szám multiplikatív rendjét modulo n! Ha a megoldás használ moduláris hatványozót, akkor jár a pont az előző feladatra is. Tipp: Multiplikatív rend
- (határidő: 2009. 12. 11., 1 pont) Készíts C programot, amely kiszámítja,
hogy az 1..1000 intervallumba eső n számok közül melyik az, amely esetén
az 1/n törtszám tizedes alakjában az ismétlődő sorozat a legnagyobb!
Ha az előző két feladat valamelyikét megoldod, akkor jár a pont azokra is.
Pl.1/2 = 0.5(0) 1 hosszú 1/3 = 0.(3) 1 hosszú 1/4 = 0.(25) 2 hosszú 1/7 = 0.(142857) 6 hosszú
- Készíts egy C könyvtárat (pl. uint128.c, uint128.h), amelyben definiálsz egy 16 bájtos (128 bites) előjeltelen
egész számok ábrázolására alkalmas struktúrát! Készíts olyan függvényeket, amelyek ezen
a típuson a szokásos összeadás, kivonás, szorzás, maradékos/egész osztás, shiftelés(balra, jobbra)
műveleteket és a kisebb-egyenlő-nagyobb (comparator) operátort megvalósítják!
Készíts egy C főprogramot (amely már main-t is tartalmaz), amely bemutatja a könyvtár használatát!