This commit is contained in:
Geoffrey Frogeye 2015-03-12 19:28:02 +01:00
parent 05f8cb6b50
commit bb3d2a3309

View file

@ -1,5 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# pylint: disable=invalid-name, global-statement
""" """
TP AP1 TP AP1
@ -21,14 +22,31 @@ from random import randint
def partie(nom): def partie(nom):
"""
str
Affiche le nom de la partie en cours
"""
assert type(nom) == str
print('\n', nom, '=' * len(nom), sep='\n') print('\n', nom, '=' * len(nom), sep='\n')
def section(nom): def section(nom):
"""
str
Affiche le nom de la section en cours
"""
assert type(nom) == str
print('\n', nom, '-' * len(nom), sep='\n') print('\n', nom, '-' * len(nom), sep='\n')
def question(numero): def question(numero):
"""
str
Affiche le numéro de la question en cours
"""
assert type(numero) == int
print('\n***', 'Question', numero, '***') print('\n***', 'Question', numero, '***')
partie("Prérequis") partie("Prérequis")
@ -45,6 +63,7 @@ def comp(x, y):
action : incrémente le compteur action : incrémente le compteur
CU : aucune CU : aucune
""" """
global compteur global compteur
compteur = compteur + 1 compteur = compteur + 1
if x < y: if x < y:
@ -59,8 +78,8 @@ def select_min(l, a, b):
""" """
list, int, int int list, int, int int
Renvoie l'indicde d'un élément minimal de la tranche l[a:b] Renvoie l'indicde d'un élément minimal de la tranche l[a:b]
CU : l est une liste de longueur n, d'éléments homogènes ordonnables, et a et b deux indices tels CU : l est une liste de longueur n, d'éléments homogènes ordonnables, et a et b deux indices
que 0 a < b < n tels que 0 a < b < n
""" """
assert 0 <= a < b <= len(l) assert 0 <= a < b <= len(l)
@ -77,6 +96,7 @@ def tri_selection(l):
La liste l est trié (selon l'algorithme du tri par sélection du minimum) La liste l est trié (selon l'algorithme du tri par sélection du minimum)
CU : l est une liste de longueur n, homogène, déléments ordonnables CU : l est une liste de longueur n, homogène, déléments ordonnables
""" """
assert type(l) == list
n = len(l) n = len(l)
for i in range(n - 1): for i in range(n - 1):
imin = select_min(l, i, n - 1) imin = select_min(l, i, n - 1)
@ -86,11 +106,12 @@ def tri_selection(l):
def tri_insertion_base(l, n): def tri_insertion_base(l, n):
""" """
list, int list, int
n est un indice de l tel que l[0:n] soit une liste triée. La fonction déplace l'élément de rang n de telle sorte que l[0:i+1] soit triée n est un indice de l tel que l[0:n] soit une liste triée. La fonction déplace l'élément
CU: n est un entier < len(l) et l est une liste, dont les éléments sont comparables, triée jusqu'à l'indice n-1. de rang n de telle sorte que l[0:i+1] soit triée
CU: n est un entier < len(l) et l est une liste, dont les éléments sont comparables, triée
jusqu'à l'indice n-1.
""" """
assert type(n) == int and type(l) == list and 0 <= n < len(l)
assert(type(n) == int and type(l) == list and n < len(l))
aux = l[n] aux = l[n]
@ -103,6 +124,12 @@ def tri_insertion_base(l, n):
def tri_insertion(l): def tri_insertion(l):
"""
list
La liste l est trié (selon l'algorithme du tri par insertion)
CU : l est une liste de longueur n, homogène, déléments ordonnables
"""
assert type(l) == list
for i in range(1, len(l)): for i in range(1, len(l)):
tri_insertion_base(l, i) tri_insertion_base(l, i)
@ -119,9 +146,9 @@ def liste_croissante(n):
Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre croissant Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre croissant
CU: n est un entier positif CU: n est un entier positif
""" """
assert(type(n) == int and n >= 0) assert type(n) == int and n >= 0
return [i for i in range(n)] return list(range(n))
question(2) question(2)
@ -133,9 +160,9 @@ def liste_decroissante(n):
Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre décroissant Retourne la liste des entiers compris entre 0 et n-1, rangés dans l'ordre décroissant
CU: n est un entier positif CU: n est un entier positif
""" """
assert(type(n) == int and n >= 0) assert type(n) == int and n >= 0
return [i for i in range(n - 1, 0, -1)] return list(range(n - 1, 0, -1))
question(3) question(3)
@ -145,11 +172,11 @@ def liste_alea(n, a, b):
int, int, int list int, int, int list
Renvoie une liste dentiers, qui construit une liste de longueur n les entiers choisis au hasard Renvoie une liste dentiers, qui construit une liste de longueur n les entiers choisis au hasard
compris entre a et b. compris entre a et b.
CU : n entier positif, a et b entiers, a b
""" """
res = [] assert type(n) == type(a) == type(b) == int and n >= 0 and a <= b
for i in range(n):
res.append(randint(a, b)) return [randint(a, b) for _ in range(n)]
return res
section("Compter les comparaisons") section("Compter les comparaisons")
@ -159,24 +186,24 @@ compteur = 0
tri_selection(liste_alea(100, -5000, 5000)) tri_selection(liste_alea(100, -5000, 5000))
print(compteur, 'comparaisons') print('{} comparaisons ont été faite pour cette liste.'.format(compteur))
question(2) question(2)
def tri_et_compte(foo, l): def tri_et_compte(trieur, l):
""" """
Trie la liste l avec la fonction de triage foo passée en paramètre, renvoie la liste triée et le nombre de comparaisons effectuées Trie la liste l avec la fonction de triage trieur passée en paramètre, renvoie la liste triée
et le nombre de comparaisons effectuées
str, list (list, int) str, list (list, int)
CU: l est une liste CU: l est une liste
""" """
assert type(l) == list
assert(type(l) == list)
global compteur global compteur
compteur = 0 compteur = 0
foo(l) trieur(l)
return (l, compteur) return (l, compteur)
@ -207,10 +234,12 @@ def afficher_tableau(donnees):
question(1) question(1)
tableau = [['i ', 'croissante ', 'decroissante', 'aléatoire ']] tableau = [['nb ', 'croissante ', 'decroissante', 'aléatoire ']]
for i in range(1, 101): for nb in range(1, 101):
tableau.append([i, tri_et_compte(tri_selection, liste_croissante(i))[1], tri_et_compte( tableau.append([nb,
tri_selection, liste_decroissante(i))[1], tri_et_compte(tri_selection, liste_alea(i, 0, 500))[1]]) tri_et_compte(tri_selection, liste_croissante(nb))[1],
tri_et_compte(tri_selection, liste_decroissante(nb))[1],
tri_et_compte(tri_selection, liste_alea(nb, 0, 500))[1]])
afficher_tableau(tableau) afficher_tableau(tableau)
question(2) question(2)
@ -220,9 +249,11 @@ partie("Analyse du tri par insertion")
question(1) question(1)
tableau = [tableau[0]] tableau = [tableau[0]]
for i in range(1, 101): for nb in range(1, 101):
tableau.append([i, tri_et_compte(tri_insertion, liste_croissante(i))[1], tri_et_compte( tableau.append([nb,
tri_insertion, liste_decroissante(i))[1], tri_et_compte(tri_insertion, liste_alea(i, 0, 500))[1]]) tri_et_compte(tri_insertion, liste_croissante(nb))[1],
tri_et_compte(tri_insertion, liste_decroissante(nb))[1],
tri_et_compte(tri_insertion, liste_alea(nb, 0, 500))[1]])
afficher_tableau(tableau) afficher_tableau(tableau)
section("Dans le meilleur des cas") section("Dans le meilleur des cas")