C16 : Exercices

Préconditions

C16.E1 : Somme des valeurs d'un tableau

On considère la fonction ci-dessous.

def somme(T, a, b):
    S = 0
    for i in range(a, b+1) :
        S = S + T[i]
return S

1) Expliquer ce que fait cette fonction.

2) Lister toutes les préconditions sur a et b.

3) Ajouter les lignes de codes à la fonction afin de vérifier que les préconditions sont respectées.

C16.E2 : Liste de nombres aléatoires

1) Écrire une fonction liste_aletaoire(n:int, mini:int, maxi:int) -> list (avec doctstrings) qui renvoie une liste de taille n contenant des entiers tirés au hasard entre mini et maxi.

2) Lister toutes préconditions pour n, mini et maxi.

3) Ajouter, à la fonction, les assertions pour vérifier ces préconditions.

Afficher la correction

1.

from random import randint

def liste_aleatoire(n:int, mini:int, maxi:int) -> list:
    """
    Renvoie une liste de n entier aléatoires compris entre mini et maxi
    Paramètres:
        n (int) : nombre d'entiers dans la liste
        mini (int) : valeur miniamle des nombres aléatoires
        maxi (int) : valeur maximale des nombres aléatoires
    Valeur renvoyée :
        (list) : liste de n entier aléatoires compris entre mini et maxi
    """
    liste = []
    for i in range(n):
        nb_aleatoire = randint(mini, maxi)
        liste.append(nb_aleatoire)
    return liste

2.

Jeux de tests

C16.E11 : Position dans une liste

Écrire une fonction avec docstring et doctests, indice(e:int, li:list) -> int, qui renvoie l’indice de la première occurrence de l’élément e dans la liste li si e est présent dans li et qui renvoie None sinon.

Exemple en ligne de commande :

>>> indice(4, [1, 0, 2, 0, 0, 4])
5
>>> indice(8, [1, 0, 2, 0, 0, 4])
None
Afficher la correction
from random import randint

def indice(e:int, li:list) -> int:
    """
    Renvoie l’indice de la première occurrence de l’élément e dans la liste li
    si e est présent dans li et qui renvoie None sinon
    Paramètres:
        e (int, float, str) : nombre d'entiers dans la liste
        li (list) : liste de valeurs
    Valeur renvoyée :
        (int) : indice de e dans li

    Exemples :
        >>> indice(4, [1, 0, 2, 0, 0, 4])
        5
        >>> indice(8, [1, 0, 2, 0, 0, 4])
        >>> indice(4, [4,4,4])
        0
        >>> indice(4, [4])
        0
    """

    for i in range(len(li)):
        if li[i] == e:
            return i
    return None

# Programme principal
from doctest import testmod
testmod(verbose=True)

C16.E12 : Une fonction à vérifier...

On considère la fonction codée ci-dessous qui teste l'appartenance de la valeur v à la liste l :

def appartient(v, l):
    i = 0
    while i < len(l) - 1 and l[i] != v:
        i = i + 1
    return i < len(l)

Donner des tests pour cette fonction, et en particulier un test montrant qu'elle est incorrecte.

C16.E13 : Liste de nombres aléatoires

1) Écrire une fonction liste_nb_aleat(n, mini, maxi) dont la docstring est la suivante :

def liste_ne_aleat(n, mini, maxi)
    """
    Renvoie une liste de n nombres entier aléatoires compris entre mini et maxi.
    Paramètres:
        n (int) : nombre d'entiers aléatoires de la liste renvoyée
        mini (int) : valeur minimale des nombres aléatoires
        maxi (int) : valeur maximale des nombres aléatoires
    Return:
        (list) : liste de nombres entiers aléatoires
    """

2) Expliquer pourquoi il n'est pas possible de proposer un jeu de test sous forme de doctests pour cette fonction.

C16.E14 : Repérer les zéros !

1) Écrire une fonction nb_zeros(li:list) -> int qui, à partir d'une liste passée en paramètre, renvoie le nombre de zéros dans la liste. On lui adjoindra une docstring et des doctests.

Exemple en ligne de commande :

>>> nb_zeros([1, 0, 2, 0, 0, 4])
3

2) Écrire la fonction nb_zeros_consecutifs(li:list) -> int qui, étant donnée une liste de nombre entiers, renvoie le nombre maximum de zéros consécutifs de la liste. On lui adjoindra une docstring et des doctests.

>>> nb_zeros_consecutifs(4, [1, 0, 2, 0, 0, 4])
2