TP - Définir une matrice☘
Dans le dossier [NSI], créez le dossier [B05_Tableaux_de_Tableaux]
.
Dans ce TP, les différentes parties sont globalement indépendantes.
Consignes communes à chaque partie
Le programme principal contient un appel au module doctest
:
##----- Programme principal et tests -----##
if __name__ == '__main__':
import doctest
doctest.testmod()
main
», il faudra penser à élaborer un plan de test
(avec des affichages console).Pensez à demander au professeur de valider ce plan de test...
Partie 1 : Affichage d'une matrice☘
-
Recopiez le code ci-dessous dans un (nouveau) programme Python :
1 2 3 4 5 6 7
B = [ [i for i in range(5)], [i*i for i in range(5)], [i*i*i for i in range(5)], [i**4 for i in range(5)], [i**5 for i in range(5)] ] print(B)
-
Exécutez ce programme, voici ce qui doit s'afficher dans la console :
Peu lisible, n'est-ce pas ?>>> (executing file "<tmp 1>") [[0, 1, 2, 3, 4], [0, 1, 4, 9, 16], [0, 1, 8, 27, 64], [0, 1, 16, 81, 256], [0, 1, 32, 243, 1024]]
On aimerait plutôt un affichage où chaque liste interne est affichée sur une ligne distincte, comme ci-dessous :>>> (executing file "<tmp 1>") [0, 1, 2, 3, 4] [0, 1, 4, 9, 16] [0, 1, 8, 27, 64] [0, 1, 16, 81, 256] [0, 1, 32, 243, 1024]
-
Téléchargez le fichier « à trous » TPB05.20.py (clic droit -> [Enregistrer sous]) et enregistrez-le dans le dossier
[B05_Tableaux_de_Tableaux]
. -
Complétez dans le fichier
TPB05.20.py
la définition de la fonctionaffichage_par_ligne()
qui permet de réaliser ce type d'affichage pour une matrice passée en paramètre.1 2 3 4 5 6
def affichage_par_ligne(matrice): """ matrice - list, tableau de tableaux de nombres Sortie: None - Fonction d'affichage qui affiche chaque sous-tableau de matrice en passant à la ligne entre les sous-tableaux. """
Exemple de test
>>> A = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] >>> affichage_par_ligne(A) [1, 2, 3] [4, 5, 6] [7, 8, 9]
Partie 2 : Matrice aléatoire☘
Complétez la définition de la fonction matrice_alea()
qui renvoie une matrice
de nb_lignes
lignes et nb_colonnes
colonnes. Chaque élément est un entier
aléatoire compris entre borne_inf
et borne_sup
, où nb_lignes
,
nb_colonnes
, borne_inf
et borne_sup
sont les quatre paramètres entiers
de la fonction.
1 2 3 4 5 6 7 |
|
Exemple de test
Génération d'une matrice contenant 4 tableaux de 6 éléments.
Ces éléments sont des entiers générés aléatoirement entre -10 et 10 (inclus).
>>> C = matrice_alea(4, 6, -10, 10)
>>> affichage_par_ligne(C)
[-2, 7, -5, 4, 9, 1]
[9, -1, -1, 6, 8, 6]
[4, -5, -5, 4, -8, 9]
[1, -1, 6, -6, -2, 5]
Partie 3 : Tables de multiplication☘
Complétez la définition de la fonction table_multi()
qui renvoie une matrice
contenant les produits i
× j
, où i
est le numéro de la ligne et
j
, le numéro de la colonne.
1 2 3 4 5 6 7 8 |
|
Exemple de test
>>> D = table_multi(7, 5)
>>> affichage_par_ligne(D)
[0, 0, 0, 0, 0]
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8]
[0, 3, 6, 9, 12]
[0, 4, 8, 12, 16]
[0, 5, 10, 15, 20]
[0, 6, 12, 18, 24]
Partie 4 : Beaucoup de 0
, quelques 1
☘
-
Complétez la définition de la fonction
premiere_diagonale()
qui renvoie une matrice carrée den
lignes etn
colonnes contenant des0
sauf la première diagonale qui contient des1
.
Les carrés blancs de l'image ci-contre représente les0
de la matrice et les carrés noirs représentent les1
.1 2 3 4 5 6 7 8 9
def premiere_diagonale(n): """ n - int, entier strictement positif Sortie: list - matrice contenant n lignes et n colonnes. Les éléments valent tous 0 sauf ceux de la première diagonale qui valent 1. >>> premiere_diagonale(4) [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] """
Exemple de test
>>> E = premiere_diagonale(4) >>> affichage_par_ligne(E) [1, 0, 0, 0] [0, 1, 0, 0] [0, 0, 1, 0] [0, 0, 0, 1]
Une piste
Répondez à la question :
« à quelle condition doit-on placer un1
plutôt qu'un0
? »
(un schéma répétitif se dessine-t-il ?) -
Complétez la définition de la fonction
deuxieme_diagonale()
qui renvoie une matrice carrée den
lignes etn
colonnes contenant des0
sauf la seconde diagonale qui contient des1
.
Les carrés blancs de l'image ci-contre représente les0
de la matrice et les carrés noirs représentent les1
.1 2 3 4 5 6 7 8 9
def deuxieme_diagonale(n): """ n - int, entier strictement positif Sortie: list - matrice contenant n lignes et n colonnes. Les éléments valent tous 0 sauf ceux de la seconde diagonale qui valent 1. >>> deuxieme_diagonale(4) [[0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]] """
Exemple de test
>>> F = deuxieme_diagonale(4) >>> affichage_par_ligne(F) [0, 0, 0, 1] [0, 0, 1, 0] [0, 1, 0, 0] [1, 0, 0, 0]
Une piste
À partir de l'exemple de test proposé, répondez aux questions qui suivent :
- Quelle est la valeur de
n
? - On s'intéresse au premier
1
, en haut à droite de cette matrice.- Quel est le numéro de ligne
i
de ce premier1
? - Quel est le numéro de colonne
j
de ce premier1
?
- Quel est le numéro de ligne
- On s'intéresse au deuxième
1
, situé en-dessous à gauche du premier.- Quel est le numéro de ligne
i
de ce deuxième1
? - Quel est le numéro de colonne
j
de ce deuxième1
?
- Quel est le numéro de ligne
- On s'intéresse au troisième
1
, situé en-dessous à gauche du deuxième.- Quel est le numéro de ligne
i
de ce troisième1
? - Quel est le numéro de colonne
j
de ce troisième1
?
- Quel est le numéro de ligne
- On s'intéresse au dernier
1
, situé en-dessous à gauche du troisième.- Quel est le numéro de ligne
i
de ce dernier1
? - Quel est le numéro de colonne
j
de ce dernier1
?
- Quel est le numéro de ligne
- Quelle est la valeur de
-
Complétez la définition de la fonction
losange()
qui renvoie une matrice carrée den
lignes etn
colonnes, avecn
impair, contenant des0
partout hormis dans un losange (représenté ci-contre) constitué de1
.1 2 3 4 5 6 7 8
def losange(n): """ n - entier impair strictement positif Sortie: list - matrice contenant n lignes et n colonnes. Les éléments valent tous 0 sauf ceux formant le losange. >>> losange(5) [[0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [1, 0, 0, 0, 1], [0, 1, 0, 1, 0], [0, 0, 1, 0, 0]] """
Exemple de test
>>> G = losange(7) >>> affichage_par_ligne(G) [0, 0, 0, 1, 0, 0, 0] [0, 0, 1, 0, 1, 0, 0] [0, 1, 0, 0, 0, 1, 0] [1, 0, 0, 0, 0, 0, 1] [0, 1, 0, 0, 0, 1, 0] [0, 0, 1, 0, 1, 0, 0] [0, 0, 0, 1, 0, 0, 0]
Un algorithme possible
i
correspond au numéro de la ligne en cours etj
au numéro de la colonne en cours.
On note aussim
le quotientn//2
, c'est-à-dire le numéro de la ligne (ou de la colonne) du « milieu ».
On va traiter les lignes en deux parties :- Première moitié : on place
1
lorsquei+j
ouj-i
est égal àm
. - Seconde moitié : on place
1
lorsquei-j
est égal àm
ou lorsquei+j
est égal àn+m-1
.
- Première moitié : on place