Partie 2 : des requêtes plus difficiles

Partie 2 : des requêtes plus difficiles#

Dans cette partie, on va effectuer des manipulations de données plus compliquées, se rapprochant de ``vraies”” requêtes sur des bases de données (mais de façon beaucoup moins efficace !).

Note : cette partie est indépendante de la partie 3

Exercice 6

On cherche à effectuer des requêtes (c’est à dire des interrogations et sélections de données) plus complexes sur les tableaux de données.

  1. Complétez les fonctions chercheIndice et distinct du fichier tableau-donnees-avance.cpp. La documentation se trouve dans tableau-donnees-avance.hpp et les tests dans tableau-donnees-avance-test.cpp. Vous pouvez compiler le fichier avec la commande make tableau-donnees-avance-test.

    Indication : la fonction distinct permet de récupérer une colonne du tableau de données en supprimant les doublons : par exemple, on peut obtenir les années qui apparaissent dans le fichier, ou les prénoms différents, etc. Pour cela, on lira le tableau ligne par ligne, et on utilisera la fonction chercheIndice pour savoir si l’élément a déjà été ajouté au tableau à renvoyer.

  2. Complétez la fonction conversionDouble en vous inspirant du fonctionnement de conversionInt donné dans tableau-donnees.cpp, avec utilisation des string stream.

  3. On cherche à écrire une fonction classique des requêtes sur base de données : la fonction groupBy. L’idée est de calculer des sommes récapitulatives à partir d’une colonne, en regroupant selon des données qui se trouvent dans une autre colonne. Par exemple, sur le tableau suivant :

    .

    .

    .

    .

    M

    2011

    Bubulle

    3

    F

    2012

    Bichette

    4

    F

    2011

    Babouche

    7

    F

    2011

    Ziboulette

    1

    Si nous regroupons selon les années de la 2ème colonne, en sommant les valeurs de la dernière colonne, nous obtenons :

    .

    .

    2011

    11

    2012

    4

    Complétez la fonction groupByInt de tableau-donnees-avance.cpp. En plus du tableau de données, cette fonction prend en paramètre :

    • les valeurs distinctes à prendre en compte pour le groupBy, par exemple { "2011", "2012" } pour la somme regroupée ci dessus,

    • le numéro de la colonne d’où sont tirées les valeurs selon lesquelles doit se faire le regroupement, dans l’exemple ci dessus, le regroupement se fait selon les années qui sont dans la 2ème colonne, c’est à dire la colonne d’indice 1,

    • le numéro de colonne des valeurs à sommer, dans l’exemple ci dessus, il s’agit de la 4ème colonne, ayant pour indice 3.

    La fonction renvoie un tableau d’entier qui correspond aux sommes obtenues. Dans l’exemple ci dessus on obtient { 11, 4}. Vous aurez besoin d’appeler la fonction chercheIndice.

    Testez votre fonction à l’aide de tableau-donnees-avance-test.cpp. Ensuite, compilez avec make mariage-complet-3 le fichier mariage-complet-3.cpp et vérifiez en l’exécutant que vous obtenez les mêmes résultats que dans make mariage-complet-2.

  4. En vous inspirant de l’utilisation de distinct et groupBy dans mariage-complet-3.cpp, répondez aux questions ci-dessous en complétant la fonction main de prenoms-tableau-avance.cpp :

    • Combien y-a-t il eu au total de naissances de garçons ? De filles ?

    • Quelle année a-t-on eu le plus de naissances (garçons et filles confondus) ?

    • Combien a-t-on de naissances en moyennes par an ?

    • Combien y-a-t il de prénoms féminins différents ? Et masculins ?

    • Quel est le prénom féminin le plus populaire ? masculin ?

    Pour toutes ces questions, il faudra utiliser une combinaison d’appels à distinct et / ou groupByInt avec parfois en plus une sélection selectLignes à effectuer. Voici les réponses que vous devez obtenir :

    Il y a eu 324276 naissance de garçons et 303142 naissances de filles
    L'année qui a eu le plus de naissance est : 2010 avec 33259 naissances
    En moyenne, naissent 31370 enfants par an
    Il y a eu 1466 prénoms de fille différents et 1365 prénoms de garçons
    Le prénom féminin le plus populaire est Louise avec 5175 naissances
    Le prénom masculin le plus populaire est Gabriel avec 6782 naissances
    
  5. Complétez la fonction groupByDouble et lancez les tests correspondants. La fonction est la même que groupByInt mais on doit maintenant fabriquer un tableau de double

  6. \(\clubsuit\) Version avancée: éviter la duplication pour les fonctions conversion et groupBy en utilisant un template.