domenica 9 novembre 2014

domenica 2 novembre 2014

Compito di Gruppo

Compito sviluppato con la collaborazione della Classe per il programma Classe Frazione:
     nel dettaglio sviluppo del metodo "+=" e "-=":

#include <iostream>

using namespace std;

class Frazione{   //classe Frazione
    public:   //metodi pubblici
        Frazione();   //costruttore senza passaggio di parametri
        Frazione(int a,int b);   //costruttore con passaggio di due parametri di tipo intero per valore
        Frazione(int c);   //costruttore con passaggio di un parametro di tipo intero per valore
        void inserimento();   //metodo per l'inserimento dei dati num e den
        void visualizza();   //metodo per la visualizzazione dei dati inseriti
        void aggiorna();   //metodo per aggiornare i dati inseriti
            Frazione operator +(Frazione a);
            Frazione operator -(Frazione a);
            Frazione operator *(Frazione a);
            Frazione operator /(Frazione a);
            void operator += (Frazione a);
    void operator -= (Frazione a);
    bool operator >(Frazione); //prototipo
   bool operator <(Frazione); //prototipo
   bool operator !=(Frazione a);
        int num;   //dichiarazione di una variabile di tipo intera
        int den;   //dichiarazione di una variabile di tipo intera

    };

Frazione::Frazione()   //costruttore senza passaggio di parametri
    {
    num=1;
    den=1;
    };

Frazione::Frazione(int a, int b)   //costruttore con passaggio di parametri dove passo i valori dal main alle variabili a e b per valore
    {
    num=a;   //associo il contenuto puntato da a alla variabile num
    den=b;   //associo il contenuto puntato da b alla variabile den
    };

Frazione::Frazione(int c)   //costruttore con passaggio di parametri dove passo i valori dal main alla variabile c per valore
    {
    num=c;
    den=1;   //trattandosi di un intero dichiaro il denominatore uguale a 1
    };


void Frazione::inserimento()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::aggiorna()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::visualizza()   //metodo per visualizzare i dati inseriti
    {
        if(den!=1)   //se a denominatre c'è un valore diverso da uno allora è una frzione e visualizzo num/den
            cout<<"La frazione inserita e': "<<num<< "/" <<den<<endl;
        else   //altrimenti è un intero e visualizzo solo num
            cout<<"La frazione inserita e': "<<num<<endl;
    };

Frazione Frazione :: operator +(Frazione a)
      {
 Frazione b;
             b.den= this->den*a.den;
             b.num= (this->den*a.num)+(this->num*a.den);
             //b.Semplifica();
           return b;

 };
  Frazione Frazione :: operator -(Frazione a)
  {
  Frazione b;
             b.den= this->den*a.den;
             b.num= (this->den*a.num)-(this->num*a.den);
             //b.Semplifica();
           return b;
  };
  Frazione Frazione :: operator / (Frazione a)
  {
  Frazione b;

                b.den=this->den*a.num;
                b.num=this->num*a.den;
               // b.Semplifica();
                return b;
  };
      Frazione Frazione :: operator * (Frazione a)
      {
      Frazione b;

                b.den=this->den*a.den;
                b.num=this->num*a.num;
                //b.Semplifica();
                return b;

      };
void Frazione :: operator += (Frazione a)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        *this=a+*this;
    };
void Frazione :: operator -= (Frazione a)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        *this=a-*this;
        if(num==0)   //if per la visualizzazione del solo numeratore in caso di risultato uguale a 0
            {
                num=0;
                den=1;
            }
};
bool Frazione::operator >(Frazione a){

  bool ris=false;

  Frazione appoggio; //istanzio l'oggetto appoggio di classe frazione
  int fraz1=this->num*a.den;   // numeratore fraz1 * den fraz2
  int fraz2=this->den*a.num;   //numeratore fraz2 * den fraz1

  if(fraz1>fraz2)
      ris=true;

   return ris;

};
    bool Frazione::operator <(Frazione a){



    bool ris=false;

    Frazione appoggio;
    int fraz1=this->num*a.den;
    int fraz2=this->den*a.num;

     if(fraz1<fraz2)
      ris=true;

          return ris;


    };

