Vous êtes sur la page 1sur 5

Vecteurs,

II .
tableaux et
chaînes de
caractères

La notion de vecteur est le fruit d'une longue histoire, commencée


voici plus de deux mille ans. Deux familles d'idées, d'abord
distinctes, sont à l'origine de la formalisation. L'une d'elle est la
géométrie, traitant de longueurs, d'angles et de mesures de surfaces
et de volumes. L'autre correspond à l'algèbre, qui traite des
nombres, de l'addition ou la multiplication et plus généralement
d'ensembles munis d'opérations. Un vieux problème d'algèbre nous
vient par exemple des Égyptiens et s'exprime de la manière suivante
« On doit diviser 100 miches de pain entre dix hommes comprenant
un navigateur, un contremaître et un gardien, tous trois recevant
double part. Que faut-il donner à chacun ? » Ces deux familles
d'idées sont développées indépendamment, pour finir par converger
vers la notion de vecteur.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
21 22
Les structures de données simples ne suffisent pas pour concevoir tout types d'algorithmes. ALGORITHM init_tab
Par exemple, si on veut faire des statistiques sur la moyenne d'âge d'un échantillon de OUTPUT INT tab [100];
population, il faudrait stocker une certaine quantité de données de même nature (l'âge) pour BEGIN
pouvoir ensuite déterminer le nombre d'individus sondés et calculer la moyenne d'âge. Si INT nb_val;
l'on connaissait le nombre N de personnes à interroger, on pourrait déclarer le même nombre INT i;
de variables (age1, age2, ... ageN), mais cette solution n'est pas une bonne solution et d'un INT val;
autre côté, on ne connait pas la taille de l'échantillon de population.
write ("combien de valeurs voulez-vous saisir : ");
La plupart des bons algorithmes fonctionnent grâce à une méthode astucieuse pour read (nb_val);
organiser les données. On distingue quatre grandes classes de structures de données :
FOR i ← 0 TO nb_val - 1 DO
• Les structures de données séquentielles (tableaux) ; write ("donner la valeur N° ", i, " : ");
read (val);
• Les structures de données linéaires (liste chaînées) ;
tab [i] ← val;
• Les arbres ; END FOR
• Les graphes. END
Algo 8. - Initialisation d'un tableau
II.1 Définition
L'instruction tab [i] ← val veut dire initialiser la valeur à l'indice i du tableau avec le contenu
Un tableau est une structure de donnée séquentielle permettant de stocker des données de de la variable val. Il n'est pas nécessaire d'utiliser la variable intermédiaire val. En effet, on
même type, chacun de ces éléments étant repéré par un indice unique. C'est une structure peut directement lire la valeur donnée par l'utilisateur et directement initialiser la valeur à
statique dont le nombre maximal N d'éléments qu'il peut contenir est connu d'avance. La l'indice i du tableau :
taille mémoire d'un tableau dépend de la nature des éléments qu'il peut contenir.
Généralement, la taille mémoire se calcule simplement par la formule : N × taille (TYPE) ; write ("donner la valeur N° ", i, " : ");
c'est à dire le nombre maximal d'éléments que peut contenir le tableau multiplié par la taille read (tab[i]);
de l'élément. II.2.2 Insertion d'un élément
Déclaration d'un tableau : TYPE nom_tableau [TAILLE_MAX] où TYPE est le type L'insertion peut se faire au début, au milieu où à la fin d'un tableau à condition de ne pas
d'éléments que va contenir le tableau. Ce type peut être n'importe quel type de base déjà vu dépasser la taille maximale c'est à dire le nombre maximum de valeurs déclaré avant l'usage
ou un type complexe ou pointeur que nous verrons plus tard. du tableau. Il est donc impératif de vérifier au préalable que le nombre d'éléments contenus
Un tableau occupe une zone mémoire contigüe. Si on déclare un tableau d'une taille N et dans le tableau est strictement inférieur au nombre total d'éléments qu'il peut contenir.
qu'il y a pas assez de mémoire contigüe pour contenir le tableau, l'opération échoue même si En ce qui concerne l'insertion en fin de tableau, il suffit de vérifier que le nombre d'éléments
la taille totale de la mémoire libre est supérieur à la taille requise par le tableau. Les éléments contenus est strictement inférieur à nombre maximal autorisé. Il faudrait ensuite mettre
d'un tableau sont repérés par des indices qui vont, selon chaque langage de programmation, l'élément à insérer au premier indice libre du tableau et incrémenter le nombre d'éléments
de 0 à N - 1 ou de 1 à N. Certains langages permettent des indices de M à N avec 1 < M < N. réellement contenus d'une unité. Pour toute autre insertion, il faut décaler tous les éléments à
Dans ce documents on considère les indices de 0 à N - 1. partir de l'indice dans lequel on va insérer le nouvel éléments jusqu'au dernier élément à
Les opération de base que l'on peut effectuer sur un tableaux sont l'accès à un éléments l'indice suivant. Ensuite on procède à l'insertion du nouvel élément à l'indice adéquat.
d'indice i, l'insertion d'un élément (au début, au milieu ou à lal fin du tableau) et enfin la Dans l'algorithme suivant, on suppose que le nombre d'éléments contenus dans le tableau
suppression d'un élément (au début, au milieu ou à lal fin du tableau). (nb_val) est connu. ce nombre peut être nul, cela ne pose pas de problème.
II.2 Algorithmes sur les tableaux ALGORITHM insertion
INPUT/OUTPUT INT tab [100];
Les algorithmes de base sur les tableaux sont l'initialisation d'un tableau et l'accumulation BEGIN
d’une opération sur les éléments du tableaux (par exemple : somme, produit, maximum, etc.) INT i;
INT pos;
II.2.1 Initialisation d'un tableau
IF nb_val >= 100 THEN
Initialiser un tableau consiste à le remplir avec des valeurs provenant soit de l'utilisateur soit write ("le tableau est plein, impossible d'insérer");
d'un autre tableau ou bien d'un fichier, etc. Il est possible de remplir tout ou partie d'un ELSE
write ("Donner la position d'insertion : ");
tableau. Généralement on utilise la structure FOR afin d'initialiser un tableau, mais les
read (pos);
structure WHILE et REPEAT sont tout autant convenables.
IF pos < 0 OR pos >= 100 THEN
write ("Erreur : débordement d'indice");

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
23 24
ELSE La déclaration d'une matrice est TYPE nom_matrice [TAILLE_L] [TAILLE_C] où TAILLE_L
write ("Donner la valeur à insérer : "); est le nombre de vecteurs contenus dans la matrice et TAILLE_C est le nombre d'éléments
par vecteur. Par exemple :
FOR i ← nb_val TO pos + 1 STEP = -1 DO
tab [i] ← tab [i - 1];
END FOR
0 0 0 0
read (tab [pos]);
1 1 1 1
END IF
2 2 2 2
END IF
END 3 3 3 3
4 4 4 4
Algo 9. - Insertion d'un élément dans un tableau . . . .

II.2.3 Suppression d'un élément


0 1 2 3
De même que l'insertion, on peut supprimer un élément au début, au milieu où à la fin d'un
Fig. 3 - Représentation schématique d'une matrice
tableau sauf si le tableau est vide. Une fois un élément supprimé, on décale tous les éléments
qui le suivent à d'un indice inférieur d'une unité. EXEMPLE
ALGORITHM suppression INT matrice [5][10];
OUTPUT/OUTPUT INT tab [100];
BEGIN Dans cet exemple on déclare une matrice contenant 5 vecteur ; chaque vecteur pouvant
INT i;
contenir 10 éléments. Pour accéder à l'élément dont l'indice est 6 du vecteur dont l'indice est
INT pos;
2, on écrit : matrice [2][6].
IF nb_val = 0 THEN
write ("le tableau est vide, suppression impossible"); Pour initialiser une matrice, il faut commencer par initialiser le vecteur à l'indice 0, ensuite
ELSE celui à l'indice 1, etc. L'initialisation de chaque vecteur se fait de la même manière que celle
write ("Donner la position de suppression : "); vue dans §II.2.1.
read (pos);
ALGORITHM init_matrice
IF pos < 0 OR pos >= 100 THEN OUTPUT INT matrice [MAX_L][MAX_C];
write ("Erreur : débordement d'indice");
ELSE BEGIN
FOR i ← pos + 1 TO nb_val - 1 DO INT i, j;
tab [i - 1] ← tab [i];
END FOR FOR i ← 0 TO MAX_L - 1 DO
nb_val ← nb_val - 1; FOR j ← 0 TO MAX_C - 1 DO
END IF write ("donner la valeur N° ", i,j, " : ");
END IF read (matrice[i][j]);
END END FOR
END FOR
Algo 10. - Suppression d'un élément d'un tableau END
Algo 11. - Initialisation d'une matrice
II.3 Les tableaux multidimensionnels
La première boucle FOR (indice i) est celle qui va passer d'un vecteur à l'autre alors la
La structure de données tableau que nous avons vu s'appelle vecteur, c'est un tableau à une deuxième boucle FOR (indice j) est celle qui va lire la valeur de chaque élément du vecteur
seule dimension. Un tableau peut avoir plusieurs dimensions, par exemple une matrice est courant.
un tableau à deux dimensions. Une matrice est un tableau dont chaque case contient aussi un
Les tableaux peuvent avoir plusieurs dimensions, par exemple un tableau à trois dimension
vecteur (fig. 3)
est très utile en informatique et représente une structure de cube (fig. 4).
Chaque vecteur a un indice qui, par convention commence à zéro. Pour accéder à un vecteur
on doit le référencer par son indice. Chaque emplacement dans un vecteur est lui aussi
référencé par un indice comme déjà vu dans §II.1. Donc pour accéder à une emplacement
particulier d'une matrice il faut référencer l'indice du vecteur ainsi que l'indice de l'élément
du vecteur choisi.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
25 26
A L G O R I T H M I Q U E \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13

(a) Représentation d’une chaîne de caractère : usage des caractères

65 76 71 79 82 73 84 72 77 73 81 84 69 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13

(b) Représentation d’une chaîne de caractère : usage des codes ASCII


Fig. 6 - Codage d'une chaîne de caractères en C

Fig. 4 - Tableau à 3 dimensions : CUBE


Dans ce documents, nous utiliserons les conventions du langage C pour la représentation des
chaînes de caractères.
II.3 Les chaînes de caractères
Contrairement aux caractères simples, les chaînes de caractères ne sont pas de type scalaire. II.4 Quelques algorithmes sur les chaînes de caractères
Une chaîne de caractère sert à stocker et manipuler des données qui ne sont pas numériques. Il y a un grand nombre d'algorithmes que l'on peut appliquer sur les chaînes de caractères :
Nous considérons un type de donnée STRING qui représente les chaînes de caractères. calculer sa longueur, concaténer deux chaînes de caractères, copier une chaîne de caractères,
Certains langages comme le langage C ne dispose pas de type chaîne de caractères etc.
contrairement au langage Java. Dans toutes les conditions, une chaîne de caractères est
assimilable à un vecteur de caractères. Un tableau de caractères ne représente, cependant pas II.4.1 Calcul de la longueur d'une chaîne de caractères
toujours, une chaîne de caractères.
Il suffit d'initialiser un compteur à zéro de parcourir les caractères de la chaînes un à un
Une chaîne de caractères peut contenir n'importe quel caractère imprimable. Elle a une jusqu'à rencontrer la valeur 0. A chaque caractère rencontré, on incrémente le compteur.
longueur qui correspond au nombre de caractères contenu dans la chaîne. Par exemple, la
ALGORITHM longueur
chaîne "support de cours d'algorithmique" a une longueur de 32. Un langage comme le INPUT STRING ch;
Pascal dispose du type STRING pour représenter les chaines de caractères. Il stocke la OUTPUT INT long;
longueur d'une chaîne de caractères dans la chaîne elle même, c'est la raison d'ailleurs pour
laquelle, la longueur d'une chaîne de caractères en Pascal ne peut jamais dépasser 255. BEGIN
L'indice du premier caractère d'une chaîne en Pascal est 1, la caractère à la position 0 contient long ← 0;
la longueur de la chaîne. Puisqu'un caractère est codé sur 0 bits, sa valeur va de 0 à 255. Dans
WHILE ch [long] ≠ 0 DO
l'exemple suivant (fig. 5) on montre le codage de la chaîne "ALGORITHMIQUE" en Pascal.
long ← long + 1;
END WHILE

write ("la longueur de la chaîne ", ch, " est : ", long);
13 A L G O R I T H M I Q U E END
Algo 13. - Calcul de la longueur d'une chaîne de caractères
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Fig. 5 - Codage d'une chaîne de caractères en Pascal II.4.2 Concaténation de deux chaines de caractères

Contrairement au Pascal, le langage C ne limite pas la longueur d'une chaîne de caractère. Il Pour concaténer deux chaînes, il faut disposer d'un vecteur dont la taille est au mois égale à
adopte le codage connu sous la terminologie anglaise : "null terminated strings" ce qui veut la longueur de la première chaîne additionnée à la longueur de la deuxième chaînes et on
dire les chaînes de caractères terminées par la valeur 0 (à ne pas confondre avec le caractère ajoute à la somme totale 1 (pour la valeur zéro terminant la chaîne de caractère résultante).
'0'). Dans une chaîne de caractères, le caractère '0' (zéro) est remplacé par son code ASCII On verra plus tard comment réserver l'espace mémoire pour un tel vecteur.
(48). La figure 6 (a et b) représente le codage d'une chaîne de caractères en C. Il s'agit alors de recopier la première chaîne de caractère dans la chaîne résultat. Ensuite lui
coller la deuxième chaîne et pour finir ajouter la valeur 0 à la fin de la chaîne résultat.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
27 28
ALGORITHM concat
INPUT STRING ch1, ch2;
OUTPUT STRING ch;

BEGIN
INT long, l;

long ← 0;
l ← 0;

/* avant la concaténation, il faut réserver de la mémoire pour


la chaine résultat ch. Nous supposons que cette opération a
été réalisée. Nous verrons comment la faire dans le chapire
IV. Pour le moment on va supposer que la mémoire a déjà été
allouée. Dans la réalité il faut le faire explicitement */

WHILE ch1 [l] ≠ 0 DO


ch [long] ← ch1[l];
long ← long + 1;
l ← l + 1;
END WHILE

l ← 0;

WHILE ch2 [l] ≠ 0 DO


ch [long] ← ch2[l];
long ← long + 1;
l ← l + 1;
END WHILE

ch [long] ← 0;
END
Algo 14. - Concaténation de deux chaînes de caractères

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données


29

Vous aimerez peut-être aussi