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.