Skip to content

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 ] ) )