Vous êtes sur la page 1sur 43

Les tableaux

Les tableaux
• Un tableau est une collection d'éléments stockés à des emplacements
de mémoire contigus. L'idée est de stocker plusieurs éléments du
même type ensemble. Cela facilite le calcul de la position de chaque
élément en ajoutant simplement un décalage à une valeur de base,
c'est-à-dire l'emplacement mémoire du premier élément du tableau
(généralement désigné par le nom du tableau).
Les composantes des tableaux
• Elément - Chaque cellule du tableau est appelé un élément.
• Indice - Chaque emplacement d'un élément dans un tableau a un
indice numérique, qui est utilisé pour identifier l'élément. L’indice
commence à partir de 0.
• Taille – est le nombre d’éléments stocké dans un tableau ou le dernier
indice + 1
Opérations de base sur les tableaux
• parcours – passer par tous les éléments du tableau un par un.

Insertion - Ajouter un élément à un index donné.

Suppression - Supprimer un élément à un index donné.

Recherche - Rechercher un élément en utilisant un index donné ou


par une valeur spécifiée.

Mise à jours - Met à jour la valeur d’un élément à un index donné.


Déclaration d’un tableau à une dimension
• Notations possibles
➢ tab : Entier[N];
➢ tab : tableau [1..N] d’entier;
➢ tab [N]:entier; (utilisé dans le cours car elle est plus proche à la
notation du langage C)
➢ type table=tableau [1..n] d’entier; tab : table;
Lecture / écriture dans un tableau
• Afin d’écrire ou de lire la valeur d’un élément d’un tableau, on utilise son
indice (sa position) dans le tableau.
• Exemple : soit le tableau d’entier ‘tab1’ ci-dessous, pour lire la valeur du
premier élément, on écrit : tab1[0], où 0 est l’indice du premier élément du
tableau.
• Pour la lecture, on suppose d’avoir la variable val de type entier, on écrit :
valtab[0];.
• Pour l’écriture dans le premier élément du tableau, on inverse l’affectation et
on écrie: tab1[0]val;

tab1 3 5 7 8
Parcours d’un tableau
• Le parcours d’un tableau peut se faire de plusieurs manières, les plus
utilisés sont : le parcours du premier au dernier élément, et le
parcours du dernier au premier élément.
• Afin de passer par tous les éléments du tableau, on utilise une boucle
avec une incrémentation/décrémentation de l’indice du premier au
dernier élément du tableau ou l’inverse.
Parcours d’un tableau
• Exemple: remplir un tableau avec les n premiers nombres pairs.

La déclaration du Algorithme nbrPairs_tab;


tableau d’entier 10 est la taille du
de taille 10
const n=10; tableau
var tab[n]:entier;
L’indice du
i:entier; premier élément L’indice du
dernier élément
Utilisé comme
debut
indice pour pointer pour i0 jusqu’à (n-1) faire
sur les différents
éléments du tab[i] i * 2;
tableau fin.
Parcours d’un tableau du dernier au premier
élément
• Exemple: remplir un tableau avec les n premiers nombres pairs.

Algorithme nbrPairs_tab;
const n=10;
var tab[n]:entier;
L’indice du
i:entier; dernier élément L’indice du
premier élément
debut
pour i(n-1) jusqu’à 0 faire
tab[i] i * 2;
fin.
Opérations sur les tableaux – Remplir et
afficher un tableau

Algorithme remplir_tab; Algorithme afficher_tab;


const n=10; const n=10;
var tab[n]:entier; var tab[n]:entier;
i:entier; i:entier;
début début
pour i 0 jusqu’à (n-1) faire pour i 0 jusqu’à (n-1) faire
lire(tab[i]); écrire(tab[i]+" ");
fin. fin.
Opérations sur les tableaux – somme des
éléments

Algorithme somme_tab;
const n=10;
var tab[n]:entier;
i,somme:entier;
debut
somme0;
pour i 0 jusqu’à (n-1) faire
sommesomme+ tab[i];
fin.
Opérations sur les tableaux – produit des
éléments