bool Frazione::operator !=(Frazione a)
{
    bool x;
    if((a.num==num)&&(a.den==den))
    {
        x=0;
    }
    else
    {
        x=1;
    }
    return x;
}

main()
{
    int *scelta;
    int *modfraz;
    char mod;
    char *input;
    Frazione obj1;   //istanza oggetto obj1
    Frazione obj2;   //istanza oggetto obj2
    Frazione ris;
    cout<<"CALCOLATRICE PER FRAZIONI:"<<endl;
    scelta=new int;


        cout<<"Quale operazione vuoi eseguire? "<<endl;
        cout<<"1)Somma\n2)Sottrazione\n3)Moltiplicazione\n4)Divisione\n5)'+='\n6)'-='\n7)'>' o '<'\n8)'=' o '!='"<<endl;
        cout<<"Scegli 1-2-3-4-5-6-7-8: ";
        cin>>*scelta;
        cout<<endl;
        obj1.inserimento();   //metodo per inserimento in oggetto obj1
        obj2.inserimento();   //metodo per inserimento in oggetto obj2
        cout<<"Dati inseriti: "<<endl;
        obj1.visualizza();   //metodo per visualizzare dati inseriti in obj1
        obj2.visualizza();   //metodo per visualizzare dati inseriti in obj2
        Frazione risultato;   //istanza oggetto risultato

        input=new char;
        do
        {
            cout<<"Vuoi modificare i dati inseriti? (s/n)";
            cin>>*input;
        }while(((*input=='S')&&(*input=='s'))&&((*input!='n')&&(*input!='N')));
        if((*input=='s')||(*input=='S'))
        {
            modfraz=new int;
            do{
                cout<<endl<<"Quale frazione vuoi modificare? (1/2)";
                cin>>*modfraz;
                if(*modfraz==1)
                    obj1.aggiorna();
                else
                    if(*modfraz==2)
                        obj2.aggiorna();
                    else
                        cout<<endl<<"Scelta non valida"<<endl;
            }while((*modfraz!=1)&&(*modfraz!=2));
            delete modfraz;
        }
        else
            if((*input!='n')&&(*input!='N'))
                cout<<"Scelta non valida"<<endl;
        delete input;

        switch (*scelta)
            {
                case 1: ris=obj1+obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 2: ris=obj1-obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 3: ris=obj1*obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 4: ris=obj1/obj2;   //metodo per somma
                        ris.visualizza();
                        break;
                case 5: obj1+=obj2;   //metodo per somma
                        obj1.visualizza();
                        break;
                case 6: obj1-=obj2;   //metodo per somma
                        obj1.visualizza();
                        break;
                case 7: bool ris;
                        if(ris=obj1>obj2)cout<<endl<<"La prima frazione e' maggiore della seconda"<<endl;
                        if(ris=obj1<obj2)cout<<endl<<"La prima frazione e' minore della seconda"<<endl;
                        break;
                case 8: bool x;
                        ris=obj1!=obj2;
                        if(x==0)
                            cout<<"Le due Frazioni sono uguali"<<endl;
                        else
                            cout<<"Le due frazioni sono diverse"<<endl;
                        break;
                }
        delete scelta;
}

mercoledì 22 ottobre 2014

Esercizio su Classe Frazione

Creare una Classe Frazione che esegua le operazioni di somma, sottrazione, moltiplicazione e divisione tra frazioni:

#include <iostream>

using namespace std;

