[C++]: esercizio con le classi - tipo Libretto Universitario

di il
10 risposte

[C++]: esercizio con le classi - tipo Libretto Universitario

Salve, il mio scopo è quello di costruire un libretto universitario di una classe, pensato in questo modo:

Vi sono un numero di studenti, poniamo 4, ed un gruppo di esami, poniamo 5.

Io vorrei che per ogni studente si potesse memorizzare il voto e la data relativa a ciascuno dei 5 esami.

Come idea costruttiva ho pensato che andrebbe creata una classe studente che contiene 5 elementi, gli esami, ma ciascuno di questi "esami" sarà a sua volta elemento della classe esame contenente quattro variabili, una per il voto e tre per gg/mm/aa dell'esame.

Vorrei innanzitutto sapere se questa idea costruttiva può funzionare.

Ho anche provato a costruire la classe esame e per ora ho scritto un programmino di questo tipo:


#include <iostream>
using namespace std;


class esame {
	public:
    int voto;
int giorno;
int mese;
int anno;
void set_values (int,int,int,int);
};
void esame::set_values (int x, int y, int z, int w)
{
voto=x;
giorno=y;
mese=z;
anno=w;
}
int main () {
 esame esame1, esame2;
  esame1.set_values (30,24,02,2014);
  esame2.set_values (28,30,01,2013);
 
  cout << "Esame 1: voto " << esame1.voto << " in data:" << esame1.giorno <<"/"<<esame1.mese<<"/"<<esame1.anno << endl;

 //cout << "Esame 2: voto " << esame2.voto <<" in data:" << esame2.data << endl;
 }
Vorrei sapere se sto procedendo bene e se potete darmi una idea di come costruire la classe studente che ha come elementi non semplici variabili ma elementi della classe esame.

Grazie per la disponibilità.