Algorithme produit_tab;
const n=10;
var tab[n]:entier;
i,produit:entier;
debut
produit 1;
pour i 0 jusqu’à (n-1) faire
produit  produit * tab[i];
fin.
Opérations sur les tableaux – symétrie
• On dit qu’un vecteur est symétrique si tab[i]=tab[(n-1)-i]
Algorithme symétrie_tab;
const n=10;
var tab[n]:entier;
i:entier; b:bouléen;
debut
b vrais;
pour i 0 jusqu’à (n-1)/2 faire
debut
si(tab[i]<>tab[n-1-i])alors
bfaux;
fin;
si (b=vrais)alors écrire ("le tableau est symétrique");
sinon écrire ("le tableau n’est pas symétrique");
fin.
Opérations sur les tableaux – copie d’un
tableau
• On utilise 2 vecteurs du même dimension.
Algorithme copie_tab;
const n=10;
var tab[n],tab2[n]:entier;
i:entier;
debut
pour i 0 jusqu’à (n-1)faire
tab2[i]tab[i];
fin.
Opérations sur les tableaux – max et min des
éléments d’un tableau
Algorithme max_min_tab;
const n=10;
var tab[n]:entier;
I,max,min:entier;
debut
min tab[0]; maxtab[0]
pour i 0 jusqu’à (n-1) faire
debut
si(min>tab[i])alors mintab[i];
si(max<tab[i])alors maxtab[i];
fin;
écrire ("le min ="+min);
écrire ("le max ="+max);
fin.
Opérations sur les tableaux – trouver les indices du
max et du min des éléments d’un tableau

Algorithme max_min_tab;
const n=10;
var tab[n]:entier;
I,max,min,indiceMin,indiceMax:entier;
debut
min tab[0]; maxtab[0]; indiceMin0;indiceMax0;
pour i 0 jusqu’à (n-1) faire
debut
si(min>tab[i])alors debut mintab[i]; indiceMini; fin;
si(max<tab[i])alors debut maxtab[i]; indiceMaxi; fin;
fin;
écrire ("le min ="+min+ " à lindice "+ indiceMin);
écrire ("le max ="+ max " à lindice "+ indiceMax);
fin.
Les décalages à gauche et à droite
• Décalage à gauche avec insertion de 0

Algorithme décalage_gauche_zeroInsert_tab;
const n=10;
var tab[n]:entier;
i:entier;
debut
pour i 0 jusqu’à (n-1-1) faire
debut
tab[i] tab[i+1];
fin;
tab[n-1]0;
fin.
Les décalages à gauche et à droite
• Décalage à gauche circulaire

Algorithme décalage_gauche_circulaire_tab;
const n=10;
var tab[n]:entier;
i,tmp:entier;
Debut
tmptab[0];
pour i 0 jusqu’à (n-1-1) faire
debut
tab[i] tab[i+1];
fin;
tab[n-1]tmp;
fin.
Les décalages à gauche et à droite
• Décalage à droite avec insertion de 0

Algorithme décalage_droite_zeroInsert_tab;
const n=10;
var tab[n]:entier;
i:entier;
debut
pour i (n-1) jusqu’à 1 faire
debut
tab[i] tab[i-1];
fin;
tab[0]0;
fin.
Les décalages à gauche et à droite
• Décalage à droite circulaire

Algorithme décalage_droite_zeroInsert_tab;
const n=10;
var tab[n]:entier;
i,tmp:entier;
Debut
tmptab[n-1]
pour i (n-1) jusqu’à 1 faire
debut
tab[i] tab[i-1];
fin;
tab[0]tmp;
fin.
Opérations sur les tableaux – le tri
• Il existe plusieurs algorithmes de tri de vecteur. Dans la présente section, on
va voir les algorithmes suivants:
• Tri-bulles
• Tri par sélection
• Tri par remplacement
Opérations sur les tableaux – le tri-bulles
• Le tri à bulles consiste à comparer répétitivement les éléments consécutifs
d'un tableau, et à les permuter lorsqu'ils sont mal triés. Il doit son nom au fait
qu'il déplace rapidement les plus grands éléments en fin de tableau, comme
des bulles d'air qui remonteraient rapidement à la surface d'un liquide.
• Après un premier parcours complet du tableau, le plus grand élément est
forcément en fin de tableau, à sa position définitive. Le reste du tableau est
en revanche encore en désordre. Il faut donc le parcourir à nouveau, en
s'arrêtant à l'avant-dernier élément.
Opérations sur les tableaux – le tri-bulles
• Deux boucles sont nécessaires, la première avec le compteur i qui délimite le
champ à parcourir et à trier. L’indice i commence par le dernier élément et il
se décrémente et avance vers le premier élément. Cependant, les éléments
ayant un indice > i sont les valeurs du plus grand au plus petit et sont triés et
sont au bon endroit. La deuxième boucle est imbriquée dans la première. Elle
utilise un compteur j qui parcours les éléments de 0 à i plusieurs fois et à
chaque fois le i est décrémenté. Pour chaque itération, les éléments du
tableau sont permuté si tab[j]>tab[j+1].

Indice i

Indice j

3 5 7 8 0 2 4 1
Opérations sur les tableaux – le tri-bulles
Algorithme tri_bulles;
const n=10;
var tab[n]:entier; Le dernier élément est traité
I,j,tmp:entier; lorsque j atteint l’avant dernier
debut élément (i-1-1)
pour i (n-1-1) jusqu’à 0 faire
Les éléments avec un indice >i
debut
sont déjà triés
pour j 0 jusqu’à i faire
si(tab[j]>tab[j+1])alors
debut
tmptab[j];
tab[j] tab[j+1];
tab[j+1]tmp;
fin;
fin;
fin.
Opérations sur les tableaux – le tri par
sélection
• le principe du tri par sélection est le suivant :
• rechercher le plus petit élément du tableau, et
l'échanger avec l'élément d'indice 0 ;
• rechercher le second plus petit élément du tableau, et
l'échanger avec l'élément d'indice 1 ;
• continuer de cette façon jusqu'à ce que le tableau soit
entièrement trié.
Opérations sur les tableaux – le tri par
sélection
• On a besoin de deux boucles, la première avec le compteur i qui varie de 0 au dernier
élément. La deuxième boucle avec le compteur j calcul le min entre l’élément à l’indice i et le
dernier élément. Une fois le min trouvé, une permutation des éléments à l’indice i et le min
est réalisée.

Indice i

L’Indice j commence à partir de i pour calculer le min


les éléments avec un indice <i sont déjà triés
3 5 7 8 0 2 4 1
Opérations sur les tableaux – le tri par
sélection
Algorithme tri_sélection;
const n=10;
var tab[n]:entier;
i,j,min,indiceMin:entier;
debut
Les éléments avec un indice < i
pour i 0 jusqu’à (n-1) faire sont déjà triés
debut
mintab[i]; indiceMini; // initialisation avant le calcul du min
pour j i jusqu’à (n-1) faire
si(min > tab[j])alors
debut
min tab[j]);
indiceMinj;
fin;
tab[indiceMin] tab[i]; // la permutation se fait une fois le min et son indice sont trouvés
tab[i] min;
fin;
fin.
Opérations sur les tableaux – le tri par
remplacement
• La méthode consiste à sélectionner des minimums successifs dans un tab, et à les
ranger au fur et à mesure dans un deuxième tableau tab2.
- Au départ on recherche quel est le max des éléments de tab.
- Pour chaque itération:
1- on cherche le min de tab
2- on le place à sa position (séquentiellement) dans tab2
3- on remplace le min trouvé dans tab par le max
- le résultat du tableau trié se trouve à la fin dans tab2.
Opérations sur les tableaux – le tri par
remplacement
L’Indice j commence à partir de i pour calculer le min
les éléments avec un indice <i sont déjà triés

(3) Remplacer le min par le max

3 5 7 8
80 2 4 1

(1) Trouver le min (=0)

(2) Copier le min dans tab2


0
Opérations sur les tableaux – le tri par
remplacement
• On a besoin de calculer le max de tab par une boucle au début
• On a besoin de deux boucles, la première avec le compteur i qui varie de 0 au dernier
élément. L’indice i permet d’un côté de pointer sur l’élément de tab2 dans lequel on va placer
la valeur min de tab1, et d’un autre côté l’indice i permet de répéter le corp de l’algorithme n
fois pour calculer le min de tab et le placer dans tab2.
• La deuxième boucle avec le compteur j calcul le min et garde sa position pour qu’il soit
écrasé par la valeur du max dans un deuxième lieu.
Opérations sur les tableaux – le tri par
remplacement const n=10;
var tab[n],tab2[n]:entier;
i,j,min,indiceMin,max:entier;
Debut
maxtab[0];
pour i 0 jusqu’à (n-1) faire // calculer le max de tab
si(max < tab[i])alors maxtab[i];

pour j i jusqu’à (n-1) faire //boucle principale


debut
minmax; //initialisation et calcul de min pour chaque itération
indiceMini;
pour j 0 jusqu’à (n-1) faire
debut
si(min > tab[j])alors
debut
min tab[j]);
indiceMinj;
fin;
fin;
tab[indiceMin] max;
tab2[i] min;
fin;
fin.
Les tableaux à deux dimensions (les matrices)
• Les matrices sont des tableaux à deux dimensions, c'est-à-dire une
structure de données permettant de stocker des informations, de même
nature, référencées par leurs numéros de ligne et de colonne.
• Les matrices présentent les mêmes caractéristiques que les vecteurs. Les
éléments d’une matrice sont arrangés dans des cases référencées par
deux indices servant d’identifier sa valeur.
Les tableaux à deux dimensions (les matrices)
• Une matrice possède un nom et un nombre d'éléments qui représente sa
taille (ex: 100*200).
• Tous les éléments d'une matrice ont le même type.
• Pour désigner un élément, on indique le nom de la matrice suivi par ses
indices (indice ligne et indice colonne) comme MAT [2][3] représente la
case située à l’intersection de la ligne « 2 » et la colonne « 3 ».
• Déclaration :
• On maintient la déclaration la plus proche au langage C et qui est comme suit:
Var nom_var [N][M]:type;
Exemple: var mat [N][M]:entier;
Initialiser une matrice
• On affecte des 0 à chaque élément de la matrice.
• Besoin de deux boucles pour parcourir la matrice ligne par ligne et
colonne par colonne.

Algorithme init_mat;
const n=4,m=5; //utilisés pour déclarer une mat de n ligne et m colonnes
var mat[n][m]:entier;
i,j:entier;
debut
pour i 0 jusqu’à (n -1) faire
pour j 0 jusqu’à (m-1) faire
mat[i][j]0;
fin.
Afficher la somme des lignes et des colonnes
• Pour la somme des lignes, on parcours les cellules des lignes une après l’autres.
• Pour la somme des colonnes, on parcours les cellules des colonnes une après
l’autres.
Algorithme somme_lignes_mat; Algorithme somme_colonnes_mat;
const n=4,m=5; const n=4,m=5;
var mat[n][m]:entier; var mat[n][m]:entier;
i,j,somme:entier; i,j,somme:entier;
Debut Debut
pour i 0 jusqu’à (n -1) faire pour j 0 jusqu’à (m -1) faire
debut debut
somme0; somme0;
pour j 0 jusqu’à (m-1) faire pour i 0 jusqu’à (n-1) faire
debut debut
sommesomme+mat[i][j]; sommesomme+mat[i][j];
fin; fin;
écrire (somme); écrire (somme);
fin; fin;
fin. fin.
Diagonales d’une matrice carrée
• Une matrice carrée a le nombre de lignes égal au nombre de colonnes.
• La diagonale principale d'une matrice identifie les éléments de la matrice
allant du nord-ouest au sud-est.
• la diagonale secondaire d'une matrice identifie les éléments de la matrice
allant du nord-est au sud-ouest.
• Exemple :

