summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorMr. Sam <samuel@yakubos.org>2026-07-15 06:41:46 +0100
committerMr. Sam <samuel@yakubos.org>2026-07-15 06:41:46 +0100
commitcbb74a8c010ef59c5bf3f043e3d25b3d260dd84f (patch)
tree1af775664b69efde487d9815cc27139556006b3b /main.c
parentb09eed563a4b960049313b88fea00261f276b8ca (diff)
Go back to main.cHEADmain
Diffstat (limited to 'main.c')
-rw-r--r--main.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..81cdc33
--- /dev/null
+++ b/main.c
@@ -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);
+}