diff options
| author | Mr. Sam <samuel@yakubos.org> | 2026-07-15 06:41:46 +0100 |
|---|---|---|
| committer | Mr. Sam <samuel@yakubos.org> | 2026-07-15 06:41:46 +0100 |
| commit | cbb74a8c010ef59c5bf3f043e3d25b3d260dd84f (patch) | |
| tree | 1af775664b69efde487d9815cc27139556006b3b /main.c | |
| parent | b09eed563a4b960049313b88fea00261f276b8ca (diff) | |
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(void){ + printf("Usage: stats <numbers>\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); +} |