Aller au contenu

Sujet n°45

Sujet original

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

Exercice n°1

On veut trier par ordre croissant les notes d’une évaluation qui sont des nombres entiers compris entre 0 et 10 (inclus).
Ces notes sont contenues dans une liste notes_eval.

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.

Écrire une fonction rangement_valeurs prenant en paramètre la liste notes_eval et renvoyant une liste de longueur 11 telle que la valeur de cette liste à chaque rang est égale au nombre de notes valant ce rang. Ainsi le terme de rang 0 indique le nombre de note 0, le terme de rang 1 le nombre de note 1, etc.

Écrire ensuite une fonction notes_triees prenant en paramètre la liste des effectifs des notes et renvoyant une liste contenant la liste, triée dans l’ordre croissant, des notes des élèves.

Exemples

1
2
3
4
5
6
7
8
>>> notes_eval = [2, 0, 5, 9, 6, 9, 10, 5, 7, 9, 9, 5, 0, 9, 6, 5, 4]

>>> effectifs_notes = rangement_valeurs(notes_eval)
>>> effectifs_notes
[2, 0, 1, 0, 1, 4, 2, 1, 0, 5, 1]

>>> notes_triees(effectifs_notes)
[0, 0, 2, 4, 5, 5, 5, 5, 6, 6, 7, 9, 9, 9, 9, 9, 10]
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
28
29
30
31
32
33
34
35
36
37
def rangement_valeurs(tab):
    """
    tab - list, tableau d'entiers compris entre 0 et 10
    Sortie: list - tableau de longueur 11 tel qu'à l'indice i
            on trouve le nombre d'occurrences de i dans tab
    """
    result = [0]*11
    for entier in tab:
        result[entier] += 1
    return result

def notes_triees(tab):
    """
    tab - list, tableau contenant 11 entiers positifs ou nuls
    Sortie: list - tableau contenant par ordre croissant les indices de
            tab répétés selon le valeur d'entier correspondant dans tab
    """
    result = []
    for i in range(len(tab)):
        for k in range(tab[i]):
            result.append(i)
    return result



if __name__ == '__main__':
    # Exemples de l'énoncé
    notes_eval = [2, 0, 5, 9, 6, 9, 10, 5, 7, 9, 9, 5, 0, 9, 6, 5, 4]
    effectifs_notes = rangement_valeurs(notes_eval)
    print(effectifs_notes == [2, 0, 1, 0, 1, 4, 2, 1, 0, 5, 1])
    print(notes_triees(effectifs_notes) == [0, 0, 2, 4, 5, 5, 5, 5, 6, 6, 7, 9, 9, 9, 9, 9, 10])

    # Nouvel exemple
    notes_eval = [0, 7, 10, 9, 6, 3, 1, 4, 10, 7, 0, 2, 10, 2, 3, 10, 6, 4, 9, 8]
    effectifs_notes = rangement_valeurs(notes_eval)
    print(effectifs_notes == [2, 1, 2, 2, 2, 0, 2, 2, 1, 2, 4])
    print(notes_triees(effectifs_notes) == [0, 0, 1, 2, 2, 3, 3, 4, 4, 6, 6, 7, 7, 8, 9, 9, 10, 10, 10, 10])

Exercice n°2

L’objectif de cet exercice est d’écrire deux fonctions récursives dec_to_bin et bin_to_dec assurant respectivement la conversion de l’écriture décimale d’un nombre entier vers son écriture en binaire et, réciproquement, la conversion de l’écriture en binaire d’un nombre vers son écriture décimale.

Dans cet exercice, on s’interdit l’usage des fonctions Python bin et int.

On rappelle sur l’exemple ci-dessous une façon d’obtenir l’écriture en binaire du nombre 25 :

25 = 1 + 2 × 12
      = 1 + 2 ( 0 + 2 × 6)
      = 1 + 2 ( 0 + 2 ( 0 + 2 × 3))
      = 1 + 2 ( 0 + 2 ( 0 + 2 × ( 1 + 2 × 1)))
      = 1 × 20 + 0 × 21 + 0 × 22 + 1 × 23 + 1 × 24

L’écriture en binaire de 25 est donc 11001.

0n rappelle également que :

  • a//2 renvoie le quotient de la division euclidienne de a par 2.
  • a%2 renvoie le reste dans la division euclidienne de a par 2.

On indique enfin qu’en Python si mot = "informatique" alors :

  • mot[-1] renvoie 'e', c’est-à-dire le dernier caractère de la chaîne de caractères mot.
  • mot[:-1] renvoie 'informatiqu', c’est-à-dire l’ensemble de la chaîne de caractères mot privée de son dernier caractère.

Compléter, puis tester, les codes de deux fonctions de la page suivante.

On précise que la fonction récursive dec_to_bin prend en paramètre un nombre entier et renvoie une chaîne de caractères contenant l’écriture en binaire du nombre passé en paramètre.

Exemple

1
2
>>> dec_to_bin(25)
'11001'

La fonction récursive bin_to_dec prend en paramètre une chaîne de caractères représentant l’écriture d’un nombre en binaire et renvoie l’écriture décimale de ce nombre.

Exemple

1
2
>>> bin_to_dec('101010') 
42
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def dec_to_bin (nb_dec): 
    q, r = nb_dec // 2, nb_dec % 2 
    if q == ...: 
        return str(r) 
    else: 
        return dec_to_bin(...) + ... 

def bin_to_dec(nb_bin): 
    if nb_bin == '0': 
        return 0 
    elif ...: 
        return 1 
    else: 
        if nb_bin[-1] == '0': 
            bit_droit = 0 
        else: 
            bit_droit = ... 
        return ... * bin_to_dec(nb_bin[:-1]) + ...
Commentaire sur le code original

Pour télécharger l'original du fichier à compléter, cliquer ici.

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
def dec_to_bin (nb_dec):
    q, r = nb_dec // 2, nb_dec % 2
    if q == 0:
        return str(r)
    else:
        return dec_to_bin(q) + str(r)

def bin_to_dec(nb_bin):
    if nb_bin == '0':
        return 0
    elif nb_bin == '1':
        return 1
    else:
        if nb_bin[-1] == '0':
            bit_droit = 0
        else:
            bit_droit = 1
        return 2 * bin_to_dec(nb_bin[:-1]) + bit_droit

if __name__ == '__main__':
    # Exemples de l'énoncé
    print(dec_to_bin(25) == '11001')
    print(bin_to_dec('101010') == 42)

    # Nouvel exemple
    print(dec_to_bin(0) == '0')
    print(dec_to_bin(1) == '1')
    print(dec_to_bin(2) == '10')
    print(bin_to_dec('0') == 0)
    print(bin_to_dec('1') == 1)
    print(bin_to_dec('1111') == 15)