Számok kiírása fordított sorrendben

Írjunk programot, amely bekér egy előjel nélküli n egész számot, utána beolvas n darab előjeles egészet, és kiírja azokat fordított sorrendben!

 



A megoldásért kattints ide!

A fordított kiíráshoz el kell tárolnunk a megadott egész számokat. Viszont nem deklarálhatunk tömböt, hiszen nem tudjuk a méretét.

Erre ad megoldást a dinamikus memóriakezelés. Ilyenkor az operációs rendszertől kérünk memóriát. Például n darab int típusú változónak az alábbi módon kérhetünk helyet:

 

int *ptr;

...

ptr = malloc(n*sizeof(int));

 

Használat után fel kell szabadítanunk (vissza kell adnunk az operációs rendszernek) a memóriát:

free(ptr);

 

A kapott memóriaterületet kétféleképpen használhatjuk fel, ezeket az alábbi ábra mutatja:

pointer1.bmp
 

Az egyik a hagyományos módszer: *ptr az első elem, *(ptr+1) a második, és így tovább. A C nyelv azonban kifejezetten erre a helyzetre biztosít egy kényelmesebb megoldást. Az egyes elemeket írhatjuk ptr[0], ptr[1], stb. formában, ahogyan a tömböket használjuk. Vagyis elmondhatjuk, hogy:
 

ptr[i] = *(ptr+i)

 
Ez a C nyelv egyik nagyon fontos összefüggése, amely nem csak akkor igaz, ha pointeren keresztül használjuk az általa mutatott területet, hanem akkor is, ha van egy tömbünk (int a
[3];), és annak nevét szeretnénk pointerként használni: *(a+1)=2;.

 

Fontos különbség, hogy míg a tömbhöz tartozó memóriahelyről a fordító gondoskodik (ezért is kell megadnunk a méretét fordítás előtt), a pointer esetén csak a pointer helyéről gondoskodik a fordító, a mutatott területről nem, azt nekünk kell lefoglalnunk a fent bemutatott módon.

 

Ezek után a program a következőképpen implementálható:

 

#include<stdio.h>
#include
<stdlib.h>

int main()
{

      unsigned int n, i;
      int *ptr;
 

      printf("n= ");
      scanf("%u",&n);
    

      ptr = malloc(n*sizeof(int));
 

      for(i=0; i<n;i++)
      {
            scanf("%d", &ptr[i]);
      }

 
      for(i=0; i<n;i++)
      {
            printf("%d ",ptr[n-i-1]);
      }

      free(ptr);
      return 0;
}




2007.09.08. 17:42:28 |  Permalink  |  Hozzászólások száma: 2  |  Tárgyszavak: Mutatók és tömbök


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások


Webmester felhasználó Webmester felhasználó  (2008.01.31. 20:53:17)

A C nem olyan szigorúan típusos, mit a C++. Vagyis C-ben void pointerről minden pointerre van automatikus konverzió, de C++-ban nincs, ki kell írni. Tehát ha C++ fordítóval fordítod a C programod (tipikusan cpp a programot tartalmazó állomány kiterjesztése, de fordítóról fordítóra más), akkor tényleg azt kell csinálni, amit írtál. Köszi a felvetést, szerintem sokaknak segít, hogy tisztáztuk ezt a problémát! Tihamér

Szasz Szasz  (2007.12.05. 1:29:56)

A 14. sorban a malloc által visszaadott mutatót int típusúra kell változtatni, valahogy így: ptr=(int*)malloc(n*sizeof(int)); /*ugyanis a malloc void* -ot ad vissza*/ Ettől eltekintve a feladat jó.