vendredi 25 janvier 2002

Tableau


TABLEAU

Un tableau est un ensemble de valeur. On peut mettre n'importe type standard dans un tableau. Ils permettent de relier des données ensemble au lieu de créer plusieurs variables. Disons que vous devez créer un programme qui calculer la moyenne des notes des étudiants d'une classe. Vous pourriez créer autant de variables qu'il y a d'étudiant, mais ça serait difficile et fastidieux à gérer.

Une solution consisterait à utiliser un tableau

var tabNote:array [0..24]of real;

Ce qui fera    150 octets (25 éléments * 6 octets pour un real) On peut représenter    en mémoire un tableau comme voici. 

tabNote[0]
tabNote[1]
tabNote[2]
La mémoire est utilisée de façon linéaire, chaque fois qu'on avance d'un élément, on avance de 6 octets dans la mémoire. On doit spécifier l'index d'un tableau lorsqu'on l'initialise. L'index c'est le chiffre qu'on spécifie entre les crochets «[]».

tabNote[0]:=23;
tabNote[21]:=144;

Les opérations

Les opérations entre tableaux sont aussi possibles
notePaul:=tabNote[3] + tabNote[12] - tabNote[5];

Les tableaux multidimensionnels

Les tableaux multidimensionnels peuvent aussi être créés. On ne doit qu'ajouter un deuxième indice à la syntaxe déjà apprise. var tabNote:array [0..2 ,0..1] of integer; Les deux syntaxes sont équivalentes. Les opérations entre tableaux peuvent aussi être faites. La représentation en mémoire est la même, de la gauche vers la droite et on change de ligne

tabNote[0][0]
tabNote[0][1]
tabNote[0][2]
tabNote[1][0]
tabNote[1][1]
tabNote[1][2]

Les tableaux sont souvent la cause de beaucoup d'erreurs chez les  programmeurs.
Il est très aisé de faire une erreur de débordement.

var
  tabNote:array [0..2] of integer;
begin
  tabNote[8]:=45;
end;

Ce code engendra une erreur à la compilation. Afin d'empêcher
que de telle erreur se produise, on peut utiliser les fonctions  low et high.
Ces fonctions renvoient les limites inférieures et supérieures
d'un tableau.

var
  bas,haut:integer
  tabNote:array [10..34] of integer;
begin
  bas:=low(tabNote);//ce qui équivaut à 10
  haut:=high(tabNote);//ce qui équivaut à 34
end;

On peut comparativement à d'autres langages créer un tableau
ne débutant pas à zéro. Cette possibilité peut
s'avérer intéressante afin de résoudre certains problèmes.

var
tabNote[10..22] of integer;

Les tableaux dynamiques

Jusqu'à maintenant, on n'a créé que des tableaux statiques. Ce type de tableau a le désavantage de ne pouvoir se modifier durant l'exécution du programme. Une fois le tableau défini, on ne peut l'agrandir, le rétrécir.

Si vous avez déjà programmé des tableaux dynamiques en langage c, c++ vous savez comment il peut être compliqué de le faire pour un novice. Vous serez sûrement heureux d'apprendre que, depuis la version 4 de delphi, il est aisé de manipuler de tel tableau. On n'a qu'à ne pas spécifier de taille lorsqu'on déclare le tableau

var
  tabNote:array of integer;
  Grandeur:integer;
begin
  Grandeur:=SpecifierGrandeur;
  SetLength(tabNote,Grandeur);
end;
Maintenant, on a un tableau de la grandeur que l'on veut. L'indice inférieur d'un tableau dynamique débute toujours à l'indice zéro.

var
  tabNote:array of integer;
  Grandeur:integer;
begin
  Grandeur:=100;
  SetLength(tabNote,Grandeur);
  //Traitement on retrecit le tableau
  SetLength(tabNote,5);
  //on agrandit le tableau
  SetLength(tabNote,10);
end;

Les tableaux multidimensionnels peuvent aussi être crées dynamiquement
var
  lpPoint:TPoint;
begin
  Grandeur:=0;
  while (ok=false) do
  begin
    GetCursorPos(lpPoint);
    Grandeur:=Grandeur+1;
    //augmente la première dimension du tableau
    setlength(tabPoint,Grandeur,2);
    tabPoint[Grandeur-1,0]:=lpPoint.x;
    tabPoint[Grandeur-1,1]:=lpPoint.y;
  end;
end;

L'utilité des tableaux est innombrable, mais gare au débordement. :)