Klasa zagnieżdzona c++

2012-12-16 13:57
0

Witam,
Mam za zadanie napisać klasę Student oraz zagniezdzona w niej klase Przedmiot. Mam dodatkowo również zdefiniować 2 metody dodajOcene i zmienOcene. Udało mi się napisać taki kod:

#include <iostream>
#include <cstring>
using namespace std;
class Student{
public:
char* imie;
char* nazwisko;
int wiek;
Student(){
imie="andrzej";
nazwisko="kowalski";
wiek=22;
}
class Przedmiot{
public:
char* nazwa;
double ocena;
Przedmiot(char*nazwa,double o){
this->nazwa=nazwa;
ocena=o;
}

};
Przedmiot* dodajOcene(char* nazwa,double ocena){
Przedmiot* p=new Przedmiot(nazwa,ocena);
return p;
}
void zmienOcene(Przedmiot& p,double o){
p.ocena=o;
}
};
int main ( ) {
Student s=Student();
cout<<s.imie<<s.nazwisko<<s.wiek<<endl;
Student::Przedmiot* wp=s.dodajOcene("Polski",3);
s.zmienOcene(*wp,5);
return 0 ;
} 

Czy ro rozwiązanie jest poprawne ?

Pozostało 580 znaków

2012-12-16 14:41
0

Sformatuj ten kod porządnie, to może ktoś go w ogóle przeczyta...


Pozostało 580 znaków

2012-12-16 14:56
0
#include <iostream>
#include <cstring>
using namespace std;
class Student{
public:
char* imie;
char* nazwisko;
int wiek;
Student(){
    imie="andrzej";
    nazwisko="kowalski";
    wiek=22;
    }
        class Przedmiot{
        public:
        char* nazwa;
        double ocena;
        Przedmiot(char*nazwa,double o){
            this->nazwa=nazwa;
            ocena=o;
            }
        };
Przedmiot* dodajOcene(char* nazwa,double ocena){
    Przedmiot* p=new Przedmiot(nazwa,ocena);
    return p;
}
void zmienOcene(Przedmiot& p,double o){
    p.ocena=o;
}
};
int main ( ) {
Student s=Student();
cout<<s.imie<<s.nazwisko<<s.wiek<<endl;
Student::Przedmiot* wp=s.dodajOcene("Polski",3);
s.zmienOcene(*wp,5);

return 0 ;
} 
edytowany 1x, ostatnio: cocain, 2012-12-16 14:56

Pozostało 580 znaków

2012-12-16 15:45
0
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Student{
    int checkPrzedmiot(string nazwa) {
        size_t i;
        for(i = 0; i < przedmioty.size(); i++)
            if(przedmioty[i]->getNazwa() == nazwa)
                break;
        if(i != przedmioty.size())
            return i;
        return -1;  
    }

    class Przedmiot{
        public:
            string nazwa;
            vector<double> oceny;
            Przedmiot(string nazwa){
                this->nazwa = nazwa;
            }
        string getNazwa() { return this->nazwa; }
        void addOcena(double x) { oceny.push_back(x); }
        void changeOcena(size_t index, double x) {
            if(index >= 0 && index < oceny.size())
                oceny[index] = x;
        }
        void display() {
            for(size_t i = 0; i < oceny.size(); i++)
                cout << oceny[i] << " ";
        }
        };
    vector<Przedmiot*> przedmioty;
public:
    string imie;
    string nazwisko;
    unsigned wiek;

    Student(){
            imie="andrzej";
            nazwisko="kowalski";
            wiek=22;
    }

    ~Student() {
        for(size_t i = 0; i < przedmioty.size(); i++)
            delete przedmioty[i];
        przedmioty.clear();
    }

    void dodajPrzedmiot(string nazwa) {
        for(size_t i = 0; i < przedmioty.size(); i++)
            if(przedmioty[i]->getNazwa() == nazwa)
                return;
        przedmioty.push_back(new Przedmiot(nazwa));
    }

    void dodajOcene(string nazwa,double ocena){
        if(checkPrzedmiot(nazwa) != -1)
            przedmioty[checkPrzedmiot(nazwa)]->addOcena(ocena);
    }
    void zmienOcene(string nazwa, size_t index, double ocena){
        if(checkPrzedmiot(nazwa) != -1)
            przedmioty[checkPrzedmiot(nazwa)]->changeOcena(index, ocena);
    }

    void display() {
        for(size_t i = 0; i < przedmioty.size(); i++)
            przedmioty[i]->display();
    }
};
int main ( ) {
    Student a;
    a.dodajPrzedmiot("Matematyka");
    a.dodajOcene("Matematyka", 4.17);
    a.zmienOcene("Matematyka", 0, 3);
    for(int i = 0; i < 15; i++) {
        a.dodajOcene("Matematyka", i);
    }
    a.zmienOcene("Matematyka", 7, 1000);

    a.display();
    return 0 ;
} 

Pisane na szybko.

Pozostało 580 znaków

2012-12-16 15:48
0

Tak to rozwiązanie jest poprawne. Nie rozumiem tej linijki:
Student s=Student();
wystarczy przecież napisać:
Student s;
Tworzy się nie potrzebnie obiekt tymczasowy i zostaje on skopiowany do drugiego obiektu. Chociaż nie wiem czy kompilator tego nie zoptymalizuje i nie stworzy obiektu tymczasowego.
Druga uwaga nie odnosimy się bezpośrednio do pól klasy tylko przez funkcję składowe.


Nie odpowiadam na PW z prośbą o pomoc programistyczną.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0