Forum - C/C++
- esercizio sulle strutture
wicca89 (Normal User)
Rookie
Messaggi: 45
Iscritto: 16/01/2009
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.titolo;
cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
cin>>galleria.opera.autore;
cout<<"Inserisci la data (gg mm aa)corrente separati da uno spazio: ";
cin>>galleria.opera.data.gg>>galleria.opera.data.mm>>galleria.opera.data.aa;
cout<<"Inserisci il prezzo del libro: ";
cin>>galleria.opera.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.titolo<<"\n";
cout<<"Autore: "<<galleria.opera.autore<<"\n";
cout<<"Data: "<<galleria.opera.data.gg<<"/"<<galleria.opera.data.mm<<"/"<<galleria.opera.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.titolo,titolo2)==0){
ok=1;
n=i;
strcpy(galleria.opera[n].titolo,galleria.opera[galleria.numero].titolo);
galleria.numero--;
cout<<galleria.opera.titolo<<endl;
}//if chiuso
else if(ok!=1){i++;}
} //while chiuso
for(i=0;i<galleria.numero;i++){
cout<<"Titolo: "<<galleria.opera.titolo<<"\n";
cout<<"Autore: "<<galleria.opera.autore<<"\n";
cout<<"Data: "<<galleria.opera.data.gg<<"/"<<galleria.opera.data.mm<<"/"<<galleria.opera.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.... help me
Ultima modifica effettuata da wicca89 il 20/03/2010 alle 12:26
Poggi Marco (Member )
Guru
Messaggi: 969
Iscritto: 05/01/2010
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.
wicca89 (Normal User)
Rookie
Messaggi: 45
Iscritto: 16/01/2009
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
wicca89 (Normal User)
Rookie
Messaggi: 45
Iscritto: 16/01/2009
ho provato una cosa del genere...sbagliata ovviamente:
Codice sorgente - presumibilmente C++
#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
Matthew (Member )
Expert
Messaggi: 387
Iscritto: 29/01/2007
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.
Codice sorgente - presumibilmente C++
/*
* 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 ++ ;
}
Poggi Marco (Member )
Guru
Messaggi: 969
Iscritto: 05/01/2010
L'errore è nella funzione "void elimina(struct Tgalleria& ,char [])".
Tu dichiari "scambia(galleria.opera,galleria.opera[galleria.numero]);" , però se ci pensi, galleria.numero, è oltre l' elenco delle opere registrate.
Posto il programma corretto:
Codice sorgente - presumibilmente C++
#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 << "\n Scrivi 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 " ;
}
}
Matthew (Member )
Expert
Messaggi: 387
Iscritto: 29/01/2007
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.
Codice sorgente - presumibilmente C++
/*
* 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 il 18/03/2010 alle 23:29
wicca89 (Normal User)
Rookie
Messaggi: 45
Iscritto: 16/01/2009
Matthew grazie mi hai sconvolta con quel codice 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???
Ultima modifica effettuata da wicca89 il 18/03/2010 alle 23:32
Matthew (Member )
Expert
Messaggi: 387
Iscritto: 29/01/2007
Significa che copi interamente tutto il contenuto di una struttura in un'altra.
Se ti limiti a fare struct1=struct2 passi solo un puntatore alle seconda struttura. Quindi se modifichi la seconda struttura modifichi anche la prima (che sostanzialmente non esiste, è solo un riflesso). Siccome quando cancelli una struttura essa verrà sovrascritta la prossima volta che inserisci un titolo, abbiamo bisogno di una deep copy.
Ultima modifica effettuata da Matthew il 18/03/2010 alle 23:35