Tableaux
multidimensionnels
Accueil

du site

Prérequis :
Tableaux unidimensionnels
Affichages par flots (streams) - cout << endl ;


Tableaux à deux dimensions

#include<stdio.h>

int main()
{
-double Matrice[2][3];
-//Nous venons de déclarer un tableau à deux lignes trois colonnes

-// Il peut être interprété comme l'ensemble de deux vecteurs
-// à trois composantes réelles (x, y ,z) écrites en ligne :
-// x1 y1 z1
-// x2 y2 z2

-// Ou comme l'ensemble de trois vecteurs
-// à deux composantes réelles (x,y) écrites en colonne :
-// x1 x2 x3
-// y1 y2 y3

-//Le problème le plus fréquent est de reconnaître la disposition
-//des coordonnées des vecteurs dans les deux interprétations

-//Le mieux est d'initialiser les tableaux à la déclaration
-double M[2][3] = { 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 };
-//et d'afficher :

-printf("1ère ligne : %4.1f %4.1f %4.1f",M[0][0],M[0][1],M[0][2]);
-putchar('\n');
-printf("2ème ligne : %4.1f %4.1f %4.1f",M[1][0],M[1][1],M[1][2]);

-return 0;
}


Affichage
à l'exécution :

1ère ligne : 1.0 2.0 3.0
2ème ligne : 4.0 5.0 6.0
Press any key to continue

La signification des index du tableau découle clairement de cet exemple :

Matrice[ligne][colonne]

Vecteurs ligne
Nous donnons ci-dessous un exemple de traitement des matrices en vecteurs ligne.

#include<stdio.h>

//Procédure d'affichage pur allèger le corps du programme
void AfficheMatrice_2L_3C(int matr[2][3])
{
-printf("1ère ligne : %i %i %i\n", matr[0][0],matr[0][1],matr[0][2]); -printf("2ème ligne : %i %i %i\n", matr[1][0],matr[1][1],matr[1][2]);
}

int main()
{
-int i;
-int VecteurLigne1[3] = {1,2,3};
-int VecteurLigne2[3] = {4,5,6};
-int Matrice[2][3];

-//Copie de vecteur ligne 1 en première ligne de Matrice
-for(i=0; i<3 ; i++) Matrice[0][i] = VecteurLigne1[i];

-//Copie de vecteur ligne 2 en deuxième ligne de Matrice
-for(i=0; i<3 ; i++) Matrice[1][i] = VecteurLigne2[i];

-//Affichage :
-AfficheMatrice_2L_3C_int(Matrice);

-return 0;
}


Affichage à l'exécution :
1ère ligne : 1 2 3
2ème ligne : 4 5 6
Press any key to continue

Observez la déclaration du paramètre formel "matr"
de la procédure :

AfficheMatrice_2L_3C(int matr[2][3])
"matr" est déclaré ici comme identificateur générique
d'un tableau d'entiers aux dimensions [2][3]
C'est un pointeur passé à la procédure.

C'est un excellent moyen pour empêcher d'utiliser cette procédure
pour d'autres types d'éléments ou d'autres dimensions.

 

Vecteurs colonne

Nous donnons ci-dessous une exemple du traitement des matrices en vecteurs-colonne.

#include<stdio.h>

//Procédures d'affichage pur allèger le corps du programme
void AfficheMatrice_2L_3C(int matr[2][3])
{
-printf("1ère ligne : %i %i %i\n", matr[0][0],matr[0][1],matr[0][2]);
-printf("2ème ligne : %i %i %i\n", matr[1][0],matr[1][1],matr[1][2]);
}

void AfficheMatrice_3C_2L(int matr[2][3])
{
-printf("1ère colonne : %i %i\n", matr[0][0],matr[1][0]);
-printf("2ème colonne : %i %i\n", matr[0][1],matr[1][1]);
-printf("3ème colonne : %i %i\n", matr[0][2],matr[1][2]);
}

int main()
{
-int i;
-int Vecteur1[2] = {1,2};
-int Vecteur2[2] = {3,4};
-int Vecteur3[2] = {5,6};
-int Matrice[2][3];

-//Copie de Vecteur1 en première colonne de Matrice
-for(i=0; i<2 ; i++) Matrice[i][0] = Vecteur1[i];

-//Copie de Vecteur2 en deuxième colonne de Matrice
-for(i=0; i<2 ; i++) Matrice[i][1] = Vecteur2[i];

-//Copie de Vecteur3 en deuxième colonne de Matrice
-for(i=0; i<2 ; i++) Matrice[i][2] = Vecteur3[i];

-//Affichage :
-AfficheMatrice_2L_3C(Matrice);
-AfficheMatrice_3C_2L(Matrice);

-return 0;
}

Affichage à l'exécution :

