PDA

Visualizza la versione completa : [C++] dimensione oggetto di una classe modificabile dall'utente


Raffaelee
30-10-2017, 18:13
ciao a tutti.
sto preparando un progetto per un esame e mi ritrovo a non risolvere un problema.
ho dichiarato un oggetto di una classe con una dimensione, solo che questa dimensione all'inizio l'ho definita come costante, ma devo farla inserire dall'utente.
purtroppo non ho molta padronanza con le classi e gli oggetti quindi ogni mia modifica non risolve nulla. qualcuno può darmi un consiglio per favore?

il codice in parte è questo:

#include <iostream>
#include <cstring>
#include <fstream>
int const n=20;
using namespace std;


class archivio
{
public:
archivio ();
char nome[20];
int voto;
void caricamento();
void stampa();
int ordina(int );
void ordina();
void maxmin();
void media();
};archivio persona[n];


int main()
{
ofstream out1("archivio laureati.xls", ios::out);
int scelta;
do
{


cout<<"scegli l'operazione da effettuare: \n"<<endl;
cout<<"1=caricamento"<<endl;
cout<<"2=stampa"<<endl;
cout<<"3=ordina in modo crescente in base al voto ottenuto"<<endl;
cout<<"4=ordina in modo alfabetico in base al nome"<<endl;
cout<<"5=visualizza il voto massimo e il voto minimo"<<endl;
cout<<"6=media dei voti"<<endl;
cout<<"7=nessuno \n"<<endl;
cin>>scelta;
cout<<"\n"<<endl;
switch(scelta)
{
case 1: persona[n].caricamento();
break;
case 2: persona[n].stampa();
cout<<endl;
break;
case 3: persona[n].ordina(persona[n].voto);
out1<<"ordine in base al voto: \n"<<endl;
for(int z=0; z<n; z++)
{
cout<<"\t"<<persona[z].nome<<"\t"<<persona[z].voto<<endl;
out1<<persona[z].nome<<"\t"<<persona[z].voto<<endl;
}
out1.close();
cout<<"\n"<<endl;
break;
case 4: persona[n].ordina();
cout<<endl;
break;
case 5: persona[n].maxmin();
cout<<endl;
break;
case 6: persona[n].media();
cout<<endl;
break;
}
}
while(scelta!=7);
out1.close();
return 0;
}

grazie per l'attenzione.

oregon
30-10-2017, 19:57
Devi usare i tag CODE e non i tag QUOTE per il codice altrimenti non si capisce.

E poi devi chiarire a cosa ti riferisci perché non è chiaro.

Raffaelee
30-10-2017, 20:19
#include <iostream>#include <cstring>
#include <fstream>
int const n=100;
using namespace std;


class archivio
{
public:
archivio ();
char nome[20];
int voto;
void caricamento();
void stampa();
int ordina(int );
void ordina();
void maxmin();
void media();
};archivio persona[n];

int main()
{
ofstream out1("archivio laureati.xls", ios::out);
int scelta;
do
{



cout<<"scegli l'operazione da effettuare: \n"<<endl;
cout<<"1=caricamento"<<endl;
cout<<"2=stampa"<<endl;
cout<<"3=ordina in modo crescente in base al voto ottenuto"<<endl;
cout<<"4=ordina in modo alfabetico in base al nome"<<endl;
cout<<"5=visualizza il voto massimo e il voto minimo"<<endl;
cout<<"6=media dei voti"<<endl;
cout<<"7=nessuno \n"<<endl;
cin>>scelta;
cout<<"\n"<<endl;
switch(scelta)
{

case 1:persona[n].caricamento();
break;
case 2:persona[n].stampa();
cout<<endl;
break;
case 3:persona[n].ordina(persona[n].voto);
out1<<"ordine in base al voto: \n"<<endl;
for(int z=0; z<n; z++)
{
cout<<"\t"<<persona[z].nome<<"\t"<<persona[z].voto<<endl;
out1<<persona[z].nome<<"\t"<<persona[z].voto<<endl;
}
out1.close();
cout<<"\n"<<endl;
break;
case 4:persona[n].ordina();
cout<<endl;
break;
case 5:persona[n].maxmin();
cout<<endl;
break;
case 6:persona[n].media();
cout<<endl;
break;
}
}
while(scelta!=7);
out1.close();
return 0;
}

oregon
31-10-2017, 08:38
Usa la new e la delete

