Ok adesso funzione... non pensavo che creare un nuovo array con new fosse così rognoso
Ma la cosa curiosa che non mi so spiegare è che se prendiamo in considerazione il primo codice da me inviato ovvero:
int n=0, cont=0;
float s=0.0;
studente* vet=nullptr;
studente* newvet=nullptr;
cout<<"Inserire il numero di studenti da catalogare: ";
cin>>n;
vet=new studente[n];
if(vet==nullptr){
cout<<"Impossibile allocare memoria."<<endl;
return -1;
}
procedura(input, vet, n);
procedura(print, vet, n);
cout<<"Il reddito maggiore e': "<<operazione(maxredd, vet, n)<<endl;
cout<<"Il reddito minore e': "<<operazione(minredd, vet, n)<<endl;
cout<<"--------------------------"<<endl;
cout<<"Inseire il reddito soglia: ";
cin>>s;
newvet=new studente[cont];
if(newvet==nullptr){
cout<<"Impossibile allocare memoria."<<endl;
return -1;
}
cout<<"Gli studenti con il reddito maggiore alla soglia sono: "<<endl;
creaElenco(vet, newvet, n, s, cont);
print1(newvet, cont);
delete []vet;
delete []newvet;
cout<<"fine programma."<<endl;
return 0;
Codice: Seleziona tutto
class studente{
private:
char cognome[20];
char nome[20];
int matricola;
float reddito;
public:
studente();
void assegna(char*, char*, int, float);
void stampa();
friend float maxredd(studente *vet, int);
friend float minredd(studente *vet, int);
friend float operazione(float(*pfun)(studente *vet, int), studente *vet, int n);
friend void creaElenco(studente* vet, studente* newvet, int n, float &s, int &cont);
};
void input(studente *vet, int);
void print(studente*, int);
void procedura(void(*p)(studente *vet, int), studente *vet, int n);
float maxredd(studente *vet, int);
float minredd(studente *vet, int);
void creaElenco(studente *vet, studente *newvet, int n, float &s, int &cont);
void print1(studente *newvet, int cont);
Codice: Seleziona tutto
studente::studente(){
strcpy(cognome, " ");
strcpy(nome, " ");
matricola=0;
reddito=0.0;
}
void studente::assegna(char *co, char* no, int mat, float red){
strcpy(cognome, co);
strcpy(nome, no);
matricola=mat;
reddito=red;
}
void studente::stampa(){
cout<<"Cognome: "<<cognome<<endl;
cout<<"Nome: "<<nome<<endl;
cout<<"Matricola: "<<matricola<<endl;
cout<<"Reddito: "<<reddito<<endl;
cout<<"-----------------------"<<endl;
}
void input(studente* vet, int n){
for(int i=0; i<n; i++){
char cognome[20], nome [20];
int matricola;
float reddito;
cin.ignore();
cout<<"Inserire il cognome dello studente: ";
cin.getline(cognome, 20);
cout<<"Inserire il nome: ";
cin.getline(nome, 20);
cout<<"Inserire la matricola: ";
cin>>matricola;
cout<<"Inserire il reddito: ";
cin>>reddito;
(vet+i)->assegna(cognome, nome, matricola, reddito);
cout<<"---------------------------------------"<<endl;
}
}
void print(studente* vet, int n){
for(int i=0; i<n; i++){
(vet+i)->stampa();
}
}
float maxredd(studente *vet, int n){
float max=(vet+0)->reddito;
for(int i=0; i<n; i++){
if((vet+i)->reddito>max){
max=(vet+i)->reddito;
}
}
return max;
}
float minredd(studente *vet, int n){
float min=(vet+0)->reddito;
for(int i=0; i<n; i++){
if((vet+i)->reddito<=min){
min=(vet+i)->reddito;
}
}
return min;
}
float operazione(float(*pfun)(studente *vet, int), studente *vet, int n){
float z=0.0;
z=(*pfun)(vet, n);
return z;
}
void procedura(void(*p)(studente *vet, int), studente *vet, int n){
(*p)(vet, n);
}
void creaElenco(studente* vet, studente* newvet, int n, float &s, int &cont){
for(int i=0; i<n; i++){
if((vet+i)->reddito>s){
*(newvet+cont)=*(vet+i);
cont++;
}
}
}
void print1(studente* newvet, int c){
for(int i=0; i<c; i++){
(newvet+i)->stampa();
}
}
se lo eseguo sul pc portatile (con ubuntu) funziona tutto liscio come l'olio.... Ora sbagliato per sbagliato perche il pc fisso (che è anche più recente e potente del portatile) crasha, invece il portatili esegue tutto alla perfezione??
Se avessi sviluppato il programma direttamente solo nel portatile, non mi sarei mai accorto degli errori.