Aller au contenu

Sujet n°16

Sujet original

Pour télécharger l'énoncé original, cliquer ici.

Exercice n°1

Écrire une fonction recherche_indices_classement() qui prend en paramètres un entier elt et une liste d'entiers tab, et qui renvoie trois listes :

  • la première liste contient les indices des valeurs de la liste tab strictement inférieures à elt ;
  • la deuxième liste contient les indices des valeurs de la liste tab égales à elt ;
  • la troisième liste contient les indices des valeurs de la liste tabstrictement supérieures à elt.
Commentaires

Ici, le mot « liste » est à comprendre dans le sens « liste Python » (c'est-à-dire tableau) plutôt que dans le sens du type abstrait de données liste étudié en Terminale.

Exemples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> recherche_indices_classement(3, [1, 3, 4, 2, 4, 6, 3, 0]) 
([0, 3, 7], [1, 6], [2, 4, 5]) 

>>> recherche_indices_classement(3, [1, 4, 2, 4, 6, 0]) 
([0, 2, 5], [], [1, 3, 4]) 

>>>recherche_indices_classement(3, [1, 1, 1, 1]) 
([0, 1, 2, 3], [], []) 

>>> recherche_indices_classement(3, []) 
([], [], [])
Une solution
 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
26
27
def recherche_indices_classement(elt, tab):
    """
    elt - int
    tab - list, tableau d'entiers
    Sortie: tuple - triplet ds trois tableaux :
            - celui des indices des valeurs de tab inférieures à elt
            - celui des indices des valeurs de tab égales à elt
            - celui des indices des valeurs de tab supérieures à elt
    """
    avant = [i for i in range(len(tab)) if tab[i] < elt]
    pendant = [i for i in range(len(tab)) if tab[i] == elt]
    apres = [i for i in range(len(tab)) if tab[i] > elt]
    return (avant, pendant, apres)

if __name__ == '__main__':
    # Exemples de l'énoncé
    print(recherche_indices_classement(3, [1, 3, 4, 2, 4, 6, 3, 0]) == ([0, 3, 7], [1, 6], [2, 4, 5]))
    print(recherche_indices_classement(3, [1, 4, 2, 4, 6, 0]) == ([0, 2, 5], [], [1, 3, 4]))
    print(recherche_indices_classement(3, [1, 1, 1, 1]) == ([0, 1, 2, 3], [], []))
    print(recherche_indices_classement(3, []) == ([], [], []))


    # Exemples supplémentaires
    print(recherche_indices_classement(3, [3, 2, 1, 3, 2, 1]) == ([1, 2, 4, 5], [0, 3], []))
    print(recherche_indices_classement(4, [5, 6, 7]) == ([], [], [0, 1, 2]))
    print(recherche_indices_classement(1, [1, 1, 1, 1, 1, 1, 1, 1]) == ([], [0, 1, 2, 3, 4, 5, 6, 7], []))
    print(recherche_indices_classement(4, [3, 2, 1, 4, 2, 1]) == ([0, 1, 2, 4, 5], [3], []))

Exercice n°2

Un professeur de NSI décide de gérer les résultats de sa classe sous la forme d’un dictionnaire :

  • les clefs sont les noms des élèves ;
  • les valeurs sont des dictionnaires dont les clefs sont les types d’épreuves sous forme de chaîne de caractères et les valeurs sont les notes obtenues associées à leurs coefficients dans une liste.
Commentaires

Ici, le mot « liste » est à comprendre dans le sens « liste Python » (c'est-à-dire tableau) plutôt que dans le sens du type abstrait de données liste étudié en Terminale.

Exemple

L’élève de nom « Durand » a obtenu au DS2 la note de 8 avec un coefficient 4 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
resultats = {'Dupont': {'DS1' : [15.5, 4],
                        'DM1' : [14.5, 1],
                        'DS2' : [13, 4],
                        'PROJET1' : [16, 3],
                        'DS3' : [14, 4] },
             'Durand': {'DS1' : [6 , 4],
                        'DM1' : [14.5, 1],
                        'DS2' : [8, 4],
                        'PROJET1' : [9, 3],
                        'IE1' : [7, 2],
                        'DS3' : [8, 4],
                        'DS4' : [15, 4]} }

Le professeur crée une fonction moyenne() qui prend en paramètre le nom d’un de ces élèves et lui renvoie sa moyenne arrondie au dixième.

Compléter le code du professeur ci-dessous :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def moyenne(nom, dico_result): 
    if nom in ...: 
        notes = dico_result[nom] 
        total_points = ... 
        total_coefficients = ... 
        for ...  in notes.values(): 
            note, coefficient = valeurs 
            total_points = total_points + ... * coefficient 
            total_coefficients = ... + coefficient 
        return round( ... / total_coefficients, 1 ) 
    else: 
        return -1
Commentaire sur le code original
  1. Pour télécharger l'original du fichier à compléter, cliquer ici.

  2. Compliqué ici d'ajouter un exemple pertinent qui permette de vérifier la bonne exécution de ce programme.

  3. Le code fait appel à la fonction round() dont le rôle n'est pas explicité.
    N'oubliez pas que vous pouvez taper l'instruction :

    1
    >>> help(round)
    
    pour obtenir la documentation de cette fonction.

Une réponse
 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
26
27
28
29
30
31
32
33
resultats = {'Dupont':{'DS1' : [15.5, 4],
                       'DM1' : [14.5, 1],
                       'DS2' : [13, 4],
                       'PROJET1' : [16, 3],
                       'DS3' : [14, 4] },
             'Durand':{'DS1' : [6 , 4],
                       'DM1' : [14.5, 1],
                       'DS2' : [8, 4],
                       'PROJET1' : [9, 3],
                       'IE1' : [7, 2],
                       'DS3' : [8, 4],
                       'DS4' : [15, 4]}}


def moyenne(nom, dico_result):
    if nom in dico_result.keys():
        notes = dico_result[nom]
        total_points = 0
        total_coefficients = 0
        for valeurs  in notes.values():
            note , coefficient = valeurs
            total_points = total_points + note * coefficient
            total_coefficients = total_coefficients + coefficient
        return round( total_points / total_coefficients , 1 )
    else:
        return -1


if __name__ == '__main__':
    # Exemples
    print(moyenne('Dupont', resultats) == 14.5)
    print(moyenne('Durand', resultats) == 9.2)
    print(moyenne('Duval', resultats) == -1)