Lista concatenata e File [C++]

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Lista concatenata e File [C++]

    Penso che attraverso una serie di condizioni puoi risolvere ciò . Prendi uno dei dati membro comune a tutte e tre le classi e fai la condizione su di esso . Esempio : penso avrai un dato membro "Tipo" nel quale ti dice che se è articolo , videogioco o dvd e in base a cosa c'è scritto crei dinamicamente la classe
    
    char nome[30];
    tipo val;
    ....
    else {
    file >> nome ;
    if ( strcmp(nome,"Articolo") == 0 ) {
           file >> dato1;
           file >> dato2;
           Articolo* ptr = new Articolo (dato1,dato2);
           val = ptr;
           push(val);
    }
    else if ( strcmp(nome,"DVD") == 0 ) {
              file >> dato1;
              file >> dato2 ;
              file >> dato3;
               DVD *ptr = new DVD ( dato1,dato2,dato3);
               val = ptr;
               push(val);
    }
    .....
    
    Una cosa del genere.

    P.S. ho usato una stringa genercia ma poichè utiliza il C++ puoi benissimo usare la classe string con l' overloading dell' operatore "==" eliminando così lo strcmp
  • Re: Lista concatenata e File [C++]

    Io userei un ID differente a seconda del tipo di dato. Quando scrivo su file ci metto anche l'ID così so che tipo di dato sto trattando quando lo devo ricaricare da file.
  • Re: Lista concatenata e File [C++]

    Sisi sicuramente molto più pratico , io ho fatto esempio con un tipo string ma era inteso qualsiasi sia il dato che diversifica i tre tipi
  • Re: Lista concatenata e File [C++]

    Grazie per le risposte, l'unico problema è che non ho informazioni del genere (non ho id, nè niente)...l'unica cosa che potrei fare è proprio all'atto della scrittura dei dati nel file anteporre qualcosa che mi dice di che tipo è, e quindi alla lettura chiamare il costruttore giusto.

    L'unica altra cosa che vorrei chiedere( e poi finisco di rompere ) che mi lascia perplesso è la seguente: il mio obiettivo iniziale era quello di creare una lettura da file che fosse "universale", e non proprietaria per quei determinati oggetti; cioè se non conoscessi la struttura dei campi degli oggetti che tratto (cosa che in teoria con l'information hiding NON DOVREI SAPERE) è possibile fare la lettura lo stesso?

    Comunque Grazie mille per le risposte tempestive!
  • Re: Lista concatenata e File [C++]

    Si può sapere come vengono creati sti oggetti? Si è parlato solo di teoria ma di codice non ho visto niente. Com'è sta struttura dati? Quali sono i membri differenti tra un CD e un DVD?
  • Re: Lista concatenata e File [C++]

    Scusami, ma non avevo visto all'inizio che era possibile allegare file, ma non mi è possibile allegare nessun tipo di file, neanche txt. Postarli tutti mi sembrava un lavoraccio ma se ti serve lo faccio subito:
    
    
    class articolo
    {
          protected:
                    char* codice;
                    float prezzo;
          ecc.....
    
    articolo::articolo(const char* code, const float price)
    {
         codice= new char[strlen(code)+1];
         strcpy(codice,code);
         prezzo=price;
    }
    
    void articolo::leggi(fstream& file)
    {
         cout <<" articolo";
         char buffer[100];
         file >> buffer >> prezzo;
         codice=new char[strlen(buffer)+1];
         strcpy(codice,buffer);
    }
         
    void articolo::scrivi(fstream& file)
    {
         file << codice <<" "<< prezzo;
    }
    
    
    class videogioco: public articolo
    {
          protected:
                    char* nome;
                    char* console;
          ecc...
    
    void videogioco::leggi(fstream& file)
    {
         articolo::leggi(file);
         cout <<" video";
         char buffer[100];
         char buffer2[100];
         file >> buffer >> buffer2;
         nome=new char[strlen(buffer)+1];
         strcpy(nome,buffer);
         console=new char[strlen(buffer2)+1];
         strcpy(console,buffer2);
    }
    
    void videogioco::scrivi(fstream& file)
    {
         articolo::scrivi(file);
         file <<" "<< nome <<" "<< console;
    }
    
    
    class dvd: public articolo
    {
          protected:
                    char* titolo;
                    int anno;
           ecc....
    
    
    void dvd::leggi(fstream& file)
    {
         articolo::leggi(file);
         char buffer[100];
         file >> buffer >> anno;
         titolo=new char[strlen(buffer)+1];
         strcpy(titolo,buffer);
    }
    
    void dvd::scrivi(fstream& file)
    {
         articolo::scrivi(file);
         file <<" "<< titolo <<" "<< anno;
    }
    
    QUI C'è LA LETTURA MALEDETTA!
    
    class lista
    {
          private:
                  nodo* l;
             ecc.....
    
    
    void lista::scrivi_su_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::out|ios::app);
         if (!file) cout << "errore apertura";
         else
         {
             nodo* app=l;
             while (app)
             {
                   app->get_elem()->scrivi(file);
                   file << endl;
                   app=app->get_next();
             }
         }
         file.close();
    }
    
    void lista::leggi_da_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::in);
         if (!file) cout << "errore nel file";
         else
         {
             /*
             while ( v->leggi(file))
             {
                 cout << v;
                 push();
             } 
             */
         }
         file.close();
    }
    
  • Re: Lista concatenata e File [C++]

    Ok, ho risolto tutti i problemi tranne uno: l'ordinamento! Il programma si blocca non appena avvio questo...le altre funzioni invece vanno alla grande! Sapete dirmi qual è il problema?
    //VERSIONE ULTIMATE
    /*Programma per la gestione di un rivenditore di automobili*/
    
    #include<iostream>
    #include<fstream>
    #include<cstdio>
    #include<cctype>
    #include<cstdlib>
    #include<string>
    #include<cstring>
    using namespace std;
    
    //dati globali
    
    int const size=50;
    //CLASSI
    
    class Mezzo{
          public:
                  string nomeprodotto;
                  string casaproduttrice;
                  string prezzo;
                  string anno;
                  void set_mezzo();
                  void get_mezzo();
          };
    
    struct Nodo{
           Mezzo x;
           Nodo *next;
           };
           
    class Lista{
          private:
                  Nodo *primo, *ultimo;
                  int num_mezzi;
          public:
                 Lista();
                 ~Lista();
                 void Caricamento_da_File();
                 void Inserimento_in_Lista();
                 void Cancella_Mezzo(Nodo* knot);
                 Nodo* Ricerca_Mezzo();
                 void Modifica_Mezzo(Nodo* knot);
                 void Ordinamento_Catalogo();
                 Nodo *returnprimo(){return primo;};
                 void Salvataggio_su_File();
          };
          
    char home();
    int password();
    
    int main()
    {
        Lista list;   
        char scelta;
        int register j;
        list.Caricamento_da_File();
        for(j=10;j>0;j--){	
    	     if(password()) break;
    		 else cout<< "Password non trovata. Tentativi rimasti: ";
             cout << j-1; cout<< "\n"; continue;
             }
        if(j==0){ cout<< "\nImpossibile accedere al programma!\n\n";
    	        }
        else{
        for (;;){   
    
        
        scelta=tolower(home());
        switch(scelta){
                       case 'i':
                                cout<<"\a\n\n\t\tINSERIMENTO NUOVO VEICOLO\n\n\t\t";
                                list.Inserimento_in_Lista();
                                break;
                       case 'o':
                                cout<<"\a\n\n\t\tORDINA CATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ordinare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     cout<< "\n\nOrdinamento in corso...";
                                     list.Ordinamento_Catalogo(); 
                                }
                                break;
                       case 'v':
                                Nodo *tempv;
                                cout<<"\a\n\n\t\tCATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da mostrare\n";
                                             system("pause");
                                }
                                else
                                {
                                    tempv = list.returnprimo();
                                    while ( tempv != 0 )
                                    {
                                      tempv->x.get_mezzo();
                                      cout << "\n";
                                      tempv = tempv->next;
                                    }
                                }
                                system("pause");
                                break;
                                                        
                       case 'm':
                                Nodo* tempm;
                                cout<<"\a\n\n\t\tMODIFICA VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da modificare\n";
                                             system("pause");
                                }
                                else
                                {
                                    tempm=list.Ricerca_Mezzo(); 
                                    list.Modifica_Mezzo(tempm);
                                    system("pause");
                                } 
                                break;
                                                   
                       case 'r':
                                Nodo* tempr;
                                cout<<"\a\n\n\t\tRICERCA NUOVO VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ricercare\n";
                                             system("pause");
                                }
                                else tempr=list.Ricerca_Mezzo();
                                if (tempr==0)
                                {
                                            cout<<"\n\nVeicolo impossibile da trovare. Controllare che il nome\n";
                                            cout<<"sia stato inserito correttamente\n\n";
                                }
                                
                                break;
                       case 'e':
                                Nodo* tempe;
                                cout<<"\a\n\n\t\tELIMINAZIONE VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da cancellare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     tempe=list.Ricerca_Mezzo();
                                     cout<<"\nEliminazione del veicolo in corso....\n\n ";
                                     list.Cancella_Mezzo(tempe);
                                     system("pause");
                                }
                                break;
                       case 'u':
                                cout<< "\a\nBuona Giornata\n\n";
                                cout<< system("pause");
                                return 0;
                                break;
                      
    }   
        list.Salvataggio_su_File();     
    }
        
                
        }              
        system("pause");
        return 0;
    }
    
    //FUNZIONI
    
    //Password
    int password(){
        char str1[size];
    	char str2[size];
    	int register i;
    	cout<< "Inserire password\n";
    	gets(str1);
    	for(i=0; i<size; i++){
    		str2[i]=tolower(str1[i]);
    	}
    	if(strcmp(str2, "gianluigi")){
    		return 0;}
    	else	return 1;
    }
    
        
    //funzioni membro Lista
    Lista::Lista()
    {       
            primo=0;
            ultimo=0;
            num_mezzi=0;
    }
    //FUNZIONI
    //CARICAMENTO DA FILE
    void Lista::Caricamento_da_File()
    {
        Mezzo a;
        Nodo* knot;
        ifstream in("Catalogo.txt");
        if(!in)
            {
                cout<<"\nCatalogo vuoto\n";
            }
        else{
             in.close();
             ifstream in("Catalogo.txt");
    
        do
            { 
                in>>a.nomeprodotto;
                in>>a.casaproduttrice;
                in>>a.prezzo;
                in>>a.anno;
                num_mezzi++;
                knot=new Nodo;
                knot->x=a;
                knot->next=primo;
                primo=knot;
            }
            while(!in.eof());
            
        cout<< "\n\n\a File caricato con successo!\n\n";
    }
    }
    //INSERIMENTO MEZZO
    void Lista::Inserimento_in_Lista()
    {
        Nodo* knot;
        int register i;
        int k=0;
        cout<< "\n\nIndicare il numero di mezzi da inserire nel Catalogo\n\n";
        cin>> k;
        for(i=0; i<k; i++)    
        {
            knot=new Nodo;
            knot->x.set_mezzo();
            
            knot->next=primo;
            primo=knot;
        }
        num_mezzi=num_mezzi+k;
    }
    //SCRITTURA DATI MEZZO
    void Mezzo::set_mezzo()
    {   
        cout<<"\n\n Inserisci il nome:  ";
        cin>> nomeprodotto;
        cout<<"\n Inserisci la casa produttrice:  ";
        cin>>casaproduttrice;
        cout<<"\n Inserisci il prezzo:  ";
        cin>>prezzo;
        cout<< "\n Inserisci l'anno di produzione:  ";
        cin>>anno;
        cout<<"\n";
    }
    //LETTURA DATI MEZZO
    void Mezzo::get_mezzo()
    {   
        cout<<"\n\n Nome prodotto:  ";
        cout<< nomeprodotto;
        cout<<"\n Casa Produttrice:  ";
        cout<< casaproduttrice;
        cout<<"\n Prezzo:  ";
        cout<< prezzo;
        cout<< "\n Anno di Produzione:  ";
        cout<< anno;
        cout<<"\n";
    }
    //ELIMINAZIONE DALLA LISTA
    void Lista::Cancella_Mezzo(Nodo *knot)
    {
         Nodo* t;
         if(knot==primo)
         {
                  t=knot->next;
                  primo=t;
         }
         else if(knot==ultimo)
         {
              t=primo;
              while(t->next != knot)
              {
                           t=t->next;
              }
              t->next=0;
              ultimo=t;
         }
         else
         {
             t=primo;
             while(t->next != knot)
             {
                           t=t->next;
             }
             t->next=knot->next;
         }
         delete knot;
         num_mezzi--;
         cout<<"Veicolo eliminato\n\n";
    }
    
    //RICERCARE MEZZO
    Nodo* Lista::Ricerca_Mezzo()
    {    
         Nodo* knot1;
         Nodo* knot2=0;
         string s;
         cout<<"\nIndicare il nome del veicolo:\n";
         cin>> s;
         while(s=="/0")
         {
                cout<<"\nNome non valido. Reinserire il nome del veicolo\n";
         }
         do
         {
                
              knot1=primo;
              if(knot1->x.nomeprodotto==s)
              { 
                cout<<"\nIl veicolo ricercato è il seguente:";
                knot1->x.get_mezzo();
                return knot1;
              }
         
         knot1=knot1->next;
         }while(knot1!=0);
         return knot2;
    }
    
    //MODIFICARE ELEMENTO LISTA
    void Lista::Modifica_Mezzo(Nodo* knot)
    {
         
         cout<< "\nInserire dati per il nuovo veicolo\n\n";
         knot->x.set_mezzo();
         
         cout<< "\n Visualizzazione del veicolo modificato\n";
         knot->x.get_mezzo();
         cout<<"\n";
    }
    
    
    //ORDINARE LISTA
    void Lista::Ordinamento_Catalogo()
    {    
         Nodo *knot, *t;
         Nodo *Array[num_mezzi];
         register int i, j=0,n;
         knot=primo;
         for(n=0; n< num_mezzi; n++)
         {
                  Array[i]=knot;
                  knot=knot->next;
                  cout<<"Dentro al for di riempimento\n";
         }
         for(j=1; j<num_mezzi; j++)
         {
                  for(i=num_mezzi-1; i>=j; i--)
                  {
                        if(Array[i-1]->x.nomeprodotto > Array[i]->x.nomeprodotto)
                        {       
                                cout<<"\nA";
                                t->x=Array[i-1]->x;
                                Array[i-1]->x=Array[i]->x;
                                Array[i]->x=t->x;
                                cout<<"\nB";
                  
                        }
                  }
         }
         cout << "\a\n\nOrdinamento completato!\n\n";
    }
    //SALVATAGGIO SU FILE
    void Lista::Salvataggio_su_File()
    {
         Nodo* knot=primo;
         ofstream out("Catalogo.txt",ios::out);
         while(knot!=0)
            {
                out<<knot->x.nomeprodotto<<endl;
                out<<knot->x.casaproduttrice<<endl;
                out<<knot->x.prezzo<<endl;
                out<<knot->x.anno<<endl;
                knot=knot->next;
            }
    
        out.close();
    }
    
    //DISTRUTTORE LISTA
    
    Lista::~Lista()
    {
         Nodo* knot=primo;
         do
         {
            if(knot==ultimo)
            {
                delete knot;
                knot=0;
            }
            else
            {
                do
                {
                     knot=knot->next;
                     delete knot;
                }while(knot!=0);
            }
        }
        while(knot!=0);
    }
    //MENU
    char home()
    {
        char ch;
        do
        {
              
              cout<< "\n                        PROGRAMMA GESTIONE AUTOSALONE\n\n";
    		  cout<< "                     ______________Menu______________\n\n";
    		  cout<< "                         (I)nserimento veicolo\n";
    		  cout<< "                         (O)rdinamento catalogo\n";
    		  cout<< "                         (V)isualizzazione catalogo\n";
    		  cout<< "                         (M)odifica singolo veicolo\n";
    		  cout<< "                         (R)icerca singolo veicolo\n";
    		  cout<< "                         (E)liminazione veicolo\n";
    		  cout<< "                         (U)scita programma\n\n";
    		
    		  cout<< "Nota: Indicare la scelta con la lettera tra parentesi\n";
    		  cin>> ch;
         }while(!strchr("iovmreu", tolower(ch)));
         return ch;
    }
    
  • Re: Lista concatenata e File [C++]

    Guarda sinceramente io non ho mai fatto una funzione per ordinare una lista , se avevo bisogno di ordinarla semplicemente creavo una funzione inserisci che mi inserisce il valore in modo ordinato e quindi racchiudeva l' ordinamento e l' inserimento ma con un algoritmo molto meno complesso . In pratica diventa una funziona ricorsiva in cui passi sempre il puntatore successivo e controlli se il valore risulta essere minore dell' altro , se si allora fai lo swap altrimenti continui la ricorsione fin quando il puntatore prossimo non punterà zero , all' ora l' elemento andrà alla fine.



    Per Fabiostyle : non ho capito bene cosa tu stai chiedendo , cioè se tu salvi nel file automaticamente sai cosa c'è dentro e tocca a te trovare un modo per distinguere i vari oggetti , io e skynet ti abbiamo solo fatto degli esempi che servono per distinguere un oggetto . Può essere in base ad un dato o a più dati , come vuoi .
  • Re: Lista concatenata e File [C++]

    Io aggiungerei un campo public/protected alla classe articolo così sai il tipo di dato che vai a caricare
    
    class articolo
    {
          protected:
                    char* codice;
                    float prezzo;
                    int tipo;
    
    
Devi accedere o registrarti per scrivere nel forum
23 risposte