1ère ligne : 1 3 5
2ème ligne : 2 4 6
1ère colonne : 1 2
2ème colonne :
3 4
3ème colonne :
5 6
Press any key to continue

 

Tableaux bi-dimensionnels : matrices de vecteurs

On peut déclarer des tableaux à plus de deux dimensions.
Voyons les tableaux bidimensionnels .

#include <stdio.h>

void AfficheEnLigne3L_3C(double matr[3][3])
{
-printf("1ère ligne : %6.2f %6.2f %6.2f\n",matr[0][0],matr[0][1],matr[0][2]);
-printf("2ème ligne : %6.2f %6.2f %6.2f\n",matr[1][0],matr[1][1],matr[1][2]);
-printf("3ème ligne : %6.2f %6.2f %6.2f\n",matr[2][0],matr[2][1],matr[2][2]);
}

//Un algorithme plus généralisant, que vous devez essayer de comprendre :

#define nbLIGNES 3
#define nbCOLONNES 3

void AfficheEnColonne3L_3C(double matr[3][3])
{
-int i,j;
-for(j=0; j < nbCOLONNES; j++)
-{
--printf("Colonne %i : ",j+1);
--for(i=0; i < nbLIGNES; i++)
---printf("%6.2f ",matr[i][j]);
--putchar('\n');
-}
}

//Enfin, une procédure de copie de matrice
void CopieMatrice(double Dest[3][3],double Sce[3][3])
{
-int i,j;
-for(i=0;i<3;i++)
--for(j=0;j<3;j++) Dest[i][j] = Sce[i][j];
}

int main()
{
-//Nous déclarons & initialisons "Matrice"
-double Matrice[3][3] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9};

-puts("Matrice initialisée, affichée en ligne :");
-AfficheEnLigne3L_3C(Matrice);
-putchar('\n');

-puts("Matrice initialisée, affichée en colonne :");
-AfficheEnColonne3L_3C(Matrice);
-putchar('\n');

-puts("Matrice M initialisée à zéro :");
-double M[3][3]={0,0,0,0,0,0,0,0,0};
-AfficheEnLigne3L_3C(M);
-putchar('\n');

-puts("Matrice initiale copiée dans M :");
-CopieMatrice(M,Matrice);
-AfficheEnLigne3L_3C(M);

return 0; }

Affichage à l'exécution :

Matrice initialisée, affichée en ligne :
1ère ligne : 1.00 2.00 3.00
2ème ligne : 4.00 5.00 6.00
3ème ligne :
7.00 8.00 9.00

Matrice initialisée, affichée en colonne :
Colonne 1 : 1.00 4.00 7.00
Colonne 2 : 2.00 5.00 8.00
Colonne 3 : 3.00 6.00 9.00

Matrice M initialisée à zéro :
1ère ligne : 0.00 0.00 0.00
2ème ligne : 0.00 0.00 0.00
3ème ligne :
0.00 0.00 0.00

Matrice initiale copiée dans M :
1ère ligne : 1.00 2.00 3.00
2ème ligne : 4.00 5.00 6.00
3ème ligne :
7.00 8.00 9.00

Press any key to continue

 

Templates

La procédure de copie de tableaux multidimensionnels est une occasion d'utiliser les "Templates"
de C++ pour n'écrire qu'une seule procédure quel que soit le type des éléments du tableau.

#include <iostream.h>
#include
<iomanip.h>

template <class T> void AfficheEnLigne(T matr[3][3])
{
cout << "1ère ligne : " ;
cout << matr[0][0] << " " << matr[0][1] << " " << matr[0][2] ;
cout << endl;

cout << "2ème ligne : ";
cout << matr[1][0] << " " << matr[1][1] << " " << matr[1][2] ;
cout << endl;

cout << "3ème ligne : ";
cout >< matr[2][0] << " " << matr[2][1] << " " << matr[2][2] ;
cout << endl;
}

template <class T> void CopieMatrice(T Dest[3][3],T Sce[3][3])
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++) Dest[i][j] = Sce[i][j];
}

int main()
{
//Nous déclarons & initialisons à zéro "MatriceE" d'entiers
int MatriceE[3][3] = {0,0,0,0,0,0,0,0,0};
cout<<"MatriceE d'entiers initialisée à zéro :" << endl;
AfficheEnLigne(MatriceE);
cout<< endl;

cout<<"Matrice E d'entiers initialisée à 1 2 3 4 5 6 7 8 9" << endl;
int E[3][3]={1,2,3,4,5,6,7,8,9};
AfficheEnLigne(E);
cout<< endl;

CopieMatrice(MatriceE,E);
cout<<"Copie de E dans MatriceE ; MatriceE :" << endl ;
AfficheEnLigne(MatriceE);
cout<< endl;

//Nous déclarons & initialisons à zéro "MatriceD" de doubles
double MatriceD[3][3] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
cout<<"MatriceD de doubles initialisée à zéro :" << endl;
AfficheEnLigne(MatriceD);
cout<< endl;

cout<<"Matrice D de doubles initialisée à 1.1 2.2 3.3 etc...9.9";
cout<< endl;
double D[3][3]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9};
AfficheEnLigne(D);
cout << endl;

