TP 13 exo1: implement odd and even elements counting with callbacks
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 14 Mar 2017 22:11:23 +0000 (23:11 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 14 Mar 2017 22:11:23 +0000 (23:11 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TP_13/exo1/lib/array.c
TP_13/exo1/lib/array.h
TP_13/exo1/lib/io.c
TP_13/exo1/src/main.c

index ec612c1f82bd769dee7883aca6228a96397ff91c..7743ca5132345894f8423c7287bb522411537b8d 100644 (file)
@@ -47,8 +47,9 @@ int* resize_tab(int tab[], unsigned new_tab_size) {
 }
 
 /* number of occurences of an element in an unsorted array  */
-int count_tab_element(int tab[], unsigned tab_size, int element) {
+unsigned count_tab_element(int tab[], unsigned tab_size, int element) {
     unsigned el_count = 0;
+
     for (unsigned i = 0; i < tab_size; i++) {
         if (tab[i] == element) {
             el_count++;
@@ -57,6 +58,26 @@ int count_tab_element(int tab[], unsigned tab_size, int element) {
     return el_count;
 }
 
+unsigned count_tab_criteria(int tab[], unsigned tab_size, count_criteria_cb c_criteria) {
+    unsigned cr_count = 0;
+
+    for (unsigned i = 0; i < tab_size; i++) {
+        if (c_criteria(tab[i])) {
+            cr_count++;
+        }
+    }
+    return cr_count;
+}
+
+bool is_even(int a) {
+    return (a % 2 == 0);
+}
+
+bool is_odd(int a) {
+    return (a % 2 != 0);
+
+}
+
 void sort_tab(int tab[], unsigned tab_size, criteria_cb criteria) {
     sort_bubble_array(tab, tab_size, criteria);
 }
index efdb488bc9c0b9a1e7e97162c42535f55e4e2aed..ebf92c525a78f4a5178f3bd1ac6bb3f876d270ab 100644 (file)
@@ -1,13 +1,21 @@
 #ifndef ARRAY_H
 #define ARRAY_H
 
+#include <stdbool.h>
+
 #include "sort.h"
 
+typedef bool(*count_criteria_cb)(int a);
+
+bool is_even(int a);
+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 count_tab_element(int tab[], unsigned tab_size, int element);
+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);
 
 #endif /* ARRAY_H */
index 989e746aa237cd90d18c0b3861427deefd5f1bf2..7639410116edf56925481f8501b24fc0ff29c963 100644 (file)
@@ -28,7 +28,9 @@ void display_choice_menu() {
     printf("2) Trier le tableau.\n");
     printf("3) Afficher le tableau.\n");
     printf("4) Compter le nombre d'occurence d'un entier dans le tableau.\n");
-    printf("5) Quitter.\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");
 }
 
 int* do_concat(int array[], unsigned* size) {
@@ -77,6 +79,7 @@ void do_sort(int array[], unsigned size) {
             criteria = ascending_and_odd;
             break;
         default:
+            /* sort ascending by default, unused code path */
             criteria = ascending;
             break;
     }
index e7472189288080d542fbfb709d6a3f01a8eab848..2c81a631b28d3abb19c28c4eb6bf4d0ce3e0bd7f 100644 (file)
@@ -18,8 +18,8 @@ int main() {
         display_choice_menu();
         errno = prompt_value("Choix?", &choice);
         handle_prompt_error(errno);
-        if (1 > choice || 5 < choice) {
-            printf("\nFaire un choix compris entre 1 et 5\n");
+        if (1 > choice || 7 < choice) {
+            printf("\nFaire un choix compris entre 1 et 7\n");
             continue;
         }
         switch (choice) {
@@ -35,11 +35,17 @@ int main() {
             case 4:
                 do_count(tab, tab_size);
                 break;
+            case 5:
+                printf("\nLe nombre d'entiers pairs dans le tableau est %d\n", count_tab_criteria(tab, tab_size, is_even));
+                break;
+            case 6:
+                printf("\nLe nombre d'entiers impairs dans le tableau est %d\n", count_tab_criteria(tab, tab_size, is_odd));
+                break;
             default:
                 /* do nothing, unused code path */
                 break;
         }
-    } while (choice != 5);
+    } while (choice != 7);
 
     free_tab(tab);
     exit(EXIT_SUCCESS);