Kezdőoldal » Számítástechnika » Programozás » Mi a baj ezzel a kóddal (C++)?

Mi a baj ezzel a kóddal (C++)?

Figyelt kérdés

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...

}


2013. dec. 31. 20:59
 1/3 anonim ***** válasza:
Unexpected ;, unexpected ". Ezeket a karaktereket légyszi szöktesd. (\; ill. \")
2013. dec. 31. 21:29
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

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...

}

2013. dec. 31. 22:27
Hasznos számodra ez a válasz?
 3/3 A kérdező kommentje:

Értem. Össze is hasonlítottam a két kódot, hogy teljesen átlássam.

Köszönöm a segítséget!

2013. dec. 31. 23:40

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!