diff options
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 81 |
1 files changed, 81 insertions, 0 deletions
@@ -0,0 +1,81 @@ +#include <stdio.h> +#include <stdlib.h> + +/* Enums make words into numbers, ergo no magic numbers */ +enum MODE { + MODE_MAX, + MODE_MIN, + MODE_DIFF +}; + +void help(){ + printf("Usage: stats <numbers>\n"); + exit(1); +} + +/* ADDING UP ALL THE VALUES */ +int sigma(int argc, char * argv[]) { + char *endptr; + int 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 */ +int range(int argc, char * argv[], enum MODE mode) { + int low = strtol(argv[1], NULL, 10); + int high = low; + + for (int i = 1; i < argc; i++) { + int 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(); + } + + int n = argc - 1; /* this is how many numbers there are */ + int 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 */ + int min = range(argc, argv, MODE_MIN); /* Using enums here to use words instead of numbers */ + int max = range(argc, argv, MODE_MAX); + int diff = range(argc, argv, MODE_DIFF); + + + /* align text left for 6 and 10 right */ + printf("%-6s %10d\n", "num:", n); + printf("%-6s %10d\n", "sum:", sum); + printf("%-6s %10.3f\n", "mean:", mean); + printf("%-6s %10d\n", "min:", min); + printf("%-6s %10d\n", "max:", max); + printf("%-6s %10d\n", "range:", diff); +} |