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

  1. (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
    
  2. (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
    
  3. (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)
  4. (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)
  5. (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.
  6. (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)!
  7. (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.
  8. (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.
  9. (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;
    }
    
  10. (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;
      }
    
  11. (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;
    }
    
  12. (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;
    }
    
  13. (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!
  14. (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?
  15. (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.
  16. (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.
  17. (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
  18. (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
  19. (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ú
    
  20. 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!

Contact