Aller au contenu

Exercices d'entraînement
Recherche

Ces exercices doivent être utilisés pour vous entraîner à programmer. Ils sont généralement accompagnés d'aide et de leur solution pour vous permettre de progresser.

Avant de vous précipiter sur ces solutions dès la première difficulté, n'oubliez pas les conseils suivants :

  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests donnés dans l'exercice ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?

Pour tester les exercices de cette page vous pourrez faire appel aux fichiers personnes.csv et Zelda_Consoles.csv.

Attention

  • Ne pas oublier de sauvegarder les fichiers dans le répertoire [NSI_Tables_Donnees].
  • Ne pas oublier d'importer le module fonctions_csv.
  • Ne pas oublier d'importer les fichiers CSV en tableau de dictionnaires pour pouvoir utiliser les fonctions...

ProgC02.51

Pour pouvoir utiliser les fonctions est_presente(), recupere_valeur() et compte_valeur() du module fonctions_csv.py, il faut être sûr que l'attribut passé en paramètre appartienne bien à la table passée en paramètre.

Pour le vérifier, complétez la définition de la fonction est_attribut() :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from fonctions_csv import *

def est_attribut(table, attribut):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaîne de caractères
    Sortie: bool - True si attribut est une clef de la table, False sinon
    """
    pass


##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    print(est_attribut(table_personnes, 'prenom'))

    table_zelda = importe_csv('Zelda_Consoles.csv')
    print(est_attribut(table_zelda, 'sortie_usa'))

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from fonctions_csv import *

def est_attribut(table, attribut):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaîne de caractères
    Sortie: bool - True si attribut est une clef de la table, False sinon
    """
    if attribut in table[0].keys():
        return True
    else:
        return False



##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    print(est_attribut(table_personnes, 'prenom'))

    table_zelda = importe_csv('Zelda_Consoles.csv')
    print(est_attribut(table_zelda, 'sortie_usa'))
Une autre solution

Il est temps de commencer à penser à ce genre de solution...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from fonctions_csv import *

def est_attribut(table, attribut):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaîne de caractères
    Sortie: bool - True si attribut est une clef de la table, False sinon
    """
    return attribut in table[0].keys()



##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    print(est_attribut(table_personnes, 'prenom'))

    table_zelda = importe_csv('Zelda_Consoles.csv')
    print(est_attribut(table_zelda, 'sortie_usa'))

ProgC02.52

Complétez la définition de la fonction recupere_tab_valeurs() qui renvoie un tableau constitué de toutes les valeurs de attribut2 lorsque, dans la table, une des valeurs de l'attribut attribut1 est valeur1.

 3
 4
 5
 6
 7
 8
 9
10
11
def recupere_tab_valeurs(table, attribut1, valeur1, attribut2):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut1, attribut2 - str, chaîne de caractères représentant des clés
    valeur1 - doit être du même type que les valeurs de la clé attribut1
    Sortie: list, tableau (éventuellement vide) des valeurs de la clé
            attribut2 des lignes où valeur1 est la valeur de attribut1
    """
    pass

Exemple

On nomme table_personnes le tableau de dictionnaires dans lequel est stockée le fichier personnes.csv.

>>> recupere_tab_valeurs(table_personnes, 'prenom', 'Alain', 'annee_naissance')
['1999', '2000', '1970']

Une solution

Il faut faire attention au **type de la variable valeur. Pour l'instant, nous ne faisons que vérifier des valeurs donc on peut tester des égalités sur les chaînes de caractères. Ce ne sera pas le cas dans le prochain exercice.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from fonctions_csv import *

def recupere_tab_valeurs(table, attribut1, valeur1, attribut2):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut1, attribut2 - str, chaîne de caractères représentant des clés
    valeur1 - doit être du même type que les valeurs de la clé attribut1
    Sortie: list, tableau (éventuellement vide) des valeurs de la clé
            attribut2 des lignes où valeur1 est la valeur de attribut1
    """
    result = []
    for dico in table:
        if dico[attribut1] == valeur1 :
            result.append(dico[attribut2])
    return result



##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    print(recupere_tab_valeurs(table_personnes, 'prenom', 'Alain', 'annee_naissance'))

    table_zelda = importe_csv('Zelda_Consoles.csv')
    print(recupere_tab_valeurs(table_zelda, 'nombre_rééditions', '0', 'titre'))

Une autre solution

En utilisant une liste définie en compréhension :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from fonctions_csv import *

def recupere_tab_valeurs(table, attribut1, valeur1, attribut2):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut1, attribut2 - str, chaîne de caractères représentant des clés
    valeur1 - doit être du même type que les valeurs de la clé attribut1
    Sortie: list, tableau (éventuellement vide) des valeurs de la clé
            attribut2 des lignes où valeur1 est la valeur de attribut1
    """
    return [dico[attribut2] for dico in table if dico[attribut1] == valeur1]



##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    print(recupere_tab_valeurs(table_personnes, 'prenom', 'Alain', 'annee_naissance'))

    table_zelda = importe_csv('Zelda_Consoles.csv')
    print(recupere_tab_valeurs(table_zelda, 'nombre_rééditions', '0', 'titre'))

ProgC02.53

La fonction à définir dans cet exercice est à appliquer uniquement à la table de données issue du fichier personnes.csv.

Complétez la définition age_moyen() qui renvoie, pour l'annee_actuelle, l'âge moyen (arrondi à 0,1 près) d'un ensemble de personnes dont on connaît l'année de naissance stockée dans l'attribut annee_naissance.

 3
 4
 5
 6
 7
 8
 9
10
11
12
def age_moyen(table, annee_naissance, annee_actuelle):
    """
    table - list, Table de données représentée par un tableau de dictionnaires
            ayant les mêmes clés
    annee_naissance - attribut (clé) de cette table ayant des valeurs entières (des années)
    annee_actuelle - entier, représentant une année
    Sortie: float - âge moyen des individus représentés dans la table,
            lors de l'année actuelle
    """
    pass
Une solution

On fait appel à la fonction attributs_entiers() pour convertir l'attribut 'annee_naissance' de la table table_personnes.

from fonctions_csv import *

def age_moyen(table, annee_naissance, annee_actuelle):
    """
    table - list, Table de données représentée par un tableau de dictionnaires
            ayant les mêmes clés
    annee_naissance - attribut (clé) de cette table ayant des valeurs entières (des années)
    annee_actuelle - entier, représentant une année
    Sortie: float - âge moyen des individus représentés dans la table,
            lors de l'année actuelle
    """
    somme_ages = 0
    # on admet que toutes les personnes sont distinctes
    nb_personnes = len(table)
    for dico in table:
        age = annee_actuelle - dico[annee_naissance]
        somme_ages = somme_ages + age
    return round(somme_ages/nb_personnes, 1)



##----- Programme principal -----##
if __name__ == '__main__':
    table_personnes = importe_csv('personnes.csv')
    attributs_entiers(table_personnes, 'annee_naissance')
    print(age_moyen(table_personnes, 'annee_naissance', 2022))