La diagonale principale : [1,5,9]


La diagonale secondaire : [3,5,7]
Diagonales d’une matrice carrée
• La diagonale principale inclut les éléments de la matrice qui ont le même
indice de ligne et de colonne (exemple : mat[0][0], mat[1][1], mat[2][2], etc)
• Exemple : vérification si la diagonale principale et secondaire sont
unitaires.

Algorithme diagonale_principale_unitaire; Algorithme diagonale_secondaire_unitaire;


const n=5; const n=5;
var mat[n][n]:entier; //mat carrée var mat[n][n]:entier; //mat carrée
i,j:entier;b: booléen; i,j:entier;b: booléen;
Debut Debut
bvrai; bvrai;
pour i 0 jusqu’à (n -1) faire pour i 0 jusqu’à (n -1) faire
si(mat[i][i]<>1)bfaux; si(mat[i][n-1-i]<>1)bfaux;
fin. fin.
Transposé d’une matrice
• la transposée d'une matrice est un opérateur qui retourne une
matrice sur sa diagonale ; c'est-à-dire qu'il commute les indices de
ligne et de colonne de la matrice A en produisant une autre matrice.
Transposé d’une matrice
• On déclare une seconde matrice de dimension m lignes et n colonnes
• L’instruction clé de l’algorithme de la transposé est d’inverser les lignes en
colonnes ou l’inverse par : mat2[i][j]mat[j][i]

Algorithme transposé_mat;
const n=4,m=5;
var mat[n][m]:entier;
Mat2[m][n]:entier;
i,j:entier;
debut
pour i 0 jusqu’à (n -1) faire
pour j 0 jusqu’à (m-1) faire
mat2[i][j]mat[j][i]
fin.
La matrice carrée symétrique
• Une matrice carrée mat est dit symétrique si mat[i][j] = mat [j][i]

Algorithme symétrique_mat;
const n=4,m=5;
var mat[n][m]:entier;
i,j:entier;b:booléen;
debut
bvrai;
pour i 0 jusqu’à (n -1) faire
pour j 0 jusqu’à (m-1) faire
si (mat[i][j]<>mat[j][i]) alors bfaux;
fin.
La somme de deux matrices
• Les deux matrices à sommer doivent avoir les mêmes dimensions.
• M3[i][j]=M1[i][j]+M2[i][j]
Algorithme somme_mat;
const n=4,m=5;
var m1[n][m]:entier;
m2 [n][m]:entier; m3[n][m]:entier;
i,j:entier;
debut
bvrai;
pour i 0 jusqu’à (n -1) faire
pour j 0 jusqu’à (m-1) faire
m3[i][j] m1[i][j]+ m2[i][j];
fin.
Le produit de deux matrices
• Le nombre de colonnes de la première matrice doit être égal au
nombre de lignes de la seconde matrice (M1[n][m], M2[m][p]).
• Le résultat est une matrice de n*p.
• M3[i][j] = le produit du ieme ligne de M1 et la jieme colonne de M2.
Le produit de deux matrices
Algorithme produit_mat;
const n=4,m=5,p=6;
var m1[n][m]:entier;
m2 [m][p]:entier;
m3[n][p]:entier;
i,j,k,somme: entier; // la variable somme est utile pour le calcul du produit entre vecteurs
début
pour k 0 jusqu’à (n -1) faire
pour i 0 jusqu’à (p -1) faire
début
somme0;
pour j 0 jusqu’à (m-1) faire
début
sommesomme+(m1[k][j]*m2[j][i]);
fin;
m3[k][i]somme;
fin;
fin.

Vous aimerez peut-être aussi