En programmation, les tableaux ou
Array en anglais sont des
outils puissants. Un tableau contient plusieurs valeurs qui sont
accessibles par un index.
Pour faire une analogie, prenons une rue avec des maisons. Les maisons
sont les espaces mémoire. Il est possible de nommer chaque maison par
un nom, disons, celui de son propriétaire:
Le nom assigné à chaque maison est une variable dans un programme.
En utilisant le nom de la maison, je peux accéder à la maison et savoir ce qu'il y a dedans.
Dans le cas présent, nous allons y mettre des humains. La variable va contenir le nombre
d'humains dans chaque maison. Je ne parle pas encore de tableau, j'y viens plus tard.
Pour l'instant, je n'ai pas indiqué le nombre de personnes dans chaque maison.
Je dois assigner un nombre de personnes pour chaque maison. Le pseudo-code est:
Rambo = 1;
Lili = 1;
John = 1;
Ada = 1;
Linus = 1;
Steve = 1;
C'est assez long! Imaginer maintenant qu'il y a une centaine de personnes sur
cette rue. Toutes les maisons sont occupées par des célibataires, donc, une personne par maison.
Vous allez devoir manuellement indiquer qu'il y a une personne
dans chaque maison! Ce n'est pas très pratique. Heureusement, il y a les
tableaux.
Reprenons notre exemple. Nommons la rue Tapaga. La rue est une analogie
pour un tableau. Une rue contient des maisons. De même, un tableau contient une
liste d'espace mémoire. Chaque maison a une adresse qui est l'équivalent de l'index
du tableau.
Pour accéder à une maison, je dis 0 Rue Tabaga, 1 rue Tabaga, etc. Pour accéder
à un tableau en C#, la syntaxe est:
Rambo = Tabaga[0];
Je mémorise la valeur de l'index 0 du tableau Tabaga dans la variable Rambo.
Remarquer que les caractères [] sont utilisés au lieu des parenthèses habituelles utilisées en mathématique.
En mathématique, pour accéder à un élément d'un vecteur, la notation est a(1), a(2), etc. En C# et pour
tous les langages de la famille du C, les crochets sont utilisés. En Fortran, la notation mathématique
est utilisée.
Le premier élément d'un tableau est à l'index 0 et non 1. Donc, si je veux accéder au dixième
élément d'un tableau, l'index à utiliser est 9 et non dix. Le code est:
Rambo = Tabaga[9];
La question que vous vous posez sûrement est: pourquoi les concepteurs du C
(l'ancêtre du C++ et du C#) n'ont-ils pas commencé les tableaux à 1, comme dans le vrai monde
(ou comme en Fortran). Les éléments d'un tableau C sont enregistrés dans des espaces
mémoire contigus. En sachant l'adresse du premier élément, les autres éléments sont
atteints en additionnant l'index du tableau.
Ainsi, le tableau n'a pas besoin de mémoriser l'adresse mémoire de
tous les éléments, mais seulement du premier, sauvant de la mémoire.
Un index en C est un décalage par rapport au premier
élément du tableau. Le tableau contient l'adresse du premier élément
du tableau. Disons que l'adresse du premier élément est 987. L'adresse du premier élément
est: 987 + 0, le second est 987 + 1, le troisième est 987 + 2, le nième est 987 + i où
i est l'index du tableau.
L'écrire dans un tableau est l'inverse de la lecture. Il suffit de mettre
le tableau à gauche de l'égalité. Le code est:
Tabaga[1] = 1;
Il est désormais possible de dire que chaque maison de la rue Tabaga
possède une seule personne. En C#, le code est:
for each maison in Tabaga
{
maison = 1;
}
L'instruction
for each est une boucle. Une boucle répète l'action entre
les {} plusieurs fois. Dans le cas d'une boucle
for each, la boucle se
répète tant qu'il y a des éléments dans
Tabaga.
maison est une
variable de la boucle
for each avec l'adresse d'une maison de la rue
Tabaga. En assignant 1 à
maison, j'assigne 1 à un élément de Tabaga.
La boucle visitant toutes les maisons, le résultat final est que chaque maison
à désormais 1 d'assigné. Une boucle est un peu comme le facteur. Le facteur
visite chaque maison une à la fois et délivre le courrier en fonction de
l'adresse de la maison.
Les boucles démontrent la puissance de la notation par tableau. La boucle
initialisera tous les éléments de Tabaga à 1, peu importe la taille de Tabaga.
Donc, si le nombre de maisons sur Tabaga change, le code, lui, reste le même!
Il n'y a rien à changer!
Bon, maintenant que nous avons expliqué les tableaux, il est temps d'apprendre
la notation pour les créer en C#. Pour créer un tableau unidimensionnel d'entier en C#, la
notation est:
int[] Tabaga;
Tabaga = new int[5];
ou en une seule instruction:
int[] Tabaga = new int[5];
Ici encore, le C# est contre-intuitif. La notation la plus naturelle serait:
int Tabaga(5) = new int(5);
Pour les admirateurs de cette notation, sachez que Visual Basic ressemble un peu à cela.
De même que Fortran.
Mettons-nous dans la perspective du C#. Une variable est déclarée en
donnant son type et le nom de la variable. Le type est ce que la variable
contient comme int, double, float ou un objet comme Vector3 ou Person, etc.
Maintenant, je veux déclarer un tableau de int. Le type de la variable est
donc int[] où [] représente un tableau. Dans ce
cas, il est logique que le int[] soit en premier et la notation d'un tableau
est compatible avec celle des variables.
L'instruction:
int[] Tabaga;
crée un pointeur à un tableau de int. Un pointeur est une variable qui contient
une adresse mémoire qui, elle, contient des données. Dans le cas présent, le pointeur ne
contient pas d'adresse. Pour revenir à notre analogie, Tabaga est une rue vide, sans maison.
La rue est vide, mais je peux construire des maisons par la suite.
Analysons l'instruction suivante:
Tabaga = new int[5];
L'instruction
new indique aux programmes de créer un tableau de int contenant 5
éléments.
new crée l'espace mémoire nécessaire au tableau et retourne l'adresse
mémoire qui est enregistrée dans Tabaga. Pour revenir à notre analogie, la
commande
new construit des maisons dans notre rue.
Si vous avez d'autres questions sur les tableaux en C#, n'hésitez pas à me le demander.