uni

Thing1's amazing uni repo
Log | Files | Refs

lab5.ino (2055B)


      1 #include "util.h"
      2 
      3 #define NUMBER_OF_RUNNERS 16
      4 
      5 /* DO NOT TOUCH, cursed, fills in printf, it works don't question */
      6 #define fill_printf_from_secs(t) (int)(t % 60), \
      7 	(int)((int)(t / 60) % 60), \
      8 	(int)((int)((int)(t / 60) / 60) % 60)
      9 
     10 const char *order[] = {"Secs", "Mins", "Hours"};
     11 const int time_orders = SIZE(order);
     12 
     13 const char *sports[] = {"swim", "cycle", "run"};
     14 const int number_of_sports = SIZE(sports);
     15 
     16 int 
     17 input_time(const char *order, const char *sport)  {
     18 	SEprintf("How many %s did %s take: ", order, sport);
     19 	return readint();
     20 }
     21 
     22 int
     23 input_sport(const char *sport, int times[time_orders]) {
     24 	for (int i = 0; i < time_orders; i++) 
     25 		if ((times[i] = input_time(order[i], sport)) == -1)
     26 			return 1;
     27 	return 0;
     28 }
     29 
     30 void
     31 normalize(int times[time_orders]) {
     32 	for (int i = 0; i < time_orders - 1; i++) {
     33 		times[i + 1] += times[i] / 60;
     34 		times[i] %= 60;
     35 	}
     36 }
     37 
     38 long
     39 in_secs(int time[number_of_sports]) {
     40 	return (long)((time[0]) + (time[1] * 60) + (time[2] * 60 * 60));
     41 }
     42 
     43 void 
     44 setup() {
     45 	Serial.begin(9600);
     46 
     47 	int sport_times[number_of_sports + 1][time_orders] = {0};
     48 	long times[NUMBER_OF_RUNNERS] = {0};
     49 	int runner;
     50 
     51 	for (runner = 0; runner < NUMBER_OF_RUNNERS; runner++) {
     52 		memset(sport_times, 0, sizeof(sport_times));
     53 		for (int i = 0; i < number_of_sports; i++) {
     54 			if (input_sport(sports[i], sport_times[i]))
     55 				goto end;
     56 		}
     57 
     58 		for (int i = 0; i < number_of_sports; i++) 
     59 			for (int j = 0; j < time_orders; j++)
     60 				sport_times[time_orders][j] += sport_times[i][j];
     61 
     62 		normalize(sport_times[3]);
     63 		times[runner] = in_secs(sport_times[time_orders]);
     64 
     65 		SEprintf("Total time: %dsec %dmin %dhr.\n", fill_printf_from_secs((long)times[runner]));
     66 	}
     67 end:
     68 	int best_index = -1;
     69 	long best = -1;
     70 	for (int i = 0; i < runner; i++) {
     71 		if (best < times[i]) {
     72 			best = times[i];
     73 			best_index = i;
     74 		}
     75 
     76 		SEprintf("Runner %d: %dsec %dmin %dhr.\n", i + 1, fill_printf_from_secs(times[i]));
     77 	}
     78 	SEprintf("The best runner was runner %d, with a time of %dsec %dmin %dhr.\n", best_index + 1, fill_printf_from_secs(best));
     79 }
     80 
     81 void loop() {}