Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    78

    comportamento strano funzione list_search

    Salve ho il seguente programma che gestisce il parco auto di un autonoleggio,nell'inserire la prima auto è tutto ok,ma nell'inserimento della seconda auto con un numero di targa diverso,la funzione list search fa qualcosa di strano,insomma il risultato è che anche se la seconda auto ha una targa diversa mi viene stampato il messaggio :Impossibile inserire l'auto,perche' c'e' gia' un auto con la stessa targa....
    qualcuno può darmi una mano...ci sho sbattuto la testa tutto il giorno..grazie mille anticipatamente..


    codice:
      #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include<stdbool.h>
    struct SKey{
       char targa[11];
    };   
    typedef struct SKey TKey;
    struct SSat {
       char marca[16];
       char modello[16];
       int  km;
       bool disponibile;
    };
    typedef struct SSat TSat;
    struct SInfo{
          TKey key;
          TSat satellite;
    };
    typedef struct SInfo TInfo;
    struct SNode {
     TInfo info;
     struct SNode *link;
    };
    typedef struct SNode TNode;
    typedef TNode* TList;
    bool greater (TKey key1, TKey key2);
    bool lower (TKey key1, TKey key2);
    bool equal (TKey key1, TKey key2);
    void print_key (TKey key);
    void print_satellite (TSat sat);
    void print_info (TInfo info);
    TKey read_key ();
    TSat read_satellite ();
    TInfo read_info ();
     
     
    int menu();
    bool inserisci_auto(TList *list, TInfo info);
    int elimina_auto_vecchie(TList *list, int km);
    void visualizza_auto_disponibili(TList list);
    bool noleggia_auto(TList list, TKey key);
    bool restituisci_auto(TList list, TKey key, int km_percorsi);
    /*PROTOTIPI FUNZIONI SULLE LISTE*/
    TList list_create();
    TNode*list_search(TList list,TKey key);
    /**************************/
    TInfo leggi_info();
     
    main()
    {
          int scelta;
          TList list;
          TInfo info;
          /* Inizializzo la lista */
          list = list_create();
          /* Scelta della funzione per gestire la rubrica */
          while(scelta=menu()){
             switch(scelta){
                
                case 1:    system("CLS");
                           printf("\n--------------------\n");
                           printf("\nInserimento nuova auto\n");
                           printf("\n--------------------\n\n");
                           info=read_info();
                           
                           if(inserisci_auto(&list,info) == true)
                           printf("L'auto e'stata inserita correttamente nell'elenco\n");
                           else
                           printf("Impossibile inserire l'auto,perche' c'e' gia' un auto con la stessa targa\n");
                           
                           system("pause");                                       
                           break;             
               
                
                case 2:    system("CLS");
                           printf("\n---------------------------------\n");
                           printf("\nEliminazione auto vecchie\n");
                           printf("\n---------------------------------\n\n");            
                           /* da completare */
                           system("PAUSE");
                           break;             
                
                case 3:    system("CLS");
                           printf("\n-------------------------------------\n");
                           printf("\nVisualizza auto disponibili\n");
                           printf("\n-------------------------------------\n");
                           /* da completare */
                           system("PAUSE");
                           break;             
               
                case 4:    system("CLS");
                           printf("\n-------------------------------------\n");
                           printf("\nNoleggio auto\n");
                           printf("\n-------------------------------------\n");
                           /* da completare */
                           system("PAUSE");
                           break;             
                
                case 5:    system("CLS");
                           printf("\n-------------------------------------\n");
                           printf("\nRestituzione auto\n");
                           printf("\n-------------------------------------\n");
                           /* da completare */
                           system("PAUSE");
                           break;             
              }
          }
          system("PAUSE");  
    }   
    
    int menu()
    {
        int scelta;
        
        system("CLS");
        printf("-------------------------------------------------\n");
        printf("PROGRAMMA PER LA GESTIONE DI UN AUTONOLEGGIO\n\n");
        printf("1. Inserimento nuova auto\n");
        printf("2. Eliminazione auto vecchie\n");
        printf("3. Visualizza auto disponibili\n");
        printf("4. Noleggio auto\n");
        printf("5. Restituzione auto\n");
        printf("0. EXIT\n\n");
        printf("-------------------------------------------------\n");
        printf("Selezionare la scelta [0-5]: ");
        scanf("%d", &scelta);
        while((scelta<0)||(scelta>5)){
           printf("ERRORE! valore non consentito\n");                        
           printf("Selezionare la scelta [0-5]: ");
           scanf("%d", &scelta);
        }
        return scelta;
       system("PAUSE");
    }
    
    /*FUNZIONI SULLE LISTE*/
      TList list_create(){
          return NULL;
                      }
     
      TList list_insert (TList list, TInfo info){
      TList prec, curr, new_node;
      prec=NULL;
      curr=list;
      /* F1: ricerca della posizione di inserimento */
      while  ((curr!=NULL) && (greater(info.key, curr->info.key)==true) ){
        prec=curr;
        curr=curr->link;
      }
      /* F2: allocazione del nuovo nodo */
      new_node=(TNode *) malloc (sizeof(TNode));
      if (new_node==NULL)
      {
        printf("Non e’ possibile allocare l’elemento\n");
        exit(1);
      }
      new_node->info=info;
      /* F3: aggiornamento della catena dei collegamenti */
      if (prec==NULL)
      {
        /* C1: inserimento in Testa */
        new_node->link=list;
        list=new_node;
        return list;
      }
      else {
        /* C2: inserimento in posizione centrale o in coda */
        prec->link=new_node; 
        new_node->link=curr;
        return list;
      }
    }
          
     
    
    TNode*list_search(TList list,TKey key){/*viene passata attraverso TKey key la targa?*/
      TNode *curr;
      curr=list;
      while((curr!=NULL) && (greater(key, curr->info.key)== true) )/*a detta della traccia questo confronto viene fatto tra le targhe*/
      /*printf("siamo all'interno della funzione list_search il valore di key e'%d\n\n\n",key);*/
      /*printf("siamo all'interno della funzione list_search il valore di curr->info.key e'%d",curr->info.key);*/
      {
        curr=curr->link;
      }
      /* Analisi delle post - condizioni
      C1: valore da cercare piu’
          piccolo della Testa :      curr != NULL
      C2: valore da cercare maggiore
          della Coda :        curr != NULL
      C3: valore da cercare compreso tra
          quello di Testa e quello di Coda :   curr->info>=info
      */
      if ((curr!=NULL) && (equal(curr->info.key, key)==true) )
      /* Elemento trovato */
         return curr;
      else
         return NULL;
    }
               
               
          
    /*FUNZIONI BOOLEANE*/
    bool greater (TKey key1, TKey key2)
    {
       if (strcmp(key1.targa, key2.targa)>0)
          return true;
       else
          return false;
    }
    bool lower (TKey key1, TKey key2)
    {
       if (strcmp(key1.targa, key2.targa)<0)
          return true;
       else
          return false;
    }
    bool equal(TKey key1, TKey key2)
    {
       if (strcmp(key1.targa, key2.targa)==0)
          return true;
       else 
          return false;
    }
     
    
    /*FUNZIONI PER INFO E SATELLITE*/
    TKey read_key(){
         
         TKey key;
         printf("Inserisci la targa: ");
         scanf("%s",key.targa);
         return key;
                   }
    TSat read_satellite(){
         TSat sat;
         printf("Inserisci la marca: ");
         scanf("%s",sat.marca);
         printf("Inserisci il modello: ");
         scanf("%s",sat.modello);
         sat.km=0;
         sat.disponibile=true;
         return sat;
                           }
                             
    TInfo read_info()
    {
          TInfo info;
          TKey key;
          
          key=read_key();
          info.satellite=read_satellite();
    }
    
    /*FUNZIONI SPECIFICHE RICHIESTE DALLA TRACCIA*/
          
    bool inserisci_auto(TList *list, TInfo info){
         
         TNode*node;
         
         node=list_search(*list,info.key); 
         if(node==NULL)
         {
        *list=list_insert(*list,info);
         return true;
         }
         else
         return false;
         
         
         
         
         
                          
        
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Come mai la read_info non restituisce alcun valore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    78
    grz della risposta..ma ho inserito il return info...ma il programma mi da sempre lo stesso problema...è davvero strano....qualkosa mi sfugge,il problema è che quando inserisco la seconda targa DIVERSA DALLA PRIMA la seguente riga di codice:
    codice:
    if ((curr!=NULL) && (equal(curr->info.key, key)==true) )
    contenuta nella funzione
    codice:
    TNode*list_search(TList list,TKey key)
    anzichè ritornare NULL ritorna curr....

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sempre nella read_info non assegni la targa alla struttura info ...

    P.S. Ma l'hai fatto un minimo di debugging ? Come compilavi senza restituire il valore dalla funzione? Quale compilatore non ti avvisa?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    78
    ok ho risolto..bisogna correggere....
    codice:
    info.key=read_key();
    ..grazie mille per l'aiuto....
    sei geniale

    devc++..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Lascialo perdere il devc++ ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    78
    e che devo usare?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Qualsiasi altro IDE e compilatore ...

    Con Windows uso sempre Visual Studio e la prima cosa che ha rilevato compilando è che la funzione non restituiva un valore.
    Appena corretto, con un breakpoint nella funzione, il contenuto di info ha rilevato la mancanza della targa ... 3 minuti ...

    Puoi anche usare Code::Blocks ... ma evita Devc++ ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    78
    grazie ancora...a saperlo prima...

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.