From: Jérôme Benoit Date: Tue, 14 Mar 2017 22:42:27 +0000 (+0100) Subject: TP 13 exo1: Implement array resizing X-Git-Url: https://git.piment-noir.org/?p=TD_C.git;a=commitdiff_plain;h=59941dc1cf415077fbfbde8b313e52e8f3fc6fe5 TP 13 exo1: Implement array resizing Signed-off-by: Jérôme Benoit --- diff --git a/TP_13/exo1/lib/array.c b/TP_13/exo1/lib/array.c index 7743ca5..57c15de 100644 --- a/TP_13/exo1/lib/array.c +++ b/TP_13/exo1/lib/array.c @@ -41,8 +41,13 @@ int* concat_tab(int tab1[], unsigned tab_size1, int tab2[], unsigned tab_size2) return tab_dest; } -int* resize_tab(int tab[], unsigned new_tab_size) { +int* resize_tab(int tab[], unsigned old_tab_size, unsigned new_tab_size) { tab = realloc(tab, sizeof(int) * new_tab_size); + if (old_tab_size < new_tab_size) { + for (unsigned i = old_tab_size; i < new_tab_size; i++) { + tab[i] = 0; + } + } return tab; } diff --git a/TP_13/exo1/lib/array.h b/TP_13/exo1/lib/array.h index ebf92c5..216fa0a 100644 --- a/TP_13/exo1/lib/array.h +++ b/TP_13/exo1/lib/array.h @@ -13,7 +13,7 @@ bool is_odd(int a); int* create_tab(int tab[], unsigned tab_size); void free_tab(int tab[]); int* concat_tab(int tab1[], unsigned tab_size1, int tab2[], unsigned tab_size2); -int* resize_tab(int tab[], unsigned tab_size); +int* resize_tab(int tab[], unsigned old_tab_size, unsigned new_tab_size); unsigned count_tab_element(int tab[], unsigned tab_size, int element); unsigned count_tab_criteria(int tab[], unsigned tab_size, count_criteria_cb c_criteria); void sort_tab(int tab[], unsigned tab_size, criteria_cb criteria); diff --git a/TP_13/exo1/lib/io.c b/TP_13/exo1/lib/io.c index 7639410..884d4a0 100644 --- a/TP_13/exo1/lib/io.c +++ b/TP_13/exo1/lib/io.c @@ -30,7 +30,8 @@ void display_choice_menu() { printf("4) Compter le nombre d'occurence d'un entier dans le tableau.\n"); printf("5) Compter le nombre d'entiers pairs dans le tableau.\n"); printf("6) Compter le nombre d'entiers impairs dans le tableau.\n"); - printf("7) Quitter.\n"); + printf("7) Redimensionner le tableau.\n"); + printf("8) Quitter.\n"); } int* do_concat(int array[], unsigned* size) { @@ -95,6 +96,16 @@ void do_count(int array[], unsigned size) { printf("La valeur %d est presente %d fois dans le tableau\n", search_value, count_tab_element(array, size, search_value)); } +void do_resize(int array[], unsigned* old_size) { + int errno = 0; + unsigned new_size = 0; + + errno = prompt_value("\nNouvelle taille?", (int*)&new_size); + handle_prompt_error(errno); + array = resize_tab(array, *old_size, new_size); + *old_size = new_size; +} + void display_array(int array[], unsigned size) { if (array != NULL) { printf("\n--array begin--\n"); diff --git a/TP_13/exo1/lib/io.h b/TP_13/exo1/lib/io.h index 13f14e0..24de1b1 100644 --- a/TP_13/exo1/lib/io.h +++ b/TP_13/exo1/lib/io.h @@ -9,6 +9,7 @@ void display_choice_menu(); int* do_concat(int array[], unsigned* size); void do_sort(int array[], unsigned size); void do_count(int array[], unsigned size); +void do_resize(int array[], unsigned* size); void display_array(int array[], unsigned size); diff --git a/TP_13/exo1/src/main.c b/TP_13/exo1/src/main.c index 2c81a63..ef4d545 100644 --- a/TP_13/exo1/src/main.c +++ b/TP_13/exo1/src/main.c @@ -18,8 +18,8 @@ int main() { display_choice_menu(); errno = prompt_value("Choix?", &choice); handle_prompt_error(errno); - if (1 > choice || 7 < choice) { - printf("\nFaire un choix compris entre 1 et 7\n"); + if (1 > choice || 8 < choice) { + printf("\nFaire un choix compris entre 1 et 8\n"); continue; } switch (choice) { @@ -41,11 +41,14 @@ int main() { case 6: printf("\nLe nombre d'entiers impairs dans le tableau est %d\n", count_tab_criteria(tab, tab_size, is_odd)); break; + case 7: + do_resize(tab, &tab_size); + break; default: /* do nothing, unused code path */ break; } - } while (choice != 7); + } while (choice != 8); free_tab(tab); exit(EXIT_SUCCESS);