/*** This program takes arguments from the command line. This means it expects
some input from the user when the program is executed. In this case the
name of the file containing the data is read in at run-time. A typical
command would look like
> ./stats tmp.dat
The program reads the data from the a file (called tmp.dat) to a
variable, x. You don't need to know the number of data points in the file
a priori. The integer 'i' counts them in the while/for loop.
***/
#include <stdio.h>
#include <math.h>
main(int argc, char *argv[]) /* this is no longer a set of empty () as the
program expects some input arguments.
The format is always the same. */
{
double x,sigma,x_m;
int i;
FILE *ifp; /* as in the other program data is read from a
file so these lines are required. Note that
fopen has "argv[1]" instead of the usual file
name. This stands for "argument value number
1. argv[0] is always the program name and
argv[i] is whatever comes after it. In this
case there's just one argument - tmp.dat. */
ifp = fopen(argv[1], "r");
i = 0;
sigma = 0.0;
x_m = 0.0;
/*
while( fscanf(ifp, "%lf", &x) ==1 )
{
x_m += x;
i++;
}
x_m /= (double)i;
*/
for ( i=0; fscanf(ifp, "%lf", &x) ==1; i++)
{
x_m += x;
}
x_m /= (double)i;
ifp = fopen(argv[1], "r");
while ( fscanf(ifp, "%lf", &x ) ==1 )
{
sigma += (x -x_m)*(x -x_m);
}
sigma = sqrt(sigma/N);
printf("the mean is %lf \n
the standard deviation is %lf\n", x_m, sigma);
}