class Frazione{   //classe Frazione
    public:   //metodi pubblici
        Frazione();   //costruttore senza passaggio di parametri
        Frazione(int a,int b);   //costruttore con passaggio di due parametri di tipo intero per valore
        Frazione(int c);   //costruttore con passaggio di un parametro di tipo intero per valore
        void inserimento();   //metodo per l'inserimento dei dati num e den
        void visualizza();   //metodo per la visualizzazione dei dati inseriti
        void aggiorna();   //metodo per aggiornare i dati inseriti
        void somma(Frazione uno, Frazione due);   //metodo per la somma tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void sottrazione(Frazione uno, Frazione due);   //metodo per la sottrazione tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void moltiplicazione(Frazione uno, Frazione due);   //metodo per la moltiplicazione tra frazioni con passaggio di due parametri di tipo oggetto per valore
        void divisione(Frazione uno, Frazione due);   //metodo per la divisione tra frazioni con passaggio di due parametri di tipo oggetto per valore
    protected:   //proprietà protette
        int num;   //dichiarazione di una variabile di tipo intera
        int den;   //dichiarazione di una variabile di tipo intera
        int risnum;   //dichiarazione di una variabile di tipo intera
        int risden;   //dichiarazione di una variabile di tipo intera
    };

Frazione::Frazione()   //costruttore senza passaggio di parametri
    {
    num=1;
    den=1;
    };

Frazione::Frazione(int a, int b)   //costruttore con passaggio di parametri dove passo i valori dal main alle variabili a e b per valore
    {
    num=a;   //associo il contenuto puntato da a alla variabile num
    den=b;   //associo il contenuto puntato da b alla variabile den
    };

Frazione::Frazione(int c)   //costruttore con passaggio di parametri dove passo i valori dal main alla variabile c per valore
    {
    num=c;
    den=1;   //trattandosi di un intero dichiaro il denominatore uguale a 1
    };


void Frazione::inserimento()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::aggiorna()   //metodo per l'inserimento dei dati
    {
        cout<<"Inserisci il numeratore: "<<endl;
        cin>>num;
        do
        {
            cout<<"Inserisci il denominatore: "<<endl;
            cin>>den;
            if(den==0)   //se il denominatore e' uguale a 0 non accetto i dati inseriti e richiedo di ripetere l'inserimento
                cout<<"Il denominatore deve essere diverso da '0'"<<endl;
        }while(den==0);
    };

void Frazione::visualizza()   //metodo per visualizzare i dati inseriti
    {
        if(den!=1)   //se a denominatre c'è un valore diverso da uno allora è una frzione e visualizzo num/den
            cout<<"La frazione inserita e': "<<num<< "/" <<den<<endl;
        else   //altrimenti è un intero e visualizzo solo num
            cout<<"La frazione inserita e': "<<num<<endl;
    };

void Frazione::somma(Frazione uno, Frazione due)   //metodo per la somma tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=(uno.num*due.den)+(uno.den*due.num);   //(a*d+c*b)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La SOMMA e': "<<risnum<<endl;
            }
        else
            cout<<"La SOMMA tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::sottrazione(Frazione uno, Frazione due)   //metodo per la sottrazione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=(uno.num*due.den)-(uno.den*due.num);   //(a*d+c*b)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==0)
            {
                risnum=0;
                risden=1;
                cout<<"La SOTTRAZIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La SOTTRAZIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::moltiplicazione(Frazione uno, Frazione due)   //metodo per la moltiplicazione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=uno.num*due.num;   //(a*c)
        this->den=(uno.den*due.den);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La MOLTIPLICAZIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La MOLTIPLICAZIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };

void Frazione::divisione(Frazione uno, Frazione due)   //metodo per la divisione tra frazioni con passaggio di oggetto a parametri (passeremo le due frazioni da sommare)
    {
        this->num=uno.num*due.den;   //(a*c)
        this->den=(uno.den*due.num);   //(b*d)
        risnum=this->num;
        risden=this->den;
        if(risnum==risden)
            {
                risnum=1;
                risden=1;
                cout<<"La DIVISIONE e': "<<risnum<<endl;
            }
        else
            cout<<"La DIVISIONE tra "<<uno.num<<"/"<<uno.den<<" e "<<due.num<<"/"<<due.den<<" e': "<<risnum<<"/"<<risden<<endl;
    };


