On a souvent besoin de regrouper dans une seule variable (et donc un seul nom) plusieurs variables (exemple 3 coordonnees d'un meme vecteur). On utilise pour cela les TABLEAUX. La maniere la plus simple des les definir est :
VAR nom_tableau : ARRAY [type_index] OF type_composantes
ex: CONST dimension=3;
VAR vecteur1,vecteur2 : ARRAY [1..dimension] OF REAL
On peut utiliser le tableau complet (vecteur1:=vecteur2) pour l'affectation uniquement (vecteur1+vecteur2 est impossible directement). Mais on peut egalement acceder aux differentes composantes par un index (si vecteur1 est le vecteur unitaire porte par Y, alors VECTEUR1[1]=0 ,VECTEUR1[2]=1, VECTEUR1[3]=0 ).
l'index peut etre variable:
PROGRAM heures(input,output);
TYPE tj=(lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche);
VAR jour:tj;
nb_heures_cours:ARRAY[tj] OF integer;
begin
{il faudrait ici entrer les nombres d'heures de cours par jour}
FOR jour:=lundi TO samedi DO writeln(nb_heures_cours[jour])
end.
On peut egalement definir un TYPE tableau, par exemple :
TYPE typheures=ARRAY[tj] OF integer;
VAR nb_heures_cours:typheures;
EXERCICE (moy a) Ecrire le programme qui lit une liste de N nombres, calcule et affiche la moyenne puis l'ecart entre chaque note et cette moyenne.
EXERCICE (rot.b) Ecrire le programme qui lit une liste de N nombres, la decale d'un cran vers le haut (le 1er doit se retrouver en dernier) l'affiche puis la decale vers le bas.
EXERCICE (clas.c) Classer automatiquement une liste de n entiers par ordre croissant puis decroissant.
On appelle chaine de caracteres une suite de caracteres regroupes dans une seule variable. En PASCAL standard il faut la declarer comme ARRAY[1..nbcar] OF CHAR. Les tests sont possibles entre chaines (test suivant l'ordre ASCII du 1er caractere, puis automatiquement du 2eme, etc).
ex : 'aaz'<'aba' 'aa '<'aaa' 'ZZZ'<'aaa' (majuscules)
On peut egalement utiliser ces tableaux dans READLN et WRITELN.
Mais en general, les compilateurs possedent des types plus puissants, associes a des fonctions et procedures non standard. En Turbo on declare une chaine par STRING[nbcar]. Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaine (inferieure ou egale a la dimension declaree).
EXERCICE (str) Ecrire un programme qui determine le nombre et les positions d'une chaine dans une autre (ex ON dans FONCTION : en position 2 et 7).
On peut faire des tableaux avec des composantes de tous types, y compris de tableaux. On peut voir une matrice comme un tableau de lignes qui sont elles meme des tableaux de composantes (exemple matrice 5 lignes, 10 colonnes):
TYPE ligne=array[1..10] of real; mat=array[1..5] of ligne;l'ecriture TYPE mat=array[1..5] of array[1..10] of real
ou meme TYPE mat=array[1..5,1..10] of real
sont strictement equivalentes (sauf si la definition du type ligne est necessaire pour d'autres variables).
soit la declaration
VAR m1,m2:mat; i,j:integer;on peut ecrire :
m1[i,j]:=10 {affectation de la valeur 10 en ligne i, colonne j}
m1[i]:=m1[i+1] {copie complete de la ligne i+1 sur la ligne i}
m2:=m1 {copie de la matrice complete }
mais il est impossible d'acceder directement a une colonne.RAPPEL: READLN et WRITELN ne s'appliquent qu'a des variables simples predefinies (c.a.d les composantes, si celles-ci sont reelles, entieres, chaines ou booleennes).
EXERCICE (mat) faire le calcul de multiplication d'une matrice (M lignes, L col) par (L lignes, N col) (resultat M lignes, N col).
On peut en PASCAL standard definir des tableaux en PACKED ARRAY. Ils s'utilisent de la meme maniere que des tableaux normaux, mais prennent moins de place en memoire. Sur certains ordinateurs, ceci se paie par un ralentissement du programme dans certaines applications. En TURBO ce n'est pas le cas, et elles sont donc automatiquement toutes compactees (inutile de le preciser).
Ex : VAR truc : PACKED ARRAY [1..10] OF typtruc;
On possede en standard les procedures de transfert :
PACK(table_non_packee , index_debut , table_packee_resultat)
UNPACK(table_packee , table_non_packee_resultat , index_debut)
pour transferer toute la table, mettre index_debut a 1.