[itk] Számítástechnika kezdőknek

C++ programozás kezdőknek - kétdimenziós tömbök

[2021. október 25.] [ christo161 ]

Ebben a tananyagrészben adatok táblázatszerű tárolásáról lesz szó.

Előző tananyagrész: continue és break utasítás
Következő tananyagrész: stringek, stringműveletet

A kétdimenziós tömböket tömbök tömbjének is szokták nevezni, illetve mátrixoknak. A kétdimenziós tömböket akár táblázatokként is elképzelhetjük, amiknek van sora és oszlopa.

Példa: 5 napon keresztül napi 3 alkalommal megmértük a kültéri hőmérsékletet. Válasszuk ki minden egyes napon ezek közül a legmagasabbat (ahány nap, annyi eredmény).

Noha könnyű kiszámolni, hogy 5 * 3 = 15, így akár egy 15 elemű tömbben is elhelyezhetnénk az értékeket, de egyrészt jobb, ha a logikailag összetartozó elemeket megfelelően csoportosítjuk, másrészt azt mindenképp nyilván kell tartanunk, hogy az egy adott naphoz tartozó adatok hol kezdődnek és hol érnek véget, és ezt sokkal könnyebb megtenni egy 5 * 3-as kétdimenziós tömb használatával.
Egy 5 * 3-as kétdimenziós tömböt például egy táblázatként képzelhetünk el, melynek 5 sora, és 3 oszlopa van, és minden értékre úgy hivatkozhatunk, ha megadjuk a sorszámát és oszlopszámát.
Például így hivatkozhatunk egy 5 * 3-as kétdimenziós tömb (nevezzük mondjuk homerseklet-nek): első elemére  homerseklet[0][0], és az utolsó elemére: homerseklet[4][2].

A tömbökhöz hasonlóan a kétdimenziós tömbök elemeit szintén for ciklussal érdemes bejárni, azzal a különbséggel, hogy a kétdimenziós tömbök esetén két egymásba ágyazott for ciklus szükséges a bejáráshoz. A külső for ciklus számolja a sorokat (és az i ciklusváltozó tartalmazza az aktuális sor számát), a belső for ciklus pedig az oszlopokat számolja (a j ciklusváltozó tartalmazza az aktuális oszlop számát).

Ebben a példában a sorok száma megegyezik a napok számával (a 0 indexű oszlop az első nap), az oszlopok száma pedig egy adott napon mért értékek számával (a homerseklet[0][0] elem az első napon mért első érték).

A kétdimenziós tömböt az egyszerűség kedvéért (0 és 40 közti) random értékekkel töltjük fel, és ahogy egy elem megkapta az értékét, azt ki is íratjuk. Célszerű persze az értékek elé kiíratni, hogy hanyadik napon mért értékekről van szó.
Az egyes értékek persze lehet, hogy egymástól nagyon eltérőek lesznek (pl. egy napon akár kijöhet 0, 40 és 0 érték), de ettől most eltekintünk.

A legnagyobb érték tárolására létrehozunk egy változót, amit mondjuk elnevezhetünk max-nak. A legnagyobb értékek megkeresése természetesen újabb két egymásba ágyazott ciklust igényel.
Az egyes napokon mért értékeket úgy dolgozzuk fel, hogy először értékül adjuk az adott napon mért első értéket a max változónak, majd ezt összehasonlítjuk a további két értékkel. Ha azok közül valamelyik nagyobb nála (a max változónál), akkor a nagyobb értéket adjuk értékül a max változónak.

A külső for ciklus (i) egyes lépései jelentik az egyes napok feldolgozását, másképp fogalmazva a külső for ciklus egy adott lépését követően feldolgozottnak tekinthetjük az adott napot (sort), így a külső for ciklus utolsó utasításaként íratjuk ki az aktuális napra vonatkozó legnagyobb értéket (akár el is tárolhatnánk, és akkor 3 db. max változó kellene).

Kétdimenziós tömbök sorainak számát szokás m-mel, oszlopainak számát pedig n-nel jelölni.

#include <iostream>
#include <random>

int main() {

  std::random_device rnd_device;
  std::mt19937 rnd_generator(rnd_device());
  std::uniform_int_distribution<int> int_dist(1,40);

  const int sor = 5; //napok szama
  const int oszlop = 3; //egy nap vegzett meresek szama
  double homerseklet[sor][oszlop];
//ketdimenzios tomb feltoltese random ertekekkel (0 es 40 kozott), elemek kiiratasa for (int i = 0; i < sor; i++) { std::cout << "A(z) " << i+1 << ". napon mert ertekek: "; for (int j = 0; j < oszlop; j++) { homerseklet[i][j] = int_dist(rnd_generator); std::cout << homerseklet[i][j] << " "; } std::cout.put('\n'); } //legnagyobb ertekek megkeresese (5 ertek), kiiratasa int max; for (int i = 0; i < sor; i++) { max = homerseklet[i][0]; for (int j = 1; j < oszlop; j++) { if (max < homerseklet[i][j]) { max = homerseklet[i][j]; } } std::cout << "A(z) " << i+1 << ". napon mert legnagyobb homerseklet: " << max << '\n'; } }

Ebben a tananyagban nem foglalkozunk változó oszlopszámú kétdimenziós tömbökkel (angolul jagged array). Ezeket például tömbök és mutatók (pointerek) segítségével lehet megvalósítani.

Előző tananyagrész: continue és break utasítás
Következő tananyagrész: stringek, stringműveletet

A bejegyzés trackback címe:

https://itkezdoknek.blog.hu/api/trackback/id/tr5916734672

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása