Csináltam C++-ban egy kezdő programot ami kiszámol egy osztály átlagát, de valami baj van (lent) Mi lehet a baj?
13fős osztály (iskolai osztály)
#include <iostream>
using namespace std;
int main()
{
int a[13],atlag=0,i=0;
while(i<13){
cout<<"Az "<<i+1<<". tanulo erdemjegye: "<<endl;
cin>>a[i];
i++;
}
atlag=atlag+a[i]/13;
;cout<<"Az osztaly atlaga: "<<atlag<<endl;
return 0;
}
Amikor futtatom, az átlagnak mindig 0-t ír
Az atlagszamitast egyszer vegzed el, az utolso tanulora.
Ezen kivul az atlag is egesz szam a programodban.
Emiatt hiaba kap 5-ost az egyik tanulo, 5/13=0, 0-val no az atlag 0.38 helyett.
#1: Még ha az utolsó tanulóra végezné el, de nem, ki is címez a tömbből.
Kérdező: egyébként felesleges a tömb ebben az esetben, hisz csak az aktuális értéket kell felhasználnod a cikluson belül. Az egész osztás is gond, hogy írta #1.
#include <iostream>
using namespace std;
int main() {
const int LETSZAM = 13;
int a[LETSZAM];
int i = 0;
int total = 0;
double atlag = 0;
while(i < LETSZAM) {
cout<<"Az "<<i+1<<". tanulo erdemjegye: ";
cin>>a[i];
total += a[i];
i++;
}
atlag = double(total)/LETSZAM;
cout<<"Az osztaly atlaga: "<<atlag<<endl;
return 0;
}
Nehany megjegyzes:
- Ha nem akarod kesobb visszanezni az egyes tanulok eredmenyeit, akkor folosleges tombbel szorakozni.
- Erdemes lenne kezelni azt, ha nem 1 es 5 kozotti szam a bemenet (vagy amilyen intervallumban mozognak az erdemjegyek). Mi fog egyaltalan tortenni akkor?
- Az osztalyletszamnak erdemes letrehozni egy valtozot, mivel tobb helyen elojon, aztan ha mondjuk egy masik osztalyban mar 20 tanulo van, akkor eleg lesz egy helyen atirni.
- Gyakolaskepp irhatnal egy fuggvenyt, ami mondjuk megkapja parameterkent, hogy hany tanulo van es visszaadja az atlagot.
#include <iostream>
using namespace std;
int main()
{
double atlag = 0; /* ez nem egesz szam!!! */
int osszeg = 0; /* ebben fog akkumulalodni a jegyek osszege */
int osztalyletszam = 13; /* erdemes beszelo nevet adni a valtozoknak, hogy ne keverd oket ossze, es erdemes angolul elnevezni oket a kesobbiekben */
/* maradhat a while ciklus is, csak igy jobban latszik, hogy mi micsoda */
for (int i = 1; i <= osztalyletszam; ++i) {
cout << "Az " << i << ". tanulo erdemjegye: " << endl;
int iedikErdemjegy; /* ha lehet kapni mondjuk 4.5 -os jegyet, akkor ez is legyen double */
cin >> iedikErdemjegy;
osszeg = osszeg + iedikErdemjegy;
}
atlag = (double)osszeg / osztalyletszam; /* ha ez a (double) nem lenne ott, akkor egesz szamot adna */
cout << "Az osztaly atlaga: " << atlag << endl;
system("pause");
return 0;
}
Ja meg ha van nem egesz erdemjegy, akkor az osszeg se legyen egesz.
Meg azt is megirhatned gyakorlaskent, hogy egy tombben levo szamok atlagat szamolja ki, ha mar tombozni akarsz.:D
#include <iostream>
int main()
{
const int letszam = 13;
double atlag = 0;
for(int i = 0, jegy; i < letszam && std::cin >> jegy; ++i) {
atlag += 1.0/letszam * jegy;
}
std::cout << atlag << '\n';
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!