Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44

    [C] funzione vettore di liste

    ciao a tutti, sto cercando di risolvere la 3funzione:
    - una funzione che riceve un nuovo elemento (cognome, nome) e il codice del volo; se il numero di posti disponibili del volo è maggiore di zero, la funzione deve effettuare l'inserimento del cognome e nome nella lista delle prenotazioni o degli acquisti, a secondo della richiesta del cliente (si può passare un parametro formale o chiedere direttamente al cliente se vuole fare una prenotazione o un acquisto). In ogni caso il numero dei posti disponibili deve essere decrementato di uno, dopo aver fatto l'inserimento in una delle 2 liste
    ecco il testo della funzione

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define FLUSH while(getchar()!='\n')
    
    /*****tipobaseList*******/
    #define STR 20
    typedef struct{
            char cognome[STR], nome[STR];
    }tipobaseList;
    
    int Confronta(tipobaseList a, tipobaseList b){
        if(!strcmp(a.cognome,b.cognome)) 
             return(strcmp(a.nome, b.nome));
        else return(strcmp(a.cognome, b.cognome));     
    }
    
    void LeggiStringa(char s[], unsigned int dim){
         unsigned int i=0;
         for(i=0; i<dim-1 && (s[i]=getchar())!='\n';i++)
             s[i]='\0';
         if(i==dim-1) while(getchar()!='\n');    
    }
    
    void  LeggiElemento(tipobaseList *x){
         printf("\nInserisci cognome: ");
         LeggiStringa(x->cognome, STR);
         printf("\nInserici nome: ");
         LeggiStringa(x->nome, STR);
    }
    
    /********list*************/
    #define LISTAVUOTA NULL
    
    typedef struct nodoList{
           tipobaseList info;
           struct nodoList *next;
    } *list;
    
    typedef short boolean;
    typedef list position;
    
    void MakeNullList(list *l){
         *l=LISTAVUOTA;
    }
    
    boolean EmptyList(list l){
            return(l==LISTAVUOTA);
    }
    
    boolean  FullList(list l){
           return(0);
    }
    
    position End(list l){
            if(l==LISTAVUOTA) return(LISTAVUOTA);
            while(l->next!=LISTAVUOTA)
                  l=l->next;
                  return(l);
    }
    
    position First(list l){
             return(LISTAVUOTA);
    }
    
    void InsertList(list *l, position p,tipobaseList x){
         struct nodoList *tmp;
         if(!FullList(*l)){
                       tmp=(struct nodoList *) malloc(sizeof(struct nodoList));
                       tmp->info=x;
                       if(p==LISTAVUOTA){
                                         tmp->next=*l;
                                         *l=tmp;
                       }else{
                             tmp->next=p->next;
                             p->next=tmp;
                       }
         }
    }
    
    void DeleteList(list *l, position p){
         struct nodoList *tmp;
         if(p==LISTAVUOTA){
                           tmp=(*l)->next;
                           free(*l);
                           *l=tmp;
         }else {
               tmp=p->next;
               p->next=tmp->next;
               free(tmp);
         }
    }
    
    position Next(list l, position p){
             if(p==LISTAVUOTA) return(l);
             else return(p->next);
    }
    
    tipobaseList Retrieve(list l, position p){
                 if(l==LISTAVUOTA) return(l->info);
                 else return(l->next->info);
    }
    
    position Locate(list l, tipobaseList x){
             if(!EmptyList(l)){
                    if(!Confronta(l->info,x)) return(LISTAVUOTA);
                    while(l->next!=LISTAVUOTA){
                           if(!Confronta(l->next->info,x)) return(l);
                           l=l->next;                    
                    } return(l);           
             }
    }
    
    
    
    /*****archivio*******/
    typedef struct{
            unsigned int posti_disponibili;
            list posti_acquistati;
            list posti_prenotati;
    }archivio;
    archivio *archivio_voli;
    
    void AllocaVettore(archivio **x, unsigned int n){
         *x=(archivio *)malloc(n*sizeof(archivio));
    }
    
    void InizializzaVettore(archivio *x, unsigned int n){
         unsigned int i=0, s=0;
         for(i=0; i<n; i++){
            printf("Numero posti disponibili del volo <%u> ? ", i);
            scanf("%u", &s);
            FLUSH;
            (x+1)->posti_disponibili=s;
            MakeNullList(&((x+1)->posti_acquistati));
            MakeNullList(&((x+1)->posti_prenotati));
         }
    }
    
    /**************3 funzione****************/
    void Insord(list *l,tipobaseList x){
         position p,u;
         tipobaseList tmp;
         if(EmptyList(*l))
               InsertList(l,First(*l),x);
         else {
              p=First(*l);
              u=End(*l);
              while(p!=u) {
                          tmp=Retrieve(*l,p);
                          if(Confronta(tmp,x)<0) p=Next(*l,p);
                          else break;
              }
              InsertList(l,p,x);
         }
    }
    
    
    void InserimentoPrenotazione(list *l,tipobaseList a){
         position p;
         if(!EmptyList(*l)) p=Locate(*l,a);
         if(EmptyList(*l) || p==End(*l)){
         Insord(l,a);
         } else printf("\nPasseggiero gia' presente");
    }
    
    void InserimentoAcquisto(list *l,tipobaseList a){
         position p;
         if(!EmptyList(*l)) p=Locate(*l,a);
         if(EmptyList(*l) || p==End(*l)){
         Insord(l,a);
         } else printf("\nPasseggiero gia' presente");
    }
    void Inserisci(archivio *x, tipobaseList a){
         unsigned int v, c;
         printf("Codice volo? ");
         scanf("%u%", &v);
         FLUSH;
         if(x->posti_disponibili>0){
                             printf("1-prenota ");
                             printf("2-acquista ");
                             scanf("%u%", &c);
                             FLUSH;
                             if(c==1) InserimentoPrenotazione(&(x->posti_prenotati), a);
                             if(c==2) InserimentoAcquisto(&(x->posti_acquistati), a);
                             x->posti_disponibili--;
         }else (printf("\nNumero posti disponibili esutito"));
    }
    
    main (){
         unsigned int n, scelta;
         tipobaseList persona;
         
          do{
            printf("\n/**********ARCHIVIO VOLI***************/");
            printf("\n1-Alloca Vettore");
            printf("\n2-Numero posti disponibili");
            printf("\n3-Inserimento");
            printf("\n4-Conferma acquisto");
            printf("\n5-Esci");
            printf("\nscelta--------------->");
            scanf("%u", &scelta);
            switch(scelta){
                       case 1: do{
                                  printf("\nInserisci il numero di elementi del vettore: ");
                                  scanf("%u",&n);
                                  FLUSH;
                               }while(n<2); 
                               
                               AllocaVettore(&archivio_voli, n);
                               break;
                       case 2: InizializzaVettore(archivio_voli, n);
                               break;
                       case 3: LeggiElemento(&persona);
                               Inserisci(archivio_voli[...], persona);
                               break;
                       case 4: 
                        
                                   
                           
            }
                           
         }while(scelta<4);
         
    }
    1- con la funzione LeggiElemento non riesco a inserire cognome e nome da tastiera
    2- come faccio a passare il codice del volo alla funzione Inserisci???

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476

    Re: [C] funzione vettore di liste

    Originariamente inviato da livrea
    1- con la funzione LeggiElemento non riesco a inserire cognome e nome da tastiera
    Cioè? Cosa succede?

    Hai controllato la funzione?

    Chi ha scritto quella funzione?

    Devi usare proprio quella?

    2- come faccio a passare il codice del volo alla funzione Inserisci???
    Non lo passi dato che lo chiedi dentro la Inserisci.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44
    La funzione LeggiElemento l'ho fatta io, per leggere da tastiera nome e cognome, ma non mi fa inserire il cognome.

    Mentre la funzione Inserisci dopo che inserisco il codice del volo si blocca il programma.
    ps: non so se il richiamo della funzione è giusto

    codice:
    void Inserisci(archivio *x, tipobaseList a){
         unsigned int v, c;
         printf("Codice volo? ");
         scanf("%u%", &v);
         FLUSH;
         if(x->posti_disponibili>0){
                             printf("1-prenota ");
                             printf("2-acquista ");
                             scanf("%u%", &c);
                             FLUSH;
                             if(c==1) InserimentoPrenotazione(&(x->posti_prenotati), a);
                             if(c==2) InserimentoAcquisto(&(x->posti_acquistati), a);
                             x->posti_disponibili--;
         }else (printf("\nNumero posti disponibili esutito"));
    }
    
    main (){
         unsigned int n,v, scelta;
         tipobaseList persona;
         
          do{
            printf("\n/**********ARCHIVIO VOLI***************/");
            printf("\n1-Alloca Vettore");
            printf("\n2-Numero posti disponibili");
            printf("\n3-Inserimento");
            printf("\n4-Conferma acquisto");
            printf("\n5-Esci");
            printf("\nscelta--------------->");
            scanf("%u", &scelta);
            switch(scelta){
                       case 1: do{
                                  printf("\nInserisci il numero di elementi del vettore: ");
                                  scanf("%u",&n);
                                  FLUSH;
                               }while(n<2); 
                               
                               AllocaVettore(&archivio_voli, n);
                               break;
                       case 2: InizializzaVettore(archivio_voli, n);
                               break;
                       case 3: LeggiElemento(&persona);
                               Inserisci(&archivio_voli[v], persona);
                               break;
                       //case 4: 
                        
                                   
                           
            }
                           
         }while(scelta<4);
         
    }

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: [C] funzione vettore di liste

    Originariamente inviato da livrea
    codice:
    void LeggiStringa(char s[], unsigned int dim){
         unsigned int i=0;
         for(i=0; i<dim-1 && (s[i]=getchar())!='\n';i++)
             s[i]='\0';
         if(i==dim-1) while(getchar()!='\n');    
    }
    1- con la funzione LeggiElemento non riesco a inserire cognome e nome da tastiera
    Perché ogni volta con l' istruzione s[i]='\0' sovrascrivi il carattere letto e ci scrivi un carattere nullo.Il terminatore va aggiunto solo alla fine della stringa.
    Modifica la funzione così:

    codice:
    void LeggiStringa(char s[], unsigned int dim)
    {
        unsigned int i=0;
        for(i=0; i<dim-1 && (s[i]=getchar())!='\n';i++)
            ;
        s[i]=0;
        if(i==dim-1)
            while(getchar()!='\n');
    }
    E tieni presente che c'è anche fgets.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44
    up

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44

    Re: Re: [C] funzione vettore di liste

    Originariamente inviato da Who am I
    Perché ogni volta con l' istruzione s[i]='\0' sovrascrivi il carattere letto e ci scrivi un carattere nullo.Il terminatore va aggiunto solo alla fine della stringa.
    Modifica la funzione così:

    codice:
    void LeggiStringa(char s[], unsigned int dim)
    {
        unsigned int i=0;
        for(i=0; i<dim-1 && (s[i]=getchar())!='\n';i++)
            ;
        s[i]=0;
        if(i==dim-1)
            while(getchar()!='\n');
    }
    E tieni presente che c'è anche fgets.
    non funziona ugualmente mi visualizza
    cognome e subito nome, senza avere la possibilità di inserire il cognome.

    qualcuno che mi aiuta con la funzione Inserisci?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Devi aggiungere una

    FLUSH;

    dopo la linea

    scanf("%u", &scelta);

    altrimenti quella funzione non lavora correttamente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44
    ok adesso riesco a inserire correttamente cognome e nome, ma rimane il problema della funzione Inserisci

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Ti sembra che qualcosa non vada in

    scanf("%u%", &v);

    e in

    scanf("%u%", &c);

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    44
    Originariamente inviato da oregon
    Ti sembra che qualcosa non vada in

    scanf("%u%", &v);

    e in

    scanf("%u%", &c);

    ?
    vero scusami ma sono ormai fusa

    scanf("%u", &v);

    e in

    scanf("%u", &c);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.