Oppure

Loading
18/03/10 18:27
wicca89

fin'ora ho fatto questo:
#include <iostream>
#include <string.h>

using namespace std;

struct Tdata{
int gg;
int mm;
int aa;
};
struct Topera{
char titolo[101];
char autore[101];
Tdata data;
int prezzo;
};

struct Tgalleria{
Topera opera[100];
int numero;//numero opere nella galleria
};

void aggiungi(struct Tgalleria& ,struct Topera&;);
void elimina(struct Tgalleria& ,char []);
//void ordina(struct Tgalleria& ,char );

int main() {
struct Tdata data;
struct Topera opera;
struct Tgalleria galleria;
char titolo2[100];
int scelta;

aggiungi(galleria,opera);
cout<<"vuoi elimare qualcosa? (1. Si - 2. No): ";
cin>>scelta;
if(scelta==1){
elimina(galleria,titolo2);
// ordina(galleria,scelta);
}
system ("PAUSE";);
return 0;
}

void aggiungi(Tgalleria& galleria , Topera& opera){
int scelta,scelta2,i=0;
char appoggio;
galleria.numero=0;
do{
do{
cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
cin>>galleria.opera[i].titolo;
cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
cin>>galleria.opera[i].autore;
cout<<"Inserisci la data (gg mm aa)corrente separati da uno spazio: ";
cin>>galleria.opera[i].data.gg>>galleria.opera[i].data.mm>>galleria.opera[i].data.aa;
cout<<"Inserisci il prezzo del libro: ";
cin>>galleria.opera[i].prezzo;
cout<<"I dati inseriti sono corretti: (1. si - 2 no): ";
cin>>scelta;
}
while(scelta==2);
cout<<"Vuoi inserire un'altro titolo e autore in galleria? (1. Si - 2.No): ";
cin>>scelta2;
i++;
galleria.numero++;
scelta=0;
}
while (scelta2==1);
for(i=0;i<galleria.numero;i++){
cout<<"Titolo: "<<galleria.opera[i].titolo<<"\n";
cout<<"Autore: "<<galleria.opera[i].autore<<"\n";
cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
}}

void elimina(Tgalleria& galleria, char titolo2[20]){
int i=0,n;
int ok=0;
cout<<n<<endl;

cout<<"Scrivi il titolo da eliminare: ";
cin>>titolo2[20];
while(i<galleria.numero || ok==0){
if(strcmp(galleria.opera[i].titolo,titolo2)==0){
ok=1;
n=i;
strcpy(galleria.opera[n].titolo,galleria.opera[galleria.numero].titolo);
galleria.numero--;
cout<<galleria.opera[i].titolo<<endl;
}//if chiuso
else if(ok!=1){i++;}
} //while chiuso

for(i=0;i<galleria.numero;i++){
cout<<"Titolo: "<<galleria.opera[i].titolo<<"\n";
cout<<"Autore: "<<galleria.opera[i].autore<<"\n";
cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
}
} // void chiuso
ovviamente ho l'errore che non mi scambia i nomi in modo da eliminare quello che dico io per esempio se scrivo prima (metto solo il titolo):
ciao
e poi
gatto
e voglio elimiare ciao mi elimina gatto e mi stampa ciao....:hail::hail: help me
Ultima modifica effettuata da wicca89 20/03/10 11:26
aaa
18/03/10 20:08
Poggi Marco
Ciao!

Ho letto il tup programma, e ho trovato alcune imprecisioni:
Nella funzione void "elimina(struct Tgalleria& ,char [])" ,quando individui il record da eliminare, sostituisci solo il campo titolo. Dovresti eliminare tutti i campi, a mio avviso, ti consiglio di implementare una funzione apposita.
aaa
18/03/10 20:15
wicca89
e come posso fare???
Il mio problema è che questo esercizio lo devo consegnare entro martedì o a giugno non posso sostenere l'esame e questi struct sono argomenti che il mio professore ha finito di spiegare praticamente lunedì qnd non sono ancora molto pratica di come si usano...se mi spieghi come fare ti sarei molto grada :hail::hail:
aaa
18/03/10 20:49
wicca89
ho provato una cosa del genere...sbagliata ovviamente:

