Mi a baj ezzel a kóddal (C++)?
Arra írtam, hogy ha tantárgyakat adnak meg, majd a jegyeiket, akkor kiírja az átlagot, és az össz. átlagot(, majd aztán a legjobbat, de azt már töröltem).
4-5 órája ezzel vacakolok, eleinte nem vettem észre egy súllyos hibát, majd aztán még alakítgattam, de nem működik...
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
#define max_subject 15 // maximums tantárgy és (alatta) jegymennyiség
#define max_marks 30
class subject // Osztály deklaráció:
{
public:
subject(): how_many_marks(0),average(0) {}
~subject() {}
void set_name(string); // beállítja az adott tantárgy nevét
string get_name(); // visszaadja a tantárgy nevét
void set_mark(int,int); // jegyeket állítja be
int get_marks(); // kiírja a megadott jegyeket
float get_average(); // megadja a jegyek átlagát
float get_average2(); // szimplán visszaadja az átlag értékét
int get_mn();
void set_hmm();
void set_i_m();
private:
int marks[max_marks]; // jegyek -- max 30
float average; // tantárgy átlaga
string sub_name; // tantárgy neve
int how_many_marks; // jegyek mennyisége -- átlag számolást teszi átláthatóbbá
};
// Osztály függvényeinek definiálásai:
void subject::set_name(string name) // beállítja az adott tantárgy nevét
{
sub_name = name;
}
string subject::get_name() // megadja a tantárgy nevét
{
return sub_name;
}
void subject::set_mark(int i,int mark) // jegyek megadása, bevitele
{
marks[i] =mark;
//how_many_marks+=1;
}
int subject::get_marks() // kiírja a korábban megadott jegyeket
{
cout << "Megadott jegyek a "<<sub_name<<" tantárgyból: "<<endl << "\t" ;
for (int i=0;i<how_many_marks;i++)
cout << " " << marks[i] << " " ;
}
float subject::get_average() // kiszámolja az átlagot EGY tantárgynál
{
int osszeg = 0;
for (int i=0;i<how_many_marks;i++)
{
osszeg += marks[i];
}
average = osszeg / how_many_marks;
}
float subject::get_average2() // visszaadja az osztály átlag változójának értékét
{
return average;
}
int subject::get_mn()
{
return how_many_marks;
}
void subject::set_hmm()
{
int a;
for (int i=0;i<max_marks;i++)
{
a = marks[i];
if (a==0) break;
how_many_marks+=1;
}
}
void subject::set_i_m()
{
for (int i=0;i<max_marks;i++)
{
marks[i] = 0;
}
}
// Program kezdete:
int main()
{
system("cls");
string name;
int how_many_subject , a = 0;
subject subjects[max_subject];
int how_many_marks;
float averages=0;
cout << "Kerem adja meg a tantargyakat ( max 15 ; "ennyi" ha nincs tobb )\n";
for (int i=0;i<max_subject;i++) // alapértelmezés adás a jegymennyiségnek
subjects[i].set_i_m();
// Tantárgyak bekérése, tömb feltöltése:
for (int i=0;i<max_subject;i++)
{
cin >> name;
if (name=="ennyi") goto after_that;
how_many_subject = i+1;
subjects[a].set_name(name);
a++;
}
after_that:
// Korábban bekért tantárgyak felsorolása:
for (int i=0 ; i < how_many_subject ; i++)
cout << i+1 <<". tantargy: "<<subjects[i].get_name()<<endl;
cout << endl;
// Jegyek beadása:
int mark;
for (int i=0;i<how_many_subject;i++)
{
int counter = 0;
cout << "Adja meg a "<<subjects[i].get_name()<<" jegyeket (max 30 ; 0 az abbahagyashoz):\n";
for (int i=0;i<max_marks;i++)
{
cin >> mark;
cout << endl;
if (mark==0) break;
subjects[counter].set_mark(i,mark);
}
counter++;
}
for (int i=0;i<max_subject;i++) // jegyek megszámolása
subjects[i].set_hmm();
// Tantárgyanként külön kiszámolja az átlagot:
int counter3 = 0;
cout << endl << "A tantargyak atlagai sorrendben: " << endl;
for (int i=0;i<how_many_subject;i++)
{
how_many_marks= subjects[i].get_mn();
for (int i=0;i<how_many_marks;i++)
{
subjects[counter3].get_average();
cout << endl;
cout << subjects[counter3].get_average2();
averages+=subjects[counter3].get_average2();
}
++counter3;
}
cout << endl;
// Összátlag kiszámolása, kiírása:
averages /= how_many_subject;
cout << "Osszatlag: "<<averages<<endl;
char Q;cin>>Q;return 0; // Hogy ne fusson le egy villanás alatt...
}
Egyrészt átlag kiíratásnál a belső for ciklust szedd ki, mivel az a tárgyak száma helyett a legtöbb jegyet tartalmazó tárgyban lévő jegyek száma szor fut.
Jegybevitelnél nem nullázod a count tömböt, így felülír mindig, és 0-s tömböt akarsz osztani. E mellett kasztolni kell legalább egyet a két int közül, ha nem egészosztást akarsz. (És kerekíted a kerekítés vagy a tanárod szabályai szerint.) Javított kód itt van, Linux x86_64 környezetben g++ fordítóval teszteltem.
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
#define max_subject 15 // maximums tantárgy és (alatta) jegymennyiség
#define max_marks 30
class subject // Osztály deklaráció:
{
public:
subject(): how_many_marks(0),average(0) {}
~subject() {}
void set_name(string); // beállítja az adott tantárgy nevét
string get_name(); // visszaadja a tantárgy nevét
void set_mark(int,int); // jegyeket állítja be
int get_marks(); // kiírja a megadott jegyeket
float get_average(); // megadja a jegyek átlagát
float get_average2(); // szimplán visszaadja az átlag értékét
int get_mn();
void set_hmm();
void set_i_m();
private:
int marks[max_marks]; // jegyek -- max 30
float average; // tantárgy átlaga
string sub_name; // tantárgy neve
int how_many_marks; // jegyek mennyisége -- átlag számolást teszi átláthatóbbá
};
// Osztály függvényeinek definiálásai:
void subject::set_name(string name) // beállítja az adott tantárgy nevét
{
sub_name = name;
}
string subject::get_name() // megadja a tantárgy nevét
{
return sub_name;
}
void subject::set_mark(int i,int mark) // jegyek megadása, bevitele
{
marks[i] = mark;
how_many_marks++;
}
int subject::get_marks() // kiírja a korábban megadott jegyeket
{
cout << "Megadott jegyek a "<<sub_name<<" tantárgyból: "<<endl << "\t" ;
for (int i=0;i<how_many_marks;i++)
cout << " " << marks[i] << " " ;
}
float subject::get_average() // kiszámolja az átlagot EGY tantárgynál
{
int osszeg = 0;
for (int i=0;i<how_many_marks;i++) osszeg += marks[i];
average = osszeg / (float) how_many_marks;
}
float subject::get_average2() // visszaadja az osztály átlag változójának értékét
{
if (average == 0) get_average();
return average;
}
int subject::get_mn()
{
return how_many_marks;
}
void subject::set_hmm()
{
int a;
for (int i=0;i<max_marks;i++)
{
a = marks[i];
if (a==0) break;
how_many_marks+=1;
}
}
void subject::set_i_m()
{
for (int i=0;i<max_marks;i++)
{
marks[i] = 0;
}
}
// Program kezdete:
int main()
{
system("cls");
string name;
int how_many_subject , a = 0;
subject subjects[max_subject];
int how_many_marks;
float averages=0;
cout << "Kerem adja meg a tantargyakat ( max 15 ; \"ennyi\" ha nincs tobb )\n";
for (int i=0;i<max_subject;i++) // alapértelmezés adás a jegymennyiségnek
subjects[i].set_i_m();
// Tantárgyak bekérése, tömb feltöltése:
for (int i=0;i<max_subject;i++)
{
cin >> name;
if (name=="ennyi") break;
how_many_subject = i+1;
subjects[a].set_name(name);
a++;
}
// Korábban bekért tantárgyak felsorolása:
for (int i=0 ; i < how_many_subject ; i++)
cout << i+1 <<". tantargy: "<<subjects[i].get_name()<<endl;
cout << endl;
// Jegyek beadása:
int mark;
for (int i=0;i<how_many_subject;i++)
{
cout << "Adja meg a "<<subjects[i].get_name()<<" jegyeket (max 30 ; 0 az abbahagyashoz):\n";
for (int j=0;j<max_marks;j++)
{
cin >> mark;
cout << endl;
if (mark==0) break;
subjects[i].set_mark(j,mark);
}
}
// Tantárgyanként külön kiszámolja az átlagot:
int counter3 = 0;
cout << endl << "A tantargyak atlagai: " << endl;
for (int i=0;i<how_many_subject;i++)
{
how_many_marks= subjects[i].get_mn();
subjects[i].get_average();
cout << endl;
cout << subjects[i].get_name() << ": " << subjects[i].get_average2();
averages+=subjects[i].get_average2();
}
cout << endl;
// Összátlag kiszámolása, kiírása:
averages /= how_many_subject;
cout << "Osszatlag: "<<averages<<endl;
char Q;cin>>Q;return 0; // Hogy ne fusson le egy villanás alatt...
}
Értem. Össze is hasonlítottam a két kódot, hogy teljesen átlássam.
Köszönöm a segítséget!
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!