main()
{
    int *scelta;
    int *modfraz;
    char mod;
    char *input;
    Frazione obj1;   //istanza oggetto obj1
    Frazione obj2;   //istanza oggetto obj2

    cout<<"CALCOLATRICE PER FRAZIONI:"<<endl;
    scelta=new int;


        cout<<"Quale operazione vuoi eseguire? "<<endl;
        cout<<"1)Somma\n2)Sottrazione\n3)Moltiplicazione\n4)Divisione"<<endl;
        cout<<"Scegli 1-2-3-4: ";
        cin>>*scelta;
        cout<<endl;
        obj1.inserimento();   //metodo per inserimento in oggetto obj1
        obj2.inserimento();   //metodo per inserimento in oggetto obj2
        cout<<"Dati inseriti: "<<endl;
        obj1.visualizza();   //metodo per visualizzare dati inseriti in obj1
        obj2.visualizza();   //metodo per visualizzare dati inseriti in obj2
        Frazione risultato;   //istanza oggetto risultato

        input=new char;
        do
        {
            cout<<"Vuoi modificare i dati inseriti? (s/n)";
            cin>>*input;
        }while(((*input=='S')&&(*input=='s'))&&((*input!='n')&&(*input!='N')));
        if((*input=='s')||(*input=='S'))
        {
            modfraz=new int;
            do{
                cout<<endl<<"Quale frazione vuoi modificare? (1/2)";
                cin>>*modfraz;
                if(*modfraz==1)
                    obj1.aggiorna();
                else
                    if(*modfraz==2)
                        obj2.aggiorna();
                    else
                        cout<<endl<<"Scelta non valida"<<endl;
            }while((*modfraz!=1)&&(*modfraz!=2));
            delete modfraz;
        }
        else
            if((*input!='n')&&(*input!='N'))
                cout<<"Scelta non valida"<<endl;
        delete input;

        switch (*scelta)
            {
                case 1: risultato.somma(obj1, obj2);   
                        break;
                case 2: risultato.sottrazione(obj1, obj2);   
                        break;
                case 3: risultato.moltiplicazione(obj1,obj2);
                        break;
                case 4: risultato.divisione(obj1,obj2);
                        break;
            }
        delete scelta;

}

martedì 14 ottobre 2014

Esercizio 13/10/2014

Esercizio:

Definire un nuovo tipo di dato tramite l'istruzione typedef di nome dipendente, creare poi un array di puntatori di n elementi di tipo dipendente con n scelto dall'utente.

#include <iostream>
using namespace std;

typedef struct persona {
                    char Nome[15];
                    char Cognome[15];
                    float Stipendio;
                       }dipendente;   //creo un nuovo tipo di dato "dipendente"

dipendente *puntatore;   //creo una variabile di tipo puntatore (dipendente)

main()
{
    int ndip;
    cout<<"Compito del 13/10/2014";

//Input da utente per dimensione array di puntatori    
cout<<endl<<endl<<"Quanti dipendenti vuoi inserire?"<<endl;
        cin>>ndip; 
  puntatore=new dipendente[ndip];   //creo un array di puntatori della dimensione "ndip"
*!* con l'istruzione new dipendente si alloca spazio in memoria nella quantità prevista dal tipo di puntatore utilizzato e si genera l'indirizzo da assegnare al primo elemento dell'array puntatore 
//Inserimento dell'array di puntatori
for(int i=0;i<ndip;i++)
{
             cout<<endl<<"Inserisci il Nome: ";
         cin>>puntatore[i].Nome;   //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
         cout<<"Inserisci il Cognome: ";    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
         cin>>puntatore[i].Cognome;
         cout<<"Inserisci lo Stipendio: ";    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
         cin>>puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
}
        cout << endl << endl;
//Visualizzo l'array di puntatori
    for(int i=0;i<ndip;i++)
{
     cout<<"Dati Inseriti nell'elemento "<<i<<": "<<endl;
         cout<<endl<<"Nome: " << puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
         cout<<endl<<"Cognome: " << puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
         cout<<endl<<"Stipendio: " << puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
             cout << endl << endl;
}
return 0;
}





Vediamo alcune prove svolte sull'istruzione DELETE per la deallocazione della memoria allocata in precedenza tramite NEW DIPENDENTE

#include <iostream>
using namespace std;

typedef struct persona {
                    char Nome[15];
                    char Cognome[15];
                    float Stipendio;
                       }dipendente;   //creo un nuovo tipo di dato "dipendente"

