/****
 *
 * This program computes simple statistics for three real numbers read from
 * standard input.  The statistics computed are the sum of the numbers, the
 * arithmetic mean, and the standard deviation.  The results are output to
 * standard output, in the following form:
 *
 * Sum = 
 * Mean =
 * Standard Deviation =
 *
 * The precise formulae for mean and standard deviation are as defined here:
 *
 *    http://www.gcseguide.co.uk/statistics_and_probability.htm
 *
 * Input numbers must be non-negative.  If a negative number is input, it is
 * treated as 0.  For each negative input, the number of data points is
 * decremented by 1.  For example, with inputs
 *
 *     1 -2 3
 *
 * The results are 
 *
 * Sum = 4.000000
 * Mean = 2.000000
 * Standard Deviation = 1.000000
 *
 *
 * Author: Gene Fisher (gfisher@calpoly.edu)
 * Created: 31mar11
 * Last Modified: 3apr11
 *
 */

#include <stdio.h>
#include <math.h>

/*
 * Declare the prototypes for functions used in the program.
 */
double compute_sum(double x1, double x2, double x3);
double compute_mean(double x1, double x2, double x3, int num_data_points);
double compute_std_dev(double x1, double x2, double x3, int num_data_points);

int main () {

    /*
     * Declare the variables used in main.
     */
    double x1, x2, x3;                  /* Input variables */
    int num_data_points;                /* Number of data points */

    /*
     * Initialize the number of data points to 3.
     */
    num_data_points = 3;

    /*
     * Prompt the user for the input.
     */
    printf("Enter three real numbers, separated by spaces: ");

    /*
     * Input the numbers.
     */
    scanf("%lf%lf%lf", &x1, &x2, &x3);

    /*
     * Consider any negative input to be 0, and drop it from stats by
     * decrementing the number of data points for each negative input.
     */
    if (x1 < 0) {
        x1 = 0;
        num_data_points = num_data_points - 1;
    }
    if (x2 < 0) {
        x2 = 0;
        num_data_points = num_data_points - 1;
    }
    if (x3 < 0) {
        x3 = 0;
        num_data_points = num_data_points - 1;
    }

    /*
     * Compute and output the results.
     */
    printf("Sum = %f\n", compute_sum(x1, x2, x3));
    printf("Mean = %f\n", compute_mean(x1, x2, x3, num_data_points));
    printf("Standard Deviation = %f\n\n",
        compute_std_dev(x1, x2, x3, num_data_points));

    return 0;

}

/*
 * Return the sum of the given three numbers.
 */
double compute_sum(double x1, double x2, double x3) {
    return x1 + x2 + x3;
}

/*
 * Return the arithmetic mean of the given three numbers, and the given number
 * of data points.  Question: What happens here if num_data_points = 0?
 */
double compute_mean(double x1, double x2, double x3, int num_data_points) {
    return compute_sum(x1, x2, x3) / num_data_points;
}

/*
 * Return the standard deviation of the given three numbers, and the given
 * number of data points.  Question: What happens here if num_data_points = 0?
 */
double compute_std_dev(double x1, double x2, double x3, int num_data_points) {

    double mean = compute_mean(x1, x2, x3, num_data_points);
    return sqrt((pow(x1 - mean, 2) +
                 pow(x2 - mean, 2) +
                 pow(x3 - mean, 2)) / (num_data_points - 1 ));
}