10 Risposte

  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    - Chiedo scusa per aver postato tre volte lo stesso topic, stavo ri-aggiornando la pagina e devo aver fatto casino.
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Second me va benissimo.
    dovresti mettere private i campi delle classi e poi modificarli soltanto con gli opportuni metodi.

    magari prova a inizializzare le classi anche con il costruttore e implementare un distruttore opportuno

    un esempio di class in class sul tuo modello e' questo :
    #include <iostream>
    using namespace std;
    
    
    class esame
    {
        public:
            int voto;
            int giorno;
            int mese;
            int anno;
    
            void set_values (int,int,int,int);
    };
    
    class studente
    {
        public:
    
            esame e[5];
            char nome[20];
    
            int getEsame1();
            void setEsame1(int,int,int,int);
            void setEsame1(esame);
            void setEsame1(esame,int);
    
            void setNome(const char nome[50]);
            char* getNome();
    };
    
    void esame::set_values (int x, int y, int z, int w)
    {
        voto=x;
        giorno=y;
        mese=z;
        anno=w;
    }
    
    void studente::setEsame1(int x, int y, int z, int w)
    {
        e[0].set_values(x,y,z,w);
    }
    
    int studente::getEsame1()
    {
        return e[0].voto;
    }
    
    void studente::setEsame1(esame Esame)
    {
        e[0]=Esame;
    }
    
    void studente::setEsame1(esame Esame,int num)
    {
        e[num]=Esame;
    }
    
    
    int main ()
    {
        esame e[5];
        studente s1;
    
        e[0].set_values(100,24,02,2014);
        e[1].set_values(90,24,02,2014);
        e[2].set_values(80,24,02,2014);
        e[3].set_values(70,24,02,2014);
        e[4].set_values(60,24,02,2014);
    
        s1.setEsame1(e[1],1);
    
        cout << s1.getEsame1();
    
    }
    non esitare a chiedere se hai problemi
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Innanzitutto ti ringrazio moltissimo per avermi risposto.

    Quando provo a lanciare il tuo programma ottengo 0.

    1) Ho capito che, per ciascun esame, ad esempio l'esame 0 (e[0]), posso ottenere le informazioni come: e[0].voto, e[0].giorno, e[0].mese ed e[0].anno. No?

    Per farmi stampare le quattro variabili potrei quindi fare:

    int studente::getEsame1()
    {
    return e[0].voto;
    return e[0].giorno;
    return e[0].mese;
    return e[0].anno;
    }

    E per gli altri dovrei creare altri "getEsame", tipo:

    int studente::getEsame2()
    {
    return e[1].voto;
    return e[1].giorno;
    return e[1].mese;
    return e[1].anno;
    }

    Giusto?

    2) Non riesco a capire la funzione, nel tuo codice, di:

    "void studente::setEsame1(esame Esame)
    {
    e[0]=Esame;
    }

    void studente::setEsame1(esame Esame,int num)
    {
    e[num]=Esame;
    }"

    e

    "s1.setEsame1(e[1],1);"

    3) Non riesco a capire come farmi stampare voto e data per ciascun esame.

    Chiedo scusa se sono domande banali...
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Conosci il concetto di puntatore e di allocazione dinamica della memoria? (domanda importantissima)

    Adesso vado a mangiare e poi ti dico tutto
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Sì, conosco entrambi i concetti da un punto di vista teorico, i puntatori li ho anche usati qualche volta ... non sono comunque "un esperto".
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    "void studente::setEsame1(esame Esame)
    {
    e[0]=Esame;
    }
    copia la classe Esame( nota la maiuscola) nella classe e[0], come se fossero due variabili qualunque
    void studente::setEsame1(esame Esame,int num)
    {
    e[num]=Esame;
    }"
    stessa cosa, solo che copia in e[num]

    E per gli altri dovrei creare altri "getEsame", tipo:

    int studente::getEsame2()
    {
    return e[1].voto;
    return e[1].giorno;
    return e[1].mese;
    return e[1].anno;
    }

    Giusto?
    puoi, ma sarebbe bruttissimo e dispendioso. Per evitarlo puoi scrivere una funzione che restituisce la struttura voluta tramite un indice


    COSA PIU' IMPORTANTE
    con
    return e[1].voto;
    return e[1].giorno;
    return e[1].mese;
    return e[1].anno;
    restituisci solo e[1].voto, dato che al primo return eseguito il programma esce dalla funzione.
    Per ovviare a questo puoi restituire la classe(o struttura), oppure puoi riempire una classe(o struttura) passata precedentemente come parametro per referenza

    1- return e[1]
    2- int studente::getEsame2(studente &s){
    ...salvi dati in s...
    return;
    }
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Una cosa del genere ti puo' far comodo per trasformare la data in stringa
    char *s=new char[11];
    
        int g=10,m=8,a=2014;
    
        s[0]=g/10+'0';
        s[1]=g%10+'0';
        s[2]='/';
        s[3]=m/10+'0';
        s[4]=m%10+'0';
        s[5]='/';
        s[6]=a/1000+'0';
        s[7]=a/100%10+'0';
        s[8]=a/10%10+'0';
        s[9]=a%10+'0';
        s[10]='\0';
    
        
        printf("%s", s);
        }
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Ti ringrazio per la gentilezza e disponibilità, purtroppo però ho capito poco di quello che hai detto o meglio, ho capito il senso di ciò che dici ma non saprei assolutamente farlo. :/
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Dato che il tuo problema mi sembra sia l'utilizzo dei puntatori, allora inizia con una sola classe studente che contiene una sola classe esame che contiene un solo intero. comincia a sperimentare quello che ti viene in mente e vedi cosa succede...

    (ad esempio potresti pensare come utilizzare il costruttore di studente per inizializzare la variabile di esame, o provare a scrivere un metodo per leggere il valore di esame tramite un metodo di studente...libera la fantasia e non avere paura di sbagliare! )

    Se il problema e' scrivere il codice ti consiglio di rivedere il libro(o qualunque cosa tu abbia usato per imparare cosa sono strutture, classi, metodi, ecc...) e magari utilizzare un tuo pseudocodice/la lingua italiana per esprimere i ragionamenti cosicchè possiamo aiutarti noi.

    2) Non riesco a capire la funzione, nel tuo codice, di:

    "void studente::setEsame1(esame Esame)
    {
    e[0]=Esame;
    }
    Se il problema è l' '=' tra classi allora sappi che questo operatore fa semplicemente una copia. Se il problema è "e[0]" , allora ti consiglio di rivedere i puntatori ( e di conseguenza il passaggio di variabili per referenza) in ambiti più semplici prima di usarli in questo programma.
    Se non sai usare bene i puntatori secondo me rischi solo di incasinarti di più

    ps: quel codice era solo per farti vedere come puoi scrivere una classe in un'altra, ma di certo non e' nè completo nè funzionale. Decidere come realizzare il VERO programma spetta solo a te
  • Re: [C++]: esercizio con le classi - tipo Libretto Universitario

    Ti ringrazio nuovamente per l'aiuto
Devi accedere o registrarti per scrivere nel forum
10 risposte