dimanche 4 mars 2012

Les tableaux en C#

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.

Aucun commentaire:

Enregistrer un commentaire