Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - esercizio sulle strutture
Forum - C/C++ - esercizio sulle strutture - Pagina 5

Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 0:40
Sabato, 20/03/2010
Testo quotato

Postato originariamente da Poggi Marco:
Dove è sbagliato (a parte chiedere all' utente cosa ordinare?)



Per prima cosa bisognerebbe controllare che il valore di ritorno di strcmp sia positivo piuttosto che uguale a 1.
Comunque non è questo il problema, il punto è questo algoritmo non funziona. Se provi a fare qualche test più complesso vedi che l'ordinamento non è completo.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 0:52
Sabato, 20/03/2010
Effettivamente, ci potrebbero essere dei problemi con le lettere maiuscole e minuscole.

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 0:53
Sabato, 20/03/2010
Non è quello il problema. L'algoritmo non funziona proprio, nemmeno con dei numeri.
[EDIT:]
Per esempio nemmeno 3 2 1 viene ordinato correttamente.

Ultima modifica effettuata da Matthew il 20/03/2010 alle 0:56
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 1:24
Sabato, 20/03/2010
Testo quotato

Postato originariamente da Matthew:

Non è quello il problema. L'algoritmo non funziona proprio, nemmeno con dei numeri.
[EDIT:]
Per esempio nemmeno 3 2 1 viene ordinato correttamente.



Io l' ho provato e funziona...

Certamente non è completo, manca l' ordinamento per data e prezzo.

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 1:30
Sabato, 20/03/2010
Testo quotato

Postato originariamente da Poggi Marco:

Testo quotato

Postato originariamente da Matthew:

Non è quello il problema. L'algoritmo non funziona proprio, nemmeno con dei numeri.
[EDIT:]
Per esempio nemmeno 3 2 1 viene ordinato correttamente.



Io l' ho provato e funziona...

Certamente non è completo, manca l' ordinamento per data e prezzo.



Funziona solo in pochissimi casi.

Hai provato 3 2 1?
Perchè a me viene ordinato 3 1 2

PM Quote
Avatar
wicca89 (Normal User)
Rookie


Messaggi: 45
Iscritto: 16/01/2009

Segnala al moderatore
Postato alle 9:52
Sabato, 20/03/2010
scusa ma dovee inserisci 3 2 1??? cmq l'ho completato e modificato ancora:

Codice sorgente - presumibilmente C++

  1. #include  <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. struct Tdata{
  8.        int gg;
  9.        int mm;
  10.        int aa;
  11.        };
  12. struct Topera {
  13.     char titolo[101];
  14.     char autore[101];
  15.     Tdata data;
  16.     int prezzo;
  17.     };
  18. struct Tgalleria
  19. {
  20.     Topera opera[100];
  21.     int numero;
  22. };
  23.  
  24. void aggiungi(struct Tgalleria& ,struct Topera&);
  25. void elimina(struct Tgalleria& ,char*);
  26. void ordina(struct Tgalleria& ,char );
  27. void stampa(struct Tgalleria&);
  28. void scambia(struct Topera& ,struct Topera& );
  29.  
  30. int main() {
  31.     struct Topera opera;
  32.     struct Tgalleria galleria;
  33.     galleria.numero=0;
  34.     int scelta=1;
  35.     char ch;
  36.     cout<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 ordina, 4 stampa, 5 esci) ";
  37.     cin>>scelta;
  38.     while(scelta!=5)    {
  39.         switch(scelta) {
  40.             case 1:
  41.                 aggiungi(galleria,opera);
  42.             break;
  43.             case 2:
  44.                 char titolo[101];
  45.                 cout<<"Inserisci titolo: ";
  46.                 cin>>titolo;
  47.                 elimina(galleria, titolo);
  48.             break;
  49.             case 3:
  50.                    ordina(galleria, ch);
  51.             break;
  52.             case 4:
  53.                 stampa(galleria);
  54.             break;
  55.             default:
  56.                 cout<<"Opzione inesistente"<<endl;
  57.         }
  58.         cout<<endl<<"Cosa vuoi fare? (1 aggiungi, 2 elimina, 3 ordina, 4 stampa, 5 esci) ";
  59.         cin>>scelta;
  60.     }
  61.     return 0;
  62. }
  63.  
  64. void aggiungi(Tgalleria& galleria , Topera& opera){
  65.  
  66.      cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
  67.      cin.getline(galleria.opera[galleria.numero].titolo,101);
  68.      cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
  69.      cin.getline(galleria.opera[galleria.numero].autore,101);
  70.      cout<<"Inserisci la data di creazione: ";
  71.      cin>>galleria.opera[galleria.numero].data.gg>>galleria.opera[galleria.numero].data.mm>>galleria.opera[galleria.numero].data.aa;
  72.      cout<<"Inserisci il prezzo del libro: ";
  73.      cin>>galleria.opera[galleria.numero].prezzo;
  74.  
  75.      galleria.numero++;
  76. }
  77.  
  78. void elimina(Tgalleria& galleria, char *titolo){
  79.      int i=0;
  80.      while(i<galleria.numero)     {
  81.          if(strcmp (galleria.opera[i].titolo, titolo)==0){
  82.              galleria.numero--;
  83.              scambia(galleria.opera[i],galleria.opera[galleria.numero]);
  84.              cout<<"Elemento eliminato"<<endl;
  85.              return;
  86.          }
  87.          i++;
  88.      }
  89.      cout<<"Impossibile eliminare, elemento non esistente"<<endl;
  90. }
  91.  
  92. void ordina(Tgalleria& galleria, char ch){
  93.      int i,j,s,ap;
  94.      Tdata x1,x2;
  95.      cout<<"Ordina per: titolo ('t'),autore ('a'), data di creazione ('d'), prezzo ('p'): ";
  96.      cin>>ch;
  97.      if((ch=='t')||(ch=='a')||(ch=='d')||(ch=='p')){
  98.         switch(ch){
  99.                    case 't':
  100.                      for(i=0;i<galleria.numero;++i){
  101.                        for(j=galleria.numero-1;j>=i+1;j--){
  102.                           if(strcmp(galleria.opera[j-1].titolo,galleria.opera[j].titolo)==1){
  103.                                           scambia(galleria.opera[j],galleria.opera[j-1]);
  104.                                           }}}
  105.                    break;
  106.                    case 'a':
  107.                         for(i=0;i<galleria.numero;++i){
  108.                          for(j=galleria.numero-1;j>=i+1;j--){
  109.                           if(strcmp(galleria.opera[j-1].autore,galleria.opera[j].autore)==1){
  110.                                           scambia(galleria.opera[j],galleria.opera[j-1]);
  111.                                           }}}
  112.                    break;
  113.                    case 'd':
  114.                         for(i=0;i<galleria.numero;++i){
  115.                          for(j=galleria.numero-1;j>=i+1;j--){
  116.                                                              x1=galleria.opera[j].data;
  117.                                                              x2=galleria.opera[j-1].data;
  118.                           s=x1.aa*10000+x1.mm*100+x1.gg;
  119.                           ap=x2.aa*10000+x2.mm*100+x2.gg;  
  120.                           if(s<ap){
  121.                                   scambia(galleria.opera[j],galleria.opera[j-1]);}}}
  122.                    break;
  123.                    case 'p':
  124.                         for(i=0;i<galleria.numero;++i){
  125.                          for(j=galleria.numero-1;j>=i+1;j--){
  126.                                                              
  127.                          if(galleria.opera[j].prezzo<galleria.opera[j-1].prezzo){
  128.                                    scambia(galleria.opera[j],galleria.opera[j-1]);}}}
  129.                          break;
  130.                                }
  131.                                }}
  132. void stampa(Tgalleria& galleria) {
  133.     for(int i=0;i<galleria.numero;i++) {
  134.            
  135.              cout<<"Titolo:  "<<galleria.opera[i].titolo<<"\n";
  136.              cout<<"Autore:  "<<galleria.opera[i].autore<<"\n";
  137.              cout<<"Data: "<<galleria.opera[i].data.gg<<"/"<<galleria.opera[i].data.mm<<"/"<<galleria.opera[i].data.aa<<"\n";
  138.              cout<<"Prezzo:  "<<galleria.opera[i].prezzo<<"\n";
  139.              cout<<endl;
  140.     }
  141. }
  142.  
  143. void scambia(Topera& x1, Topera& x2){
  144.      Topera s;
  145.      s=x1;
  146.      x1=x2;
  147.      x2=s;
  148.      }


