#include #include main (argc, argv) int argc; char *argv []; { double num[50000], sum = 0, sum2 = 0, mean, sd; double max = -9999.0, min = 9999.0; int n = 0, n0, n2, i; double cutoff; int out_p = 0; argv++; if (argc > 1) { if (argc != 3) { fprintf(stderr, "usage: sd [-out cutoff]\n"); exit(1); } if (!strcmp(*argv, "-out")) { out_p =1; argv++; cutoff = atof(*argv); } else { fprintf(stderr, "usage: sd [-out cutoff]\n"); exit(1); } } while (scanf("%lf", &num[n]) != EOF) { sum += num[n]; sum2 += num[n] * num[n]; if (num[n] > max) max = num[n]; if (num[n] < min) min = num[n]; n++; } mean = sum / (double) n; if (n == 1) sd = 0.0; else sd= sqrt( (sum2 - ( ((double) n) * mean * mean))/ (double) (n - 1)); if (out_p == 0) printf ("%d\t%g\t%g\t%g\t%g\n", n, mean, sd, min, max); else { if (sd > 0) { sum = sum2 = n2 = 0; max = -9999.0; min = 9999.0; n0 = n; for (n = 0; n < n0; n++) { if (num[n] < mean + (cutoff * sd)) { sum += num[n]; sum2 += num[n] * num[n]; if (num[n] > max) max = num[n]; if (num[n] < min) min = num[n]; n2++; } } n = n2; mean = sum / (double) n; if (((sum2 - (((double) n) * mean * mean))/(double) (n - 1)) <= 0.0 || n == 1) sd = 0.0; else sd=sqrt((sum2 - ( ((double) n) * mean * mean))/ (double) (n - 1)); } printf ("%d\t%g\t%g\t%g\t%g\n", n, mean, sd, min, max); } }