Programmation C sharp/Les tableaux
Un tableau regroupe plusieurs données d'un même type, dans un ensemble ordonné et indicé par un entier. En C#, comme avec la plupart des langages de programmation modernes, le premier élément porte l'indice 0.
Déclaration d'un tableau
modifierLes crochets ajoutés à la fin d'un type indique qu'il s'agit d'un tableau.
Exemple :
int[] entiers;
La variable entiers
est un tableau de nombres entiers.
Le nombre d'éléments du tableau n'est pas spécifié à la déclaration, mais lors de l'allocation du tableau.
Allocation d'un tableau
modifierLes tableaux font partie des types références.
Il n'est donc pas alloué par défaut (référence null
).
L'allocation se fait en utilisant le mot clé new
et en spécifiant le nombre d'éléments entre crochets après le type :
new type[taille]
Exemple :
int[] entiers = new int[10]; // un tableau de 10 entiers
Il est également possible de l'allouer ailleurs que dans la déclaration :
int[] entiers;
...
entiers = new int[10]; // un tableau de 10 entiers
Une fois la place du tableau réservée en mémoire, celui-ci ne contient que des valeurs par défaut, c'est à dire que chaque élément d'un tableau de numériques (entiers, réels, ...) vaut 0
, pour un tableau de bool
chaque élément vaut false
, et pour un tableau de références (objet, interface, tableau) chaque élément vaut null
.
Pré-initialisation
modifierIl est également possible de définir directement les valeurs que le tableau contient. Ces valeurs doivent être comprises entre des accolades et séparées par une virgule. Le compilateur détermine le nombre d'éléments à allouer d'après la liste d'éléments spécifiée à la suite de l'instruction d'allocation.
Exemples :
- À la déclaration du tableau :
int[] entiers = new int[] { 10,15,20,25,30,35,40,45 };
- Hors déclaration :
entiers = new int[] { 10,15,20,25,30,35,40,45 };
Seule la déclaration peut omettre l'instruction d'allocation du tableau avant les accolades :
int[] entiers = { 10,15,20,25,30,35,40,45 };
Dans ce cas, le compilateur alloue implicitement un tableau du même type que la variable déclarée, pour le nombre d'éléments placés entre les accolades.
Accès aux éléments
modifierL'accés (lecture et écriture) aux éléments du tableau se fait en utilisant le nom du tableau suivi des crochets encadrant l'indice de l'élément accédé :
entiers[0] = 7; // Assigner 7 au premier élémént
entiers[1] = 13; // Assigner 13 au deuxième élément
Console.WriteLine("1er entier = " + entiers[0] );
L'indice spécifié est en fait une expression. Il est donc possible d'utiliser une variable comme indice, par exemple, pour parcourir les éléments du tableau :
for(int i=0 ; i<2 ; i++)
Console.WriteLine("entier n°" + i + " = " + entiers[ i ] );
Taille d'un tableau
modifierL'attribut Length
donne la taille du tableau. Ce qui est pratique pour le parcourir :
Console.WriteLine("Le tableau contient " + entiers.Length + " entiers :"); for(int i=0 ; i<entiers.Length ; i++) // i : indice dans le tableau Console.WriteLine(" ["+i+"] = " + entiers[i] );
Si l'indice n'est pas nécessaire durant le parcours du tableau, il est plus simple d'utiliser foreach
:
Console.WriteLine("Le tableau contient " + entiers.Length + " entiers :");
foreach(int n in entiers) // n : élément du tableau
Console.WriteLine(" " + n );
Tableaux multi-dimensionnels
modifierLes tableaux vus jusqu'à présent étaient des tableaux uni-dimensionnels : ils n'ont qu'une seule dimension, c'est à dire un seul indice.
Certaines applications nécessitent des tableaux à deux indices ou davantage. Par exemple, une image est représentée par un tableau de couleurs indicé par l'abscisse (x) et l'ordonnée (y).
Un tableau multi-dimensionnel utilise la même syntaxe, en séparant les indices par une virgule.
int[,] image = new int[ 32, 16 ];
// un tableau de 32*16 entiers, soit 512 entiers
image[1,5] = 0;
Un tableau de tableaux (appelé jagged array ou tableau déchiqueté) utilise la syntaxe des tableaux uni-dimensionnels en utilisant un tableau comme type de base :
int[][] ensembles = new int[10][]; // un tableau de 10 tableaux d'entiers
ensembles[0] = new int[11]; // dont le premier contient 11 entiers
ensembles[1] = new int[] { 2, 3 }; // le deuxième : 2 entiers (2 et 3)
// ensembles[2] à ensembles[9] valent null car non alloués
ensembles[1][1] = 4; // remplace la valeur 3 par 4
Chacun des sous-tableaux doit être alloué séparément, et rien n'oblige à ce qu'ils aient tous la même dimension (d'où l'appellation de tableau déchiqueté).
Il est également possible de combiner les possibilités :
int[,][] donnees = new int[10,20][];
donnees[1,5] = new int[25];
donnees[1,5][10] = 12;