stats - Simple Statistics Tool
for analyzing average, sum, standard deviation, variance,
number of observations and max/min of large quantities of data




#include <stdio.h>

#include <stdlib.h>
#include <getopt.h>
#include <math.h>

/*
        Simple Statistics Tool for Large Quantities of Data
        Christian Doerr; http://www-plan.cs.colorado.edu
*/



void help()
{
        printf(
"Simple Statistics Tools\n");
        printf(
"from http://www-plan.cs.colorado.edu\n\n");
        printf(
"Options (short form):\n");

        printf(
" no options display number of observations, mean and standard deviation\n");
        printf(
" --avg (-a) \t\t average\n");
        printf(
" --sum (-s) \t\t sum\n");
        printf(
" --std (-d) \t\t standard deviation\n");
        printf(
" --var (-v) \t\t variance\n");
        printf(
" --num (-i) \t\t number of observations\n");
        printf(
" --min (-n) \t\t minimum value\n");
        printf(
" --max (-x) \t\t maximum value\n");
        printf(
" --help (-h) \t\t this short help\n");
}

int main(int argc, char **argv)
{
        
static struct option long_options[] =
        {
                {
"avg", no_argument, 0, 'a'},
                {
"sum", no_argument, 0, 's'},
                {
"std", no_argument, 0, 'd'},
                {
"var", no_argument, 0, 'v'},
                {
"num", no_argument, 0, 'i'},
                {
"min", no_argument, 0, 'n'},
                {
"max", no_argument, 0, 'x'},
                {
"help", no_argument, 0, 'h'},
                {
0, 0, 0, 0}
        };

        
int option_index = 0;

        
float sum=0, sumsquare=0;
        
float min = 0, max = 0;
        
int num=0;
        
float val=0;

        
int c = getopt_long (argc, argv, "asdvinxh", long_options, &option_index);
        
if(c=='h') { help(); exit(0); }

        
while(scanf("%f\n", &val) != EOF)
        {
                
if(num==0) { min = val; max = val; }
                
else if(min > val) min = val;
                
else if(max < val) max = val;
                sum+=val;
                sumsquare+=val*val;
                num++;
                
/*
                        Cuts down O(n) to O(1) space by using
                        (\sum_{i} (x_i - x_{bar})^2) / n =
                               (\sum_{i} {x_i}^2 - ((\sum_{i} x_i)^2) / n) / n - 1
                */

        }

        
float mean = sum/num;
        
float var = (sumsquare - (sum*sum / num))/(num-1);
        
float std = sqrt(var);


        
switch(c)
        {
                
case 'a': printf("%f\n", mean); break;
                
case 'd': printf("%f\n", std); break;
                
case 's': printf("%f\n", sum); break;
                
case 'v': printf("%f\n", var); break;
                
case 'i': printf("%d\n", num); break;
                
case 'x': printf("%f\n", max); break;
                
case 'n': printf("%f\n", min); break;
                
default: printf("n = %d, avg = %f, std = %f\n", num, mean, std);
        }
}