Vill c++ kisHF

További gondolatok a múlt heti házik kapcsán

  1. A C ill. C++ szabványban a printf függvénynek nincs %lf vezérlő szekvenciája. (A scanf-nek van!)
  2. Az int n; scanf("%d",&n); double x[n]; kódrészletben — bár sok modern fordító értelmezi — két súlyos hiba is van. Mindkettő az ANSI/ISO C90 szabvány, és így a hordozhatóság ellen vét.
    • A deklarációs és kód utasítások blokkon belüli sorrendje kötött: előbb deklarálunk, utána jön a kód.
    • A tömb deklarációjában csak fordításkor kiértékelhető konstans érték lehet a méretmegadásban.
    Megoldás: megfelelő compiler opciókkal figyelmeztető vagy hibaüzeneteket kapunk (pl. gcc -Wall -pedantic ...). Persze oda is kell figyelni ezekre. (A warning üzenetek 90%-a súlyos hibára utal.)
  3. Egy tetszőleges célú programban minden memóriafoglaláshoz tartozik egy felszabadítás. Más módon fogalmazva: a malloc/calloc hívások és a free hívások száma meg kell egyezzen. Ha nem így írunk programot, annak memóriafolyás lesz az eredménye.
  4. A break szabályos C utasítás, mégsem illik használni (természetesen a switch-ben minden case végén kötelező egy break). A ciklusokban használt break és continue hazavágja a programunk strukturáltságát, és olvashatatlanná, követhetetlenné teszi a kódot. Ezt eredményezi a goto utasítás használata is. Összefoglalva:
    • A goto és continue használata tilos.
    • A break használata — a switch-case szerkezettől eltekintve — szintén tilos.
  5. A main függvény minden normális oprendszerben kötelezően int-et ad vissza. (Csak m$ környéken divatos a void main, de így a programunk nem tud státusz- ill. hibakódot visszaadni a hívónak.)
  6. Nem elég, hogy lefut a program, a megoldást tesztelni kell. Néhány egyszerű bemetre a kimenet egyezik-e a várttal.
  7. Aki M$ Visual alatt dolgozik, három dologra ügyeljen:
    • mindig üres projecttel indítson
    • ki legyen kapcsolva a "using precompiled headers" direktíva
    • a forrásfile kiterjesztése határozza meg, hogy C vagy C++ (.c kell a C projecthez).

2. Házi feladat.

Jövő héten kisZH lesz.
  1. Írj C programot, amely file végéig olvassa a szabványos bemenetet, a szövegben minden kisbetűt nagybetűre cserél, és viszont. Minden más karaktert változatlanul hagy. A feldolgozott szöveget a szabványos kimenetre írja. (Betű: az angol ábécé szerint értelmezve.)
    • I/O műveletekhez ajánlott a getchar és putchar (stdio.h). Miért int getchar(); ??
    • A karakter vizsgálata és váltása a ctype.h-ban deklarált isupper, islower, toupper ill. tolower függvényekkel a legegyszerűbb.
    • Mesterséges file vége jelet így lehet adni billentyűzetről. m$: ctrl+z (csak önállóan, sor elején), *nix: ctrl+d.
    • Tesztelés. Ha pl. a forráskód f1.c és a végrehajtható file prog(.exe), akkor a következő parancssori hívás kétszer egymásután átfuttatja a betűváltón a forrásfile-t, és az eredményt f1_2.c-be írja: prog < f1.c | prog > f1_2.c. Ezután *nix alatt a diff f1.c f1_2.c, m$ alatt a comp f1.c f1_2.c parancs mutatja az eltérést (nem szabad lennie).
  2. Egészítsd ki a hivatkozott függvényekkel az alábbi C programot, hogy a kommentben látható várt kimenetet adja. Ne használd string.h függvényeit. Hívd be a szükséges fejléceket (.h) is. Az alábbi kódon nem változtathatsz. Kis magyarázat: az alábbi három hívás három adatkezelési stratégiára mutat példát.
    • ford1 helyben dolgozik, valójában nincs is új adatterület,
    • ford2 a függvény foglal helyet, a hívó szabadít fel,
    • ford3 a hívó végzi a foglalást és a felszabadítást is.
    int main()
    {
        char a[]="egyik", b[]="es a masik", *c=NULL;
    
        ford1(a);
        printf("1:%s\n",a);        /*1:kiyge*/
    
        c=ford2(b);
        if(!c) return 1;
        printf("2:%s\n",c);        /*2:kisam a se*/
        free(c);
        c=NULL;
    
        c=(char*)malloc(hossz(b));
        if(!c) return 1;
        ford3(c,b);
        printf("3:%s\n",c);        /*3:kisam a se*/
        free(c);
        c=NULL;
        return 0;
    }
    
  3. Írj függvényt, amely a paraméterként kapott tetszőleges hosszúságú pozitív egész számot tartalmazó nullavégű string számjegyeit hármasával tagolja. Az eredmény számára a függvény foglal helyet, es NE return-nel adja vissza azt a hívónak, hanem paraméterlistán.
    Például: ha a kapott string "12345678", akkor az eredmény "12 345 678" kell legyen.
Ha a feladat csak függvényt kér, akkor is kötelező mellékelni a működést demonstráló main-t! (Lehetnek egy file-ban is.)