#include #include /* Enums make words into numbers, ergo no magic numbers */ enum MODE { MODE_MAX, MODE_MIN, MODE_DIFF }; void help(){ printf("Usage: stats \n"); exit(1); } /* ADDING UP ALL THE VALUES */ long sigma(int argc, char * argv[]) { char *endptr; long sum = 0; for (int i = 1; i < argc; i++) { sum += strtol(argv[i], &endptr, 10); /* convert the value to an integer and add it on */ if (endptr == argv[i] || *endptr != '\0') { help(); } } return sum; } /* FINDING MEAN */ float average(int n, int sum) { float mean = (float) sum / n; return mean; } /* FINDING THE MIN/MAX/DIFFERENCE */ long range(int argc, char * argv[], enum MODE mode) { long low = strtol(argv[1], NULL, 10); long high = low; for (int i = 1; i < argc; i++) { long val = strtol(argv[i], NULL, 10); if (val > high) high = val; if (low > val) low = val; } /* Check once and return what we need */ switch (mode) { case MODE_MAX: return high; case MODE_MIN: return low; case MODE_DIFF: return high - low; } return 1; } int main(int argc, char * argv[]) { if (argc < 2) { /* Stop empty input */ help(); } long n = argc - 1; /* this is how many numbers there are */ long sum = sigma(argc, argv); /* sigma means adding them all together */ float mean = average(n, sum); /* the sum divided by the however many numbers there are */ long min = range(argc, argv, MODE_MIN); /* Using enums here to use words instead of numbers */ long max = range(argc, argv, MODE_MAX); long diff = range(argc, argv, MODE_DIFF); /* align text left for 6 and 12 right */ printf("%-6s %12ld\n", "num:", n); printf("%-6s %12ld\n", "sum:", sum); printf("%-6s %12.3f\n", "mean:", mean); printf("%-6s %12ld\n", "min:", min); printf("%-6s %12ld\n", "max:", max); printf("%-6s %12ld\n", "range:", diff); }