Informatika2-2012/Gyakorlat04

A MathWikiből
(Változatok közti eltérés)
52. sor: 52. sor:
 
}
 
}
 
</c>
 
</c>
 +
  
 
==== Mutató paraméterű függvény 2 ====
 
==== Mutató paraméterű függvény 2 ====
57. sor: 58. sor:
 
Módosítsuk az előző feladatot úgy, hogy a függvény a két double szám átlagát ne függvényértékként adja vissza, hanem egy mutatóval kijelölt harmadik változóba tegye!
 
Módosítsuk az előző feladatot úgy, hogy a függvény a két double szám átlagát ne függvényértékként adja vissza, hanem egy mutatóval kijelölt harmadik változóba tegye!
 
A keretprogramot is módosítsuk a feladatnak megfelelően.
 
A keretprogramot is módosítsuk a feladatnak megfelelően.
 +
 +
 +
==== Betűraktár-kezelő ====
 +
 +
A "raktar" nevű globális kétdimenziós tömbben karaktereket tárolunk 7 polcon, minden polcon 9 dobozban.
 +
 +
Írj, függvényeket a fenti programhoz:
 +
* ''void betesz(char a, int polc, int doboz)'': a raktár megfelelő helyére beírja az ''a'' változóban kapott karaktert
 +
* ''char mivanott(int polc, int rekesz)'': visszaadja a raktár adott helyén tárolt karakter értékét
 +
* ''void urit(int polc, int doboz)'': a raktár megfelelő helyére beírja a '\0' karaktert
 +
* ''void polcoturit(int polc)'': a raktár egy teljes sorát kiüríti (használd az előző függvényt!)
 +
* ''void urit()'': kiüríti a teljes raktárat, vagyis minden elemnek a '\0' karaktert adja értékül
 +
* ''char* mutato(int polc, int rekesz)'' : visszaadja az adott elemre mutató pointert
 +
* ''char* holvan(char s)'': az első polctól és első doboztól kezdve végigkeresi a raktárat és visszaadja az első olyan karakter címét(mutatóját) aminek az értéke megegyezik a kapott ''s'' karakterrel.
 +
 +
Használd a következő keretprogramot:
 +
<c>
 +
#include <stdio.h>
 +
 +
int polcok = 7;
 +
int dobozok = 9;
 +
char raktar[polcok][dobozok];
 +
 +
main(){
 +
  urit();
 +
  /* Ide írj még függvényhívásokat amik használják a raktárat! */
 +
  return 0;
 +
}
 +
</c>

A lap 2012. február 29., 22:54-kori változata

Tartalomjegyzék

Mutatók (pointer-ek)

A lenti feladatokat a CodeLite-ban oldhatjátok meg legegyszerűbben (ne felejtsetek el minden feladathoz új projektet nyitni!), de akinek a konzolos, gcc-s fordítás a szimpatikusabb úgy is csinálhatja.

Ismerkedés a mutatókkal és a debuggerrel

Ha mutatókakl végzünk műveleteket, azt könnyű elrontani. Ezért mielőtt belemerülünk, ismerkedjünk meg egy hatékony hibakeresési módszerrel.

A CodeLite tartalmaz beépített debuggert (bug = rajtett hiba a kódban; debugging = ennek keresése/javítása; debugger = ezt segítő eszközkészlet/segédprogram).

Másoljuk be a következő kódot egy új projekt main.c-jébe:

#include <stdio.h>
 
main() {
  int a=5; int b=6; int c = 7;
  int *bb;
  int *aa = &a;
  bb = &b;
  a = 3;
  aa = bb;
  *aa = 8;
  aa = &c;
  *aa = 10;
  *bb = *aa;
}

A hibakeresés egyik fontos eszköze hogy a program futását bárhol megállíthassuk és ránézhessünk a változók pillanatnyi értékére. A program persze túl gyorsan fut ahhoz hogy futás közben megnyomjunk egy "pause" gombot, ezért előre meg kell adni azokat a helyeket (sorokat) ahol szeretnénk hogy megálljon a futás. Ezek az ún. "töréspontok" (breakpoint). Állítsunk be töréspontokat a kód melett balra a sorszámokat is tartalmazó csíkra (a sor-szám mellé kicsit jobbra) kattintva! Piros pöttyöknek kell megjelenniük a kattintás helyén. Ezek a pöttyök jelzik a töréspontokat. Egy következő kattintás kitörli a töréspontot.

A programot ne úgy futtassuk mint eddig (Build menü -> Run), hanem a "Debug" menüpont alatti "Start/Continue debugger" -rel. A kerek kék "play-gombbal" ugorhatunk a következő töréspontra, a kapcsoszárójeles-zöldnyilas gombokkal pedig sorról sorra haladhatunk akkor is ha nincs ott töréspont, illetve bemehetünk egy függvényhívás belsejébe, vagy a visszatérése utáni állapotra ugorhatunk.

Futtassuk le lépésről lépésre (szinte minden sorban legyen töréspont) a programot és figyeljük meg a változók értékeinek változását ( a lenti "Locals" fül alatt fognak látszani)!

Figyeljük meg azt is, hogy a töréspont az aktuális sorban található parancs lefutása előtt vagy után állítja-e meg a futást!


Mutató paraméterű függvény

Írjunk függvényt, amely két mutatóval kijelölt double számot átlagol! Illesszük a függvényt az alábbi keretprogramhoz.

#include <stdio.h>
main(){
  double a, b, res;
  scanf("%lf%lf", &a, &b);
  res = average(&a, &b);  /* ez a megírandó függvény */
  printf("%6.2lf%\n", res);
  return 0;
}


Mutató paraméterű függvény 2

Módosítsuk az előző feladatot úgy, hogy a függvény a két double szám átlagát ne függvényértékként adja vissza, hanem egy mutatóval kijelölt harmadik változóba tegye! A keretprogramot is módosítsuk a feladatnak megfelelően.


Betűraktár-kezelő

A "raktar" nevű globális kétdimenziós tömbben karaktereket tárolunk 7 polcon, minden polcon 9 dobozban.

Írj, függvényeket a fenti programhoz:

  • void betesz(char a, int polc, int doboz): a raktár megfelelő helyére beírja az a változóban kapott karaktert
  • char mivanott(int polc, int rekesz): visszaadja a raktár adott helyén tárolt karakter értékét
  • void urit(int polc, int doboz): a raktár megfelelő helyére beírja a '\0' karaktert
  • void polcoturit(int polc): a raktár egy teljes sorát kiüríti (használd az előző függvényt!)
  • void urit(): kiüríti a teljes raktárat, vagyis minden elemnek a '\0' karaktert adja értékül
  • char* mutato(int polc, int rekesz) : visszaadja az adott elemre mutató pointert
  • char* holvan(char s): az első polctól és első doboztól kezdve végigkeresi a raktárat és visszaadja az első olyan karakter címét(mutatóját) aminek az értéke megegyezik a kapott s karakterrel.

Használd a következő keretprogramot:

#include <stdio.h>
 
int polcok = 7;
int dobozok = 9;
char raktar[polcok][dobozok];
 
main(){
  urit();
  /* Ide írj még függvényhívásokat amik használják a raktárat! */
  return 0;
}
Személyes eszközök