TP 13 exo1: Implement all the required features.
[TD_C.git] / TP_13 / exo1 / lib / io.c
CommitLineData
33b9c646 1#include <stdio.h>
475ee86d 2#include <stdbool.h>
33b9c646
JB
3
4#include "io.h"
cfdd46d2 5#include "array.h"
475ee86d 6#include "utils.h"
33b9c646
JB
7
8int prompt_value(const char* msg, int* result) {
9 puts(msg);
10 int retVal = scanf("%d", result);
11 return (retVal == 1) ? 0 : 1;
12}
13
cfdd46d2
JB
14int* prompt_array(int array[], unsigned* size) {
15 int errno = prompt_value("Taille du tableau?", (int*)size);
16 array = create_tab(array, *size);
17 for (unsigned i = 0; i < *size; i++) {
18 errno += prompt_value("Valeur?", &array[i]);
19 }
475ee86d
JB
20 /* error might have occured */
21 handle_prompt_error(errno);
22 return array;
23}
24
25void display_choice_menu() {
26 printf("\n=== Menu ===\n\n");
27 printf("1) Saisir puis concatener un autre tableau.\n");
28 printf("2) Trier le tableau.\n");
29 printf("3) Afficher le tableau.\n");
30 printf("4) Compter le nombre d'occurence d'un entier dans le tableau.\n");
31 printf("5) Quitter.\n");
32}
33
34int* do_concat(int array[], unsigned* size) {
35 int* tab_to_concat = NULL;
36 unsigned tab_to_concat_size = 0;
37 printf("\n=== Saisie d'un tableau ===\n\n");
38 tab_to_concat = prompt_array(tab_to_concat, &tab_to_concat_size);
39 int* tab_concat = concat_tab(array, *size, tab_to_concat, tab_to_concat_size);
40 *size += tab_to_concat_size;
41 free_tab(array);
42 free_tab(tab_to_concat);
43 return tab_concat;
44}
45
46void do_sort(int array[], unsigned size) {
47 int errno = 0;
48 int choice = 0;
49 bool done = false;
50 criteria_cb criteria;
51
52 printf("\n=== Menu de tri ===\n\n");
53 printf("1) Croissant.\n");
54 printf("2) Decroissant.\n");
55 printf("3) Croissant pairs en premier.\n");
56 printf("4) Croissant impairs en premier.\n");
57 do {
58 errno = prompt_value("Choix?", &choice);
59 handle_prompt_error(errno);
60 done = true;
61 if (1 > choice || 4 < choice) {
62 printf("\nFaire un choix compris entre 1 et 4\n");
63 done = false;
64 }
65 } while (!done);
66 switch (choice) {
67 case 1:
68 criteria = ascending;
69 break;
70 case 2:
71 criteria = descending;
72 break;
73 case 3:
74 criteria = ascending_and_even;
75 break;
76 case 4:
77 criteria = ascending_and_odd;
78 break;
79 default:
80 criteria = ascending;
81 break;
cfdd46d2 82 }
475ee86d
JB
83 sort_tab(array, size, criteria);
84}
85
86void do_count(int array[], unsigned size) {
87 int errno = 0;
88 int search_value = 0;
89
90 errno = prompt_value("\nValeur a chercher?", &search_value);
91 handle_prompt_error(errno);
92 printf("La valeur %d est presente %d fois dans le tableau\n", search_value, count_tab_element(array, size, search_value));
cfdd46d2
JB
93}
94
475ee86d 95void display_array(int array[], unsigned size) {
cfdd46d2 96 if (array != NULL) {
475ee86d
JB
97 printf("\n--array begin--\n");
98 for (unsigned i = 0; i < size; i++) {
cfdd46d2
JB
99 printf("value in array at index[%d]=%d\n", i, array[i]);
100 }
101 printf("--array end--\n");
102 } else {
475ee86d 103 printf("\n--array NULL--\n");
33b9c646
JB
104 }
105}