C++ kiakad "nagy" számoktól, mint pl 2000?
Évfolyam zh-ra gyakorlok és belefutottam ebbe a problémába, hogy ha a programot tesztelésnél teleírom olyan számokkal, mint 2-3-4-5 stb, akkor tökéletesen lefut, azonban ha mondjuk valahova 2000-et írok, az már nagy neki és nem fut le a program. Olyan feladatok, ahol meg kell adni, hogy hányféle különböző adat lett megadva. Ha az ezt vizsgáló részt kiszedem a programból, akkor tökéletesen lefut nagy számokkal is. Ami felettébb érdekes, hogy több ilyen feladatot megírtam már, az első ilyennél egyik haverom segítségét kértem, sikerült is megírni egy ilyen feladatot, azonban akármikor máskor megpróbáltam ilyen feladatot megoldani az alapján, ez történik, hogy lefagy. Megírtam "kicsiben" is ezt a programrészt, ugyanúgy lefagy, ha 2000-et írok be. Mi lehet a gond? Ti találkoztatok már ilyennel? Még annyi, hátha segít, hogy Code::Blocks-ot használok, 16.01 és GNU CCC compiler.
Spórolás végett az int main() előtti meg return 0; utáni dolgokat nem másoltam be.
int n;
cerr<<"n= ";
cin>>n;
int tomb[100],hanyfele;
bool vizsgal[100];
for (int i=0;i<n;i++)
{
vizsgal[i]=false;
cerr<<i+1<<". elem= ";
cin>>tomb[i];
}
hanyfele=0;
for (int i=0;i<n;i++)
{
if (vizsgal[tomb[i]-1]==false)
{
vizsgal[tomb[i]-1]=true;
hanyfele++;
}
}
cout<<hanyfele<<endl;
Azért azt jegyezzük meg, hogy 3-4 hónap alatt senkiből sem lesz programozó zseni. Én örülök, hogy egyenlőre eddig eljutottam!
#8-as, az akar lenni. Akkor hogy kéne megírni, hogy ne legyen borzasztó?
Ha csak a minimális változtatásokat nézzük - e helyett:
int tomb[100], hanyfele;
bool vizsgal[100];
ez kell:
int tomb[n], hanyfele;
bool vizsgal[n];
ugyanis az n értéke határozza meg az elemszámot, e szerint kell a tömb méretét beállítani.
Mondjuk tényleg nem a legszebb megoldás a tömb egyedi elemeinek megszámolására, de ha nem használhatsz láncolt listát vagy vektort az egyedi elemek tárolására (és nem akarsz még külön végigiterálni a tömbön se), akkor ez is megteszi. ;)
1. Ne írj a cerr-re felhasználói üzeneteket.
2. Ne használj magyar változóneveket.
3. Ha logikai vizsgálatot csinálsz nem kell az '== true' és '== false'.
4. Háromféle megoldás jut eszembe hirtelen, ha mindenképpen tömböket kell használni.
4a. Egy logikai tömb, ami akkora, mint a megengedett legnagyobb elem ( + 1). Ezt kezdetben csupa false-ra inicializálod, majd minden bekérésnél bebillented igazra az adott indexű elemet, a végén pedig megszámolod az igaz elemeket. Nincs szükség a bekért számok tárolására.
4b. Int tömböt használsz és megjegyzed, hogy kezdetben 0 elemszámod van. Minden egyes bekért számnál megnézed, hogy tartalmazza-e már az adott tömb számot, ha nem akkor belerakod és növeled az elemek számát eggyel. A végén az elemszám megadja a különböző elemek számák.
4c. Bekéred az összes elemet, rendezed a tömböt és megszámolod az elemek változását.
Te az a, és b, megoldás valamilyen furcsa kombinációját próbáltad használni, aminek nem sok értelme van.
"int tomb[n], hanyfele;
bool vizsgal[n]; "
Csakhogy ilyen nincs C++-ban.
13-as b megoldása nagyjából:
http://pastie(dot)org/10986518
Ha nekem írtad az előző választ, azt sajnálom, mert ezek szerint programozó zseninek kell lenni, hogy rájöjjünk, egy 100 elemű tömbbe nem fér 2000 elem.
Ráadásul most látom, az se tök legit, amit én írtam a vector indexelő operátoráról..
#16: Azt a programozói zsenit úgy általánosságban írtam, nem csak neked. Próbáltam magam védeni a tudatlanságom miatt. :D
#13: Az 'a' megoldást sikerült megírnom, köszönöm szépen a segítséget! Még annyit szeretnék kérdezni, hogy az első kettő pontot eltudnád mondani, hogy miért?
A másodikat még csak csak megtudom érteni, de kíváncsi volnék, hogy te miért mondod ezt.
Az elsőre viszont én azt tudom mondani, hogy pl a bíró, amit mi használunk, az a cout-ot látja, de a cerr-t nem. Ezáltal a cerr-el tudok magamnak futáskor ellenőrzésképp kiírni eredményekhez, hogy az minek az eredménye vagy hogy mit kérek be, mert a cerr-t nem látja a bíró. Ha cout-ba írok be bármi extrát, akkor a bíró szerint már szar az egész programom, mert az eredmények el vannak csúszva egy kiírással és 0 pont.
"A másodikat még csak csak megtudom érteni, de kíváncsi volnék, hogy te miért mondod ezt."
A #13-as hozzászólás 2. pontjának akkor van értelme, ha például nemzetközi projekten dolgozol, vagy nemzetközi szinten osztod meg a kódodat - egy hanyfele-t nem fog megérteni egy külföldi programozó. ;)
A szabvány ugyanis nem írja elő, hogy nem használhatsz magyar nyelvű - de ékezetek nélküli! - változóneveket.
Ha érdekel itt egy megvalósitás:
int i, j;
int darab;
int hanyfele;
int *tomb;
cout << "darab= ";
cin >> darab;
tomb = new int[darab];
hanyfele = 0;
for( i = 0; i < darab; i++ ) {
cout << i + 1 << ". elem= ";
cin >> tomb[i];
j = 0;
while( j < i && tomb[i] != tomb[j] ) // lecsekkoljuk van-e mar ilyen
j++;
if ( j == i ) { // ha nincs, noveljuk
hanyfele++;
}
}
cout << "eredmeny: " << hanyfele << endl;
//delete[] tomb; // ha mar nem kell a tomb
A 'tomb' feltöltödik az összes számmal, de csak akkor növeli a 'hanyfele' értékét, ha nincs olyan még a tömben.
Miért jó ez a megoldás?
1. Ha szeretnél még ezekkel a számokkal dolgozni a késöbbi programkódodban, akkor meglesz az összes.
2. Nem kell létre hoznod feleslegesen 2 millió nagyságú tömböt csak azért, hogy be tudd indexelni vele a másik tömböt. Felesleges memória területeket ne használjunk már :D
3. A tömböd dinamikus méretű lesz.
Annyit hozzá teszek még, hogy elfogadná a:
int tomb[darab];
sort is, csak szerintem nem szép dolog a 'dinamikus' méretű tömböket a stackben tárolni.
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!