Vous êtes sur la page 1sur 8

Departement informatique

TD 8

Tableaux deux dimensions (Corrig)

Exercice 1 : Manipulations de tableaux


6 4 1 1 6 2 6 3 6 0 3 2 6 3 1 5 6 7 6 4

Soit un tableau deux dimensions de 5 par 4 entiers compltement initialis :

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

Question 1.1 : Eectuer les actions suivantes : acher le tableau acher le sous-tableau de la 2e ligne la 3e ligne comprises acher le sous-tableau du dbut la 2e ligne comprise acher le sous-tableau de la 3e ligne comprise la n du tableau acher le tableau constitu uniquement des lignes dindice pair acher le tableau constitu uniquement des lments dindice impair de chaque ligne (ceci correspond acher uniquement les colonnes dindice impair de la matrice) Correction :
lobjectif est quils constatent que les mmes fonctions restent valables

tab=[[6,2,3,5,6],[4,6,2,6,1],[1,3,6,7,9],[1,6,3,6,8],[6,0,1,4,6]] print(tab)
#sans utiliser les tranches propres au langages python

for i in range(1,3): print(tab[i]) for i in range(2): print(tab[i]) for i in range(2, len(tab)): print(tab[i]) for i in range(0, len(tab),2): print(tab[i]) for i in range(len(tab)): for j in range(0, len(tab[1]),2): print(tab[i][j]) print(\n)
#on utilise ici les tranches qui sont propres au langage Python

print(tab[1:3]) print(tab[:2]) print(tab[2:]) print(tab[::2]) print(tab[:][1::2])

Question 1.2 : crire un algorithme qui permet premirement dacher la diagonale (de gauche droite), puis la 2e diagonale Correction :
1re anne

113

Bases de la programmation

IUT de Villetaneuse

1 2 3 4 5

tab=[[6,2,3,5,6],[4,6,2,6,1],[1,3,6,7,9],[1,6,3,6,8],[6,0,1,4,6]] i=0 ; taille = len(tab) while (i < taille ): print(tab[i][i]) i=i+1

1 2 3 4 5 6

Correction :

tab=[[6,2,3,5,6],[4,6,2,6,1],[1,3,6,7,9],[1,6,3,6,8],[6,0,1,4,6]] taille = len(tab) i=0 ; k=taille-1 while (i < taille ): print(tab[i][k]) i=i+1 ; k = k-1

1 2 3 4 5 6 7 8 9 10 11

Question 1.3 : Tester si les nombres qui apparaissent dans les deux diagonales sont tous gaux une seule et mme valeur. Le programme achera "OUI" ou "Non" en fonction du rsulat. Correction :
tab=[[6,2,3,5,6],[4,6,2,6,1],[1,3,6,7,9],[1,6,3,6,8],[6,0,1,4,6]] val = tab[0][0]; taille=len(tab) i=0 ; k=taille-1 while (i < taille and tab[i][i] == val and tab[i][k] == val): # garder lordre des conditions i=i+1 ; k=k-1 if (i == taille): print(oui); else: print(non);

Question 1.4 : Soit un tableau deux dimensions initialis avec des nombres entiers. 6 4 1 3 6 2 6 3 6 0 3 2 6 3 1 5 6 7 8 4

1 2 3 4 5 6 7 8 9 10

Donner un algorithme qui permet de calculer la moyenne par colonne. Les valeurs des moyennes seront sauvegardes dans une liste. Ensuite, indiquer lindice de la colonne correspondant la plus grande moyenne. Correction :
dimAlg= 5 #dimension de A - lignes dimAcl =4 # dimension de A - colonnes matriceA=[[6,2, 3, 5],[4,6, 2, 6],[1,3, 6, 7],[3,6, 3,8],[6,0, 1, 4]] moyenne=[0.0]*dimAcl for j in range(dimAcl): for i in range (dimAlg): moyenne[j]=moyenne[j]+matriceA[i][j]; moyenne[j]=moyenne[j]/dimAlg Bases de la programmation

114

1re anne

Departement informatique

11 12 13 14 15 16 17 18 19 20 21 22

MoyenneMax=moyenne[0] clMax=0 for j in range(1,dimAcl): if (moyenne[j]>MoyenneMax): MoyenneMax=moyenne[j] clMax=j print(La moyenne par colonne est: \n) print(moyenne)

print(La plus grande moyenne correspond lindice en colonne : + str(clMax))

Exercice 2 : change de triangles