dipendente *puntatore;   //creo una variabile di tipo puntatore (dipendente)

main()
{
    int ndip;
    cout<<"Compito del 13/10/2014";

//Input da utente per dimensione array di puntatori
 cout<<endl<<endl<<"Quanti dipendenti vuoi inserire?"<<endl;
        cin>>ndip;
//Visualizzo gli indirizzi puntati dall'array di puntatori SENZA allocazione tramite "new dipendente"
    for(int i=0;i<ndip;i++)
 {
      cout<<"Indirizzi SENZA ALLOCAZIONE 'NEW PUNTATORE' puntato dall'elemento "<<i<< ": "<<endl;
      cout<<endl<<"Nome: " << &puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Cognome: " << &puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Stipendio: " << &puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout << endl << endl;
 }

  puntatore=new dipendente[ndip];   //creo un array di puntatori della dimensione "ndip"

//Visualizzo gli indirizzi puntati dall'array di puntatori
    for(int i=0;i<ndip;i++)
 {
      cout<<"Indirizzi CON ALLOCAZIONE 'NEW PUNTATORE' puntati dall'elemento "<<i<< ": "<<endl;
      cout<<endl<<"Nome: " << &puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Cognome: " << &puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Stipendio: " << &puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout << endl << endl;
 }

//Inserimento dell'array di puntatori
 for(int i=0;i<ndip;i++)
 {
    cout<<"Inserimento dell'elemento "<<i<< ": "<<endl;
    cout<<"Inserisci il Nome: ";
    cin>>puntatore[i].Nome;   //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
    cout<<"Inserisci il Cognome: ";    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
    cin>>puntatore[i].Cognome;
    cout<<"Inserisci lo Stipendio: ";    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
    cin>>puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
 }
        cout << endl;
//Visualizzo l'array di puntatori
    for(int i=0;i<ndip;i++)
 {
      cout<<"Dati Inseriti nell'elemento "<<i<<": "<<endl;
      cout<<endl<<"Nome: " << puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Cognome: " << puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Stipendio: " << puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout << endl;
 }
 cout<<"_____________________________________________________________"<<endl;
 cout<<endl<<"Ripetiamo ora la visualizzazione degli array dopo aver utilizzato"<<endl<<"l'istruzione 'delete' per deallocare lo spazio di memoria"<<endl<<endl;
 delete [] puntatore;

//Visualizzo l'array di puntatori
    for(int i=0;i<ndip;i++)
for(int i=0;i<ndip;i++)
 {
      cout<<"Indirizzi DOPO ISTRUZIONE 'DELETE []' puntati dall'elemento "<<i<< ": "<<endl;
      cout<<endl<<"Nome: " << &puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Cognome: " << &puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Stipendio: " << &puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout << endl << endl;
 }

//Visualizzo l'array di puntatori
    for(int i=0;i<ndip;i++)
 {
      cout<<"Dati presenti nell'elemento "<<i<<" dopo istruzione 'delete': "<<endl;
      cout<<endl<<"Nome: " << puntatore[i].Nome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Cognome: " << puntatore[i].Cognome;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout<<endl<<"Stipendio: " << puntatore[i].Stipendio;    //notazione puntata con riferimento tramite indice "i" all'elemento dell'array di puntatori a cui si fa riferimento
      cout << endl << endl;
 }

return 0;
}



domenica 12 ottobre 2014

I Puntatori 2

I Puntatori - Seconda Lezione

La caratteristica alla base dei puntatori è che con essi si lavora su indirizzi di memoria, questo con il loro utilizzo comporta grandi proprietà a vantaggio del programmatore ma anche alcune possibili problematiche che potrebbero nascere dal loro utilizzo non appropriato: si potrebbe correre il rischio di andare a modificare aree di memoria riservate ad altri processi (ad esempio si potrebbe andare a modificare un area di memoria riservata al sistema operativo il che potrebbe provocare blocchi o problemi di varia natura). Proprio per questo motivo il compilatore esegue dei controlli prima di eseguire la compilazione del codice con puntatori.
Quando lavoriamo con tipi di dati primitivi (int,float,char, ecc…) il compilatore non si pone particolari riserve e cerca di fare quello che gli viene chiesto dalle istruzioni scritte dal programmatore, ma proprio per quanto detto poco fa quando si utilizzano i puntatori invece il compilatore andrà ad eseguire una serie di controlli atti ad evitare un utilizzo inappropriato.



