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.
Complétez les fonctions
chercheIndice
etdistinct
du fichiertableau-donnees-avance.cpp
. La documentation se trouve danstableau-donnees-avance.hpp
et les tests danstableau-donnees-avance-test.cpp
. Vous pouvez compiler le fichier avec la commandemake 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 fonctionchercheIndice
pour savoir si l’élément a déjà été ajouté au tableau à renvoyer.Complétez la fonction
conversionDouble
en vous inspirant du fonctionnement deconversionInt
donné danstableau-donnees.cpp
, avec utilisation des string stream.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
detableau-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 fonctionchercheIndice
.Testez votre fonction à l’aide de
tableau-donnees-avance-test.cpp
. Ensuite, compilez avecmake mariage-complet-3
le fichiermariage-complet-3.cpp
et vérifiez en l’exécutant que vous obtenez les mêmes résultats que dansmake mariage-complet-2
.En vous inspirant de l’utilisation de
distinct
etgroupBy
dansmariage-complet-3.cpp
, répondez aux questions ci-dessous en complétant la fonctionmain
deprenoms-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 / ougroupByInt
avec parfois en plus une sélectionselectLignes
à 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
Complétez la fonction
groupByDouble
et lancez les tests correspondants. La fonction est la même quegroupByInt
mais on doit maintenant fabriquer un tableau dedouble
\(\clubsuit\) Version avancée: éviter la duplication pour les fonctions
conversion
etgroupBy
en utilisant un template.