#include <iostream>
#include <string.h>

using namespace std;

struct Tdata{
       int gg;
       int mm;
       int aa;
       };
struct Topera{
char titolo[101];
char autore[101];
Tdata data;
int prezzo;
};

struct Tgalleria{
Topera opera[100];
int numero;//numero opere nella galleria
};

void aggiungi(struct Tgalleria& ,struct Topera&);
void elimina(struct Tgalleria& ,char []);
void scambia(struct Topera& ,struct Topera& );
//void ordina(struct Tgalleria& ,char );

int main() {
    struct Tdata data;
    struct Topera opera;
    struct Tgalleria galleria;
    char titolo2[100];
    int scelta;
    
    aggiungi(galleria,opera);
    cout<<"vuoi elimare qualcosa? (1. Si - 2. No): ";
    cin>>scelta;
    if(scelta==1){
    elimina(galleria,titolo2);
   // ordina(galleria,scelta);
}
system ("PAUSE");
return 0;
}

void aggiungi(Tgalleria& galleria , Topera& opera){
     int scelta,scelta2,i=0;
     char appoggio;
     galleria.numero=0;
     do{
        do{
     cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[i].titolo;
     cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[i].autore;
     cout<<"Inserisci la data (gg mm aa)corrente separati da uno spazio: ";
     cin>>galleria.opera[i].data.gg>>galleria.opera[i].data.mm>>galleria.opera[i].data.aa;
     cout<<"Inserisci il prezzo del libro: ";
     cin>>galleria.opera[i].prezzo;
     cout<<"I dati inseriti sono corretti: (1. si - 2 no): ";
     cin>>scelta;
     }
     while(scelta==2);
     cout<<"Vuoi inserire un'altro titolo e autore in galleria? (1. Si - 2.No): ";
     cin>>scelta2;
     i++;
     galleria.numero++;
     scelta=0;
                  }
     while (scelta2==1);  
     for(i=0;i<galleria.numero;i++){
              cout<<"Titolo:  "<<galleria.opera[i].titolo<<"\n";
              cout<<"Autore:  "<<galleria.opera[i].autore<<"\n";
              cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
                                     }}
                                   
void elimina(Tgalleria& galleria, char titolo2[20]){
     int i=0,n,ap;
     int ok=0;     
     char app[101];
     cout<<"Scrivi il titolo da eliminare: ";
     cin>>titolo2[20];
     i=0;
     while(i<galleria.numero){
               if(strcmp(galleria.opera[i].titolo,titolo2)==0){
                                                  scambia(galleria.opera[i],galleria.opera[galleria.numero]);
                                                             } i++;//if chiuso     
                                 }//while chiuso
                    
                     for(i=0;i<galleria.numero;i++){
              cout<<"Titolo:  "<<galleria.opera[i].titolo<<"\n";
              cout<<"Autore:  "<<galleria.opera[i].autore<<"\n";
              cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
                                     }
                      } // void chiuso
     
void scambia(Topera& x1, Topera& x2){
     
     Topera s;
     
     s=x1;
     x1=x2;
     x2=s;
     
     
     }

Vi prego aiutatemiiii:hail:
aaa
18/03/10 22:02
Matthew
Ciao, ho messo a posto la funzione di inserimento e ho pulito un po' il tuo codice.
Non ho ancora completato le altre funzioni, ma quello che per ora trovi qui funziona.

/*
 * main.cc
 *
 *  Created on: Mar 18, 2010
 *  Author: Matthew
 */

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

struct Tdata
{
       int gg;
       int mm;
       int aa;
};
struct Topera
{
	char titolo[101];
	char autore[101];
	Tdata data;
	int prezzo;
};

