La mise au point des programmes
Partie 1: préconditions-postconditions-exceptions
On donne ici le code d'une fonction censée vérifier que les nombres d'une liste t passée en paramètre à la fonction sont classées par ordre croissant:
def est_croissant(t):
i=len(t) -1
while i >= 0:
if t[i] <= t[i+1]:
return True
else:
return False
i-= 1
Exercice 1.1
- Ecrire les postconditions suivantes, en déduire si la fonction est mal écrite:
t1 = [ 1, 2, 3, 4, 5, 6] ici la fonction doit renvoyer True
t2 = [ 1, 3, 2, 4, 5, 6] ici la fonction doit renvoyer False
t3 = [ ] ici la fonction doit renvoyer True
- Trouver la cause du bug, modifier la fonction et vérifier à nouveau les postconditions.
- Remplacer la boucle while par une boucle for qui parcourt la liste en commençant par le dernier élément ( analyse du dernier élément vers le premier)
Exercice 1.2
- Ecrire la précondition qui permettra d’arrêter l'exécution de la fonction si on soumet le tableau suivant à la fonction
t1= [1, 2, 3, 'B', 5, 6]
Exercice 1.3
- Ecrire le code d'un programme qui demande n nombres à l'utilisateur et les stockent dans un tableau t2, le nombre n est choisi par l'utilisateur du programme.
- Ecrire une gestion d'exception qui permettrait d’afficher le message " vous devez saisir des nombres entiers naturels" si l'utilisateur ne saisit pas un nombre entier:
- Ecrire un code qui range par ordre croissant les nombres de votre tableau t2
Exercice 1.4
On cherche maintenant à générer aléatoirement n nombres dans un tableau t3
- Compléter la fonction tableau_croissant(n) qui génère un tableau trié de n nombres générés aléatoirement.
from random import randint
def tableau_croissant(n):
""" fonction de génération d'un tableau de n nombres aléatoires"""
t3 = [0] * n
return t3
# utilisation pour n=10 éléments
tableau_généré = tableau_croissant(10)
- Expliquer la ligne t3 = [0] * n
Partie 2: Module et package
Exercice 2.1
- Créer un dossier appelé mon_dossier_travail
- Créer un package appelé mon_package dans le dossier mon_dossier_travail
- Ajouter un module appelé mon_module_1 dans le package mon_package
- Ajouter la fonction affichage ci-dessous dans le module mon_module_1
def affiche():
print("message depuis le module 1")
- Ajouter un module appelé mon_module_2 dans le package mon_package
- Ajouter la fonction affichage ci-dessous dans mon_module_2
def affiche():
print("message depuis le module 2")
- Ajouter un module appelé mon_module_principal dans le dossier mon_dossier_travail et en dehors du package.
Exercice 2.2
- Ajouter le code ci_dessous dans le module mon_module_principal :
from mon_package.mon_module_2 import *
from mon_package.mon_module_1 import *
affiche()
- tester le code et expliquer le résultat de l'affichage
Exercice 2.3
- Modifier le code précédent pour utiliser la fonction affiche du module 2 dans le module mon_module_principal
Partie 3: Interfaces
Exercice 3.1
- Ajouter le code ci_dessous de deux fonctions qui détecte la présence de doublons dans un tableau dans votre module mon_module_principal :
def presence_doublon(t):
s={}
for data in t:
if data in s.keys():
return True
else:
s[data] = 1
return False
def presence_doublon_2(t):
s=[]
for data in t:
if data in s:
return True
else:
s.append(data)
return False
- tester les deux fonctions en passant en paramètre les tableaux ci-dessous :
tab1 = [1,2,3,2,4]
tab2 = [1,2,3,4,5]
- conclure sur la correction de ces deux fonctions ( correction = fonctionnement correct)
Exercice 3.2
- Vous pouvez voir ci-dessus que le code des deux fonctions n'a pas de documentation. Ajouter aux fonctions une documentation, le type de données attendu pour t, ainsi que le type de la valeur de retour.
Exercice 3.3
- Les parties rouges de chaque fonction ( ci-dessus) sont liées à l'implémentation choisie pour le conteneur s . On désire remplacer ces parties par le code en vert ci-dessous qui encapsule l'implémentation:
def presence_doublon(t):
s = creer_conteneur()
for data in t:
if est_present(data, s):
return True
else:
ajouter(data,s)
return False
- Ecrire l'interface qui présente les trois fonctions sur votre compte rendu
- Proposer une implémentation de ces trois fonctions dans le cas où la fonction creer_conteneur() renvoie une liste vide à s.
- Proposer une implémentation de ces trois fonctions dans le cas où la fonction creer_conteneur() renvoie un dictionnaire vide à s.
- Proposer une implémentation des deux fonctions est_present(data,s) et ajouter(data,s) qui permette de manipuler indifféremment une structure s de type dictionnaire ou liste, tout autre structure générera un exception de type TypeError
Exercice supplémentaire
- Ecrire la fonction compte_et_affiche_doublons(t) qui crée un dictionnaire avec comme clés les éléments du tableau t passé en paramètre, la valeur de chaque clé étant le nombre d'occurrences des éléments, la fonction affichera le dictionnaire, le nombre d’occurrences de chaque élément, renverra True si t comporte des doublons et False sinon.
Exemple de rendu pour le code d'utilisation suivant:
Créé avec HelpNDoc Personal Edition: Produire des livres Kindle gratuitement