crire lalgorithme qui change le triangle infrieur avec le triangle suprieur dans un tableau deux dimensions. Cest donc le tableau obtenu en faisant une symtrie par rapport la diagonale principale. Donnez le programme en utilisant la boucle while puis la boucle for. Exemple : 10 23 56 47 11 44 90 78 45 12 67 55 78 56 89 34 ---\ ---/ 10 11 45 78 23 44 12 56 56 90 67 89 47 78 55 34

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Correction :

tab=[[10, 11, 45, 78],[23, 44, 12, 56], [56, 90, 67, 89],[47, 78, 55, 34]] nbLigEff=4 nbColEff=4 i=0 while (i<nbLigEff): j=i+1 while (j<nbColEff): temp = tab[i][j] tab[i][j] = tab[j][i] tab[j][i] = temp j=j+1 i=i+1 for lg in tab: print(lg)
Avec la boucle for

1 2 3 4 5 6 7 8 9 10 11

tab=[[10, 11, 45, 78],[23, 44, 12, 56], [56, 90, 67, 89],[47, 78, 55, 34]] nbLigEff=4 nbColEff=4 for i in range(nbLigEff): for j in range(i+1, nbColEff): temp = tab[i][j] tab[i][j] = tab[j][i] tab[j][i] = temp for lg in tab: print(lg)

1re anne

115

3
Bases de la programmation

IUT de Villetaneuse

1 2 3 4 5 6 7 8 9 10 11 12 13

Dans la base de donnes des tudiants du dpartement informatique, nous disposons dune table "tudiant" contenant le numro, le nom et le prnom des tudiants. Question 3.1 : crire un programme qui permet de saisir toutes ces informations au clavier et de les stocker dans un tableau. Correction :
idxnum=0 #index du numero idxnom=1 # index de \ldots idxprenom=2 nbEtud=int(raw_input(Saisissez le nombre dtudiants : )) etudiant= [ [ 0 , "", "" ] for i in range(nbEtud) ] for i in range(nbEtud): numet= int(raw_input(Saisissez le numro : )) nomet = raw_input(Saisissez le nom : ) prenomet= raw_input(Saisissez le prnom : ) etudiant[i][idxnum]= numet etudiant[i][idxnom]= nomet etudiant[i][idxprenom]= prenomet
Version 2 :

Exercice 3 : Base de donnes tudiante

1 2 3 4 5 6 7 8 9

nbEtud=int(raw_input(Saisissez le nombre dtudiants : )) etudiant= [ ] for i in range(nbEtud): numet= int(raw_input(Saisissez le numro : )) nomet = raw_input(Saisissez le nom : ) prenomet= raw_input(Saisissez le prnom : ) etud=[ numet, nomet, prenomet] etudiant=etudiant+ [etud]

1 2 3 4 5 6

Question 3.2 : crire le programme qui permet dacher tous les tudiants dont le nom commence par une lettre saisie au clavier (en tenant compte de la casse). Correction :
idxnom=1 lettre= raw_input(donnez la premire lettre : ) for i in range(len(etudiant)): nom=etudiant[i][idxnom] if nom[0]==lettre: print (etudiant[i])

1 2 3 4

a serait bien de leur montrer cette solution (tableau 3 dimensions)

3
1re anne

lettre= raw_input(donnez la premire lettre : ) for i in range(len(etudiant)): if etudiant[i][idxnom][0]==lettre: print (etudiant[i])


pour information : si on veut le refaire en neutralisant les dirences de casse :

1 2 3 4

lettre= raw_input(donnez la premire lettre : ).lower() for i in range(len(etudiant)): if etudiant[i][idxnom][0].lower()==lettre : print (etudiant[i])

Bases de la programmation

116

Departement informatique

TP8 : Tableaux deux dimensions (Corrig)


Exercice 4 : Liste de listes

1 2 3 4 5 6 7 8 9 10

En Python, un tableau 2 dimensions est dni comme une liste de listes. crire le programme qui permet de vrier que les lments dune liste sont des listes de mme longueur. Par exemple les lments de la liste A = [[1, 2], [2, 4, 3]] nont pas la mme longueur (len([1, 2]) !=len([2, 4, 3]) ). Correction :
taille=len(A) t=len(A[0]) i=1 while (i<taille and len(A[i])==t ): # garder lordre des conditions i=i+1 if i==taille: print(mme nombre de colonnes) else: print(nombre de colonnes variable)

Exercice 5 : Manipulation des matrices


Question 5.1 : crire un programme qui permet de construire la matrice nulle de taille m n. Correction :
n=int(raw_input(combien de colonnes : ")) m=int(raw_input("combien de lignes : ")) I = [0]*m for i in range(m): I[i] = [0] * n

1 2 3 4 5

1 2

Question 5.2 : Modier le programme pour construire la matrice carre identit I (tous les lments de la diagonale sont gaux 1, les autres valent 0). Correction :
Demander seulement une dimension (matrice carre). Mme initialisation, puis

for i in range(n): I[i][i] = 1

1 2 3 4 5 6 7

Question 5.3 : crire une fonction qui calcule la trace dune matrice carre, cest--dire la somme des coecients diagonaux de cette matrice. Correction :
def trace(A): if len(A)!=len(A[1]): print(Le calcul est impossible) else: tr=0 for i in range(len(A)): tr=tr+A[i][i] 1re anne

117

Bases de la programmation

IUT de Villetaneuse

return(tr)

1 2 3 4 5 6 7 8 9

Question 5.4 : crire une fonction qui teste si un lment x appartient une matrice A. Correction :
def appartenance(x): dedans = False i=0 while i < range(len(A)) and dedans==False : j=0 while j < range(len(A[1])) and dedans==False: if A[i][j] == x: dedans = True return(dedans)

3 3

1 2 3 4

Question 5.5 : crire une fonction qui permute deux lignes dune matrice. Correction :
def permut_ligne(A): tempo=A[k] A[k] = A[l] A[l] = tempo

1 2 3 4 5

Question 5.6 : crire une fonction qui remplace dans une matrice A toutes les occurrences de x par y. Correction :
def remplace(A,x,y): for i in range(len(A)): for j in range(len(A[i])): if A[i][j] == x: A[i][j] = y

1 2 3 4 5 6 7

Ecrire aussi une fonction qui permet de faire laddition de deux matrices de mme dimension. Correction :
def addition_mat(mat1, mat2): mat3= [ [ 0 for i in range(len(mat1[1])) ] for j in range(len(mat1)) ] for i in range(len(mat1)): for j in range(len(mat1[1])): mat3[i][j] = mat1[i][j] + mat2[i][j]; return mat3

Exercice 6 : Addition de matrices

Exercice 7 : Carr magique

Un carr (tableau dentiers de N lignes et N colonnes initialises) est dit magique lorsque la somme dune ligne, dune colonne ou dune diagonale quelconque est toujours gale au mme nombre. Voici un exemple de carr magique :
Bases de la programmation

118

1re anne

Departement informatique

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

15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 Question 7.1 : Concevoir une fonction crant une matrice carre dont les coecients sont des entiers positif saisi par lutilisateur. Question 7.2 : Concevoir une fonction qui vrie si un carr est magique. Correction :
def carre_magique(tabMag): OK = True i =0 j = 0 somme = 0 sommeSuiv = 0 taille = len(tabMag)

# initialisation de la somme pour la premire ligne

if (taille > 1): for j in range(taille): somme = somme + tabMag[0][j] print(\n somme = + str( somme))
#comparaison avec les autres lignes

i=i+1 while (OK and i < taille): for j in range(taille): sommeSuiv = sommeSuiv + tabMag[i][j] print(\n sommeSuiv = + str(sommeSuiv)) if (sommeSuiv != somme): OK = False i=i+1 sommeSuiv = 0
# comparaison avec les colonnes

j = 0 while (OK and j < taille): for i in range(taille): sommeSuiv = sommeSuiv + tabMag[i][j] print(\n sommeSuiv = + str(sommeSuiv)) if (sommeSuiv != somme): OK = False j=j+1 sommeSuiv = 0

# comparaison avec les deux diagonales # la premiere

if (OK): j = 0 sommeSuiv = 0 for i in range(taille): sommeSuiv = sommeSuiv + tabMag[i][j] j=j+1 print(\n sommeSuiv = + str(sommeSuiv)) if (sommeSuiv != somme): OK = False 1re anne

119

Bases de la programmation

IUT de Villetaneuse sommeSuiv = 0


#la seconde

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

if (OK): sommeSuiv = 0 j = taille - 1 for i in range(taille): sommeSuiv = sommeSuiv + tabMag[i][j] j=j-1 print(\n sommeSuiv = + str(sommeSuiv)) if (sommeSuiv != somme): OK = False
# fin du if (taille > 1)

return OK tabMag= [[15,8,1,24,17],[16,14,7,5,23],[22,20,13,6,4],[3,21,19,12,10],[9,2,25,18,11]] if carre_magique(tabMag): print(\n Oui il est magique \n); else: print(\nNon il n est pas magique\n);

Bases de la programmation

120

1re anne

Vous aimerez peut-être aussi