struct Tgalleria
{
	Topera opera[100];
	int numero;
};

void aggiungi(struct Tgalleria& ,struct Topera&);
void elimina(struct Tgalleria& ,char*);
void scambia(struct Topera& ,struct Topera& );
//void ordina(struct Tgalleria& ,char );
void stampa(struct Tgalleria&);

int main()
{
    struct Topera opera;
    struct Tgalleria galleria;
    galleria.numero=0;
    int scelta=1;
    cout<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 scambia, 4 ordina, 5 stampa, 6 esci)";
    cin>>scelta;
    int pointer=0;
    while(scelta!=6)
    {
    	switch(scelta)
    	{
			case 1:
			{
				aggiungi(galleria,opera);
			}
			break;
			case 2:
			{
				string titolo;
				cout<<"Inserisci titolo:"<<endl;
				cin>>titolo;
				//elimina(galleria, titolo.c_str());
			}
			break;
			case 3:
			{
				//scambia
			}
			break;
			case 4:
			{
				char ch;
				cout<<"Ordina per: titolo ('t'),autore ('a'), data di creazione ('d'), prezzo ('p')"<<endl;
				cin>>ch;
				if((ch=='t')|(ch=='a')|(ch=='d')|(ch=='p'))
				{
					//ordina(galleria, ch);
				}
				else
				{
					cout<<"Opzione inesistente"<<endl;
				}
			}
			break;
			case 5:
			{
				stampa(galleria);
			}
			break;
			default:
			{
				cout<<"Opzione inesistente"<<endl;
			}
    	}
    	cout<<endl<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 scambia, 4 ordina, 5 stampa, 6 esci)";
    	cin>>scelta;
    }
    return 0;
}

void stampa(Tgalleria& galleria)
{
    for(int i=0;i<galleria.numero;i++)
    {
             cout<<"Titolo:  "<<galleria.opera[i].titolo<<"\n";
             cout<<"Autore:  "<<galleria.opera[i].autore<<"\n";
             cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
             cout<<"Prezzo:  "<<galleria.opera[i].prezzo<<"\n";
             cout<<endl;
    }
}

void aggiungi(Tgalleria& galleria , Topera& opera)
{
     time_t rawtime;
     struct tm * timeinfo;

     cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[galleria.numero].titolo;
     cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[galleria.numero].autore;
     time (&rawtime);
     timeinfo = localtime (&rawtime);
     galleria.opera[galleria.numero].data.gg=timeinfo->tm_mday;
     galleria.opera[galleria.numero].data.mm=timeinfo->tm_mon;
     galleria.opera[galleria.numero].data.aa=timeinfo->tm_year+1900;
     cout<<"Inserisci il prezzo del libro: ";
     cin>>galleria.opera[galleria.numero].prezzo;

     galleria.numero++;
}
aaa
18/03/10 22:08
Poggi Marco
L'errore è nella funzione "void elimina(struct Tgalleria& ,char [])".

Tu dichiari "scambia(galleria.opera[i],galleria.opera[galleria.numero]);" , però se ci pensi, galleria.numero, è oltre l' elenco delle opere registrate.

Posto il programma corretto:

#include <iostream>
#include <string.h>

using namespace std;

struct Tdata{
       int gg,mm,aa;
       };

struct Topera
{
char titolo[101];
char autore[101];
Tdata data;
float prezzo;
};

struct Tgalleria
{
Topera opera[100];
int numero;//numero opere nella galleria
};

void aggiungi(struct Tgalleria& ,struct Topera);
void elimina(struct Tgalleria& ,char []);
void sostituisci(Topera &, Topera);
void stampa(const struct Tgalleria & );
//void ordina(struct Tgalleria& ,char );

