Aller au contenu

Sujet n°34

Sujet original

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

Exercice n°1

Programmer la fonction moyenne prenant en paramètre un tableau d'entiers tab (de type list) qui renvoie la moyenne de ses éléments si le tableau est non vide. Proposer une façon de traiter le cas où le tableau passé en paramètre est vide.

Dans cet exercice, on s’interdira d’utiliser la fonction Python sum.

Exemples

>>> moyenne([5, 3, 8])
5.333333333333333

>>> moyenne([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
5.5

>>> moyenne([])
# Comportement différent suivant le traitement proposé.
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def moyenne(tab):
    """
    tab - list, tableau non vide d'entiers
    Sortie: float, moyenne des éléments de tab si celui-ci n'est pas vide
    """
    assert isinstance(tab, list), "Le paramètre doit être un tableau"
    assert tab != [], "Tableau vide !"
    somme = 0
    for elt in tab:
        somme = somme + elt
    return somme/len(tab)


if __name__ == '__main__':
    # Exemples de l'énoncé
    print(moyenne([5, 3, 8]) == 5.333333333333333 )
    print(moyenne([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) == 5.5)

    # Exemples supplémentaires
    print(moyenne([1]) == 1.0)
    print(moyenne([1, 1, 1]) == 1.0)

Exercice n°2

On considère un tableau d'entiers tab (de type list) dont les éléments sont des 0 ou des 1. On se propose de trier ce tableau selon l'algorithme suivant : à chaque étape du tri, le tableau est constitué de trois zones consécutives, la première ne contenant que des 0, la seconde n'étant pas triée et la dernière ne contenant que des 1.

Zone de 0 Zone non triée Zone de 1

Tant que la zone non triée n'est pas réduite à un seul élément, on regarde son premier élément :

  • si cet élément vaut 0, on considère qu'il appartient désormais à la zone ne contenant que des 0 ;
  • si cet élément vaut 1, il est échangé avec le dernier élément de la zone non triée et on considère alors qu’il appartient à la zone ne contenant que des 1.

Dans tous les cas, la longueur de la zone non triée diminue de 1.

Compléter la fonction tri suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def tri(tab):
    # i est le premier indice de la zone non triee,
    # j est le dernier indice de cette zone non triée.
    # Au debut, la zone non triee est le tableau entier.
    i = ...
    j = ...
    while i != j :
        if tab[i] == 0:
            i = ...
        else :
            valeur = tab[j]
            tab[j] = ...
            ...
            j = ...
    ...
Commentaire sur le code original

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

Exemple

>>> tri([0, 1, 0, 1, 0, 1, 0, 1, 0])
[0, 0, 0, 0, 0, 1, 1, 1, 1]
Une réponse

Dans cet exercice, il est vraiment conseillé de « dérouler » l'algorithme sur un exemple AVANT de se lancer dans la programmation.

 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 tri(tab):
    # i est le premier indice de la zone non triee,
    # j est le dernier indice de cette zone non triée.
    # Au debut, la zone non triee est le tableau entier.
    i = 0
    j = len(tab)-1
    while i != j :
        if tab[i] == 0:
            i = i+1
        else :
            valeur = tab[j]
            tab[j] = 1
            tab[i] = valeur
            j = j-1
    return tab


if __name__ == '__main__':
    # Exemple de l'énoncé
    tab = [0, 1, 0, 1, 0, 1, 0, 1, 0]
    print(tri(tab) == [0, 0, 0, 0, 0, 1, 1, 1, 1])

    # Exemples supplémentaires
    tab = [0, 1, 1, 1, 0, 1, 0, 1, 0, 1]
    print(tri(tab) == [0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
    tab = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
    print(tri(tab) == [0, 0, 0, 0, 1, 1, 1, 1, 1, 1])