Kezdőoldal » Számítástechnika » Programozás » Hogyan kell létrehozni ebben...

Hogyan kell létrehozni ebben a feladatban a 3 dimenziós tömböt úgy hogy jó legyen a bemenetre is (C++)?

Figyelt kérdés

A tanárok órarendjét háromdimenziós tömbben tároljuk. Az első index a tanár, a második a nap, a harmadik pedig az óra sorszáma. A tömbelem értéke adja meg a tantárgyat (számokkal reprezentálva). Ha nincs órája a tanárnak az adott napon és időpontban, azt 0-val jelezzük.


VÁLTOZÓ Órák(1…N, 1…5, 0…8) MINT Egész

Be: az Órák tömb elemeinek értéke



1. sor : órák száma, tanárok száma, a tantárgyak száma

többi sor : tanár sorszáma, a tanított tantárgy sorszáma, nap, óra

Például 3 7 2 0 azt jelenti, hogy a harmadik tanár a hetedik tantárgyat a hét második napján a nulladik órában tanítja.

Bemenet:

8 3 4

1 1 1 6

1 1 2 2

1 2 1 3

2 1 2 2

2 2 3 1

3 4 1 2

3 2 1 4

3 3 2 1


A beolvasás már megtörtént : [link]



2021. nov. 12. 21:59
 1/9 anonim ***** válasza:

Ez de nagy hülyeségnek tűnik így elsőre.


Egyébként így tudsz value értékel feltöltött x,y,z méretű 3D vectort létrehozni:

vector<vector<vector<int>>> vec vec (x,vector <int>(y,vector <int>(z,value)));

2021. nov. 12. 22:31
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

Áhh bocs.. most látom, hogy array kell neked nem vector...


int array[x][y][z];


array[0][0][0] = 6;

2021. nov. 12. 22:35
Hasznos számodra ez a válasz?
 3/9 A kérdező kommentje:
Igen ez eddig megvan, de az hogy hogyan kell beletölteni az értékeket az nincs.
2021. nov. 12. 22:41
 4/9 anonim ***** válasza:

vmi ilyesmi lesz:


int orarend[tanarok_szama][5][8]; //5 nap, minden nap 8 tanóra


int tanar,tantargy, nap, ora;


for(int i=0; i<orak_szama; i++){

cin >> tanar >> tantargy >> nap >> ora;

orarend[tanar][nap][ora] = tantargy;

}

2021. nov. 12. 22:56
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:

Miert lesz a tömb egyenlő a tantárgy változóval ?

Ezt már próbáltam egyébként de nem működik sajnos és valamikor fel kellene vennie mindenhol a 0 értéket a tömbnek.

2021. nov. 12. 23:17
 6/9 anonim ***** válasza:

A tömb nem lesz egyenlő a tantárgy változóval. A tömb cellái töltődnek fel a tantárgy kódjaival a ciklusban.


A feladatleírás alapján: "Az első index a tanár, a második a nap, a harmadik pedig az óra sorszáma."


A cella értéke pedig: "A tömbelem értéke adja meg a tantárgyat (számokkal reprezentálva)."


Más lehetőség nem nagyon van...


Képzeld el úgy a tömb ellemeit mint kis kocka dobozokat. Minden dobozba be tudsz rakni egy számot. Itt építened kell egy tanarok*5*8 méretű blokkot ezekből a kis kockákból. A hasáb minden 5*8-as szelete egy tanár hetét tárolja. Ezen belül van 5 darab 8 hosszú hasáb. Ezekben vannak az tantárgyak kódjai minden tanitási naphoz rendelve.


"Ezt már próbáltam egyébként de nem működik sajnos" - mégis miért nem működik?


"valamikor fel kellene vennie mindenhol a 0 értéket a tömbnek." - akkor inicializáld a tömböt nullákkal. Szerintem itt is cellákat értesz tömb alatt.

2021. nov. 12. 23:45
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:

Eddig jutottam : [link]


Nem értem, hogy a 4. adatot amit be kellene olvsani a tantárgyat azt hol kellene, mert a 3D tömbben csak 3 érték van.

Most felveszi elvileg a 0 értéket a tömb.


Ha most beleolvasom a tömbbe a számokat akkor nem csak a beolvasott értékek lesznek benne?


Én úgy képzelem el, hogy van a tömböm és az végig megy az összes nap összes óráján és összes tanárján és ha a a tömb értéke megegyezik a bekért értékkel, akkor átírja azt, ahol nem ott 0 marad az értéke.


Ezt szeretném megoldani, őszintén szólva nem igazán értem hogyan működik ez a beolvasás é tömbfeltöltés.

2021. nov. 13. 14:33
 8/9 anonim ***** válasza:

Sok dolgot nem gondolsz végig. A legelső megoldásod, ahol beolvasol 4 db tömbbe, bár működik, feleslegesnek tűnik. Mert utána megint végig akarsz majd menni rajtuk, hogy más adatstruktúrába (pl. a 3d tömbbe) áttöltsd az adatokat, akkor már tök mindegy lenne, ha eleve a bemenetről raknád a 3d tömbbe.


A tantárgyra semmi szükség a feladat szempontjából. Mert feltételezem ez a pár nappal ezelőtt feltett feladat még mindig, ahol a lyukas órákat kellett számolni.


Lehet a többdimenziós tömböt sem érted igazán, úgyhogy leírom.

Egy 3D tömb az egy tömb, amiben tanar_max db 2D tömb van.

Minden ilyen 2D tömb egy tömb, amiben nap_max db 1D tömb van.

Minden ilyen 1D tömb egy tömb, amiben ora_max db int van.


orarend[tanar][nap][ora] ez a tanar-adik 2D tömbnek a nap-adik 1D tömbjének az ora-adik int-je.


orarend[tanar][nap][ora] = tantargy;

"Miert lesz a tömb egyenlő a tantárgy változóval ?"

Nem a tömb lesz vele egyenlő. Egyrészt az = jel értékadást jelent, nem egyenlőséget. A tömbben egyetlen int-nek ad értéket most, a tanar-adik 2D tömbnek a nap-adik 1D tömbjének az ora-adik int-jének megváltozik az értéke a tantargy változó értékére. Na most ez a feladat szempontjából felesleges, akár orarend[tanar][nap][ora] = 1; is lehetne, mert csak a lyukas órákat kell összeszámolgatni, az 1 jelenti, hogy van óra, a 0, hogy nincs. Ekkor így nézne ki pl. az első tanár első napjának 1D tömbje: {0,0,1,0,0,1,0,0}, mert 3. és 6. órája van. Ebből lehet számítani a lyukas órákat, de okosan kell, mert lehet csak egy órája egy nap, vagy lehet 2-nél több, stb. Éppen ezért ajánlották valamelyik nap azt is, hogy ne 1D tömbök legyenek, hanem legyenek rendezett halmazban az órák számai.


Tehát lesz egy 2D tömb, ami tanar_max db 1D tömböt tartalmaz. Mindegyik 1D tömb nap_max db set-et tartalmaz. Mindegyik set int-eket tartalmaz, ugyanennél a példánál az első tanár első napján a 3-ast és a 6-ost. Ezeket sorrendben fogja tárolni a C++ set-je, mert az rendezett halmaz (ordered set). És emiatt nagyon egyszerűen ki lehet számolni belőle a lyukas órákat, le is írták pár napja: A legnagyobb_elem, a legkisebb_elem és az elemek_száma-ból.


Na most, amit te csináltál itt a legutolsó kódodban, az nagyon nem jó. Az, hogy 3 for ciklusban mész végig i,j,k szerint, és minden iterációban van egy beolvasás (cin), ezen látszik, hogy nem lesz jó, mert nem törvényszerű, hogy pont ilyen sorrendben érkezik majd a bemenet, ráadásul a lyukas órákról nem is érkezik bemenetsor. Gondold végig, 3 (i) tanár esetén 5 (j) nap és 8 (k) óra, 3*5*8=120 iteráció, 120 soros bemenet kéne. Közben a példabemenet 8 soros csak.


Ennyi lenne az egész:

for (int i=0; i<8; i++) {

cin >> tanar >> tantargy >> nap >> ora;

orarend[tanar-1][nap-1][ora-1] = tantargy;

//ki kell vonni 1-et mert 0-tól indexel a c++

}


vagy:

orarend[tanar-1][nap-1][ora-1] = 1;


vagy, ha set-tel csinálod:

orarend[tanar-1][nap-1].insert(tantargy);


Ebben a legutolsó szintaxisban nem vagyok biztos, hogy jó. A lényeg, hogy az orarend[tanar-1][nap-1] egy set, aminek meghívod az insert metódusát.

2021. nov. 14. 14:57
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:

Rosszul írtam, nem a tantargy-at kell insertelni, hanem az óra számát.

Szóval:

.insert(ora);

2021. nov. 14. 15:01
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!