Menu principale

Problemone C++ Per Esamone

Aperto da zerocool, 27 Dicembre 2004, 21:06:13

Discussione precedente - Discussione successiva

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

spiros

[img]http://img247.imageshack.us/img247/7803/untitled1mr9.jpg" border="0" alt="Immagine IPB" /]


spiros

zero sono col pc di un amico
e mi dice: cartella compressa non valida o danneggiata  -.-''
copia icolla qui sul topic no eh?^
[img]http://img247.imageshack.us/img247/7803/untitled1mr9.jpg" border="0" alt="Immagine IPB" /]

zerocool

Ecco a voi signori e signore...  

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class persona{
   private:
      string nome;
      string cognome;
      string data_nascita;
   public:
      persona()
      {
         //Costruttore di default
      }
      
      ~persona()
      {
         //distruttore di default
      }
      
      persona(string n, string c, string d)
      {
         nome = n;
         cognome = c;
         data_nascita = d;
      }
      
      bool operator== (persona x)
      {
         if(nome == x.nome && cognome == x.cognome && data_nascita == x.data_nascita) return true;
         else return false;
      }
      
      void stampa()
      {
         cout<<"Nome: "<<nome<<endl;
         cout<<"Cognome: "<<cognome<<endl;
         cout<<"Data di nascita: "<<data_nascita<<endl;
         return;
      }
      
      void carica_lista(istream& lista)
      {
            lista >> nome;
            lista >> cognome;
            lista >> data_nascita;
            return;
      }
      
      void salva_lista(ostream& lista)
      {
         lista << nome<<endl;
         lista << cognome<<endl;
         lista << data_nascita<<endl;
         return;
      }
      
      void aggiungi(string n, string c, string d)
      {
         nome = n;
         cognome = c;
         data_nascita = d;
         return;
      }
      
      bool ricerca(char tipo, string chiave)
      {
         switch(tipo)
         {
            case 'n':
               if(nome == chiave) return true;
               break;
            case 'c' :
               if(cognome == chiave) return true;
               break;
         }
         return false;         
      }
      
      void cancella(persona suc)
      {
         nome = suc.nome;
         cognome = suc.cognome;
         data_nascita = suc.data_nascita;
      }
};

persona database[50];
ifstream in;
ofstream out;

void visualizza(int k)
{
   for(int i = 0; i < k; i++)
   {
      cout<<"\t\t\tPersona "<<i+1<<endl;
      database.stampa();
   }
   cout<<endl;
}

int apri()
{
   in.open("persone.txt");
   int k = 0;
   if(in.fail())
   {
      cout<<"\t\t\tErrore nell'apertura del file"<<endl;
   }
   else
   {
      while(!in.eof())
      {
         database[k].carica_lista(in);   
         k++;
      }
      cout<<"\t\t\tArchivio aperto con successo"<<endl;
   }
   in.close();
   return k;
}
void salva(int k)
{
   out.open("persone.txt");
   for(int i = 0; i < k; i++)
   {
      database.salva_lista(out);
   }
   out.close();
}

void aggiungi(int k)
{
   string nome;
   string cognome;
   string data;
   
   cout<<"Nome: ";
   cin>>nome;
   cout<<"Cognome: ";
   cin>>cognome;
   cout<<"Data di nascita: ";
   cin>>data;
   database[k].aggiungi(nome, cognome, data);
}

void elimina(int k)
{
   int p;
   cout<<"Inserisci il numero della persona da eliminare"<<endl;
   cin>>p;
   for(int i = 0; i < k; i++)
   {
      if(database == database[p] )
      {
         for(int j = p - 1; j < k; j++)
         {
            database[j].cancella(database[j+1]);
         }
      }
   }
   return;
}

int ricerca(char t, int k)
{
   string cerca;
   bool trovato;
   switch(t)
   {
      case 'n':
         cout<<"\t\t\tRicerca per nome..."<<endl;
         cin>>cerca;
         for(int i = 0; i < k; i++)
         {
            trovato = database.ricerca(t, cerca);
            if(trovato == true) return i;
         }
         break;
      case 'c':
         cout<<"\t\t\tRicerca per cognome..."<<endl;
         cin>>cerca;
         for(int i = 0; i < k; i++)
         {
            trovato = database.ricerca(t, cerca);
            if(trovato == true) return i;
         }
         break;
   }
   return -1;
}

void menu()
{
   cout<<"1. Inserisci una nuova persona"<<endl;
   cout<<"2. Visualizza l'elenco delle persone"<<endl;
   cout<<"3. Ricerca una persona"<<endl;
   cout<<"4. Elimina una persona"<<endl;
   cout<<"5. Esci"<<endl;
   return;
}

void menu_ricerca()
{
   cout<<"1. Ricerca per nome"<<endl;
   cout<<"2. Ricerca per cognome"<<endl;
   return;
}

