Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    33

    Controllate questo codice?

    Salve a tutti. Ho scritto questo codice per creare un programma seguendo i punti di un esercizio.
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_CHARS 50
    #define MAX_ELEM 200
    #define FILE_PRED "registro_cont.txt"
    
      struct studente {             
             char nome[MAX_CHARS];
             char cognome[MAX_CHARS];
             } io={"Pinco","Pallino"};
             
      struct contribuenti {
             char nome[MAX_CHARS];
             char cognome[MAX_CHARS];
             char codice_fiscale[16];
             char indirizzo[MAX_CHARS];
             double reddito;    
             };
             
      //PROTOTIPI
      int inserisci (struct contribuenti elenco_contribuenti[], int n);     
      int media_reddito (struct contribuenti elenco_contribuenti[], int n);
      int visualizza (struct contribuenti elenco_contribuenti[], int n);
      int salva_elenco (struct contribuenti elenco_contribuenti[], int n);
      int cerca_codice_fiscale (struct contribuenti elenco_contribuenti[], int n);
      int cerca_reddito(struct contribuenti elenco_contribuenti[], int n); 
               
      //Inizio programma
    int main(int argc, char *argv[])                                     
    {
      struct contribuenti elenco_contribuenti[MAX_ELEM];              //Stampa i dati dell'autore
          
             printf(" Autore del programma:\n");
             printf("------------------------------\n");
             printf(" Nome:      %s\n Cognome:   %s\n",io.nome,io.cognome);
             printf("------------------------------\n");
      
     
    
      
      int scelta;
      int n=0;
        
      do {
           printf("\nScegli dall'elenco l'opzione che desideri fare.\n");    //Menù principale
           printf(" 1: Aggiungere nuovo individuo\n");
           printf(" 2: Calcola il reddito medio dell'elenco\n");
           printf(" 3: Visualizza la lista\n");
           printf(" 4: Salva elenco su un file\n");
           printf(" 5: Cerca per codice fiscale\n");
           printf(" 6: Cerca per fascia di reddito\n");
           printf(" 0: Uscita\n\n");
           printf("Scelta: ");
           scanf("%d", &scelta);
                  switch(scelta){
                            case 1:{
                                   n=inserisci (elenco_contribuenti,n);   
                                   break;}
                            case 2:{
                                   FILE*fp=fopen(FILE_PRED,"r");
                                   if(fp==NULL) {printf("C'e' stato un errore\n");}
                                   while (feof(fp)==0)
                                   {
                                     fscanf(fp,"%s %s %s %s %lf", elenco_contribuenti[n].nome,elenco_contribuenti[n].cognome,elenco_contribuenti[n].codice_fiscale,elenco_contribuenti[n].indirizzo,elenco_contribuenti[n].reddito);
                                       n++;
                                       }
                                       int media=media_reddito(elenco_contribuenti, n);
                                   break;}
                            case 3:{
                                   n=visualizza (elenco_contribuenti,n);
                                   break;}
                            case 4:{
                                   n=salva_elenco (elenco_contribuenti,n);
                                   break;
                                   }
                            case 5:{
                                   n=cerca_codice_fiscale (elenco_contribuenti,n);
                                   break;
                                   }
                            case 6:{
                                   n=cerca_reddito (elenco_contribuenti,n);       
                                   break;
                                   }
                            case 0:{exit(0);
                                   break;}
                            }                        
         } 
         while(scelta!=0);
         system("pause");
         return 0;
      
    
    }
    
      int inserisci (struct contribuenti elenco_contribuenti[], int n) {            //Serve per inserire un nuovo individuo
          if (n>=MAX_ELEM)
              printf("Non puoi aggiungere altri individui\n");
    
          printf("\nNon iserire spazi e/o lettere accentate\n");
          printf("\nInserisci nome: ");
          scanf("%s",elenco_contribuenti[n].nome);                        
          printf("\nInserisci cognome: ");
          scanf("%s",elenco_contribuenti[n].cognome);
          printf("\nInserisci codice fiscale: ");
          scanf("%s",elenco_contribuenti[n].codice_fiscale);
          printf("\nInserisci indirizzo: ");
          scanf("%s",elenco_contribuenti[n].indirizzo);
          printf("\nInserisci reddito: ");
          scanf("%lf",elenco_contribuenti[n].reddito);  
          printf("\n\n");
                                    
          FILE*fp=fopen(FILE_PRED,"a");
          if(fp==NULL) {
             printf("Impossibile salvare!\n");
             }
          else {
             fprintf(fp,"%s %s %s %s %lf\n",elenco_contribuenti[n].nome,elenco_contribuenti[n].cognome,elenco_contribuenti[n].codice_fiscale,elenco_contribuenti[n].indirizzo,elenco_contribuenti[n].reddito);
             printf("-----------SALVATO----------\n\n");
             fclose(fp);
             }
           return n;                    
     }
    
      int media_reddito (struct contribuenti elenco_contribuenti[], int n) {        //Serve per calcolare la media dei redditi
          int i;
          double media=0.0;
          
          for (i=0; i<n; i++)
              media=media+elenco_contribuenti[i].reddito;
          media=media/n;
          
          return media;
      }
    
      int visualizza (struct contribuenti elenco_contribuenti[], int n) {           //Serve per visualizzare la lista dell'elenco
          int i;
          int scelta;
          
          FILE*fp=fopen(FILE_PRED,"r");
          if(fp==NULL) {
             printf("C'e' stato un errore nella lettura del file\n");
             return (scelta);
             }
          else {
             printf("Ecco la lista degli individui presenti in elenco:\n");
             printf(" %s  %s  %s  %s  %lf\n",elenco_contribuenti[i].nome,elenco_contribuenti[i].cognome,elenco_contribuenti[i].codice_fiscale,elenco_contribuenti[i].indirizzo,elenco_contribuenti[i].reddito);
             return i;
          }
          fclose(fp);
      }
    
      int salva_elenco (struct contribuenti elenco_contribuenti[], int n) {         //Serve per salvare i dati su un file
          int i;
          int scelta;
          char caratteri [MAX_CHARS];
          
          printf("Inserisci il nome del file su cui vuoi salvare (.txt): ");
          scanf("%s",caratteri);
          
          FILE*fp=fopen(caratteri,"w");
          if(fp==NULL) {
             printf("Errore nel salvataggio\n");
             return (scelta);
             }
          else {
             for(i=0;i<n;i++) {
             fprintf(fp,"%s %s %s %s %lf\n",elenco_contribuenti[i].nome,elenco_contribuenti[i].cognome,elenco_contribuenti[i].codice_fiscale,elenco_contribuenti[i].indirizzo,elenco_contribuenti[i].reddito);
                }
             }
          printf("----------SALVATO----------\n");
          fclose(fp);
      }
    
      int cerca_codice_fiscale (struct contribuenti elenco_contribuenti[], int n) { //Serve per cercare un individuo in base al codice fiscale
          int i;
          char cerca[MAX_CHARS];
          
          printf("Inserisci il codice fiscale: ");
          scanf("%s",cerca);
          printf("\n");
          
          for(i=0;i<n;i++) {
              if(strcmp(cerca,elenco_contribuenti[i].codice_fiscale)==0)
                 printf("%s %s %s %s %lf",elenco_contribuenti[i].nome,elenco_contribuenti[i].cognome,elenco_contribuenti[i].codice_fiscale,elenco_contribuenti[i].indirizzo,elenco_contribuenti[i].reddito);
                 
             }
    
      }
    
      int cerca_reddito(struct contribuenti elenco_contribuenti[], int n) {         //Serve per cercare un individuo in base al reddito
          int i;
          int trovati=0;
          int min;
          int max;
          
          printf("Inserire il reddito minimo: ");
          scanf("%d",&min);
          printf("\nInserire il reddito massimo: ");
          scanf("%d",&max);
          printf("\nRisultati trovati: \n");
          
          for(i=0;i<n;i++) {
              if(elenco_contribuenti[i].reddito > min && elenco_contribuenti[i].reddito < max) {
                 printf("%s %s %s %s %lf",elenco_contribuenti[i].nome,elenco_contribuenti[i].cognome,elenco_contribuenti[i].codice_fiscale,elenco_contribuenti[i].indirizzo,elenco_contribuenti[i].reddito);
                 trovati++;
                }
             }
          return (trovati);
      }
    I punti dell'esercizio sono quelli delle "printf" del menù principale.
    Chiedo se qualcuno può controllare questo codice e dirmi gli errori, in quanto così com'è il compilatore non mi da alcun errore/warning, ma quando parte e scelgo alcune opzioni dal menù, queste non funzionano a dovere.
    Grazie per l'aiuto.

  2. #2
    Dando una prima occhiata ho notato che:
    codice:
    int inserisci (struct contribuenti elenco_contribuenti[], int n) {  //Serve per inserire un nuovo individuo  
       if (n>=MAX_ELEM)           
                   printf("Non puoi aggiungere altri individui\n");
                   //qui se non metti altro e la condizione si verifica ti esegue lo stesso il resto tutto il resto della funzione
    ciao..poi lo controllo meglio..
    Cmq..cerca si essere piu' specifico sui problemi cosi è piu' facile trovare gli errori..

  3. #3
    Non hai precisato il linguaggio. Nel caso sia C ottengo:
    codice:
    $ gcc -Wall -ansi -pedantic -Wextra -Wconversion main.c 
    main.c:22: error: parse error before '/' token
    main.c:30: error: parse error before '/' token
    main.c:33: error: missing terminating ' character
    main.c:36: error: parse error before string constant
    main.c:36: warning: type defaults to 'int' in declaration of 'printf'
    main.c:36: error: conflicting types for 'printf'
    main.c:36: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:36: warning: data definition has no type or storage class
    main.c:37: error: parse error before string constant
    main.c:37: warning: type defaults to 'int' in declaration of 'printf'
    main.c:37: error: conflicting types for 'printf'
    main.c:37: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:37: warning: data definition has no type or storage class
    main.c:38: error: parse error before string constant
    main.c:38: warning: type defaults to 'int' in declaration of 'printf'
    main.c:38: error: conflicting types for 'printf'
    main.c:38: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:38: warning: data definition has no type or storage class
    main.c:46: error: parse error before 'do'
    main.c:47: error: stray '\195' in program
    main.c:47: error: stray '\185' in program
    main.c:49: error: parse error before string constant
    main.c:49: warning: type defaults to 'int' in declaration of 'printf'
    main.c:49: error: conflicting types for 'printf'
    main.c:49: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:49: warning: data definition has no type or storage class
    main.c:50: error: parse error before string constant
    main.c:50: warning: type defaults to 'int' in declaration of 'printf'
    main.c:50: error: conflicting types for 'printf'
    main.c:50: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:50: warning: data definition has no type or storage class
    main.c:51: error: parse error before string constant
    main.c:51: warning: type defaults to 'int' in declaration of 'printf'
    main.c:51: error: conflicting types for 'printf'
    main.c:51: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:51: warning: data definition has no type or storage class
    main.c:52: error: parse error before string constant
    main.c:52: warning: type defaults to 'int' in declaration of 'printf'
    main.c:52: error: conflicting types for 'printf'
    main.c:52: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:52: warning: data definition has no type or storage class
    main.c:53: error: parse error before string constant
    main.c:53: warning: type defaults to 'int' in declaration of 'printf'
    main.c:53: error: conflicting types for 'printf'
    main.c:53: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:53: warning: data definition has no type or storage class
    main.c:54: error: parse error before string constant
    main.c:54: warning: type defaults to 'int' in declaration of 'printf'
    main.c:54: error: conflicting types for 'printf'
    main.c:54: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:54: warning: data definition has no type or storage class
    main.c:55: error: parse error before string constant
    main.c:55: warning: type defaults to 'int' in declaration of 'printf'
    main.c:55: error: conflicting types for 'printf'
    main.c:55: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:55: warning: data definition has no type or storage class
    main.c:56: error: parse error before string constant
    main.c:56: warning: type defaults to 'int' in declaration of 'scanf'
    main.c:56: error: conflicting types for 'scanf'
    main.c:56: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:56: warning: data definition has no type or storage class
    main.c:69: error: 'elenco_contribuenti' undeclared here (not in a function)
    main.c:69: error: initializer element is not constant
    main.c:70: error: parse error before 'break'
    main.c:91: error: parse error before string constant
    main.c:91: warning: type defaults to 'int' in declaration of 'system'
    main.c:91: warning: data definition has no type or storage class
    main.c: In function 'inserisci':
    main.c:97: error: parse error before '/' token
    main.c:114: warning: ISO C90 forbids mixed declarations and code
    main.c:119: warning: ISO C90 does not support the '%lf' printf format
    main.c: In function 'media_reddito':
    main.c:126: error: parse error before '/' token
    main.c:130: error: 'i' undeclared (first use in this function)
    main.c:130: error: (Each undeclared identifier is reported only once
    main.c:130: error: for each function it appears in.)
    main.c: In function 'visualizza':
    main.c:137: error: parse error before '/' token
    main.c:137: error: missing terminating ' character
    main.c:148: error: 'i' undeclared (first use in this function)
    main.c:152: warning: control reaches end of non-void function
    main.c: At top level:
    main.c:137: warning: unused parameter 'n'
    main.c: In function 'salva_elenco':
    main.c:154: error: parse error before '/' token
    main.c:162: warning: ISO C90 forbids mixed declarations and code
    main.c:168: error: 'i' undeclared (first use in this function)
    main.c:169: warning: ISO C90 does not support the '%lf' printf format
    main.c:174: warning: control reaches end of non-void function
    main.c: In function 'cerca_codice_fiscale':
    main.c:176: error: parse error before '/' token
    main.c:184: error: 'i' undeclared (first use in this function)
    main.c:190: warning: control reaches end of non-void function
    main.c: In function 'cerca_reddito':
    main.c:192: error: parse error before '/' token
    main.c:204: error: 'i' undeclared (first use in this function)
    Nel caso invece sia C++ si ottiene:
    codice:
    $ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp
    main.cpp: In function 'int main(int, char**)':
    main.cpp:66: warning: format '%lf' expects type 'double*', but argument 7 has type 'double'
    main.cpp:69: warning: unused variable 'media'
    main.cpp: At global scope:
    main.cpp:31: warning: unused parameter 'argc'
    main.cpp:31: warning: unused parameter 'argv'
    main.cpp: In function 'int inserisci(contribuenti*, int)':
    main.cpp:111: warning: format '%lf' expects type 'double*', but argument 2 has type 'double'
    main.cpp:119: warning: ISO C++ does not support the '%lf' printf format
    main.cpp: In function 'int media_reddito(contribuenti*, int)':
    main.cpp:134: warning: converting to 'int' from 'double'
    main.cpp: In function 'int visualizza(contribuenti*, int)':
    main.cpp:148: warning: ISO C++ does not support the '%lf' printf format
    main.cpp: At global scope:
    main.cpp:137: warning: unused parameter 'n'
    main.cpp: In function 'int salva_elenco(contribuenti*, int)':
    main.cpp:169: warning: ISO C++ does not support the '%lf' printf format
    main.cpp: In function 'int cerca_codice_fiscale(contribuenti*, int)':
    main.cpp:186: warning: ISO C++ does not support the '%lf' printf format
    main.cpp: In function 'int cerca_reddito(contribuenti*, int)':
    main.cpp:206: warning: ISO C++ does not support the '%lf' printf format
    main.cpp: In function 'int salva_elenco(contribuenti*, int)':
    main.cpp:174: warning: control reaches end of non-void function
    main.cpp: In function 'int cerca_codice_fiscale(contribuenti*, int)':
    main.cpp:190: warning: control reaches end of non-void function
    il tutto con:
    codice:
    $ gcc --version 
    i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    Copyright (C) 2005 Free Software Foundation, Inc.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    33
    Scusate. Il linguaggio è il C, e come programma uso il DevC++.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    33
    Rispondo a igaziodeblasi:
    ho modificato quel tratto di codece così:
    codice:
      int inserisci (struct contribuenti elenco_contribuenti[], int n) {            //Serve per inserire un nuovo individuo
          if (n>=MAX_ELEM) {
              printf("Non puoi aggiungere altri individui\n");
              system("pause");
              return n;
              }
    Adesso se si verifica tale condizione il programma si mette in pausa. Non mi ero accorto di questa mancanza.

  6. #6
    Poi che altri problemi ti da?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    A parte il linguaggio mancante nel titolo, come vuole il Regolamento, e del titolo stesso inadeguato, la richiesta non è delle migliori: non si può chiedere alla gente di copiare/incollare/compilare/eseguire il proprio codice.
    Se ci sono dei problemi, si postano.
    Se ci sono degli errori in compilazione, si postano.
    Se ci sono degli errori in esecuzione, si postano.
    Se ci sono malfunzionamenti (risultati inattesi), si elencano.
    Se ci sono dei dubbi si chiede lumi su quelli.

    Non è il modo di usare il forum, questo. Altrimenti se ne perde completamente l'utilità, che non è solo quella di porre un "problema generico" e ottenerne la risposta... ma anche fornire agli altri un punto di partenza per i propri dubbi. Un'accozzaglia di errori, con scritto "sistema questo, sistema quello" non fornisce alcuna utilità per chi un domani dovesse avere uno degli errori da te riscontrati.
    Lascio aperta la discussione viste le molte risposte, ma alla prossima chiudo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    33
    Anzitutto mi scuso per le ommissioni e grazie per avermelo comunicato.
    Allora, tenendo conto del codice che prima ho postato e tenendo conto di ogni punto del menù:
    1. Quando vado ad inserire un nuovo individuo prima mi salvava i dati sul file, mentre adesso il programma, dopo che inserisco il reddito e clicco INVIO, si blocca e compare la schermata di Windows "Si è verificato un errore. L'applicazione verrà chiusa.".Questa parte di codice non l'ho modificata, ho solo aggiunto le due righe di prima, e anche senza queste non salva più.
    2. Quando voglio avere il reddito medio della lista il programma si blocca.
    3. Se voglio visualizzare la lista mi compaiono solo alcuni simboli e non i dati salvati in lista.
    4. Se voglio salvare i dati su un altro file, il file me lo crea, ma i dati non li inserisce.
    5. Se voglio cercare per codice fiscale, un volta inserito esso, il programma si blocca.
    6. Se voglio cercare per fascia di reddito, una volta inseriti i dati non mi da il risultato.
    Spero che adesso capiate i problemi del codice.
    Ripeto che come programma uso il DevC++, e linguaggio predefinito il C.
    Qualndo compilo non mi da nessun errore/warning ed il programma parte, ma poi non funziona a dovere.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Forse faresti meglio a concentrarti su un solo problema per thread ... penso che sia difficile ottenere tutte le risposte ai tuoi tanti quesiti ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    33
    Mi conviene quindi aprire una discussione per ogni problema?
    Comunque sto iniziando a fare un nuovo eserizio, quindi potrebbe essere utile aprire una nuova discussione e sviluppare a poco a poco il nuovo esercizio, e successivamente posso andare a vedere quali errori sono presenti in quello che ho già fatto, in quanto sono molto simili.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.