int main()
{
    //struct Tdata data;
    struct Topera opera;
    struct Tgalleria galleria;
    char titolo2[100];
    int scelta=0, scelta2=0;
    galleria.numero=0; // azzeramento del numero di opere
    do
    {
      cout<<"Vuoi inserire un titolo e autore in galleria? (1. Si - 2.No): ";
      cin>>scelta2;
      if (scelta2==1)
      {
          do
          {
             cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
             cin>>opera.titolo;
             cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
             cin>>opera.autore;
             cout<<"Inserisci la data (gg mm aa)corrente separati da uno spazio: ";
             cin>>opera.data.gg>>opera.data.mm>>opera.data.aa;
             cout<<"Inserisci il prezzo del libro: ";
             cin>>opera.prezzo;
             cout<<"I dati inseriti sono corretti: (1. si - 2 no): ";
             fflush(stdin);
             cin>>scelta;
          } while (scelta!=1);
          aggiungi(galleria, opera);
      }
    } while (scelta2==1);
    stampa(galleria);
    do
    {
      cout<<"vuoi elimare qualcosa? (1. Si - 2. No): ";
      cin>>scelta;
      if(scelta==1)
      {
          cout<<"\nScrivi il titolo da eliminare: ";
          cin>>titolo2;
          elimina(galleria,titolo2);
      }
    } while(scelta==1);
   // ordina(galleria,scelta);
   stampa(galleria);
 fflush(stdin);
 getchar();
return 0;
}

void aggiungi(Tgalleria &galleria , Topera op)
{
     galleria.opera[galleria.numero]=op;
     galleria.numero++;
}

void sostituisci(Topera &a, Topera b)
{
    a=b;
}

void elimina(Tgalleria& galleria, char titolo2[])
{
     int i=0;
     //cout<<n<<endl;
     while(i<galleria.numero)
     {
               if(strcmp(galleria.opera[i].titolo,titolo2)==0)
               {
                   sostituisci(galleria.opera[i], galleria.opera[galleria.numero-1]);
                   galleria.numero--;
                }//if chiuso
                else i++;
        }    //while chiuso


} // void chiuso

void stampa(const struct Tgalleria &g)
{
    int i=0;
    cout<<"Esistono "<<g.numero<<" opere registrate\n";
    for (i=0; i<g.numero; i++)
    {
              cout<<"Titolo:  "<<g.opera[i].titolo<<"\n";
              cout<<"Autore:  "<<g.opera[i].autore<<"\n";
              cout<<"Data: "<<g.opera[i].data.gg<<"/"<<g.opera[i].data.mm<<"/"<<g.opera[i].data.aa<<"\n";
              cout<<"-----------------------------------------\n";
    }
}



aaa
18/03/10 22:25
Matthew
La tua funzione sostituisci (poggi marco) è sbagliata, e di conseguenza anche la funzione elimina.
Non puoi scambiare i valori di due strutture in quel modo. Stai solo passando un puntatore, quando l'originale verrà sovrascritto succederà un gran pasticcio.
Devi eseguire una deep copy.
/*
 * main.cc
 *
 *  Created on: Mar 18, 2010
 *  Author: Matthew
 */

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

struct Tdata
{
       int gg;
       int mm;
       int aa;
};
struct Topera
{
	char titolo[101];
	char autore[101];
	Tdata data;
	int prezzo;
};

struct Tgalleria
{
	Topera opera[100];
	int numero;
};

void aggiungi(struct Tgalleria& ,struct Topera&);
void elimina(struct Tgalleria& ,char*);
void scambia(struct Topera& ,struct Topera& );
//void ordina(struct Tgalleria& ,char );
void stampa(struct Tgalleria&);