int main()
{
   int n_persone;
   n_persone = apri();
   while(true)
   {
      int scelta = 0;
      menu();
      while((scelta != 1) && (scelta != 2) && (scelta != 3) && (scelta != 4))
      {
         cin>>scelta;
         switch(scelta)
         {
            case 1:
               aggiungi(n_persone);
               n_persone++;
               break;
            case 2:
               visualizza(n_persone);
               break;
            case 3:
               int ric;
               int risultato;
               menu_ricerca();
               cin>>ric;
               switch(ric)
               {
                  case 1:
                     risultato = ricerca('n', n_persone);
                     if(risultato != -1)
                     {
                        cout<<"\t\t\tTrovata corrispondenza alla persona: "<<endl;
                        database[risultato].stampa();
                     }
                     else cout<<"\t\t\tNessuna corrispondenza"<<endl;
                     break;
                  case 2:
                     risultato = ricerca('c', n_persone);
                     if(risultato != -1)
                     {
                        cout<<"\t\t\tTrovata corrispondenza alla persona: "<<endl;
                        database[risultato].stampa();
                     }
                     else cout<<"\t\t\tNessuna corrispondenza"<<endl;
                  break;
                  default:
                  cout<<"Operazione non valida"<<endl;
                  return 0;
               }
               break;
            case 4:
               elimina(n_persone);
               n_persone--;
               break;
            case 5:
               salva(n_persone);
               return 0;
            default:
               cout<<"Scelta non valida"<<endl;
               cin>>scelta;
         }
      }
      }
   salva(n_persone);
   return 0;
}

lukelf

#19
Oddio ... senza indentazione è terribile. Mi sono già "incartato" tre volte.
Fase 1: zero, mi mandi il txt via PM o Mail, pls?

Fase 2: possibile soluzione
io mi aspetto che da qualche parte, durante la lettura della stringa/riga del file TXT ci debba essere un controllo sul contenuto (che non ho trovato); questo controllo dovrebbe verificare alcune possibilità che vado a descrivere. Infatti secondo me il file potrebbe terminare in questi diversi modi:

contenutoriga[CR][LF] (dove ci sono un numero imprecisato di byte che leggi)
[CR][LF][EOF] (dove leggi 2 byte escluso il EOF)

oppure

contenutoriga[CR][LF] (dove ci sono un numero imprecisato di byte che leggi)
[EOF] (dove leggi 0 byte escluso il EOF)

Diciamo quindi pure che se tu verifichi la lunghezza del contenuto della stringa durante la fase di lettura (credo con una length) e ottieni un valore inferiore o uguale a 2 byte e poi subito dopo un EOF, l'ultima lettura la devi buttare. E' come se ... tutte le volte che verifichi la lunghezza della stringa letta ottieni <= a 2 allora devi fare una seconda lettura del file per verificare se subito dopo c'è l'EOF o qualcosa di analogo.

Mi rendo conto che è complicato spiegarlo a parole e non ho un compilatore sotto mano per provare.

Fammi sapere.

zerocool

CitazioneOddio ... senza indentazione è terribile. Mi sono già "incartato" tre volte.
Fase 1: zero, mi mandi il txt via PM o Mail, pls?

Fase 2: possibile soluzione
io mi aspetto che da qualche parte, durante la lettura della stringa/riga del file TXT ci debba essere un controllo sul contenuto (che non ho trovato); questo controllo dovrebbe verificare alcune possibilità che vado a descrivere. Infatti secondo me il file potrebbe terminare in questi diversi modi:

contenutoriga[CR][LF] (dove ci sono un numero imprecisato di byte che leggi)
[CR][LF][EOF] (dove leggi 2 byte escluso il EOF)

oppure

contenutoriga[CR][LF] (dove ci sono un numero imprecisato di byte che leggi)
[EOF] (dove leggi 0 byte escluso il EOF)

Diciamo quindi pure che se tu verifichi la lunghezza del contenuto della stringa durante la fase di lettura (credo con una length) e ottieni un valore inferiore o uguale a 2 byte e poi subito dopo un EOF, l'ultima lettura la devi buttare. E' come se ... tutte le volte che verifichi la lunghezza della stringa letta ottieni <= a 2 allora devi fare una seconda lettura del file per verificare se subito dopo c'è l'EOF o qualcosa di analogo.

Mi rendo conto che è complicato spiegarlo a parole e non ho un compilatore sotto mano per provare.

Fammi sapere.
mmm il problema è che nn riesco a fare sti controlli... e il forum nn accetta l'indentazione... appena ti trovo su msn ti mando il sorgente...  

lukelf

Non mi sono dimenticato di te ... sono ancora in tempo?


lukelf

Buongiorno zero, mi servirebbe il file che utilizzi per le prove. Quello che usi in lettura.
Postalo quì (che tanto non credo che i tab siano significativi) oppure mandalo via mail.

P.S.: Il compilatore mi ha dato degli errori e ho dovuto fare delle correzioni ma, nonostante il corretto risultato ottenuto, c'è qualcosa che non mi convince. Diciamo che mi si stanno accavallando le regole di Java e del C++ o che, più semplicemente, mi stò rincoglionendo. Comunque se mi mandi il file faccio le prove e ti rispedisco la parte di NON lettura del CRLF.

Per tutti gli altri che non fanno gli informatici: scegliete un altro lavoro! -.-'