précédent suivant haut Contents

TABLEAUX


TABLEAUX UNIDIMENSIONNELS

On a souvent besoin de regrouper dans une seule variable (et donc un seul nom) plusieurs variables (exemple 3 coordonnées d'un même vecteur). On utilise pour cela les TABLEAUX. La manière la plus simple des les définir 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 également accéder aux différentes composantes par un index (si vecteur1 est le vecteur unitaire porté par Y, alors VECTEUR1[1]=0 ,VECTEUR1[2]=1, VECTEUR1[3]=0 ).

l'index peut être 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 également définir 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'écart entre chaque note et cette moyenne.

EXERCICE (rot.b) Ecrire le programme qui lit une liste de N nombres, la décale d'un cran vers le haut (le 1er doit se retrouver en dernier) l'affiche puis la décale vers le bas.

EXERCICE (clas.c) Classer automatiquement une liste de n entiers par ordre croissant puis décroissant.

LES CHAINES DE CARACTERES

On appelle chaîne de caractères une suite de caractères regroupés dans une seule variable. En PASCAL standard il faut la déclarer comme ARRAY[1..nbcar] OF CHAR. Les tests sont possibles entre chaines (test suivant l'ordre ASCII du 1er caractère, puis automatiquement du 2ème, etc).

ex : 'aaz'<'aba' 'aa '<'aaa' 'ZZZ'<'aaa' (majuscules)

On peut également utiliser ces tableaux dans READLN et WRITELN.

Mais en général, les compilateurs possèdent des types plus puissants, associés à des fonctions et procédures non standard. En Turbo on déclare une chaîne par STRING[nbcar]. Une fonction utile est alors LENGTH(variable_string) qui donne la longueur de la chaîne (inférieure ou égale à la dimension déclarée).

EXERCICE (str) Ecrire un programme qui détermine le nombre et les positions d'une chaîne dans une autre (ex ON dans FONCTION : en position 2 et 7).

TABLEAUX DE TABLEAUX

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 même des tableaux de composantes (exemple matrice 5 lignes, 10 colonnes):

   TYPE 	ligne=array[1..10] of real;
		mat=array[1..5] of ligne;
l'écriture TYPE mat=array[1..5] of array[1..10] of real

ou même TYPE mat=array[1..5,1..10] of real

sont strictement équivalentes (sauf si la définition du type ligne est nécessaire pour d'autres variables).

soit la déclaration

	VAR 	m1,m2:mat;
		i,j:integer;
on peut écrire :
	m1[i,j]:=10 {affectation de la valeur 10 en ligne i, colonne j}
	m1[i]:=m1[i+1]  {copie complète de la ligne i+1 sur la ligne i}
	m2:=m1          {copie de la matrice complète }
mais il est impossible d'accéder directement à une colonne.

RAPPEL: READLN et WRITELN ne s'appliquent qu'a des variables simples prédéfinies (c.a.d les composantes, si celles-ci sont réelles, entières, chaînes ou booléennes).

EXERCICE (mat) faire le calcul de multiplication d'une matrice (M lignes, L col) par (L lignes, N col) (résultat M lignes, N col).

TABLEAUX COMPACTES

On peut en PASCAL standard définir des tableaux en PACKED ARRAY. Ils s'utilisent de la même manière que des tableaux normaux, mais prennent moins de place en mémoire. 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 compactées (inutile de le préciser).

Ex : VAR truc : PACKED ARRAY [1..10] OF typtruc;

On possède en standard les procédures de transfert :

PACK(table_non_packée , index_début , table_packée_resultat)

UNPACK(table_packée , table_non_packée_resultat , index_début)

pour transférer toute la table, mettre index_début à 1.


précédent suivant haut Contents