Caractériser ligne, colonne ou diagonale.☘
L'objectif des exercices ci-dessous est de savoir caractériser les éléments d'une ligne, d'une colonne, d'une diagonale.
Diagonale "principale"☘
On dispose de matrices de taille n×n.
On aimerait changer tous les éléments de la diagonale en 42.
Par exemple
[ [0, 1, 2]
[3, 4, 5]
[6, 7, 8]
]
doit devenir
[ [42, 1, 2]
[3, 42, 5]
[6, 7, 42]
]
De même
[ [0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
]
doit devenir
[ [42, 1, 2, 3]
[4, 42, 6, 7]
[8, 9, 42, 11]
[12, 13, 14, 42]
]
Écrire une fonction python effectuant cette transformation d'une matrice n×n.
Rappel sur effet de bord
La fonction demandée ne renvoie pas de valeur (ou plutôt renvoie par défaut None
): il s'agit
d'une fonction à effet de bord, elle transforme la matrice passée en argument, variable non locale
à la fonction.
Rappelons que dans la chaîne de documentation d'une telle fonction, on n'utilise pas le verbe "renvoie"
puisqu'une telle fonction ne renvoie rien (sauf par défaut l'objet None
). On utilise, à la place
de ce verbe renvoyer, un verbe correspondant à l'action faite par la fonction.
Aide: récupérer la taille de la matrice
Comment récupérer n lorsqu'on dispose de la matrice A de taille n×n?
De deux façons:
- n est le nombre de listes internes, c'est à dire:
n = len(A)
. - n est aussi la longueur de chaque liste interne, par exemple
n = len(A[0])
.
Aide: caractériser les éléments diagonaux
Les éléments de la diagonale sont les éléments A[0][0], A[1][1], A[2][2]... En bref, ce sont les éléments A[i][i], pour i entre 0 et len(A)-1.
Solution
Un code possible:
def affichage(tab):
"""
tab -- liste de listes de nombres
affiche chaque liste en passant à la ligne entre les listes.
"""
for ligne in tab:
print(ligne)
def creeMatrice(n):
"""
n -- entier naturel non nul
renvoie une matrice de n lignes, n colonnes (cf exercice précédent)
"""
return [ [i*n + j for j in range(n)] for i in range(n)]
def diagonale42(matrice):
"""
matrice -- matrice n*n
place des 42 sur la diagonale de matrice.
"""
n = len(matrice)
for i in range(n):
matrice[i][i] = 42
A = creeMatrice(4)
diagonale42(A)
affichage(A)
Ligne☘
On dispose de matrices de taille n×n.
On aimerait changer tous les éléments de la ligne numéro k en 42.
Par exemple, la modification de la ligne d'indice 0 de la matrice suivante:
[ [0, 1, 2]
[3, 4, 5]
[6, 7, 8]
]
doit transformer cette matrice en:
[ [42, 42, 42]
[3, 4, 5]
[6, 7, 8]
]
De même, la modification de la ligne d'indice 1 de la matrice suivante:
[ [0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
]
doit transformer cette matrice en:
[ [0, 1, 2, 3]
[42, 42, 42, 42]
[8, 9, 10, 11]
[12, 13, 14, 15]
]
Écrire une fonction python effectuant cette transformation d'une matrice n×n.
Un code
def affichage(tab):
"""
tab -- liste de listes de nombres
affiche chaque liste en passant à la ligne entre les listes.
"""
for ligne in tab:
print(ligne)
def creeMatrice(n):
"""
n -- entier naturel non nul
renvoie une matrice de n lignes, n colonnes (cf exercice précédent)
"""
return [ [i*n + j for j in range(n)] for i in range(n)]
def changeLigne42(matrice, numero_ligne):
"""
matrice -- matrice n*n
place des 42 sur la ligne numero_ligne de la matrice
"""
n = len(matrice)
for i in range(n):
matrice[numero_ligne][i] = 42
A = creeMatrice(4)
changeLigne42(A, 1)
affichage(A)
Colonne☘
On dispose de matrices de taille n×n.
On aimerait changer tous les éléments de la colonne numéro k en 42.
Écrire une fonction python effectuant cette transformation d'une matrice n×n.
Solution
Un code possible:
def affichage(tab):
"""
tab -- liste de listes de nombres
affiche chaque liste en passant à la ligne entre les listes.
"""
for ligne in tab:
for element in ligne:
print(element, end="\t") # \t signifie une tabulation après l'élément
print()
def creeMatrice(n):
"""
n -- entier naturel non nul
renvoie une matrice de n lignes, n colonnes (cf exercice précédent)
"""
return [ [i*n + j for j in range(n)] for i in range(n)]
def changeColonne42(matrice, numero_colonne):
"""
matrice -- matrice n*n
place des 42 sur la colonne numero_colonne de la matrice
"""
n = len(matrice)
for i in range(n):
matrice[i][numero_colonne] = 42
A = creeMatrice(4)
changeColonne42(A, 2)
affichage(A)
Seconde diagonale☘
Écrire une fonction prenant en paramètre une matrice carrée et modifiant les valeurs de la diagonale (représentée ci-dessous en pointillés) par des 42.
Aide
On cherche à obtenir une "formule" simple pour les coordonnées des cellules de la diagonale qui nous intéresse ici.
Il s'agit d'une équation de droite... On cherche un lien affine entre le numéro de colonne j et le numéro de ligne i.
On trouve facilement que j = n-1-i (testez!)
Solution
Un code possible:
from random import randint
NB_LIGNES = 5
NB_COLONNES = 5
def affichage(matrice):
"""
matrice -- matrice de nombres
Affiche la matrice une ligne écran pour chaque ligne matrice.
"""
for ligne in matrice:
for valeur in ligne:
print(valeur, end="\t") # une tabulation après chaque valeur
print() # on passe à la ligne sur l'écran à la fin de chaque ligne matrice
def diagonale42(matrice):
"""
matrice -- matrice carrée
remplace les éléments de la diagonale principale / par des 42.
"""
n = len(matrice) # n = nombre de lignes = nombre de colonnes
for i in range(n):
matrice[i][n-1-i] = 42
A = [[randint(0,100) for j in range(NB_COLONNES)] for i in range(NB_LIGNES)]
affichage(A)
print()
diagonale42(A)
affichage(A)