Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - mancata acquisizione dati
Forum - C/C++ - mancata acquisizione dati

Avatar
rubik90 (Normal User)
Newbie


Messaggi: 2
Iscritto: 17/09/2011

Segnala al moderatore
Postato alle 10:27
Sabato, 17/09/2011
buongiorno a tutti ragazzi! :) sono un nuovo utente del forum, scoperto per caso qualche mese fa "googlando" qua e là, e devo dire molto completo specialmente nella sezione del forum..ed arrivo al punto :asd:
premettendo che sono alle prime armi con la programmazione, devo realizzare un piccolo programmino in C che mi consenta di acquisire dei dati da tastiera e scriverli su un file binario (e l'ho fatto tramite la funzione inserisci), poi devo acquisire da tastiera alcuni dati per verificare, tramite la funzione ricerca, se i dati inseriti corrispondono a qualcuno all'interno del file precedentemente creato, e in ultimo stampare solo i dati di un determinato utente su un file di testo. dal punto di vista sintattico è ok, il compilatore non mi segnala alcun errore .. il problema risiede nella funzione ricerca, ho l'impressione che la condizione dell'if con la strcmp venga completamente ignorata poichè quando eseguo il programma e invoco la funzione ricerca, non mi dice come dovrebbe se l'utente c'è o meno nel file :d
ecco il codice :

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct { char nome [20];
  7.                  char cognome [20];
  8.                  char corso [20];
  9.                  int quota_mensile;
  10.                  int  mesi_pagati;
  11.                  } cliente;
  12.                  
  13.  
  14. void inserisci ();
  15. void stampasaldo();
  16. void ricerca();
  17.  
  18.  
  19.  
  20. int main ()
  21. {
  22.      int flag=1;
  23.      char c;
  24.      
  25.      do {
  26.          fflush(stdin);
  27.          printf ("\n Digita 1 per inserire un cliente nel file");
  28.          printf ("\n Digita 2 per calcolare e stampare il saldo di un cliente");
  29.          printf ("\n Digita 3 per trovare un cliente e stampare le informazioni relative su file di testo");
  30.          printf ("\n Digita 0 per uscire");
  31.          c=getch ();
  32.          
  33.          switch (c)
  34.          {
  35.                 case '0':
  36.                      flag=0;
  37.                      break;
  38.                      
  39.                 case '1':
  40.                      inserisci();
  41.                      break;
  42.                      
  43.                 case '2':
  44.                      stampasaldo();
  45.                      break;
  46.                      
  47.                 case '3':
  48.                      ricerca ();
  49.                      break;
  50.                      
  51.           }
  52.       } while (flag);
  53.       return 0;
  54. }
  55.                      
  56. //Funzione di inserimento del cliente nel file
  57. void inserisci()
  58. {
  59.      FILE *fp1;
  60.      cliente sportivo;
  61.      
  62.      fp1 = fopen ("Circolo.dat","a+");
  63.      
  64.      if(fp1==NULL)
  65.        { printf("\n Impossibile aprire il file");
  66.          return;
  67.        }
  68.      else {
  69.    
  70.      printf("\n Digita il nome del cliente da inserire nel file: ");
  71.      gets(sportivo.nome);
  72.      printf("\n Digita il cognome da inserire nel file: ");
  73.      gets (sportivo.cognome);
  74.      printf("\n Digita il corso seguito dal cliente: ");
  75.      gets(sportivo.corso);
  76.      printf("\n Digita la quota mensile versata dal cliente: ");
  77.      scanf("%d", &sportivo.quota_mensile);
  78.      printf("\n Digita il numero di mesi pagati dal cliente: ");
  79.      scanf("%d", &sportivo.mesi_pagati);
  80.      fwrite(&sportivo,sizeof(cliente),1,fp1);
  81.      }
  82.      fclose(fp1);
  83.      }
  84.      
  85. //Funzione che stampa il saldo relativo a un particolare cliente del circolo sportivo
  86.  
  87. void stampasaldo()
  88. {
  89.      int saldo = 0;
  90.      int i;
  91.      cliente cristiani[10];
  92.      char nom [20];
  93.      char cogn [20];
  94.      char cors [20];
  95.      FILE *fp1;
  96.          
  97.      fp1 = fopen("Circolo.dat","r");
  98.      if(fp1==NULL) { printf("\n Impossibile aprire il file"); }
  99.      else {
  100.      fflush(stdin);
  101.      printf("\n Inserire il nome del cliente di cui si desidera visualizzare il saldo: ");
  102.      gets (nom);
  103.      printf("\n Inserire il cognome del cliente di cui si desidera visualizzare il saldo: ");
  104.      gets (cogn);
  105.      printf("\n Inserire il corso del cliente di cui si desidera visualizzare il saldo: ");
  106.      gets (cors);
  107.      for (i=0; i<10; i++) {
  108.          fread (&cristiani[i],sizeof(cliente),1,fp1) ;
  109.          if( ( (strcmp(cristiani[i].nome, nom)) && (strcmp(cristiani[i].cognome, cogn)) && (strcmp(cristiani[i].corso, cors)) ) == 0)
  110.        {
  111.           saldo = saldo + (cristiani[i].quota_mensile) * (cristiani[i].mesi_pagati) ;
  112.           printf ("\n Il saldo relativo al cliente %s\t%s\t e' il seguente: %d", nom, cogn, saldo);
  113.           // exit (1);
  114.        }
  115.      }
  116.  
  117.      }
  118.      fclose (fp1);
  119. }
  120.          
  121. //Funzione che ricerca un particolare cliente e stampa su file di testo le informazioni ad esso relative
  122. void ricerca()
  123. {
  124.      char Nome [20];
  125.      char Cognome [20];
  126.      char Corso [20];
  127.      int QuotaMens;
  128.      int Codice;
  129.      int MesiPagati;
  130.      cliente sportivo;
  131.      FILE *fp1;
  132.      FILE *fp2;
  133.    
  134.      fp1 = fopen("Circolo.dat","r");
  135.      
  136.      while(fread(&sportivo,sizeof(sportivo) ,1,fp1)){
  137.      if((strcmp(sportivo.nome,Nome)==0) && ((sportivo.cognome,Cognome)==0) && ((sportivo.corso,Corso)==0) && (QuotaMens==sportivo.quota_mensile) && (MesiPagati==sportivo.mesi_pagati))
  138.      {
  139.        printf("%s\t", sportivo.nome);
  140.        printf("%s\t", sportivo.cognome);
  141.        printf("%s\t", sportivo.corso);
  142.        printf("%f\t", sportivo.quota_mensile);
  143.        printf("%d\t", sportivo.mesi_pagati);
  144.      }
  145. //Scrittura dei risultati su file di testo
  146.      fp2 = fopen("gasperini.txt", "w");
  147.      fprintf(fp2,"%s\t%s\t%s\t%%f\t%d\t", sportivo.nome,sportivo.cognome,sportivo.corso,sportivo.quota_mensile,sportivo.mesi_pagati);
  148.      fclose(fp1);
  149.      fclose(fp2);
  150. }
  151. }



ieri avevo anche provato, nella funzione inserisci, a dichiarare semplicemente un variabile strutturata di tipo cliente, per poi scrivere come argomenti della strcmp cliente.nome,nom .. ma anche questo non  è servito :d
confido nel vostro aiuto e nella vostra disponibilità!

buona giornata! 8-)

