C programozás kezdőknek - 25. fejezet

Tömbök

Karakterekből karakterláncokat építünk.

A C nyelvben lehetőségünk van létrehozni tömböket. Egy tömb lényegében egy nagyobb memóriaterület, ami sok azonos típusból álló elemet tartalmaz egymás után. Erre a memóriaterületre, egy egységként is nézhetünk (a tömb nevével hivatkozunk rá) - de ha kell külön-külön is elérhetjük a tömbelemeket, ha megmondjuk, hogy melyik memóriacímen érhető el (hányadik a tömbelem a sorban).

Tömböt a meglévő típusok bármelyikéből létrehozhatunk, legyen szó unsigned int-ről, char-ról vagy double-ről. A létrehozás ilyen formában történik:

Egy tömbelem lekérdezéséhez vagy módosításához tudnunk kell az elem sorszámát a tömbben. A sorszámozás 0-tól kezdődik (!!), és ha n hosszú a tömb, akkor n-1 ig tart. Egy 5 elemű tömb képzeletbeli memóriaképe:

Nézzük egy egyszerű példát:

#include<stdio.h>

int main(){

    int tomb[3];

    tomb[0] = 91;
    tomb[1] = 3;
    tomb[2] = 5;

    printf("%d %d %d", tomb[0], tomb[1], tomb[2]);

return 0;
}

c tomb1.c 91 3 5

  • létrehozok egy 3 szám tárolására alkalmas tömböt, ezért azt írom: int tomb[3];
  • ezután mindegyik tömbelembe rakok egy számot
    • Az 1. tömbelem sorszáma a 0, ezért ezt írom: tomb[0] = 91;
    • A 2. tömbelem sorszáma az 1, ezért ezt írom: tomb[1] = 3;
    • A 3. tömbelem sorszáma a 2, ezért ezt írom: tomb[2] = 5;
  • végül kiíratom a tömb tartalmát

Látszik, hogy a tömb létrehozása nagyon hasonlít a tömbelem lekérdezéséhez, de nem ugyanaz a kettő!

A tömb létrehozásakor, mint minden változóban memóriaszemét található, ezért vagy adjunk minden tömbelemnek értéket, ahogy a fenti példában történt, vagy nullázzuk ki a tömb minden elemét használat előtt!

Felmerülhet benned a kérdés, hogy mire jók a tömbök, ha igazból sok változó létrehozásával ugyanazt a hatást lehet elérni:

#include<stdio.h>

int main(){

    int a,b,c;

    a = 91;
    b = 3;
    c = 5;

    printf("%d %d %d", a, b, c);

return 0;
}

c tomb2.c 91 3 5

A válasz:

  • nagyon sok változó esetén sokkal egyszerűbb inkább egy tömböt létrehozni
  • a tömbelemeknek van sorszáma, ami felhasználható programírás során
  • egy tömb bejárható elejétől a végéig, ellenben a külön-külön létrehozott változók nem

Feladat: Tömb beolvasása és kiírása

Írjunk egy programot, ami bekér a felhasználótól 10 darab egész számot, és kiírja a képernyőre őket fordított sorrendben!

A beolvasást és a kiírást FOR ciklus segítségével lehet elvégezni! A FOR ciklus ciklusváltozója (i) induljon 0-ról és menjen 9-ig beolvasáskor Mindig az i-edik tömbelemet olvassuk be. (Ezt úgy lehet elképzelni, hogy i helyére minden egyes ciklusban behelyettesítődik egy szám kijelölve ezzel egy tömbelemet). Ezután i menjen 9-től egészen 0-ig, hogy fordított sorrendben történjen meg a kiírás.

#include<stdio.h>

int main(){

    int tomb[10];

    int i;
    for(i=0; i<=9; i++)
    {
        scanf("%d", &tomb[i] );
    }

    for(i=9; i>=0; i--)
    {
        printf("%d ", tomb[i]);
    }

return 0;
}

c tombfordito.c 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1

Ha a tömbbe mondjuk az 1,2,3,4,5,6,7,8,9,10-es számokat pakoljuk, akkor a kimenet 10,9,8,7,6,5,4,3,2,1 lesz.

Feladat: Karaktertömb

Hozzunk létre char típusból egy tömböt, hogy ezentúl ne csak 1 darab karaktert, hanem komplett szövegeket is el tudjunk tárolni a programunkban!

Az egyik korábbi fejezetben megismertük a karakter beolvasását és kiírását, ami így néz ki:

#include<stdio.h>

int main(){

    char karakter;

    scanf("%c", &karakter);
    printf("%c", karakter);

return 0;
}

c karakterbeki.c x x

Sok karakter, azaz egy szöveg beolvasása és kiírása így néz ki:

#include<stdio.h>

int main(){

    char szoveg[20];

    scanf("%s", &szoveg);
    printf("%s", szoveg);

return 0;
}

c szovebeki.c donaldtrump donaldtrump

A karakternek és a karakterekből képzett karaktertömbnek (szövegnek) más a hely-jelölője!

karakter        %c
szöveg      %s

A karaktertömb is ugyanolyan tömb, mint például egy egész szám tömb – tehát le lehet kérni bármelyik tömbelemét is:

Feladat: Szöveg karakterei

Írjunk egy programot, ami bekér egy szót és megszámolja, hogy hány 'e' betű szerepel benne! (A felhasználó maximum 20 hosszú szót adhat be.)

#include<stdio.h>

int main(){

    char szo[50];

    scanf("%s", &szo);

    int i;
    int db = 0;

    for(i=0; i<20; i++)
    {
        if( szo[i] == 'e'){ db++; }
    }

    printf("A szovegben %d db E betu van.", db);

return 0;
}

c eszperente.c felesleges A szovegben 4 db E betu van.

Beolvasunk egy szót %s hely-jelölővel, majd egy FOR ciklussal végignézzük az összes karakterét vizsgálva közben egy IF-fel, hogy 'e' betű vagy sem. Az 'e' betűt, meg úgy általában minden önmagában álló karaktert aposztrófok közé kell írni, különben a C változónak értelmezi azt.

Feladat: Átlagszámítás

Írjunk programot, ami bekér a felhasználótól 10 számot, majd meghatározza az átlagukat.

"Buta" megoldás

  • A 10 számot egy tömbbe olvassuk
  • Majd összeadjuk a tömbelemeket
  • Végül kiszámoljuk az átlagot
#include<stdio.h>

int main(){

    double szamok[10];
    int i;

    //beolvasás
    for(i=0; i<10; i++){
        scanf("%lf", &szamok[i] );
    }

    //összeg
    double osszeg = 0;
    for(i=0; i<10; i++){
        osszeg = osszeg + szamok[i];
    }

    //átlagolás
    double atlag = osszeg /10;
    printf("A számok átlaga: %lf", atlag);

return 0;
}

c atlag.c -1 1 1 2 2 3 3 4 4 5 A számok átlaga: 2.4000

Az okos megoldás

Nem is használunk tömböt.

  • Elég egy szám változó amibe beolvasunk egy számot
  • Ezen kívül kell még egy eredmény változó, amihez mindig hozzáadjuk a beolvasott számot
  • A végén az eredmény változót elosztjuk 10-zel, hogy megkapjuk az átlagot
#include<stdio.h>

int main(){

    double szam, eredmeny = 0;
    int i;

    for(i=0; i<10; i++){
       scanf("%lf", &szam);
       eredmeny = eredmeny + szam;
    }

    printf("Az atlag: %lf", eredmeny / 10);

return 0;
}

c atlag2.c -1 1 1 2 2 3 3 4 4 5 Az atlag: 2.4000

Nagyon meg kell gondolni, mikor érdemes tömböket használni.

Kvízkérdések betöltése...

A hozzászóláshoz jelentkezz be

Hozzászólások beltöltése...

Közösség

Bankkártyás fizetés: OTP Simple Pay Bankkártyás fizetési szolgáltató

Díjak

AZ ÉV HONLAPJAMINŐSÉGIDÍJ

Az oldalon közölt anyagok szerzői jogvédelem alatt állnak. Copyright © 1991-2024 Horváth Loránd, MegaByte.hu