Kezdőoldal » Számítástechnika » Programozás » C++ programozásban lenne...

C++ programozásban lenne szükségem segítségre: Statikus tömbök feladatokból a feladat?

Figyelt kérdés

Nyaralás: Egy N fıs baráti társaság egy nyaralás minden napján feljegyezte, hogy aznap mennyit költöttek. Készíts programot, ami meghatározza, hogy hány olyan nap volt, amikor fejenként 100 eurónál is többet költöttek.



Eddig valami ilyesmire jutottam vele:

#include <iostream>


using namespace std;


int main()

{

int m,n;

int koltes[1000];


// Beolvasás


do

{

cout << "Hanyan vettek reszt a kirandulason?" << endl;

cin >> m;

}

while (m<=0);


do

{

cout << "Hany napig tartott a kirandulas?" << endl;

cin >> n;

}

while (n<=0);


for (int i=1;i<=n;i++)

do

{

cout << "Mennyit koltottek a(z)" << i <<". napon?";

cin >> koltes[i];

}

while (koltes[i]<=0);

}


// Feldolgozás

int atlag=0;

int i;

while (i=1;i<n;i++)

{atlag =float (koltes[i])/m;

if (atlag>100)


cout << "Tulkoltekeztek." << endl;


}

return 0;

}


Előre is köszi, ha valaki tud segíteni!


2012. márc. 17. 22:50
 1/7 anonim ***** válasza:

Felvettél egy 1000 méretű statikus tömböt, inkább dinamikus tömböt lenne elegáns használni. Ha 1000-nél kevesebb értéket kell tárolni akkor felesleges 1000-et lefoglalni, mi van akkor ha 1003 értéket kell tárolni?

----------------

"N fıs baráti társaság egy nyaralás minden napján feljegyezte, hogy aznap mennyit költöttek"

Értelem szerűen nem azt jegyezte fel mindenki hogy összesen mennyit költöttek hanem fejenként, feltehetően mindenki a sajátját. Nem látom a kódban ezt.

Ha m=3 (ahol m-be tárolod a tagok számát)

Ha az 1. fő 3 eurót, 2. fő 1 eurót, 3. fő 304 eurót költött akkor az átlag=103 és mégsem igaz hogy mindenki többet költött 100 eurónál, vagyis feletsük el azt az átlagot, nem az volt a feladat.

Vagyis naponként és ezen belül fejenként kell eltárolni az értékeket. Képzeletben egy (pl excel) táblázat. Megsúgom, hogy 2 dimenziós tömböt kell használni.

2012. márc. 17. 23:50
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:
Azt mondták órán, hogy az átlagnál figyeljünk a float-ra, ezért gondoltam, hogy így kell.
2012. márc. 18. 00:23
 3/7 anonim ***** válasza:

Ha a feladat az, hogy ...fejenként ÁTLAGBA 100 eurónál is többet költöttek, akkor átlaggal kell tényleg és elegendő ez esetben naponként az összköltést tárolni. Nem vagyok gondolat olvasó én csak arra a kérdésre válaszoltam amit írtál, lehet hogy aki a feladatot kitalálta ő is így gondolta hogy átlaggal kell, de ez esetben nem jól folgalmazott vagy te nem jól írtad le, egy szó kimaradt.

-------------------------------------------------------

Akkor maradjunk az átlagnál ha azt mondták. Az atlag változó ne int hanem float legyen, mert különben semmit nem ér hogy floatként osztasz és csak int-ként tárolod el az osztás eredményét.


"while (m<=0)" Itt az m=0-t is megengeded, az "szép" kis futási hiba lesz ha aztán meg 0-val próbálsz osztani. m=1-re már nem lép fel ez a hiba, de egy baráti társaság minimum 2 fő szerintem.


"while (n<=0)" Itt is megengeded a 0-t ... ha már ellenőrzöd akkor felső határt is illik belerakni, hogy ne lehessen nagyobb az értéke mint a lefoglalt tömb utolsó elemének indexe.