CopieMatrice(MatriceD,D);
cout << "Copie de D dans MatriceD ; MatriceD :" << endl ;
AfficheEnLigne(MatriceD);
cout << endl;

//Nous déclarons & initialisons "MatriceC" par des caractères points
char MatriceC[3][3] = {'.','.','.','.','.','.','.','.','.'};
cout << "MatriceC de caractères initialisée avec des points :" << endl; AfficheEnLigne(MatriceC);
cout<< endl;
cout<< "Matrice C de caractères initialisée à a b c d e f g h i";
cout << endl;

char C[3][3]={'a','b','c','d','e','f','g','h','i'};
AfficheEnLigne(C);
cout << endl

CopieMatrice(MatriceC,C);
cout << "Copie de C dans MatriceC ; Matrice C :" << endl ;
AfficheEnLigne(MatriceC);

return 0;
}

Affichage à l'exécution :

MatriceE d'entiers initialisée à zéro :
1ère ligne : 0 0 0
2ème ligne : 0 0 0
3ème ligne :
0 0 0

Matrice E d'entiers initialisée à 1 2 3 4 5 6 7 8 9
1ère ligne : 1 2 3
2ème ligne : 4 5 6
3ème ligne :
7 8 9

Copie de E dans MatriceE ; MatriceE :
1ère ligne : 1 2 3
2ème ligne : 4 5 6
3ème ligne :
7 8 9

MatriceD de doubles initialisée à zéro :
1ère ligne : 0.0- 0.0--0.0
2ème ligne : 0.0- 0.0- 0.0
3ème ligne :
0.0- 0.0- 0.0

Matrice D de doubles initialisée à 1.1 2.2 3.3 etc...9.9
1ère ligne : 1.1- 2.2--3.3
2ème ligne : 4.4- 5.5- 6.6
3ème ligne :
7.7- 8.8- 9.9

Copie de D dans MatriceD ; MatriceD :
1ère ligne : 1.1- 2.2--3.3
2ème ligne : 4.4- 5.5- 6.6
3ème ligne :
7.7- 8.8- 9.9

MatriceC de caractères initialisée avec des points :
1ère ligne : . . .
2ème ligne : . . .
3ème ligne :
. . .

Matrice C de caractères initialisée à a b c d e f g h i
1ère ligne : a b c
2ème ligne : d e f
3ème ligne :
g h i

Copie de C dans MatriceC ; MatriceC :
1ère ligne : a b c
2ème ligne : d e f
3ème ligne :
g h i

Press any key to continue

 

Tableaux de chaînes de caractères

Un tableau bi-dimensionnel de caractères peut également être considéré comme
un tableau unidimensionnel de chaînes de caractères.

L'apport de ce qui va suivre concerne surtout l'initialisation de tels tableaux.

#define alaligne cout << endl;

int main()
{

-char Tableau[] = {"Chaine"};
-//Un tableau de 7 éléments contenant "Chaine" et son terminateur est créé

-//Vérifions :
-int i=0;

-while(Tableau[i]) putchar(Tableau[i++]);
-alaligne;alaligne;

-//Une autre manière de réserver un tableau de chaînes
-//avec initialisation partielle :
-char Prenom[100][35] =
-{ "Jean" , "Claude" , "Ernest" , "Jacinthe" ,"", "Baptiste"-};

-//Vérifions :
-cout << Prenom[0] << endl;
-cout << Prenom[1] << endl;
-cout << Prenom[2] << endl;
-cout << Prenom[3] << endl;
-cout << Prenom[4] << endl;
-cout << Prenom[5] << endl;
-alaligne;

-//Remarquez que dans les instructions d'affichage ci-dessus :
-//Prenom[0], Prenom[1], etc. sont considérés comme
-//des pointeurs sur des tableaux unidimentsionnels de caractères
-//Prenom[i][j] est un caractère
-//Prenom[i] est un pointeur sur un tableau unidimensionnel de caractères
-//Prenom est un tableau bidimensionnel de caractères
-//Prenom est un pointeur sur le premier tableau de caractères : "Jean"

-cout << *Prenom << endl;
-alaligne;

-return 0;
}

Affichage à l'exécution :

Chaine

Jean
Claude
Ernest
Jacinthe

Baptiste

Jean

Press any key to continue

 


Exemples de programmation sur les pointeurs

Exemples de programmation sur les tableaux


Sommaire Langage C
Accueil

du site