Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.10 KB | None | 0 0
  1. #include "ui.h"
  2. #include "io.h"
  3. #include "analyze.h"
  4. #include <stdbool.h>
  5. #include <stdio.h>
  6. #include <math.h>
  7.  
  8. //
  9. // Private
  10. //
  11. static void ui_invalid_input()
  12. {
  13. printf("info> bad input\n");
  14. }
  15.  
  16. static void ui_exit()
  17. {
  18. printf("info> bye\n");
  19. }
  20.  
  21. static char ui_get_choice()
  22. {
  23. char buf[3];
  24.  
  25. printf("input> ");
  26. return read_line(buf, 3) ? buf[0] : 0;
  27. }
  28.  
  29. static void ui_line(char c, int n)
  30. {
  31. while (n-- > 0) {
  32. putchar(c);
  33. }
  34. putchar('\n');
  35. }
  36.  
  37. static void ui_menu_options(const char *options[], int num_options)
  38. {
  39. int i;
  40. for (i=0; i<num_options; i++) {
  41. printf("%c) %s\n", 'a'+i, options[i]);
  42. }
  43. }
  44.  
  45. static void ui_menu()
  46. {
  47. const char *options[] = {
  48. "Menu",
  49. "Exit\n",
  50. "Bubble sort best case",
  51. "Bubble sort worst case",
  52. "Bubble sort average case",
  53. "Insertion sort best case",
  54. "Insertion sort worst case",
  55. "Insertion sort average case",
  56. "Quick sort best case",
  57. "Quick sort worst case",
  58. "Quick sort average case",
  59. "Linear sort best case",
  60. "Linear sort wors case",
  61. "Linear sort average case",
  62. "Binary sort best case",
  63. "Binary sort worst case",
  64. "Binary sort average case",
  65. };
  66.  
  67. ui_line('=', MENU_WIDTH);
  68. ui_menu_options(options, sizeof(options) / sizeof(char *));
  69. ui_line('-', MENU_WIDTH);
  70. }
  71.  
  72. static void Print(result_t *buf, complexity typ, int i, int storlek)
  73. {
  74. if(typ == en)
  75. {
  76. if(i == 0)
  77. {
  78. ui_line('~', MENU_WIDTH);
  79. printf("SIZE\tTIME Tid i sekunder\tT delat på log(n) \t\t Tid delat på n \t\tTid delat på n*log(n)\n");
  80. ui_line('~', MENU_WIDTH);
  81. }
  82. printf("\n");
  83. printf("|%d| \t", buf[i].size);
  84. printf("|%lf| \t\t", buf[i].time);
  85. printf("|%.6e| \t\t\t", buf[i].time / (log(buf[i].size)));
  86. printf("|%.6e| \t\t\t", buf[i].time / (buf[i].size));
  87. printf("|%.6e|\t\t\t",buf[i].time / (buf[i].size*log(buf[i].size)));
  88. printf("\n");
  89. }
  90.  
  91. if(typ == n2)
  92. {
  93. if(i == 0)
  94. {
  95. ui_line('~', MENU_WIDTH);
  96. printf("size\ttime T(s)\tT/nlogn \t (T/n^2) \t\t T/n^3\n");
  97. ui_line('~', MENU_WIDTH);
  98. }
  99. printf("\n");
  100. printf("%d\t", buf[i].size);
  101. printf("%lf \t", buf[i].time);
  102. printf("%.6e \t", buf[i].time/(buf[i].size*log(buf[i].size)));
  103. printf("%.6e \t", buf[i].time / pow(buf[i].size,2));
  104. printf("%.6e \t",buf[i].time / pow(buf[i].size,3));
  105. printf("\n");
  106. }
  107.  
  108.  
  109. }
  110.  
  111. void resultat(const algorithm_t a, const case_t c, result_t *buf, int n)
  112. {
  113. int i;
  114. ui_line('*', MENU_WIDTH);
  115.  
  116. for(i=0;i<n;i++)
  117. {
  118. switch(a){
  119. printf("\t\t\t");
  120. case bubble_sort_t:
  121. {
  122. if(i==0)
  123. {
  124. printf("\t\t\tbubble sort: ");
  125. }
  126. if(c == best_t)
  127. {
  128. if(i==0){printf("best\n");} Print(buf,en,i,n);
  129. break;}
  130. if(c == worst_t)
  131. {
  132. if(i==0){printf("worst\n");} Print(buf,n2,i,n);
  133. break;}
  134. if(c == average_t)
  135. {
  136. if(i==0){printf("average\n");} Print(buf,n2,i,n);
  137. break;}}
  138. case insertion_sort_t:
  139. {
  140. if(i==0)
  141. {
  142. printf("\t\t\tinsertion sort: ");
  143. }
  144. if(c == best_t)
  145. {
  146. if(i==0){printf("best\n");} Print(buf,en,i,n);
  147. break;}
  148.  
  149. if(c == worst_t)
  150. {
  151. if(i==0){printf("worst\n");} Print(buf,n2,i,n);
  152. break;}
  153.  
  154. if(c == average_t)
  155. {
  156. if(i==0){printf("average\n");} Print(buf,n2,i,n);
  157. break;}
  158. }
  159. case quick_sort_t:
  160. {
  161. if(i==0)
  162. {
  163. printf("\t\t\tquick sort: ");
  164. }
  165. if(c == best_t)
  166. {
  167. if(i==0){printf("best\n");} Print(buf,en,i,n);
  168. break;}
  169.  
  170. if(c == worst_t)
  171. {
  172. if(i==0){printf("worst\n");} Print(buf,n2,i,n);
  173. break;}
  174.  
  175. if(c == average_t)
  176. {
  177. if(i==0){printf("average\n");} Print(buf,en,i,n);
  178. break;}
  179. }
  180. case linear_search_t:
  181. {
  182. if(i==0)
  183. {
  184. printf("\t\t\tlinear search: ");
  185. }
  186. if(c == best_t)
  187. {
  188. if(i==0){printf("best\n");} Print(buf,en,i,n);
  189. break;}
  190.  
  191. if(c == worst_t)
  192. {
  193. if(i==0){printf("worst\n");} Print(buf,en,i,n);
  194. break;}
  195.  
  196. if(c == average_t)
  197. {
  198. if(i==0){printf("average\n");} Print(buf,en,i,n);
  199. break;}
  200. }
  201. case binary_search_t:
  202. {
  203. if(i==0)
  204. {
  205. printf("\t\t\tbinary search: ");
  206. }
  207. if(c == best_t)
  208. {
  209. if(i==0){printf("best\n");} Print(buf,en,i,n);
  210. break;}
  211.  
  212. if(c == worst_t)
  213. {
  214. if(i==0){printf("worst\n");} Print(buf,en,i,n);
  215. break;}
  216.  
  217. if(c == average_t)
  218. {
  219. if(i==0){printf("average\n");} Print(buf,en,i,n);
  220. break;}
  221.  
  222.  
  223. }
  224. }
  225. }
  226. }
  227.  
  228.  
  229. //
  230. // Public
  231. //
  232. void ui_run()
  233. {
  234. bool running, show_menu;
  235. result_t result[RESULT_ROWS];
  236.  
  237. show_menu = true;
  238. running = true;
  239. while (running) {
  240. if (show_menu) {
  241. show_menu = false;
  242. ui_menu();
  243. }
  244. switch (ui_get_choice()) {
  245. case 'a':
  246. show_menu = true;
  247. break;
  248. case 'b':
  249. running = false;
  250. break;
  251. case 'c':
  252. benchmark(bubble_sort_t, best_t, result, RESULT_ROWS);
  253. resultat(bubble_sort_t, best_t, result, RESULT_ROWS);
  254. break;
  255. case 'd':
  256. benchmark(bubble_sort_t, worst_t, result, RESULT_ROWS);
  257. resultat(bubble_sort_t, worst_t,result, RESULT_ROWS);
  258. break;
  259. case 'e':
  260. benchmark(bubble_sort_t, average_t, result, RESULT_ROWS);
  261. resultat(bubble_sort_t, average_t, result, RESULT_ROWS);
  262. break;
  263. case 'f':
  264. benchmark(insertion_sort_t, best_t, result, RESULT_ROWS);
  265. resultat(insertion_sort_t, best_t, result, RESULT_ROWS);
  266. break;
  267. case 'g':
  268. benchmark(insertion_sort_t, worst_t, result, RESULT_ROWS);
  269. resultat(insertion_sort_t, worst_t, result, RESULT_ROWS);
  270. break;
  271. case 'h':
  272. benchmark(insertion_sort_t, average_t, result, RESULT_ROWS);
  273. resultat(insertion_sort_t, average_t, result, RESULT_ROWS);
  274. break;
  275. case 'i':
  276. benchmark(quick_sort_t, best_t, result, RESULT_ROWS);
  277. resultat(quick_sort_t, best_t, result, RESULT_ROWS);
  278. break;
  279. case 'j':
  280. benchmark(quick_sort_t, worst_t, result, RESULT_ROWS);
  281. resultat(quick_sort_t, worst_t, result, RESULT_ROWS);
  282. break;
  283. case 'k':
  284. benchmark(quick_sort_t, average_t, result, RESULT_ROWS);
  285. resultat(quick_sort_t, average_t, result, RESULT_ROWS);
  286. break;
  287. case 'l':
  288. benchmark(linear_search_t, best_t, result, RESULT_ROWS);
  289. resultat(linear_search_t, best_t, result, RESULT_ROWS);
  290. break;
  291. case 'm':
  292. benchmark(linear_search_t, worst_t, result, RESULT_ROWS);
  293. resultat(linear_search_t, worst_t, result, RESULT_ROWS);
  294. break;
  295. case 'n':
  296. benchmark(linear_search_t, average_t, result, RESULT_ROWS);
  297. resultat(linear_search_t, average_t, result, RESULT_ROWS);
  298. break;
  299. case 'o':
  300. benchmark(binary_search_t, best_t, result, RESULT_ROWS);
  301. resultat(binary_search_t, best_t, result, RESULT_ROWS);
  302. break;
  303. case 'p':
  304. benchmark(binary_search_t, worst_t, result, RESULT_ROWS);
  305. resultat(binary_search_t, worst_t, result, RESULT_ROWS);
  306. break;
  307. case 'q':
  308. benchmark(binary_search_t, average_t, result, RESULT_ROWS);
  309. resultat(binary_search_t, average_t, result, RESULT_ROWS);
  310. break;
  311. // Invalid input
  312. default:
  313. show_menu = false;
  314. ui_invalid_input();
  315. break;
  316. }
  317. }
  318. ui_exit();
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement