Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C++]Copia di code

  1. #1

    [C++]Copia di code

    La traccia era questa:
    Si realizzi in linguaggio C++ una classe generica Coda mediante uso del costrutto class del linguaggio C++, e ricorrendo ad una implementazione dinamica. Gli elementi della Coda siano di tipo record così definito
    struct Esame {
    int codice;
    char * descrizione;
    };

    . Il tipo Coda deve prevedere le seguenti operazioni:
    clear() Svuota la coda.
    push(const Esame el) Inserisce l’elemento el nella coda
    pop(Esame & el) Estrae l’elemento el dalla coda.
    top(Esame & el) Copia in el l’elemento di testa della coda.
    stampa() Visualizza a video gli elementi contenuti nella coda.



    ho implementato alcune funzioni sulla coda tra cui la stampa della coda (coda::stampa())

    definisco una coda p1 inserisco gli elementi con un push...scrivo p1.stampa();
    e mi da in output quello che ho inserito...e fin qui tutto bene...

    poi...
    definisco una nuova coda p2:
    codice:
    coda p2=p1;			// copia
    p1.clear();                            //Pulisce la coda p1
    p1.stampa();                        //Cerca di stampare p1, ma non può farlo(e funziona bene)
    p2.stampa();                        //Dovrebbe stamparmi la stessa cosa che stampava  //p1.stampa(), ma non lo fa..cioè...mi scrive i nomi degli esami correttamente ma non mi riesce a stampare bene il codice dell'esame!!!
    Ad esempio io ho come codice esame 4081 e lui mi fa vedere 0....poi per il secondo esame mi scrive 4007232 per il 3° 4007208 per il 4° 4007184(il numero diminuisce di 24...ogni volta)...e così via...è come se c fosse un problema nella copia...come se copiasse una sorta di indirizzo o di posizione...boh...

    Grazie per la pazienza come sempre!
    L'impossibile richiede solo più tempo...

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Sempre gli stessi esercizi fanno fare.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è possibile dare una risposta se non posti il codice come l'hai implementato. (Tutto il codice)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    E' che mi sembrava brutto scrivere direttamente il codice....e quindi ho provato a scriverlo a parole....cmq...ecco il codice...con 3 file..: specifica, implementazione,utente!


    codice:
    //File di specifica 
    
    #ifndef CODA_H
    #define CODA_H
    
    
    
    typedef struct _ESAME{
    		int codice;
    		const char * descrizione;
    		struct _ESAME *next;
    	}ESAME;
    	
    class Coda{
          public:
                 Coda();
                 bool clear();
                 bool empty();
                 void push(const ESAME el);
                 bool pop(ESAME& el);
                 bool top(ESAME& el);
                 //Coda(const Coda& codaToCopy);
                 void stampa();
          private:
                   ESAME* createEsame(int codice,const char* descrizione);
                   ESAME *first, *last;
                   
                  
    };
               
    #endif //CODA_H
    codice:
    //File di implementazione
    #include "Coda.h"
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    
    using namespace std;
    
    Coda::Coda(){
                 last=first=0;
                             
    }
    
    //Coda::Coda (const Coda& codaToCopy){
               
    
    
    bool Coda::clear(){
                       first=0;
                       ESAME *node=last;
                       last=0;
                       ESAME *next;
                       while(node!=0){
                                      next= node->next;
                                      delete node;
                                      node=next;
                       }
    }
    
    bool Coda::empty(){
                       return last==0;
    }
    
    
    void Coda::push(const ESAME el){
                                                                  
                                    ESAME* nuovorecord= createEsame(el.codice,el.descrizione);
                                    if(empty()){
                                                
                                                last=nuovorecord;
                                                first=nuovorecord;
                                    }
                                    else{
                                         nuovorecord->next=last;
                                         last=nuovorecord;
                                        }
    }
    
    void Coda::stampa(){
         if(!empty()){
                        ESAME *temp=last;
                        while(temp){
                                    cout << "\n";
                                    cout<< temp->codice;
                                    cout<< "\n";
                                    cout<< temp->descrizione;
                                    cout<< "\n";
                                    temp=temp->next;
                                    }
                        }
         else
         cout<<"\n"<<"La lista è vuota"<<"\n";
    }
    
    bool Coda::pop(ESAME& el){
                     if(!empty()){
                                  if(last=&el){
                                               ESAME* temp=last->next;
                                               delete last;
                                               last=temp;
                                  }
                                  else{
                                       ESAME* temp1=last;
                                       while(temp1->next!=&el){
                                                              temp1=temp1->next;
                                       }
                                       ESAME* temp2=&el;
                                       temp1->next=temp2->next;
                                       temp2->next=0;
                                       delete temp2;
                                       }
                                  return true;
                     }           
                     else
                     return false;
    }
    
    bool Coda::top(ESAME &el){
         if(!empty()){
                         ESAME* temp=last;
                         while(temp->next){
                                           temp=temp->next;
                                           }
                         el.codice=temp->codice;
                         el.descrizione=temp->descrizione;
                         }
         else
         return false;
    }
    
    ESAME* Coda::createEsame(int cod,const char* desc){
          ESAME* nuovoesame = new ESAME;
          nuovoesame->codice = cod;
          nuovoesame->descrizione = desc;
          nuovoesame->next=0;
          return nuovoesame;
    }
    codice:
    //File di utilizzo
    
    #include <iostream>
    #include <stdlib.h>
    #include "Coda.h"	
    #include <string>
    #include <cstring>
    
    using namespace std;
    
    int main(){
               Coda p1; 
               
               ESAME str;
               str.codice=4081; 
               str.descrizione="Analisi I";
               p1.push(str);
               str.codice=2000; 
               str.descrizione="Analisi II";
               p1.push(str);
               str.codice=3928; 
               str.descrizione="Fisica";
               p1.push(str);
               str.codice=1011; 
               str.descrizione="Geometria";
               p1.push(str);
               p1.stampa();
               p1.top(str);
               cout<<"\n" << "Elemento di testa" <<"\n" << str.codice <<"\n"<< str.descrizione<<"\n";
               Coda p2;
               p2=p1;
               p1.clear(); 
               p1.stampa();
               cout<<"\n\nprima della stampa p2\n";
               p2.stampa();
               system("PAUSE");
               return EXIT_SUCCESS;
    }
    Grazie!!!
    L'impossibile richiede solo più tempo...

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se vai dal meccanico non puoi dirgli semplicemente: "la macchina non va in moto"; devi portagliela, altrimenti come fa a ripararla?

    Considera questo codice:
    codice:
               Coda p2; // ok, crea una Coda.
               p2=p1;   // copia bit a bit perché non è definito l'operatore di assegnamento.
               p1.clear(); // distrugge la coda 
               p1.stampa(); // stampa una Coda distrutta
               cout<<"\n\nprima della stampa p2\n";
               p2.stampa(); // stampa una copia della Coda distrutta.
    Non ha molto senso stampare qualcosa che distruggi prima, non ti sembra?
    Corretto sarebbe:
    codice:
               Coda p2; // ok, crea una Coda.
               p2=p1;   // copia bit a bit perché non è definito l'operatore di assegnamento.
               p1.stampa(); // stampa una Coda distrutta
               cout<<"\n\nprima della stampa p2\n";
               p2.stampa(); // stampa una copia della Coda distrutta.
               p1.clear(); // distrugge la coda
    Riallacciandosi al tuo thread su costruttore di copia e operatore di assegnamento, prova ad aggiungere un'ulteriore linea e vedi che succede.
    codice:
               Coda p2; // ok, crea una Coda.
               p2=p1;   // copia bit a bit perché non è definito l'operatore di assegnamento.
               p1.stampa(); // stampa una Coda distrutta
               cout<<"\n\nprima della stampa p2\n";
               p2.stampa(); // stampa una copia della Coda distrutta.
               p1.clear(); // distrugge la coda 
               p2.clear(); // <-- ?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    il fatto che non ha molto senso è vero...ma non capisco perchè non funziona...cioè...io prima di distruggere p1 lo copio in p2...poi quando lo vado a stampare perchè non mi esce di nuovo p1...ma qualcosa di simile???

    p.s. che linea devo aggiungere??p2.clear()???...a che mi servirebbe???
    L'impossibile richiede solo più tempo...

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il post di MItaly è esplicativo sul perché succede:
    http://forum.html.it/forum/showthrea...3#post12758503

    Se cancelli p1, anche p2 risente della cancellazione, quindi i suoi puntatori diventano non validi.
    La riga che ti ho detto di aggiungere evidenzia come internamente la memoria a cui puntano i puntatori, sia la stessa. (Con violazione d'accesso per doppia cancellazione ovviamente).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    ho capito....il problema sai qual'era...che quell'operazione stava nella traccia...era per questo che non mi spiegavo il fattaccio...perchè io di mio nn l'avrei mai messa una copia così inutile!!!...boh..!!sti professori!...
    L'impossibile richiede solo più tempo...

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Inutile forse, però istruttiva se ci pensi bene.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    istruttiva....ma che non funzionava però...cioè t fa capire una cosa molto importante...quella che ho scritto in un altro post...sul costrutt d copia e sull'operatore di assegnazione!!!...quello sicuramente sì...

    GRAZIE ancora comunque!
    L'impossibile richiede solo più tempo...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.