EDIT BY HeDo: Ho inserito degli spazi all'interno della lunghissima formula del codice, in questo modo non sballi tutta la larghezza del forum...

Ultima modifica effettuata da HeDo il 17/09/2011 alle 11:17
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:39
Sabato, 17/09/2011
Nome, Cognome, Corso, QuotaMensile, eccetera, son tutte variabili locali non inizializzate, perciò hanno un valore casuale che non c'entra nulla con la ricerca. A dir la verità non vedo nemmeno una parte di codice in cui dovresti inserire i parametri della ricerca.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
rubik90 (Normal User)
Newbie


Messaggi: 2
Iscritto: 17/09/2011

Segnala al moderatore
Postato alle 10:50
Sabato, 17/09/2011
Testo quotato

Postato originariamente da Il Totem:

Nome, Cognome, Corso, QuotaMensile, eccetera, son tutte variabili locali non inizializzate, perciò hanno un valore casuale che non c'entra nulla con la ricerca. A dir la verità non vedo nemmeno una parte di codice in cui dovresti inserire i parametri della ricerca.





intanto, ti ringrazio per aver risposto! affrontiamo una questione alla volta:

- nella funzione stampasaldo() , per quale motivo non verifica correttamente se l'utente che digito da tastiera c'è o meno nel file? è sbagliata la condizione dell'if, come presumo?

- la funzione ricerca() l'ho scritta di getto, non ho avuto ancora modo di aggiustarla perchè ieri sera ho perso un sacco di tempo nel trovare l'errore alla stampasaldo(). tu dici che devo inizializzare a ' ' ogni array di char che ho dichiarato in questa funzione?

accetto indicazioni per entrambe le funzioni, grazie ancora!

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:54
Sabato, 17/09/2011
Ah, in quella funzione... Beh, strcmp(a, b) significa implicitamente strmp(a, b) != 0, ossia a != b. A sembra che la ricerca dovrebbe produrre delle congruenze, invece.
Inoltre, perché usi un array? Ogni match lo consideri una volta sola, quindi perché memorizzarli tutti?


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote