Oppure

Loading
19/03/10 23:31
Matthew
Un'altro problemino: la funziona aggiungi così com'è contiene un argomento di troppo. Il secondo argomento infatti è inutilizzato. Non so se la traccia che stai seguendo vada proprio seguita alla lettera. Potresti semplicemente eliminare quell'argomento. Se però la traccia va seguita alla lettera, sarebbe meglio creare il nuovo libro nella funzione principale e poi passarlo a quella di inserimento.
aaa
19/03/10 23:40
Matthew
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.
aaa
19/03/10 23:52
Poggi Marco
Effettivamente, ci potrebbero essere dei problemi con le lettere maiuscole e minuscole.
aaa
19/03/10 23:53
Matthew
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 19/03/10 23:56
aaa
20/03/10 0:24
Poggi Marco
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.
aaa
20/03/10 0:30
Matthew
Postato originariamente da Poggi Marco:

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
aaa
20/03/10 8:52
wicca89
scusa ma dovee inserisci 3 2 1??? cmq l'ho completato e modificato ancora:

#include  <iostream>
#include <stdlib.h> 
#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;
};

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

int main() {
    struct Topera opera;
    struct Tgalleria galleria;
    galleria.numero=0;
    int scelta=1;
    char ch;
    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:
                   ordina(galleria, ch);
            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 aggiungi(Tgalleria& galleria , Topera& opera){

     cout<<"Inserisci il titolo dell'opera da aggiungere nella galleria: ";
     cin.getline(galleria.opera[galleria.numero].titolo,101);
     cout<<"Inserisci l'autore del titolo dell'opera da aggiungere nella galleria: ";
     cin.getline(galleria.opera[galleria.numero].autore,101);
     cout<<"Inserisci la data di creazione: ";
     cin>>galleria.opera[galleria.numero].data.gg>>galleria.opera[galleria.numero].data.mm>>galleria.opera[galleria.numero].data.aa;
     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){
             galleria.numero--;
             scambia(galleria.opera[i],galleria.opera[galleria.numero]);
             cout<<"Elemento eliminato"<<endl;
             return;
         }
         i++;
     }
     cout<<"Impossibile eliminare, elemento non esistente"<<endl;
}

void ordina(Tgalleria& galleria, char ch){
     int i,j,s,ap;
     Tdata x1,x2;
     cout<<"Ordina per: titolo ('t'),autore ('a'), data di creazione ('d'), prezzo ('p'): ";
     cin>>ch;
     if((ch=='t')||(ch=='a')||(ch=='d')||(ch=='p')){
        switch(ch){
                   case 't':
                     for(i=0;i<galleria.numero;++i){
                       for(j=galleria.numero-1;j>=i+1;j--){
                          if(strcmp(galleria.opera[j-1].titolo,galleria.opera[j].titolo)==1){
                                          scambia(galleria.opera[j],galleria.opera[j-1]);
                                          }}}
                   break;
                   case 'a':
                        for(i=0;i<galleria.numero;++i){
                         for(j=galleria.numero-1;j>=i+1;j--){
                          if(strcmp(galleria.opera[j-1].autore,galleria.opera[j].autore)==1){
                                          scambia(galleria.opera[j],galleria.opera[j-1]);
                                          }}}
                   break;
                   case 'd':
                        for(i=0;i<galleria.numero;++i){
                         for(j=galleria.numero-1;j>=i+1;j--){
                                                             x1=galleria.opera[j].data;
                                                             x2=galleria.opera[j-1].data;
                          s=x1.aa*10000+x1.mm*100+x1.gg;
                          ap=x2.aa*10000+x2.mm*100+x2.gg;   
                          if(s<ap){
                                  scambia(galleria.opera[j],galleria.opera[j-1]);}}}
                   break;
                   case 'p':
                        for(i=0;i<galleria.numero;++i){
                         for(j=galleria.numero-1;j>=i+1;j--){
                                                             
                         if(galleria.opera[j].prezzo<galleria.opera[j-1].prezzo){
                                   scambia(galleria.opera[j],galleria.opera[j-1]);}}}
                         break;
                               }
                               }}
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 scambia(Topera& x1, Topera& x2){
     Topera s;
     s=x1;
     x1=x2;
     x2=s;
     }                                                              

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
aaa
20/03/10 10:43
wicca89
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:
void aggiungiAlbum(struct Tmediateca& , char [],char []);

nel main:
 aggiungiAlbum(mediateca,autore,album)

dopo il main:
void aggiungiAlbum(Tmediateca& mediateca, char autore[],char album[]){
     int i=0;
     int scelta;
     Tdiscografia discografia;
     cout<<"Nome dell'autore della discografia: ";
     cin>>autore;
     for(i=0;i<mediateca.numero;i++){
                                     if(strcmp(mediateca.discografia[i].autore,autore){
                                                                                       cout<<"Nome album: ";
                                                                                       cin<<mediateca.discografia[i].album;
                                                                                       }
                                                                                       }
                                                                                       }

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[i].album; che è sbagliato a
così: cin>>mediateca.discografia[i].album;
mi da una serie di errori
:_doubt::_doubt::_doubt:xk tt a meeeeeee
Ultima modifica effettuata da wicca89 20/03/10 10:47
aaa