Visualizzazione risultati 1 fino 8 di 8

Discussione: Aiutino programma C!

  1. #1
    Ufobm non è connesso Utente attivo
    Data registrazione
    06-12-2004
    Messaggi
    432

    Predefinito Aiutino programma C!

    Ciao! Potreste darmi una mano? E' anche un pò urgente a dire la verità... Vi posto un codice in cui si usano puntatori, funzioni, liste e altre cose varie... Non capisco come farlo funzionare! Date un'occhiata e aiutatemi per favore!
    Ecco:
    Codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef char stringa[100];
    typedef struct EL {
            int codice_fatt;
            stringa descrizione;
            float importo;
            struct EL *fatt_prec;
            struct EL *fatt_succ;
            } fattura;
    typedef fattura *lista_fatture;
    
    void inizializza(lista_fatture *lista);
    int controlla_doppi(lista_fatture *lista, stringa descrizione);
    void inserisci(lista_fatture *lista, stringa descrizione, float importo, int codice);
    void inserisci_int(lista_fatture *lista, stringa descrizione, float importo, int codice);
    void stampa(lista_fatture *lista);
    
    main()
    {
          lista_fatture fatture2007, fatture2008;
          char azione='x';
          int progr1=0, progr2=0;
          stringa descrizione;
          float importo;
          int anno;
          int doppio;
          
          inizializza(&fatture2007);
          inizializza(&fatture2008);
          
          while(1)
          {
                  printf("Cosa vuoi fare?\nInserisci fattura(i)   -   Stampa archivio(s)   -   Esci(e)\n");
                  scanf(" %c",&azione);
                  if(azione=='e')
                  {
                          exit(1);
                  }
                  else if(azione=='i')
                  {
                       printf("\nInserisci descrizione: ");
                       scanf("%s",&descrizione);
                       printf("Inserisci importo: ");
                       scanf("%f",&importo);
                       printf("Inserisci anno: ");
                       scanf("%d",&anno);   
                       if(anno==2007)   
                       {
                              doppio=controlla_doppi(&fatture2007, descrizione);
                              if (doppio==0)
                              {
                                     progr1=progr1+1;
                                     inserisci(&fatture2007,descrizione,importo,progr1);
                              }   
                       }  
                       else if(anno==2008)   
                       {
                              doppio=controlla_doppi(&fatture2008, descrizione);
                              if (doppio==0)
                              {
                                     progr2=progr2+1;
                                     inserisci(&fatture2008,descrizione,importo,progr2);
                              }   
                       }  
                       printf("\n");    
                  }
                  else if(azione=='s')
                  {
                       printf("Inserisci anno da stampare: ");
                       scanf("%d",&anno);
                       if(anno==2007)
                         stampa(&fatture2007);
                       else if(anno==2008)
                         stampa(&fatture2008);
                  }       
          }
          
    }
          
          
          
    void inizializza(lista_fatture *lista)
    {
          *lista=NULL;
    }
    
    
    
    int controlla_doppi(lista_fatture *lista, stringa descrizione)
    {
        while(*lista!=NULL)
        {
               if(!strcmp((*lista)->descrizione, descrizione))
               {
                   return 1;
               }
               else
               {
                   *lista=(*lista)->fatt_succ;
               }
        }
        return 0;
    }
    
    
    
    void inserisci(lista_fatture *lista, stringa descrizione, float importo, int codice)
    {       
         if(*lista==NULL)
         {                  
                 *lista=(lista_fatture)malloc(sizeof(fattura));
                 (*lista)->codice_fatt=codice;
                 (*lista)->importo=importo;
                 strcpy((*lista)->descrizione,descrizione);
                 (*lista)->fatt_prec=NULL;
                 (*lista)->fatt_succ=NULL;
         }  
         else
         {
                 inserisci_int(lista, descrizione, importo, codice);
         }   
    }
    
    
    void inserisci_int(lista_fatture *lista, stringa descrizione, float importo, int codice)
    {     
         if((*lista)->fatt_succ==NULL)
         {
                 lista_fatture p;                   
                 p=(lista_fatture)malloc(sizeof(fattura));
                 p->codice_fatt=codice;
                 p->importo=importo;
                 strcpy(p->descrizione,descrizione);
                 p->fatt_prec=*lista;
                 p->fatt_succ=NULL;
                 (*lista)->fatt_succ=p;
         }
         else
         {
                 inserisci_int(&((*lista)->fatt_succ), descrizione, importo, codice);
         }            
    }
    
    
    
    void stampa(lista_fatture *lista)
    {
         lista_fatture p=*lista;
         char verso='x';
         printf("Stampare dal primo all'ultimo(p) o dall'ultimo al primo(u)?");
         scanf(" %c",&verso);
         if(verso=='p')
         {
               printf("\n\n");
               while(p!=NULL)
               {
                      printf("Codice: %d\nDescrizione: %s\nImporto: %f\n\n",p->codice_fatt,p->descrizione,p->importo);
                      p=p->fatt_succ;
               }      
         }  
         else if(verso=='u')
         {
              printf("\n\n");
              
              while(p->fatt_succ!=NULL)
              {
                     p=p->fatt_succ;
              }
              while(p!=NULL)
              {
                     printf("Codice: %d\nDescrizione: %s\nImporto: %f\n\n",p->codice_fatt,p->descrizione,p->importo);
                     p=p->fatt_prec;
              } 
         } 
    }
    Grazie mille davvero !

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Ma cos'è che fa o non fa? L'hai compilato? Ci sono errori e/o warnings? Esplode? Non fa nulla? Perché? Cosa dovrebbe fare e cosa fa? Quando?


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  3. #3
    Ufobm non è connesso Utente attivo
    Data registrazione
    06-12-2004
    Messaggi
    432

    Predefinito

    No warning né error! Dovrebbe inserire in una lista dinamica delle fatture ricevute in input e stamparle!

    Però stampa solo l'ultima! E non so perché! Forse si perde il puntatore alla testa o che sò! Probabilmente è un errore stupido ma non riesco a capire...

  4. #4
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    Ho capito quello che volevi e il programma l'ho rifatto da me, per tenermi in esercizio, e non ho guardato più di tanto il tuo, anche perchè alcune cose non mi piacevano. Vedi se ti va bene, se no appena ho un attimo darò uno sguardo al tuo.

    Codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct fattura {
    	int codice;
       char *descrizione;
       float importo;
       int anno;
       struct fattura *prev;
       struct fattura *next;
    };
    
    struct fattura *fatt, *temp;
    
    int controlla_doppi(struct fattura *, char *);
    struct fattura *inserisci(struct fattura *, int, char *, float , int);
    void stampa(struct fattura *, int);
    
    int main(int argc, char *argv[]) {
       char descr[100];
       float importo;
       int anno, doppio, azione;
       int cod1 = 0, cod2 = 0;
          
       fatt = NULL;
    	temp = NULL;
             
       while(1) {
    	   printf("_Inserisci fattura(1) - Stampa archivio(2) - Esci(0) ...  ");
          scanf("%d", &azione);
          if(azione == 0) {
    	      printf("_Programma terminato\n");
    	      break;
          }
          else if(azione == 1) {
             printf("_Inserisci descrizione: ");
             scanf("%s", descr);
             printf("_Inserisci importo: ");
             scanf("%f", &importo);
             printf("_Inserisci anno: ");
             scanf("%d", &anno);   
    	     	doppio = controlla_doppi(fatt, descr);
             if(doppio == 0) {
             	if(anno == 2007) {
               		cod1++;
                   temp = inserisci(temp, cod1, descr, importo, anno);
                }   
    	         else if(anno == 2008) {
     	         	cod2++;
                   temp = inserisci(temp, cod2, descr, importo, anno);
       			}   
             }
             else {
             	printf("_Descrizione già esistente\n");
             }  
    		}
    	   else if(azione == 2) {
          	printf("_Inserisci anno da stampare: ");
             scanf("%d", &anno);
             stampa(fatt, anno);
          }
          else {
          	printf("_Azione non valida\n");
          	break;
          }      
    	}
    	return 0;
    }
          
    int controlla_doppi(struct fattura *p, char *descr) {
    	while(p != NULL) {
        	if( strcmp(p->descrizione, descr) == 0) {
    	      return 1;
          }
          else {
             p = p->next;
          }
    	}
    	return 0;
    }
    
    struct fattura *inserisci(struct fattura *p, int codice, char *descr, float importo, int anno) {       
    	struct fattura *punt;
    	if(p == NULL)  {                  
    	   punt = (struct fattura *)malloc(sizeof(struct fattura));
          punt->codice = codice;
          punt->descrizione = malloc(strlen(descr)+1);
          strcpy(punt->descrizione, descr);
          punt->importo = importo;
          punt->anno = anno;
          punt->prev = NULL;
          punt->next = NULL;
          fatt = punt;
          temp = punt;
       }  
       else {
          punt = (struct fattura *)malloc(sizeof(struct fattura));
          punt->codice = codice;
          punt->descrizione = malloc(strlen(descr)+1);
          strcpy(punt->descrizione, descr);
          punt->importo = importo;
          punt->anno = anno;
          punt->prev = p;
          punt->next = NULL;
          temp->next = punt;
          temp = punt;
       }
       return (temp);   
    }
    
    void stampa(struct fattura *p, int anno) {
    	int verso;
       printf("Stampare dalla testa(1) o dalla coda(2)? ...  ");
       scanf("%d", &verso);
       if(verso == 1) {
       	while(p != NULL) {
       		if ( p->anno == anno ) {
    	      	printf("*Cod: %d - Descr: %s - Imp: %f\n", p->codice, p->descrizione, p->importo);
     	   	}
     	   	p = p->next;
    	  	}      
       }  
       else if(verso == 2) {
    		while(p-> next != NULL) {
    	      p = p->next;
          }
          while(p != NULL) {
    	      printf("*Cod: %d - Descr: %s - Imp: %f\n", p->codice, p->descrizione, p->importo);
             p = p->prev;
          } 
       }
    }


    -- Aut Roma Aut Nihil!

  5. #5
    Ufobm non è connesso Utente attivo
    Data registrazione
    06-12-2004
    Messaggi
    432

    Predefinito

    Ciao!
    Ho visto la tua soluzione e ti ringrazio, anche se vorrei capire cosa ho sbagliato io! In particolare tu la fai troppo facile con i puntatori perché fai una funzione invece che una procedura :P ! Poi quando la p non è NULL tu vai ad inserire nella seconda posizione... Ma perdi le altre fatture o sbaglio...? Non mi è chiaro quel passaggio! Comunque se avessi voglia di dare un'occhiata al mio ti sarei grato! Grazie mille!

  6. #6
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    In particolare tu la fai troppo facile con i puntatori perché fai una funzione invece che una procedura :P !
    Non capisco questa affermazione, spiegamela meglio.
    Inoltre una cosa che mi hanno sempre insegnata è che nella dichiarazione delle funzioni devi passare solo il tipo di dato, non anche il nome.

    Poi quando la p non è NULL tu vai ad inserire nella seconda posizione... Ma perdi le altre fatture o sbaglio...? Non mi è chiaro quel passaggio!
    No no, io salvo tutto. Provalo, inserisci le fatture e poi stampale, le troverai tutte... Quando p != NULL, io inserisco in coda e aggiorno i relativi puntatori next e prev. Quando p == NULL, devi salvare l'indirizzo della prima struttura per avere e mantenere la testa.


    Comunque se avessi voglia di dare un'occhiata al mio ti sarei grato! Grazie mille!
    Nel pomeriggio quando passo su linux vedo di dargli un'occhiata, ciao!


    -- Aut Roma Aut Nihil!

  7. #7
    Ufobm non è connesso Utente attivo
    Data registrazione
    06-12-2004
    Messaggi
    432

    Predefinito

    Sisi funziona hai ragione! Non avevo visto il discorso fatt e temp ! Quindi mi sembrava che non collegassi alla fine il next del precedente! Dopo rileggendo riga per riga ho visto anche quella! Comunque ho capito, ti faccio anche i miei complimenti per lo stile di programmazione! Il mio discorso, è che siccome mi stavo esercitando per scuola volevo fare qualcosa di più intrecciato (lo so che non ha senso e si spreca un sacco ma poi purtroppo a scuola vogliono così perché sono CATTIVI !) mentre tu hai eliminato i doppi puntatori e hai dichiarato globali alcune variabili che invece io passavo per indirizzo! L'hai semplificato e hai fatto benissimo, se non fosse per ciò che ti ho spiegato (tra l'altro il programma stesso che sto creando è inutile perché se fosse per me salverei almeno almeno in un file di testo... Altrimenti chi è che si mette a scrivere di volta in volta tutte le fatture?!? eheh!)!
    Grazie mille ancora!!

  8. #8
    L'avatar di seneca
    seneca non è connesso Super Moderatore
    Data registrazione
    18-12-2004
    Residenza
    la Città Eterna
    Messaggi
    8,376

    Predefinito

    Di niente, ciao!


    -- Aut Roma Aut Nihil!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •