A következő C++-kódban lenne pár kérdésem? (A feladat leírása és az általam írt kód a lent van. ) A beolvasás 2. részében mi a hiba? És a lényegi résznben mi a hiba?
(A feladatot CodeBlocksban írom)
Feladat: Leírás:
Egy iskola tanárairól tudjuk, hogy mikor milyen órát tartanak. A tanárokat, a tantárgyakat, a hét napjait, a napokon belüli órákat sorszámukkal azonosítjuk. Készíts programot, amely megadja minden napra az aznap órát tartó tanárok számát! Bemenet A standard bemenet első sorában az órák száma (1O1000), a tanárok száma a tantárgyak száma (1M100), egy tanár sorszáma (1TN) és egy nap sorszáma van (1H5), egy-egy szóközzel elválasztva. A következő sorok mindegyikében 4 egész szám van, egy-egy szóközzel elválasztva: tanár sorszám (1TSN), tanított tantárgy sorszáma (1TTSM), nap (1Nap5), óra (0Óra8). 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. Kimenet A standard kimenet első sorába meg kell adni, minden napra az aznap órát tartó tanárok számát!
Bemenet:
8 3 4 1 1
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
Kimenet:
2 3 1 0 0
#include <iostream>
using namespace std;
int main()
{
// Beolvasás
int o; // órák száma órák száma (1<=O<=1000
int n; // tanárok száma (1<=N<=100)
int m;// tantárgyak száma (1<=M<=100),
int t;// tanár sorszáma (1<=T<=N
int h; // egy nap sorszáma van (1<=H<=5)
setlocale(LC_ALL,"hun");
cout << "Hány óra van? (órák száma)" << endl;
cin >> o;
cout << " tanárok száma " << endl;
cin >> n;
cout << " tantárgyak száma " << endl;
cin >> m;
cout << " Egy tanár sorszáma " << endl;
cin >> t;
cout << " Egy nap sorszáma " << endl;
cin >> h;
cout << o << " " << n << " " << m << " " << " " << t << " " << h << endl;
int i;
int ts[i] ; // tanár sorszám (1<=TS<=N
int tts[i]; // tanított tantárgy sorszáma 1<=TS<=M
int nap[i];// nap
int ora[i];// ora
// INNENTŐL NEM MEGY Az oszlopos beolvasás
cout << "\n 2. sor beolvasása: \nTanár sorszám " << endl;
for (int i=1;i<20;i++)
{
cin >> ts[i];
}
cout << " Tanított tantárgy sorszáma " << endl;
for (int i=1;i<20;i++)
{
cin >> tts[i];
}
cout << " NAP " << endl;
for (int i=1;i<20;i++)
{
cin >> nap[i];
}
cout << " ora " << endl;
for (int i=1;i<20;i++)
{
cin >> ora[i];
}
for (int i=1;i<20;i++)
{
cout <<"A "<< ts[i] << ". tanár, a " << tts[i] << " tantárgyat, " << nap[i] << "napon, " << " " << ora[i] << " órában tartja. " << endl;
// lényegi rész:
Programozási tételek – Megszámolás
új tömbbel ?
int oratt[i]; // órát tartó tanárok száma
if (
nap[i]!=nap[i]
)
oratt[i]=oratt[i]+1;
}
return 0;
}
vagy if)(nap[i]!=nap[i])
(i++)
;
A segítséget előre is köszönöm!
Oszlopos beolvasásnak így kéne kinéznie:
for( int i = 0; i< o; i++)
{
cout<<"Add be a(z) "<<i<<". óra adatait:";
cin>>teacher>>subject>>day>>class;
}
Célszerű lenne létrehozni egy külön structot, amiben az egyes órák adatait eltárolod, és abból készítened az 'o' hosszúságú tömböt. Kinda like this:
struct ClassInfo
{
int Teacher;
int Subject;
int Day;
int Class;
}
//...
ClassInfo classes[o];
//...
for(int i=0; i<o; i++)
{
cout<<"Add be a(z) "<<i<<". óra adatait:";
cin>>classes[i].Teacher
>>classes[i].Subject
>>classes[i].Day
>>classes[i].Class;
}
És egy lábjegyzet:
int i;
int ts[i] ; // tanár sorszám (1<=TS<=N
int tts[i]; // tanított tantárgy sorszáma 1<=TS<=M
Ilyet soha ne csinálj, ne hozz létre i elemű tömböt, ha az i változónak magának még nincs érték adva. Jobb esetben nullázódik az i létrehozáskor, és 0 elemű tömböt próbálsz létrehozni, rosszabb esetben memóriaszemét marad benne, és létrehozol valami random hosszúságú tömböt, jó eséllyel tizenszázezres nagyságrendűt.
Köszi szépen zöld pacsi ment
Viszont a beolvasás majd úgy nézne ki, hogy parancssorral beolvasom a txt-t.
De ezt a Class-t még meg kell értenem mivel még nem taniltuk.
De köszi szépen
A lényegi rész akkor úgy jó lesz valahogy ahogy leírtam ?
Csak akkor számolja ha aznap nem tartott már egy órát az a tanár.
Az első kimentben pl. csak azért van 2 , hiába 4 óra volt aznap(mivel 4 órát tartott 2 tanár.)
„De ezt a Class-t még meg kell értenem, mivel még nem tanultuk.”
Szerintem jó úton vagy afelé, hogy a C++-ban jelentős szerepet játszó osztályokat összekeverd a feladatban szereplő iskolai osztályokkal. Itt még csak egy egyszerű structról van szó, amelynek történetesen van egy eleme, amelyet #1 Class névre keresztelt, de hívhatná bármi egyébnek is. Ha a struktúrákat még nem tanultátok, a struktúratömböt egyelőre helyettesítheted egy közönséges kétdimenziós tömbbel, amelyben ezeket az adatokat a tömb egy-egy sorában helyezheted el.
Igen megvan kB köszi.
De nekem egyenlőre a 2dimenziós tömb beolvasás a nem megy sajnos 😥
Amikor oszlopokat kell beolvasni kiakad a program.
„De nekem egyenlőre a 2dimenziós tömb beolvasás a nem megy sajnos 😥”
Tartok tőle, hogy nem csak ennyiről van szó, mellesleg a kétdimenziós tömböt is helyettesítheted 4 egydimenzióssal -- a programodban éppen effélével kísérletezel.
Már a feladat megfogalmazása is zavaros egy kissé. Egyrészt nálam a bekopizott kacsacsőrök ismeretlen karakterként jelennek meg, ami nem kedvez az olvashatóságnak. Másrészt úgy tűnik, ez a Nemes Tihamér verseny egyik régi feladatának lebutított változata, a kóbor apácák megtévesztése érdekében két fölösleges adattal megtoldva...
... csak éppen az értelmezést megkönnyítő táblázat maradt el.
Innentől viszont te vagy a hunyó, én nem tudom követni a szándékaidat. Gondosan beolvasod az o, n, m, t, h változókat, azután nem kezdesz velük semmit. Létrehozol 4db ismeretlen méretű tömböt (erre nemcsak a fordító figyelmeztetett, hanem #1 is a hozzászólásában), azután megpróbálod az ágasfáról leakasztott 20-as határértékig feltölteni őket, ha jól látom, abból kiindulva, hogy éppen 19 tanár van az iskolában (bár akkor sem világos, miért kell a sorszámukat külön beolvasni).
A „lényegi rész” vizsgálatát meg kutya legyek, ha értem:
if(nap[i] != nap[i]){akármi}
Vagyis a program akkor csináljon valamit, ha a tömbelem nem egyenlő saját magával. Ez mikor teljesül?
Kezdd a feladatot egy egyszerűbb részfeladat megoldásával. Először is papíron rajzold fel azt a táblázatot, amelyet be akarsz olvasni, aztán írd meg azt a programot, amellyel ezt meg is tudod csinálni. Ha meg már a gyötrelmes manuális adatbevitelre vagy szorulva, nehogy már húsz tanár adatait kelljen bevinned minden futtatáskor. Ha megoldod kettő-hárommal, az a végleges programban működni fog akárhánnyal is. Igazából ez is az a manuális bevitelnél a leginkább zavaró, de (ahogy #1 is jelezte) értelmetlen összetartozó adatokat külön ciklusokban beolvasni. Amikor mondjuk a tantárgyat kell beírni, ki a fene fog emlékezni arra, hogy ki volt a 47. tanár? Értelmesebb egyetlen cikluson belül beolvasni mindegyik tömb azonos indexű elemét. Megjegyzem, ha a feladatnak meg akarsz felelned, kötelező is így tenned, hiszen az input egyetlen szóközökkel tagolt sor, amely ezeket az adatokat tartalmazza -- ennek a megoldását egyelőre egyáltalán nem látom a programodban.
Hogyha utána ki tudod íratni a táblázatot, akkor tartasz ott, hogy vizsgálható formába rendezett adataid vannak, és elkezdhetsz töprengeni, hogy mit kezdjél velük.
Ha meg változtatsz a programon (mint nyilván az első hozzászólás után), akkor azt is közöld. A „nem megy” után írt szomorú pofinál pedig ezerszer többet ér, ha a hibaüzenetet írod ide.
Tisztul a kép. Az elején megadott óraszám minden tanár minden órájának együttes számát, tehát az összes bejegyzés számát jelentheti. Gondolom, ez helyettesít a kézi bevitelnél az eredeti feladat fájlvégéjét.
Továbbra sem világos azonban, minek megadni egyik tanár sorszámát és a hét egy bizonyos napját, amikor minden nap összes tanárának számát kell meghatározni?
Lehet, hogy ez a majdani teljes feladat előkészítésének van szánva, de az én szememben inkább valami félresikerült egyszerűsítési kísérletnek látszik, amely így csak zavarja a tisztánlátást.
Na jó, én most nem tudom, mi van, mindenesetre itt egy próbálkozás a te módszereddel, tömbökkel:
Megjegyzem, hogy semmiért nem kezeskedem, én magam nem tudok C++-ben programozni, csak amennyit a kérdésekből magamra szedek. De így talán könnyebben igazodom a kezdő szinthez, mint aki ért hozzá...
Igen igen megvan a 2d-s tömb beolvasás köszi!
ment a zöld kéz :)
kód:
cout << "\n 2. sor beolvasása: \nTanár sorszám " << endl;
for (int i=0;i<o;i++)
{
cin >> ts[i] >> tts[i] >> nap[i] >> ora[i];
}
for (int i=0;i<o;i++)
{
cout << ts[i] << " " << tts[i] << " " << nap[i] << " " << " " << ora[i] << endl;
}
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!