Maximum sur une grille☘
Exercice 1☘
Ecrire une fonction prenant en paramètre une liste de listes d'entiers (les listes internes seront toutes de même longueur) et renvoyant la valeur maximale contenue dans la grille.
Vous écrirez une partie de code permettant de tester votre fonction en générant au hasard une grille et
en utilisant la fonction max
prédéfinie de python.
Un code possible
On s'appuie une fois encore sur la même structure de code utilisant une fonction renvoyant le maximum de deux entiers.
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 38 39 40 41 | def max_bin(a,b): """ a et b sont deux variables de valeurs comparables. La fonction renvoie la plus grande des deux. """ if a > b: return a else: return b def max_grille(grille): """ grille est une liste de listes d'éléments comparables. La fonction renvoie l'élément le plus grand de la grille. """ m = grille[0][0] for ligne in grille: for valeur in ligne: m = max_bin(m, valeur) return m # exemple d'utilisation if __name__ == '__main__': from random import randint largeur = randint(1,10) # nombre d'éléments d'une liste interne hauteur = randint(1,10) # nombre de listes internes L = [ [randint(1,100) for col in range(largeur)] for lig in range(hauteur)] print(f"Grille de {largeur} colonne(s) et {hauteur} ligne(s): ") for ligne in L: print(ligne) print(f"Valeur max : {max_grille(L)}.") # utilisation d'une fonction prédéfinie pour vérif: print( max_grille(L) == max( [ max(ligne) for ligne in L ] ) ) |
Une autre façon de tester le code est d'utiliser une assertion à l'intérieur de la fonction.
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 38 39 40 | def max_bin(a,b): """ a et b sont deux variables de valeurs comparables. La fonction renvoie la plus grande des deux. """ if a > b: return a else: return b def max_grille(grille): """ grille est une liste de listes d'éléments comparables. La fonction renvoie l'élément le plus grand de la grille. """ m = grille[0][0] for ligne in grille: for valeur in ligne: m = max_bin(m, valeur) # assertion avec fonction python prédéfinie pour vérif: assert m == max([max(ligne) for ligne in grille]), "La valeur calculée n'est pas le max!" return m # exemple d'utilisation if __name__ == '__main__': from random import randint largeur = randint(1,10) # nombre d'éléments d'une liste interne hauteur = randint(1,10) # nombre de listes internes L = [ [randint(1,100) for col in range(largeur)] for lig in range(hauteur)] print(f"Grille de {largeur} colonne(s) et {hauteur} ligne(s): ") for ligne in L: print(ligne) print(f"Valeur max : {max_grille(L)}.") |
Pour bien comprendre le rôle de assert
, modifier la valeur de m dans le code juste avant
la ligne assert ...
(faîtes par exemple précéder cette ligne assert ...
de
la ligne m -= 1
afin que m ne soit plus la valeur maximale) et observez le résultat d'une exécution.
Vous devriez avoir une interruption avec le message:
"AssertionError: La valeur calculée n'est pas le max!".
Exercice 2☘
Reprendre le code donné dans le corrigé de l'exercice précédent et le modifier afin que la fonction renvoie le couple (ligne, colonne) d'une occurrence de la valeur maximale plutôt que la valeur maximale elle-même.
Un code possible
On s'appuie encore une fois sur la même structure de code.
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | def coord_du_max_bin(grille, lig1, col1, lig2, col2): """ grille est une liste de listes d'éléments comparables. (lig1, col1) est un couple (ligne, colonne) possible, ainsi que (lig2, col2). La fonction renvoie le couple (lig1, col1) si grille[lig1][col1] > grille[lig2][col2] et l'autre couple sinon. """ if grille[lig1][col1] > grille[lig2][col2]: return lig1, col1 else: return lig2, col2 def coord_du_max_grille(grille): """ grille est une liste de listes d'éléments comparables. Les listes internes ont toutes même longueur. La fonction renvoie les coordonnées (ligne, colonne) d'un plus grand élément de la grille. """ largeur = len(grille[0]) # longueur d'une liste interne hauteur = len(grille) # nombre de listes internes m = (0,0) for lig in range(hauteur): for col in range(largeur): m = coord_du_max_bin(grille, lig, col, m[0], m[1]) return m # exemple d'utilisation if __name__ == '__main__': from random import randint largeur = randint(1,10) # nombre d'éléments d'une liste interne hauteur = randint(1,10) # nombre de listes internes L = [ [randint(1,100) for col in range(largeur)] for lig in range(hauteur)] print(f"Grille de {largeur} colonne(s) et {hauteur} ligne(s): ") for ligne in L: print(ligne) m = coord_du_max_grille(L) print(f"Coordonnées d'une valeur max : {m}.") # utilisation d'une fonction prédéfinie pour vérif: print( L[m[0]][m[1]] == max( [ max(ligne) for ligne in L ] ) ) |