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.

samedi 3 mars 2012

Comment insérer des équations dans Blogger? (Revisité)

Dans le passé, j'ai indiqué comment ajouter des équations à Blogger en ajoutant des images générées par Microsoft Office ou Libre Office. Cette méthode n'est pas idéale. Si je veux créer une page Web contenant des équations et du contenu interactif, deux logiciels minimum sont utilisés: Libre Office ou Microsoft Office et un éditeur Web. Par la suite, les images des équations sont générées et collées comme image sur la page Web. Pour un site Web avec beaucoup d'équations, ce processus est très long. Si une ou plusieurs équations sont erronées, les images sont modifiées dans le traitement de texte, transformées en images et collées à nouveau dans la page Web. Ouf! Il y a surement une façon plus rapide. Effectivement, en cherchant, il y en a une. Il existe une application JavaScript nommée MathJax qui transforme du code LaTeX en magnifique équation sur le Web. Comme je suis un admirateur inconditionnel de LaTeX, je ne pouvais pas être plus heureux! Si vous n'êtes pas fou de TeX ou LaTeX, MathJax n'est probablement pas pour vous. J'aime LaTeX, car je peux écrire une équation au clavier plus vite qu'avec la souris et une interface graphique.

L'installation de MathJax dans Blogger est simple. Dans le Tableau de Bord de Blogger, aller dans l'onglet Présentation. Choississer le sous-onglet Modifier le code HTML. Chercher pour la balise < /head > . Juste avant cette balise, insérer le code suivant:

Enregistrer le modèle et vous êtes prêt pour insérer des équations avec MathJax. Comment fait-on pour insérer des équations? Commençons avec une équation bien simple: \[ \alpha + \beta = \gamma \] Le code pour cette équation est:
\[ \alpha + \beta = \gamma \]
Les symboles \[ et \] servent de balises à MathJax. Ce n'est pas du LaTeX. Le code à l'intérieur des balises est du code LaTeX. Essayons maintenant d'afficher une équation plus complexe, comme les équations de Maxwell: \[ \begin{aligned} \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} \] Fantastique! La qualité graphique est sublime. Le code LaTeX pour cette équation est:
\[
\begin{aligned}
\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\   
\nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
\nabla \cdot \vec{\mathbf{B}} & = 0 
\end{aligned}
\]
N'importe quel code LaTeX pour équation fonctionne. N'oubliez pas d'entourer votre code des balises \[ et \], sinon MathJax ne fera rien. Pour plus d'informations, je vous conseille d'aller visiter le site de MathJax.