Raffaelee
31-10-2017, 10:34
si ci sto provando solo che non so usarli molto bene e mi da molti errori perché dovrei fare molte modifiche al programma che non riesco a fare.. speravo in una soluzione un pò brutta da vedere ma funzionale..

Raffaelee
31-10-2017, 11:17
ho fatto in questo modo, solo che ho due problemi:
1- non mantiene i dati inseriti ma solo l'ultimo
2- nel case 3 devo passare la variabile voto in modo da poter fare l'overloading della funzione ordina.. non so come passarlo ora.(se riuscissi a risolvere il primo problema non ci perdo molto la testa e tolgo l'overloading, ho l'esame di informatica la settimana prossima:bhò:)


#include <iostream>#include <cstring>
#include <fstream>


using namespace std;
class persona
{
public:
char nome[20];
int voto;
};
class archivio
{
public: archivio(int n)
{
p=new persona[n]();
};
persona *p;
void caricamento(int );
void stampa(int);
int ordina(int );
void ordina();
void maxmin();
void media();
};


int main()
{
int n;
archivio *a=new archivio(n);
cout<<"inserisci il numero di persone: \n"<<endl;
cin>>n;
ofstream out1("archivio laureati.xls", ios::out);
int scelta;
do
{
cout<<"scegli l'operazione da effettuare: \n"<<endl;
cout<<"1=caricamento"<<endl;
cout<<"2=stampa"<<endl;
cout<<"3=ordina in modo crescente in base al voto ottenuto"<<endl;
cout<<"4=ordina in modo alfabetico in base al nome"<<endl;
cout<<"5=visualizza il voto massimo e il voto minimo"<<endl;
cout<<"6=media dei voti"<<endl;
cout<<"7=nessuno \n"<<endl;
cin>>scelta;
cout<<"\n"<<endl;
switch(scelta)
{
case 1:(*a).caricamento(n);
break;
case 2:(*a).stampa(n);
cout<<endl;
break;
/*case 3:(*a).ordina(a->p[n].voto);
out1<<"ordine in base al voto: \n"<<endl;
for(int z=0; z<n; z++)
{
cout<<"\t"<<a->p[n].nome<<"\t"<<a->p[n].voto<<endl;*/
/*out1<<persona[z].nome<<"\t"<<persona[z].voto<<endl;*/
/*}
out1.close();
cout<<"\n"<<endl;
break;
case 4:(*a).ordina();
cout<<endl;
break;
case 5: (*a).maxmin();
cout<<endl;
break;
case 6:(*a).media();
cout<<endl;
break;*/
}
}
while(scelta!=7);
out1.close();
return 0;
}




void archivio::caricamento(int n)
{
ofstream out1("archivio laureati.xls", ios::app);
out1<<"i dati inseriti sono: \n"<<endl;
for(int i=0; i<n; i++)
{
cout<<"inserisci il nome: \n";
cin>>p[n].nome;
cout<<"inserisci il voto \n";
cin>>p[n].voto;
/*out1<<persona[i].nome<<"\t"<<persona[i].voto<<endl;*/
}


out1.close();
}


void archivio::stampa(int n)
{
cout<<"i dati inseriti sono: \n"<<endl;
for(int i=0; i<n; i++)
{
cout<<i<<"\t..."<<p[n].nome<<"\t"<<p[n].voto<<endl;
}
}

oregon
31-10-2017, 11:28
Ho visto il codice un po' di fretta ma noto che fai la new prima di chiedere il valore di n. Che senso ha?

Prima chiedi quanti sono gli studenti e poi lo passi alla classe ...

Raffaelee
31-10-2017, 11:38
è vero, ma il problema persiste anche cambiando l'ordine.. se inserisco per esempio 3 dati (nome, voto) quando vado a stamparli mi stampa tutti e tre i campi creati con l'ultimo dato inserito.

oregon
31-10-2017, 11:54
è vero, ma il problema persiste anche cambiando l'ordine.. se inserisco per esempio 3 dati (nome, voto) quando vado a stamparli mi stampa tutti e tre i campi creati con l'ultimo dato inserito.

Se nei cicli usi p[n] al posto di p[i] è ovvio ...

Raffaelee
31-10-2017, 12:03
caspitaaa è verooo.... l'avrò modificato per provare alcune cose e non l'ho più notato!!!
che bello funziona perfettamente!!
ora cerco di risolvere l'overloading...
grazie mille, se passo l'esame è grazie a te:)

Loading