*!* L’area di memoria valida di un puntatore è legata al tipo di puntatore dichiarato (int, float, ecc…)

Vediamo alcuni esempi:








*!* La potenza dei puntatori sta nella possibilità di poter allocare e successivamente liberare (quando non se ne ha più la necessità di utilizzo) lo spaio di memoria allocato al puntatore stesso, cosa che non può invece accadere con le variabili tradizionali (int, float, ecc…) che di conseguenza continuano a mantenere memoria allocata anche qualora non fosse più necessario.

Vediamo alcuni esempi di Codice:


#include <iostream>
using namespace std;
int main()
{
     int a=1;
     int b=10;
     int c;
     cout<<"Inserisci un valore";
     cin >> c;
     if(c>5)
     {
          a++;
          cout<<a;
     }
     else
     {
          b++;
          cout<<b;
     }
return 0;
}

In questo esempio la variabile contatore “a” o “b” viene incrementata a seconda che il valore inserito dall’utente (contenuto nella variabile “c”) sia o meno maggiore del valore 5. Ricollegandoci a quanto detto sopra possiamo vedere come in ogni caso, a prescindere dal valore dato in Input dall’utente, il compilatore allocherà spazio nella memoria per tutte e tre le variabili “a”, “b” e “c”.
Vediamo invece lo stesso esempio di codice scritto questa volta sfruttando le proprietà sopra elencate dei puntatori:

          #include <iostream>
          using namespace std;
          int main()
          {
               int *a;
               int *b;
               int c;
               cout<<"Inserisci un valore";
               cin >> c;
               if(c>5)
               {
                    a=new int;
                    *a=1;
                    *a+=1;
                    cout<<*a;
                    delete a;
               }
               else
               {
                    b=new int;
                    *b=10;
                    *b+=1;
                    cout<<*b;
                    delete b;
               }        
          return 0;
          }

In questo esempio la variabile “a” e la variabile “b” sono di tipo puntatore. Così facendo è possibile tramite l’istruzione “new int” allocare spazio in memoria per la variabile puntatore sono al momento della necessità di utilizzo della variabile senza allocare spazio a prescindere, come succede con le viste nell’esempio precedente, di conseguenza se l’utente inserirà un valore maggiore di 5 nella variabile “c” il programma allocherà memoria per il puntatore “a”, assegnerà il valore 1 all’area di memoria da esso puntata, incrementerà tale valore, visualizzerà “a” in Output e poi tramite l’istruzione delete libererà lo spazio di memoria utilizzato dalla variabile puntatore “a” da li in poi non più necessaria. 
Lo stesso procedimento verrà eseguito per la variabile puntatore “b” se il valore inserito in Input dall’utente sarà minore di 5.

Schema puntatore e indirizzi:


Schema logico di un doppio puntatore:



*!* In questo esempio la variabile puntatore “r” punta ad un indirizzo che punta a sua volta ad un altro indirizzo che contiene un dato di tipo intero.

Fonti:
Prof. Alemanno
Marchesi Giacomo

mercoledì 8 ottobre 2014

Esercizio 06/10/2014 - AGGIORNATO! (11/10/14)

Compito per casa assegnato il 06/10/2014 con consegna per il 08/10/2014

Esercizio su classi, ereditarietà, metodi e proprietà:
Creare una classe "Padre" Persona dalla quale ereditare due classi "Figlio" Studente e Dipendente.
 La classe "Padre" deve contenere un metodo per l’inserimento, uno per la visualizzazione dei dati e uno per l’aggiornamento di uno o più campi inseriti.

Il programmatore dovrà decidere i criteri public,protected o private da assegnare al modificatore.

