ansem90
18-09-2015, 12:44
salve a tutti ragazzi,ho questo programma svolto ma faccio fatica a capire alcune cose e la tipologia d'esame è molto simile tra i vari appelli.
In pratica devo costruire una classe Persona con nome e cognome,una classe derivata studente con matricola e tramite la bubblesort ordinare i nomi in base alla matricola...il tutto usando le classi.
#include<iostream>
#include<string.h>
using namespace std;
class Persona{ // inizio punto 1
private:
string Nome,Cognome;
public:
Persona(){ //definizione costruttore
Nome="";
Cognome="";
};
Persona(string name,string subname){ //funzione costruttore da definire dentro la classe
Nome=name;
Cognome=subname;
}
void insert(); //definizione funzioni
void setname(string name) {Nome=name;}
void setsubname(string subname) {Cognome=subname;}
string getname() {return Nome;}
string getsubname(){return Cognome;}
void visual();
};
void Persona::insert(){ //funzioni
string name,subname;
cout<<"inserire nome persona:"<<endl;
cin>>name;
setname(name);
cout<<"inserire cognome persona:"<<endl;
cin>>subname;
setsubname(subname);
}
void Persona::visual(){
cout<<"nome:"<<endl<<getname()<<endl;
cout<<"cognome:"<<endl<<getsubname()<<endl;
} //fine punto 1
class Studente: public Persona{ //inizio punto 2,definizione sottoclasse studente
int Matricola;
public:
Studente(){ //definizione costruttore
Matricola=0;
};
Studente(int mat){ //funzione costruttore
Matricola=mat;
}
void insertmat(); //definizione funzioni punto 2
void setmat(int mat) {Matricola=mat;}
int getmat() {return Matricola;}
void visualmat();
};
void Studente::insertmat() { //funzioni 2
int mat;
cout<<"inserire la matricola:"<<endl;
cin>>mat;
setmat(mat);
}
void Studente::visualmat(){
cout<<"matricola:"<<getmat()<<endl;
} //fine punto 2
class ListaStudenti: public Studente{ //inizio punto 4
Studente *lista; //dichiaro un puntatore lista che punta a una variabile Studente
int n;
public:
void ordina();
void visuallista();
ListaStudenti(){ //definizione costruttore lista
cout<<"inserire il numero di studenti:"<<endl;
cin>>n;
lista=new Studente[n]; //dichiaro un array di puntatori a studente (new funziona come & e restituisce un indirizzo)
for (int i=0;i<n;i++){
cout<<"inserisci studente"<<i+1<<endl;
lista[i].insert();
lista[i].insertmat() ; //richiamo la funzione di inserimento di Persona,siccome che listastudenti è una sottoclasse di studenti che è una sottoclasse di persona
}
}
~ListaStudenti(){delete[] lista;} //distruttore
};
void ListaStudenti::ordina(){ //algoritmo di ordinamento lista
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
if (lista[j].getmat()>lista[j+1].getmat()){ //chiamo la funzione di studente getmat e ordino quella
Studente temp = lista[j+1];
lista[j+1] = lista[j];
lista[j] = temp;
}
}
}
}
void ListaStudenti::visuallista(){ //utilizzo la funzione visual di persona per visualizzare l'array di studenti
for(int i=0;i<n;i++){
lista[i].visual();
lista[i].visualmat();
}
}
int n;
Studente lista[n];
main(){
ListaStudenti a;
cout<<"lista non ordinata:"<<endl;
a.visuallista();
a.ordina();
cout<<"lista studenti ordinata:"<<endl;
a.visuallista();
return 0;
}
Mi servirebbe una mano col capire costruttori e distruttori...in particolare vorrei capire se ad esempio avessi definito Nome e Cognome in public cosa sarebbe cambiato con il costruttore...consequenzialmente quindi vorrei capire le funzioni setname e getname a cosa servono(se ho capito bene,definendo Nome e Cognome privati non posso accedervi direttamente e fare le operazioni su di loro,ma tramite altre variabili che poi daranno il loro valore a Nome e Cognome tramite get e set,giusto?).
Infine siccome non sono praticissimo di puntatori,per realizzare la bubblesort si è usato un array di Studente con dei puntatori e l'operatore new...mi servirebbe sapere qualcosa in più su questo procedimento e se c'è un modo di semplificare le cose usando magari un array statico di Studente...grazie a tutti per l'attenzione!
In pratica devo costruire una classe Persona con nome e cognome,una classe derivata studente con matricola e tramite la bubblesort ordinare i nomi in base alla matricola...il tutto usando le classi.
#include<iostream>
#include<string.h>
using namespace std;
class Persona{ // inizio punto 1
private:
string Nome,Cognome;
public:
Persona(){ //definizione costruttore
Nome="";
Cognome="";
};
Persona(string name,string subname){ //funzione costruttore da definire dentro la classe
Nome=name;
Cognome=subname;
}
void insert(); //definizione funzioni
void setname(string name) {Nome=name;}
void setsubname(string subname) {Cognome=subname;}
string getname() {return Nome;}
string getsubname(){return Cognome;}
void visual();
};
void Persona::insert(){ //funzioni
string name,subname;
cout<<"inserire nome persona:"<<endl;
cin>>name;
setname(name);
cout<<"inserire cognome persona:"<<endl;
cin>>subname;
setsubname(subname);
}
void Persona::visual(){
cout<<"nome:"<<endl<<getname()<<endl;
cout<<"cognome:"<<endl<<getsubname()<<endl;
} //fine punto 1
class Studente: public Persona{ //inizio punto 2,definizione sottoclasse studente
int Matricola;
public:
Studente(){ //definizione costruttore
Matricola=0;
};
Studente(int mat){ //funzione costruttore
Matricola=mat;
}
void insertmat(); //definizione funzioni punto 2
void setmat(int mat) {Matricola=mat;}
int getmat() {return Matricola;}
void visualmat();
};
void Studente::insertmat() { //funzioni 2
int mat;
cout<<"inserire la matricola:"<<endl;
cin>>mat;
setmat(mat);
}
void Studente::visualmat(){
cout<<"matricola:"<<getmat()<<endl;
} //fine punto 2
class ListaStudenti: public Studente{ //inizio punto 4
Studente *lista; //dichiaro un puntatore lista che punta a una variabile Studente
int n;
public:
void ordina();
void visuallista();
ListaStudenti(){ //definizione costruttore lista
cout<<"inserire il numero di studenti:"<<endl;
cin>>n;
lista=new Studente[n]; //dichiaro un array di puntatori a studente (new funziona come & e restituisce un indirizzo)
for (int i=0;i<n;i++){
cout<<"inserisci studente"<<i+1<<endl;
lista[i].insert();
lista[i].insertmat() ; //richiamo la funzione di inserimento di Persona,siccome che listastudenti è una sottoclasse di studenti che è una sottoclasse di persona
}
}
~ListaStudenti(){delete[] lista;} //distruttore
};
void ListaStudenti::ordina(){ //algoritmo di ordinamento lista
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
if (lista[j].getmat()>lista[j+1].getmat()){ //chiamo la funzione di studente getmat e ordino quella
Studente temp = lista[j+1];
lista[j+1] = lista[j];
lista[j] = temp;
}
}
}
}
void ListaStudenti::visuallista(){ //utilizzo la funzione visual di persona per visualizzare l'array di studenti
for(int i=0;i<n;i++){
lista[i].visual();
lista[i].visualmat();
}
}
int n;
Studente lista[n];
main(){
ListaStudenti a;
cout<<"lista non ordinata:"<<endl;
a.visuallista();
a.ordina();
cout<<"lista studenti ordinata:"<<endl;
a.visuallista();
return 0;
}
Mi servirebbe una mano col capire costruttori e distruttori...in particolare vorrei capire se ad esempio avessi definito Nome e Cognome in public cosa sarebbe cambiato con il costruttore...consequenzialmente quindi vorrei capire le funzioni setname e getname a cosa servono(se ho capito bene,definendo Nome e Cognome privati non posso accedervi direttamente e fare le operazioni su di loro,ma tramite altre variabili che poi daranno il loro valore a Nome e Cognome tramite get e set,giusto?).
Infine siccome non sono praticissimo di puntatori,per realizzare la bubblesort si è usato un array di Studente con dei puntatori e l'operatore new...mi servirebbe sapere qualcosa in più su questo procedimento e se c'è un modo di semplificare le cose usando magari un array statico di Studente...grazie a tutti per l'attenzione!