Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ui.h"
- #include "io.h"
- #include "analyze.h"
- #include <stdbool.h>
- #include <stdio.h>
- #include <math.h>
- //
- // Private
- //
- static void ui_invalid_input()
- {
- printf("info> bad input\n");
- }
- static void ui_exit()
- {
- printf("info> bye\n");
- }
- static char ui_get_choice()
- {
- char buf[3];
- printf("input> ");
- return read_line(buf, 3) ? buf[0] : 0;
- }
- static void ui_line(char c, int n)
- {
- while (n-- > 0) {
- putchar(c);
- }
- putchar('\n');
- }
- static void ui_menu_options(const char *options[], int num_options)
- {
- int i;
- for (i=0; i<num_options; i++) {
- printf("%c) %s\n", 'a'+i, options[i]);
- }
- }
- static void ui_menu()
- {
- const char *options[] = {
- "Menu",
- "Exit\n",
- "Bubble sort best case",
- "Bubble sort worst case",
- "Bubble sort average case",
- "Insertion sort best case",
- "Insertion sort worst case",
- "Insertion sort average case",
- "Quick sort best case",
- "Quick sort worst case",
- "Quick sort average case",
- "Linear sort best case",
- "Linear sort wors case",
- "Linear sort average case",
- "Binary sort best case",
- "Binary sort worst case",
- "Binary sort average case",
- };
- ui_line('=', MENU_WIDTH);
- ui_menu_options(options, sizeof(options) / sizeof(char *));
- ui_line('-', MENU_WIDTH);
- }
- static void Print(result_t *buf, complexity typ, int i, int storlek)
- {
- if(typ == en)
- {
- if(i == 0)
- {
- ui_line('~', MENU_WIDTH);
- 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");
- ui_line('~', MENU_WIDTH);
- }
- printf("\n");
- printf("|%d| \t", buf[i].size);
- printf("|%lf| \t\t", buf[i].time);
- printf("|%.6e| \t\t\t", buf[i].time / (log(buf[i].size)));
- printf("|%.6e| \t\t\t", buf[i].time / (buf[i].size));
- printf("|%.6e|\t\t\t",buf[i].time / (buf[i].size*log(buf[i].size)));
- printf("\n");
- }
- if(typ == n2)
- {
- if(i == 0)
- {
- ui_line('~', MENU_WIDTH);
- printf("size\ttime T(s)\tT/nlogn \t (T/n^2) \t\t T/n^3\n");
- ui_line('~', MENU_WIDTH);
- }
- printf("\n");
- printf("%d\t", buf[i].size);
- printf("%lf \t", buf[i].time);
- printf("%.6e \t", buf[i].time/(buf[i].size*log(buf[i].size)));
- printf("%.6e \t", buf[i].time / pow(buf[i].size,2));
- printf("%.6e \t",buf[i].time / pow(buf[i].size,3));
- printf("\n");
- }
- }
- void resultat(const algorithm_t a, const case_t c, result_t *buf, int n)
- {
- int i;
- ui_line('*', MENU_WIDTH);
- for(i=0;i<n;i++)
- {
- switch(a){
- printf("\t\t\t");
- case bubble_sort_t:
- {
- if(i==0)
- {
- printf("\t\t\tbubble sort: ");
- }
- if(c == best_t)
- {
- if(i==0){printf("best\n");} Print(buf,en,i,n);
- break;}
- if(c == worst_t)
- {
- if(i==0){printf("worst\n");} Print(buf,n2,i,n);
- break;}
- if(c == average_t)
- {
- if(i==0){printf("average\n");} Print(buf,n2,i,n);
- break;}}
- case insertion_sort_t:
- {
- if(i==0)
- {
- printf("\t\t\tinsertion sort: ");
- }
- if(c == best_t)
- {
- if(i==0){printf("best\n");} Print(buf,en,i,n);
- break;}
- if(c == worst_t)
- {
- if(i==0){printf("worst\n");} Print(buf,n2,i,n);
- break;}
- if(c == average_t)
- {
- if(i==0){printf("average\n");} Print(buf,n2,i,n);
- break;}
- }
- case quick_sort_t:
- {
- if(i==0)
- {
- printf("\t\t\tquick sort: ");
- }
- if(c == best_t)
- {
- if(i==0){printf("best\n");} Print(buf,en,i,n);
- break;}
- if(c == worst_t)
- {
- if(i==0){printf("worst\n");} Print(buf,n2,i,n);
- break;}
- if(c == average_t)
- {
- if(i==0){printf("average\n");} Print(buf,en,i,n);
- break;}
- }
- case linear_search_t:
- {
- if(i==0)
- {
- printf("\t\t\tlinear search: ");
- }
- if(c == best_t)
- {
- if(i==0){printf("best\n");} Print(buf,en,i,n);
- break;}
- if(c == worst_t)
- {
- if(i==0){printf("worst\n");} Print(buf,en,i,n);
- break;}
- if(c == average_t)
- {
- if(i==0){printf("average\n");} Print(buf,en,i,n);
- break;}
- }
- case binary_search_t:
- {
- if(i==0)
- {
- printf("\t\t\tbinary search: ");
- }
- if(c == best_t)
- {
- if(i==0){printf("best\n");} Print(buf,en,i,n);
- break;}
- if(c == worst_t)
- {
- if(i==0){printf("worst\n");} Print(buf,en,i,n);
- break;}
- if(c == average_t)
- {
- if(i==0){printf("average\n");} Print(buf,en,i,n);
- break;}
- }
- }
- }
- }
- //
- // Public
- //
- void ui_run()
- {
- bool running, show_menu;
- result_t result[RESULT_ROWS];
- show_menu = true;
- running = true;
- while (running) {
- if (show_menu) {
- show_menu = false;
- ui_menu();
- }
- switch (ui_get_choice()) {
- case 'a':
- show_menu = true;
- break;
- case 'b':
- running = false;
- break;
- case 'c':
- benchmark(bubble_sort_t, best_t, result, RESULT_ROWS);
- resultat(bubble_sort_t, best_t, result, RESULT_ROWS);
- break;
- case 'd':
- benchmark(bubble_sort_t, worst_t, result, RESULT_ROWS);
- resultat(bubble_sort_t, worst_t,result, RESULT_ROWS);
- break;
- case 'e':
- benchmark(bubble_sort_t, average_t, result, RESULT_ROWS);
- resultat(bubble_sort_t, average_t, result, RESULT_ROWS);
- break;
- case 'f':
- benchmark(insertion_sort_t, best_t, result, RESULT_ROWS);
- resultat(insertion_sort_t, best_t, result, RESULT_ROWS);
- break;
- case 'g':
- benchmark(insertion_sort_t, worst_t, result, RESULT_ROWS);
- resultat(insertion_sort_t, worst_t, result, RESULT_ROWS);
- break;
- case 'h':
- benchmark(insertion_sort_t, average_t, result, RESULT_ROWS);
- resultat(insertion_sort_t, average_t, result, RESULT_ROWS);
- break;
- case 'i':
- benchmark(quick_sort_t, best_t, result, RESULT_ROWS);
- resultat(quick_sort_t, best_t, result, RESULT_ROWS);
- break;
- case 'j':
- benchmark(quick_sort_t, worst_t, result, RESULT_ROWS);
- resultat(quick_sort_t, worst_t, result, RESULT_ROWS);
- break;
- case 'k':
- benchmark(quick_sort_t, average_t, result, RESULT_ROWS);
- resultat(quick_sort_t, average_t, result, RESULT_ROWS);
- break;
- case 'l':
- benchmark(linear_search_t, best_t, result, RESULT_ROWS);
- resultat(linear_search_t, best_t, result, RESULT_ROWS);
- break;
- case 'm':
- benchmark(linear_search_t, worst_t, result, RESULT_ROWS);
- resultat(linear_search_t, worst_t, result, RESULT_ROWS);
- break;
- case 'n':
- benchmark(linear_search_t, average_t, result, RESULT_ROWS);
- resultat(linear_search_t, average_t, result, RESULT_ROWS);
- break;
- case 'o':
- benchmark(binary_search_t, best_t, result, RESULT_ROWS);
- resultat(binary_search_t, best_t, result, RESULT_ROWS);
- break;
- case 'p':
- benchmark(binary_search_t, worst_t, result, RESULT_ROWS);
- resultat(binary_search_t, worst_t, result, RESULT_ROWS);
- break;
- case 'q':
- benchmark(binary_search_t, average_t, result, RESULT_ROWS);
- resultat(binary_search_t, average_t, result, RESULT_ROWS);
- break;
- // Invalid input
- default:
- show_menu = false;
- ui_invalid_input();
- break;
- }
- }
- ui_exit();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement