További gondolatok a múlt heti házik kapcsán
- A C ill. C++ szabványban a
printf
függvénynek nincs %lf
vezérlő szekvenciája. (A scanf
-nek van!)
- 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.)
-
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.
-
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.
-
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.)
-
Nem elég, hogy lefut a program, a megoldást tesztelni kell. Néhány egyszerű bemetre a kimenet egyezik-e a várttal.
- 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.
-
Í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).
-
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;
}
-
Í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.)
include "../_foot.inc"; ?>