ovviamente c vorrebbero delle modifike sceme del tipo appena apro il programma non avendo inserito nessun titolo ecc e premo 2 o 3 ecc dovrebbe dare un'errore oppure se alla rikiesta del titolo scrivo "ciao mondo ciao" che si blocca il programma per questo volevo sapere cin.getline(a proposito come dovrei usare fflush?? io con il c usavo gets e andavo tranquilla ma ora siamo passati al cpp e a stento ci hanno spiegato il cin e cout a posto di print e scanf..:_doubt:)...Xò non capisco l'errore dell'ordinamento l'ho provato ieri sera cn parekki esempi e a me sembra funzionare...cmq si credo k dovrei seguire alla lettere infatti già non so se posso usare il void scambia visto k non è riportato dalla traccia...infatti ieri sera ho mandato una email al professore x sapere se posso usarla

PM Quote
Avatar
wicca89 (Normal User)
Rookie


Messaggi: 45
Iscritto: 16/01/2009

Segnala al moderatore
Postato alle 11:43
Sabato, 20/03/2010
Scusatemi ho iniziato a fare questo esercizio ma mi da un'errore k non capisco allora la traccia e':

#  Si definiscano le seguenti strutture:

struct Tmediateca{
Tdiscografia discografie[20];
int numero; }


struct Tdiscografia{
char autore[101];
Talbum album[20];
int numero_album; }


struct Talbum{
char titolo_album[31]; char brani[30][21];
int numero_brani;
}


Dove numero rappresenta rispettivamente il numero di album dato un autore e il numero di brani dato un album.
Si definiscano le funzioni:
aggiungiAutore(Tmediateca &, char autore[]) che aggiunge una nuova discografia di un autore alla mediateca.
aggiungiAlbum(Tmediateca &, char autore[],char album[]) che aggiunge una nuovo album alla discografia relativa a autore.
aggiungiBrano(Tmediateca &, char autore[],char album[], char brano[]) che aggiunge una nuovo brano in un album (di un certo autore).
visualizzaBrani(Tmediateca &, char autore[]) che stampa tutti i brani di un certo autore.

Definire una sessione di testing per il programma.


Ora ho già fatto aggiungiAutore
ma aggiungiAlbum l'ho fatto così:

prima del main:
Codice sorgente - presumibilmente C/C++

  1. void aggiungiAlbum(struct Tmediateca& , char [],char []);


nel main:
Codice sorgente - presumibilmente Plain Text

  1. aggiungiAlbum(mediateca,autore,album)


dopo il main:
Codice sorgente - presumibilmente C++

  1. void aggiungiAlbum(Tmediateca& mediateca, char autore[],char album[]){
  2.      int i=0;
  3.      int scelta;
  4.      Tdiscografia discografia;
  5.      cout<<"Nome dell'autore della discografia: ";
  6.      cin>>autore;
  7.      for(i=0;i<mediateca.numero;i++){
  8.                                      if(strcmp(mediateca.discografia[i].autore,autore){
  9.                                                                                        cout<<"Nome album: ";
  10.                                                                                        cin<<mediateca.discografia[i].album;
  11.                                                                                        }
  12.                                                                                        }
  13.                                                                                        }


mi da qst errore nel main:
cannot convert `Talbum' to `char*' for argument `3' to `void aggiungiAlbum(Tmediateca&, char*, char*)'
inoltre se modifico qst ultimo cin:
da così cin<<mediateca.discografia.album; che è sbagliato a
così: cin>>mediateca.discografia.album;
mi da una serie di errori
:_doubt::_doubt::_doubt:xk tt a meeeeeee

Ultima modifica effettuata da wicca89 il 20/03/2010 alle 11:47
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:30
Sabato, 20/03/2010
Rispondo al problema del buffer da tastiera:
Come ti ho già detto, la funzione cin, quando trova qualcose nel buffer, lo legge senza aspettare l'input da tastiera.
Per ovviare a questo problema, si può forzare la pulitura del buffer tramite la funzione fflush( ) in questo modo:
Codice sorgente - presumibilmente Plain Text

  1. ...
  2.  fflush(stdin); // si svuota forzatamente il buffer
  3.  cin>>i; // operazione di input
  4.  ...


Se ti trovi a tuo agio con la funzione get(), usala.
Scusa, ma non capisco come mai ti ostini a far richiesta di inpit allefunzioni, nonostante il passaggio dei dati per parametro.
In questo modo, il programma perde molta flessibilità!

Per quanto riguarda la seconda traccia, inizia un nuovo topic.

( conunque, "album" indica una struct, quindi devi specificare a quale campo vuoi accedere.)

PM Quote
Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo