Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Leggere un vettore da un file di testo
Forum - C/C++ - Leggere un vettore da un file di testo

Avatar
Gabry (Normal User)
Rookie


Messaggi: 36
Iscritto: 19/04/2011

Segnala al moderatore
Postato alle 23:33
Domenica, 13/11/2011
Sto scrivendo un piccolo programma in C che apre un file di testo, ne memorizza il contenuto in un array e poi calcola la somma, la media e la deviazione standard dei dati. Ecco il codice:
Codice sorgente - presumibilmente C++

  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. int main(){
  6.   int j,k,i=0;
  7.   FILE *fp;
  8.   float A[10000];
  9.   float m,s1=0,s2=0,stDev,b;
  10.   fp=fopen("/home/samsung/Scrivania/Dati.txt","a+");              // Apre il file
  11.   printf("\n === Dati === \n");
  12.   while(!feof(fp)){
  13.     fscanf(fp,"%f \n",&b);
  14.     printf("%f \n",b);
  15.     A[i]=b;
  16.     i++;
  17.   }
  18.   fclose(fp);
  19.   for (j=0;j<=i;j++){
  20.   s1+=A[i];
  21.   }
  22.   m=s1/i;
  23.   for (k=0;k<=i;k++){
  24.     s2+=(A[i]-m)*(A[i]-m);
  25.   }
  26.   stDev=sqrt(s2/i);
  27.   printf("\n\n");
  28.   printf(" Somma        = %f \n",s1);
  29.   printf(" Media        = %f \n",m);
  30.   printf(" Dev Standard = %f \n\n",stDev);
  31. }


Ma il programma non funziona. Mi da sempre somma, media e dev st 0, anche se il percorso è giusto e il file non è vuoto. Ho capito che per non so quale motivo il programma non riesce ad "immagazzinare" i dati nell'array. Infatti, durante il 1° ciclo, quello di lettura (scanf) scrittura degli elementi sullo schermo tutto sembra andare bene. Pero alla fine il risultato è sempre 0. Cosa posso fare?
ps Sono nuovo del C, ma ho già implementato il programma in Python e tutto andava bene.

PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 23:46
Domenica, 13/11/2011
Il termine dei cicli non deve essere <=i ma <i

for (j=0; j<i; j++){

for (k=0; k<i; k++){

e gli indici dei cicli devono essere corretti

s1+=A[j];

e

s2+=(A[k]-m)*(A[k]-m);

nessuno stavo scrivendo non ho potuto vedere la tua risposta la topic - Bonny - 13/11/11 23:52


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 23:49
Domenica, 13/11/2011
Prima di tutto apri il file in modalia write:
fp=fopen("/home/samsung/Scrivania/Dati.txt","w");
secondo:
nel ciclo for (riga 19)
Codice sorgente - presumibilmente C/C++

  1. for (j=0;j<=i;j++){
  2.   s1+=A[i];//qui va j
  3.   }



è j che viene incrementata quindi

Codice sorgente - presumibilmente C/C++

  1. int dim = i;
  2. for (j=0;j<=dim;j++){
  3.   s1+=A[j];
  4.   }


e la stessa cosa nel succesivo...

Grazie ad entrambi. Adesso sembra funzionare tutto. Ho fatto un errore davvero idiota. Ecco cosa succede a programmare alle 11 e mezza di sera! :) - Gabry - 14/11/11 14:56
PM