#include <iostream>
using namespace std;
class Persona{
        public:
        Persona();
       void inserisciPersona()
                {
          cout<<"Inserisci il Nome: "<<endl;
          cin>>nome;
          cout<<"Inserisci il Cognome: "<<endl;
          cin>>cognome;
          cout<<"Inserisci la Data di Nascita: "<<endl;
          cin>>dataNascita;
          cout<<"Inserisci la Citta': "<<endl;
          cin>>citta;
    }

    void visualizzaPersona()
                {
                    cout<<"Nome: "<<nome<<endl;
                    cout<<"Cognome: "<<cognome<<endl;
                    cout<<"Data di Nascita: "<<dataNascita<<endl;
                    cout<<"Citta': "<<citta<<endl;
                };
        void aggiornaPersona()
                {
                    char menu;
                    do
                    {
                    cout<<"Quale campo vuoi modificare? 1)Nome 2)Cognome 3)Data di Nascita 4)Citta"<<endl;
                    cin>>menu;
                    switch(menu)
                        {
                            case '1': cout<<"Inserisci il Nome: "<<endl;
                                    cin>>nome;
                            break;
                            case '2': cout<<"Inserisci il Cognome: "<<endl;
                                    cin>>cognome;
                            break;
                            case '3': cout<<"Inserisci la Data di Nascita: "<<endl;
                                    cin>>dataNascita;
                            break;
                            case '4': cout<<"Inserisci la Citta': "<<endl;
                                    cin>>citta;
                            break;
                            default: cout<<"Scelta non valida"<<endl;
                        }
                    }while((menu<'1')||(menu>'4'));
                };

  protected:
        char nome[15];
        char cognome[15];
        char dataNascita[11];
        char citta[15];
        };


Persona::Persona()
{
       char nome[15];
       char cognome[15];
        char dataNascita[11];
        char citta[15];
}

class Studente : public Persona {
        public:
        Studente();
  void inserisciStudente()
                {
          cout<<"Inserisci la classe dello studente: "<<endl;
           cin>>classe;
           cout<<"Inserisci la sezione dello studente: "<<endl;
           cin>>sezione;
           cout<<"Inserisci l'indirizzo di studi dello studente: "<<endl;
           cin>>indirizzo;
    }

        void aggiornaStudente();

  void visualizzaStudente()
                {
                    visualizzaPersona();
                    cout<<"Classe: "<<classe<<endl;
                    cout<<"Sezione: "<<sezione<<endl;
                    cout<<"Indirizzo: "<<indirizzo<<endl;
                };
        protected:
        char classe[10];
        char sezione[2];
        char indirizzo[15];
        };

void Studente::aggiornaStudente()
{

     char scelt;
     char menu;
                 do{
                  cout<<"Quale parte vuoi modificare? 1)persona 2)studente"<<endl;
                  cin>>scelt;
                  switch(scelt)
                   {
                    case '1': aggiornaPersona();
                    break;
                    case '2':
        do{
                        cout<<"Quale campo vuoi modificare? 1)Classe 2)Sezione 3)Indirizzo"<<endl;
                        cin>>menu;


                         switch(menu)
                             {
                                case '1': cout<<"Inserisci la classe dello studente: "<<endl;
                                         cin>>classe;
                                   break;
                                 case '2': cout<<"Inserisci la sezione dello studente: "<<endl;
                                          cin>>sezione;
                                   break;
                                case '3': cout<<"Inserisci l'indirizzo di studi dello studente: "<<endl;
                                        cin>>indirizzo;
                                   break;
                                  default: cout<<"Scelta non valida"<<endl;
                             };
                        }while((menu<'1')||(menu>'3'));
                        break;
                       default: cout<<"Scelta non valida!"<<endl;
                   }
                 }while((scelt<'1')||(scelt>'2'));
}

Studente::Studente()
{
        char classe[10];
        char sezione[2];
        char indirizzo[15];
}

class Dipendente : public Persona {
        public:
        Dipendente();
        void inserisciDipendente()
                {
          cout<<"Inserisci la mansione del dipendente: "<<endl;
              cin>>mansione;
             cout<<"Inserisci lo stipendio del dipendente: "<<endl;
            cin>>stipendio;
    }
        void aggiornaDipendente();
        void visualizzaDipendente()
                {
                    visualizzaPersona();
                    cout<<"Mansione: "<<mansione<<endl;
                    cout<<"Stipendio: "<<stipendio<<endl;

                };
        protected:

        char mansione[15];
        char stipendio[6];
        };

void Dipendente::aggiornaDipendente() {

 char scelt;
   char menu;
        do{
               cout<<"Quale parte vuoi modificare? 1)persona 2)dipendente"<<endl;
                cin>>scelt;
                 switch(scelt)
                  {
                   case '1': aggiornaPersona();
                   break;
                   case '2':
                       do{
                          cout<<"Quale campo vuoi modificare? 1)Mansione 2)Stipendio"<<endl;
                        cin>>menu;
                        switch(menu)
                            {
                               case '1': cout<<"Inserisci la mansione del dipendente: "<<endl;
                                      cin>>mansione;
                                break;
                               case '2': cout<<"Inserisci lo stipendio del dipendente: "<<endl;
                                      cin>>stipendio;
                                break;
                                  default: cout<<"Scelta non valida"<<endl;
                             };
                           }while((menu!='1')&&(menu!='2'));
                       break;
                       default: cout<<"Scelta non valida!"<<endl;
                     };
     }while((scelt<'1')||(scelt>'2'));
}

Dipendente::Dipendente()
{
          char mansione[15];
          char stipendio[6];

}

main()
 {
  int menu;
  char scelta1;
  cout << "Esercizio 06/10/2014";
  cout << endl << endl;
 Persona prova;
 Studente prova2;
 Dipendente prova3;
 do{
    cout << "Che tipo di oggetto usi? 1)Persona 2)Studente 3)Dipendente"<<endl;
    cin>>menu;
    if((menu<1)||(menu>3))
     cout<<"Scelta non valida!"<<endl;

 }while((menu<1)||(menu>3));

  if(menu==1)
    {
     prova.inserisciPersona();
        do{
         cout << "Vuoi visualizzare i dati inseriti? s/n"<<endl;
         cin >> scelta1;
        }while((scelta1!='s')&&(scelta1!='n'));
  if(scelta1=='s')
            prova.visualizzaPersona();
            do{
    cout << "Vuoi aggiornare i dati inseriti? s/n"<<endl;
             cin >> scelta1;
            }while((scelta1!='s')&&(scelta1!='n'));
            if(scelta1=='s')
                prova.aggiornaPersona();
            cout<<endl<<endl;
            prova.visualizzaPersona();
        }

  else
    if(menu==2)
        {
        prova2.inserisciPersona();
  prova2.inserisciStudente();
        do{
         cout << "Vuoi visualizzare i dati inseriti? s/n"<<endl;
         cin >> scelta1;
        }while((scelta1!='s')&&(scelta1!='n'));
        if(scelta1=='s')
            prova2.visualizzaStudente();
            do{
             cout << "Vuoi aggiornare i dati inseriti? s/n"<<endl;
             cin >> scelta1;
   }while((scelta1!='s')&&(scelta1!='n'));
            if(scelta1=='s')
                prova2.aggiornaStudente();
            cout<<endl<<endl;
            prova2.visualizzaStudente();
        }

   else
     if(menu==3)
        {
         prova3.inserisciPersona();
         prova3.inserisciDipendente();
         do{
          cout << "Vuoi visualizzare i dati inseriti? s/n"<<endl;
          cin >> scelta1;
         }while((scelta1!='s')&&(scelta1!='n'));
        if(scelta1=='s')
            {
    prova3.visualizzaDipendente();
             do{
              cout << "Vuoi aggiornare i dati inseriti? s/n"<<endl;
              cin >> scelta1;
          }while((scelta1!='s')&&(scelta1!='n'));
             if(scelta1=='s')
                 prova3.aggiornaDipendente();
                cout<<endl<<endl;
             prova3.visualizzaDipendente();
            }
  }
return 0;
}


Lavoro di gruppo sviluppato con Mattia Callegaro