int main()
{
    struct Topera opera;
    struct Tgalleria galleria;
    galleria.numero=0;
    int scelta=1;
    cout<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 ordina, 4 stampa, 5 esci) ";
    cin>>scelta;
    while(scelta!=5)
    {
    	switch(scelta)
    	{
			case 1:
			{
				aggiungi(galleria,opera);
			}
			break;
			case 2:
			{
				char titolo[101];
				cout<<"Inserisci titolo: ";
				cin>>titolo;
				elimina(galleria, titolo);
			}
			break;
			case 3:
			{
				char ch;
				cout<<"Ordina per: titolo ('t'),autore ('a'), data di creazione ('d'), prezzo ('p'): ";
				cin>>ch;
				if((ch=='t')|(ch=='a')|(ch=='d')|(ch=='p'))
				{
					//ordina(galleria, ch);
				}
				else
				{
					cout<<"Opzione inesistente"<<endl;
				}
			}
			break;
			case 4:
			{
				stampa(galleria);
			}
			break;
			default:
			{
				cout<<"Opzione inesistente"<<endl;
			}
    	}
    	cout<<endl<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 ordina, 4 stampa, 5 esci) ";
    	cin>>scelta;
    }
    return 0;
}

void stampa(Tgalleria& galleria)
{
    for(int i=0;i<galleria.numero;i++)
    {
             cout<<"Titolo:  "<<galleria.opera[i].titolo<<"\n";
             cout<<"Autore:  "<<galleria.opera[i].autore<<"\n";
             cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
             cout<<"Prezzo:  "<<galleria.opera[i].prezzo<<"\n";
             cout<<endl;
    }
}

void aggiungi(Tgalleria& galleria , Topera& opera)
{
     time_t rawtime;
     struct tm * timeinfo;

     cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[galleria.numero].titolo;
     cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
     cin>>galleria.opera[galleria.numero].autore;
     time (&rawtime);
     timeinfo = localtime (&rawtime);
     galleria.opera[galleria.numero].data.gg=timeinfo->tm_mday;
     galleria.opera[galleria.numero].data.mm=timeinfo->tm_mon;
     galleria.opera[galleria.numero].data.aa=timeinfo->tm_year+1900;
     cout<<"Inserisci il prezzo del libro: ";
     cin>>galleria.opera[galleria.numero].prezzo;

     galleria.numero++;
}

void elimina(Tgalleria& galleria, char *titolo)
{
     int i=0;

     while(i<galleria.numero)
     {
         if(strcmp (galleria.opera[i].titolo, titolo)==0)
         {
        	 //NB: decrementa galleria.numero PRIMA di scambiare, o avrai un errore "fuori di uno"
        	 galleria.numero--;
        	 scambia(galleria.opera[i],galleria.opera[galleria.numero]);
        	 cout<<"Elemento eliminato"<<endl;
        	 return;
         }
         i++;
     }
     cout<<"Impossibile eliminare, elemento non esistente"<<endl;
}

void scambia(Topera& x1, Topera& x2)
{
     Topera s;
     strcpy(s.autore, x1.autore);
     strcpy(s.titolo, x1.titolo);
     s.data.gg=x1.data.gg;
     s.data.mm=x1.data.mm;
     s.data.aa=x1.data.aa;
     s.prezzo=x1.prezzo;

     strcpy(x1.autore, x2.autore);
     strcpy(x1.titolo, x2.titolo);
     x1.data.gg=x2.data.gg;
     x1.data.mm=x2.data.mm;
     x1.data.aa=x2.data.aa;
     x1.prezzo=x2.prezzo;

     strcpy(x2.autore, s.autore);
     strcpy(x2.titolo, s.titolo);
     x2.data.gg=s.data.gg;
     x2.data.mm=s.data.mm;
     x2.data.aa=s.data.aa;
     x2.prezzo=s.prezzo;
}
Ultima modifica effettuata da Matthew 18/03/10 22:29
aaa
18/03/10 22:32
wicca89
Matthew grazie mi hai sconvolta con quel codice :D domani mattina lo vedo con calma
marco grazie ank a te ma continua a non funzionarmi con quel num-1.
Matthew che significa quel deep copy??? :D
Ultima modifica effettuata da wicca89 18/03/10 22:32
aaa