Mellesleg a tömb legelső eleme a 0-ik elem, mert a tömb indexelés 0-tól kezdődik, a te esetedben 0-tól 999-ig (ami pont 1000 db elem). Te 1-től indexeled, ez nem hiba, nem kötelező használni a 0-ik elemet, de tisztában kell lenni ezzel.

Mi az hogy "while (i=1;i<n;i++)"?

"if (atlag>100)" Itt kéne számolni, hogy ... kvázi egy számlálót növelni, vagyis egy int változót számlálónak használni, 0-ra inicializálni majd mindig amikor a feltétel igaz növelni 1-el.

2012. márc. 18. 11:55
Hasznos számodra ez a válasz?
 4/7 A kérdező kommentje:

Köszi a segítséget! Végül erre jutottam: #include <iostream>


using namespace std;


int main()

{

int n;

int hossz;


do

{

cout << "Hany napig tartott a kirandulas?" << endl;

cin >> hossz;

}

while (hossz<=0);


int osszeg[hossz];



do

{

cout << "Hanyan vettek reszt a kirandulason?" << endl;

cin >> n;

}

while (n<=0);


for (int i=0;i<hossz;i++)

{

do

{ cout << "Mennyit koltottek a(z) " << i+1 << ". napon?";

cin >> osszeg[i];

}


while (osszeg[i]<0);

}

int napok=0;

for (int i=0;i<hossz;i++)

{

if ((float (osszeg[i])/100)>=n)

napok=napok+1;


}



cout << napok << endl;

return 0;

}

2012. márc. 18. 17:41
 5/7 anonim ***** válasza:

Ez már sokkal jobb, ezt elfogadnám a tanár helyébe.

Azért hozzátennék egy-két dolgot ha már megkérdezted.

"((float (osszeg[i])/100)>=n) " Miért rendezted át? Az összeget osztotod 100-al és nem n-el, ugyan azt kapod így is, kivéve ha n=0, de ez nem lehet mert úgy írtad meg hogy ez ne lehessen. Akkor én tovább gondoltam, ha mindkét oldalt átszorzod 100-al akkor nem is kell osztani, jobb oldalt 100*n lesz amit minden elemnél újraszámol a gép, ezt el lehetne tárolni egy változóba így elég 1x kiszámolni, így nincs se szorzás se osztás a ciklusba, ez gyorsabb futást eredményez, persze a mai gépeknél csak nagyon nagy tömbnél lehetne észrevenni futási idő különbséget.


Amit kifogásolni lehet hogy "int osszeg[hossz]" az ISO C++ szabvány tiltja, hogy a satikus tömb mérete előre nem ismert fordítási időbe, nem minden c++ compiler fogadná el ezt a sort, vagy legalábbis dobna egy warning-ot. Ezért (is) szokták ez esetben szabványosan dinamikusan lefogalni a tömböt new-al, de mondom ebbe nem kötnék bele a tanár helyébe csak leírtam a precíz c++ használatot.

2012. márc. 19. 12:54
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

//egyszerusitve:


#include <iostream>


using namespace std;


int main()

{

int m,n;

int i,j;

int tulkoltekezesi_napok[1000]=0;

int ar=0;

// Beolvasás


cout << "Hanyan vettek reszt a kirandulason?" << endl;

cin >> m;



cout << "Hany napig tartott a kirandulas?" << endl;

cin >> n;


for (i=1,j=1;i<=m&&j<=n;i++,j++) //egyenerteku 2 for ciklussal a j ciklus volna az i ciklusban

{

cout <<i<<". tanuló mennyit koltott a(z)" << j <<". napon?"<<endl;

cin>>ar;

if(ar>100) tulkoltekezesi_napok[i]++;

}


// kiiras


for(i=1;i<=m;i++)

cout<<i<<". tanulo "<<tulkoltekezesi_napok[i]<<" napot költekezett 100 eurónál többet\n";

return 0;

}

2014. febr. 27. 18:55
Hasznos számodra ez a válasz?
 7/7 anonim ***** válasza:

bocsi elfelejtettem

igy deklarald hogy le legyen nullázva:

int tulkoltekezesi_napok[1000]={0};

2014. febr. 27. 18:56
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!