Académique Documents
Professionnel Documents
Culture Documents
2. VECTEURS
2.1. Introduction
2.2. Algorithmes traitant un seul vecteur
2.3. Tris d’un vecteur
2.4. Algorithmes de mise à jour d’un vecteur
3. FICHIERS
3.1. Définition et propriétés
3.2. Actions primitives d’accès
3.3. Algorithmes traitant un seul fichier
3.4. Algorithmes traitant plusieurs
1 fichiers 1
1. ELEMENTS ELEMENTAIRES DES ALGORITHMES
3
1.1.2. Variables de type chaîne, instruction "lire"
Nous pouvons "personnaliser" le message d’accueil en affichant le nom
de l’utilisateur. Bien entendu, L’ordinateur ne connaît pas ce nom à priori
et devra donc commencer par le lui demander.
bonjour version 2
Algorithme
écrire("Comment vous appelez-vous ?"); lire(nom);
écrire("Bonjour" & nom & "!");
procédure bonjour2
nom : chaine;
année, naissance : entier;
debproc
écrire("A quelle année sommes-nous ?"); lire(année);
écrire("Comment vous appelez-vous ?"); lire(nom);
écrire("Votre année de naissance ?"); lire(naissance);
écrire("Bonjour " & nom & "!");
écrire("Vous êtes âgé de " & année-naissance & "ans");
finproc;
8
Nous introduisons 2 variables : année et naissance, dont les valeurs sont
saisies au clavier. Ces variables seront des nombres entiers, nous les
déclarons donc de type entier.
Les entiers peuvent être positifs ou négatifs, et on peut leur appliquer les
opérations arithmétiques classiques : +, -, et multiplication notée *.
La division entière notée div, n div p donne la partie entière du quotient
de la division de n par p.
Le modulo noté mod, donne le reste de la division entière de n par p;
Exemples :
3 + 5 donnera 8
2 * (-6) donnera -12
12 div 3 donnera 4
14 div 3 donnera 4
12 mod 3 donnera 0
14 mod 3 donnera 2
Une expression entière est toute expression formée à partir de variables
entières, de nombres entiers, d’opérateurs, et éventuellement de
parenthèses, selon les règles habituelles
1 de l’algèbre. 9
Exemple
10
1.2.3. Paramètres, instruction d’affectation
fonction exerc
x, y : entier;
defonc
x := 7;
z := x;
x*2 := 3 + z;
y := x + 5w;
finfonc;
1 15
1.3. Itérations et conditions
Une procédure saisit le nom et l’année de naissance de toute une série de personnes et affiche
pour chaque personne son âge. Une première méthode consiste à répéter les instructions de saisie
et d’écriture un certain nombre de fois. On suppose qu’il y a 3 étudiants.
procédure etudiants1(d année:entier)
nom : chaine; naissance, âge : entier;
debproc
écrire("Nom d’un étudiant ? "); lire(nom);
écrire("Son année de naissance ? "); lire(naissance);
âge := année – naissance;
écrire(nom & "est âgé de " & âge & "ans");
Nous pouvons imaginer que des utilisateurs s’amusent à faire tourner indéfiniment l’itération
de la procédure etudiants3, en refusant de frapper un nom égal à ‘*’. Nous allons forcer la
procédure à s’arrêter au bout de 20 itérations au maximum, en ajoutant un second test
d’arrêt, contrôlé par un compteur.
procédure etudiants4(d année : entier)
nom : chaine; naissance, âge, i : entier;
stop : booléen;
debproc
stop := faux;
i := 0;
tantque non stop et (i < 20) faire
écrire("Nom d’un étudiant ? ") ; lire(nom);
si nom ≠ "*" alors
écrire("Son année de naissance ? ") ; lire(naissance);
âge := année – naissance;
écrire(nom & "est âgé de " & âge & "ans"); i := i+1;
sinon stop := vrai;
finsi;
finfaire;
finproc;
21
Nous avons introduit la variable i, destinée à compter le nombre d’itérations. Ce compteur est
initialisé à 0, puisqu’au départ nous avons effectué zéro fois, l’itération. Chaque fois que nous
traitons un nom différente de ‘*’, nous incrémentons i. Avant d’entrer de nouveau dans
l’itération, nous testons i. Si cette valeur n’est pas inférieure à 20, nous n’autorisons pas l’entrée
dans l’itération, et l’algorithme s’arrête.
Dans l’expression de test (non stop) et (i<20), nous utilisons une nouvelle opération,
l’intersection. Le résultat de L’intersection n’est vrai que si les deux opérandes ont la valeur
vrai. A B A et B
Intersection (et) vrai vrai vrai
vrai faux faux
faux vrai faux
faux faux faux
Une assertion est une expression logique (booléenne) ou condition qui est toujours vraie.
22
1.3.3. Type caractère et instructions conditionnelles imbriquées
Nous améliorons la procédure bonjour en affichant Monsieur, Madame,
Mademoiselle devant le nom de l’utilisateur.
Pour cela, nous devons connaître son sexe, codé par la lettre ‘M’ ou ‘F’. Si le sexe est
féminin, nous devons de plus demander si la personne est mariée (réponse codée par
‘O’ ou ‘N’).
procédure bonjour4
nom : chaine; sexe, marié : char;
debproc
écrire("Comment vous appelez-vous ? "); lire(nom);
écrire("Quel est votre sexe (M ou F) ? "); lire(sexe);
si sexe = ‘M’ alors
écrire("Bonjour, Monsieur" & nom & "! ");
sinon
écrire("êtes-vous mariée (O ou N) ? ") ; lire(marié);
si marie = ‘O’ alors
écrire("Bonjour, Madame" & nom & "! ");
sinon
écrire("Bonjour, Mademoiselle" & nom & "! ");
finsi;
finsi; 1 23
finproc;
Nous avons utilisé deux instructions de la forme si-sinon-finsi, la seconde étant
incluse, ou imbriquée, dans la première.
Le résultat équivalent serait obtenu par la procédure suivante qui utilise la forme
sinonsi de l’instruction conditionnelle.
procédure bonjour5
nom : chaine; sexe, marié : char;
debproc
écrire("Comment vous appelez-vous ? "); litexte(nom);
écrire("Quel est votre sexe (M ou F) ? "); litexte(sexe);
écritexte("êtes-vous mariée (O ou N) ? ") ; litexte(marié);
si sexe = ‘M’ alors
écritexte("Bonjour, Monsieur" & nom & "! ");
sinonsi marié = ‘O’ alors
écritexte("Bonjour, Madame" & nom & "! ");
sinon
écritexte("Bonjour, Mademoiselle" & nom & "! ");
finsi;
finproc;
1 24
La forme la plus générale de l’instruction conditionnelle est :
si condition1 alors
(suite d’instructions)1
sinonsi condition2 alors
(suite d’instruction)2
…
sinonsi conditionn alors
(suite d’instructions)n
sinon
(suite d’instruction)n+1
finsi;
La partie sinon est facultative, mais si elle est présente, elle sera toujours
la dernière.
25
1.4. Fonction
Simplifions la procédure bonjour5 en regroupant les instructions de calcul du titre
Monsieur, Madame, Mademoiselle, dans une fonction qui délivre (retourne) une
valeur d’un type déterminé que nous nommerons résultat.
1 26
1.4.1. Résultat d’une fonction, prédicat
Une fonction qui retourne une valeur booléenne (vrai ou faux) est appelée prédicat.
Note : il est obligatoire que la fonction retourne une valeur. Dans tous les cas, sinon le
résultat n’aurait pas de valeur dans les cas non prévus. La fonction suivante est
interdite car elle ne retourne pas de valeur si l’âge est supérieur ou égal à 18.
fonction majeur( d âge : entier) : booléen
debfonc
si âge < 18 alors
retour faux ; {écriture incorrecte}
finsi;
finfonc;
L’ exécution de l’instruction retour interrompt l’exécution de la fonction, ainsi la
fonction suivante, bien que syntaxiquement correcte, retournera toujours la valeur vrai.
fonction majeur( d âge : entier) : booléen
debfonc
retour vrai;
si âge < 18 alors
retour faux ; {écriture incorrecte}
finsi;
finfonc;
27
Les solutions correctes seraient les suivantes.
1 28
fonction majeur3( d âge : entier) : booléen
debfonc
si âge ≥ 18 alors
retour vrai;
sinon
retour faux;
finsi;
finfonc;
En effet, l’expression âge ≥ 18 prend la valeur vrai ou faux selon la valeur de âge, l’instruction
conditionnelle est inutile. C’est cette forme qu’un utilise le plus souvent.
Paramètres résultat
Pour simplifier la procédure d’accueil, nous pouvons regrouper les
questions posées à l’utilisateur dans une procédure qui devra donc
fournir trois résultats : le nom, le sexe, et l’état-civil. On ne pourra pas
utiliser une fonction car celle-ci ne peut retourner qu’une seule valeur.
Les résultats fournis seront dans des paramètres formels précédés de la
lettre r (résultat), au lieu de d (donnée).
31
procédure interrogatoire (r nom : chaine, r sexe, marié : car)
debproc
écrire("Comment vous appelez-vous ? "); lire(nom);
écrire("Quel est votre sexe (M ou F) ? "); lire(sexe);
écrire("Etes-vous marié ? "); lire(marié);
finproc;
La procédure d’accueil se réduit alors à :
procédure bonjour7
n : chaine;
s, m : car;
debproc
interrogatoire(n, s, m);
écritexte("Bonjour, "& titre(s, m) & n & "! ");
finproc;
Remarques
-Toute procédure qui possède un paramètre résultat et un seul peut être remplacée par
une fonction.
- Un paramètre résultat doit recevoir une valeur dans tous les cas de figure.
- Il est interdit d’utiliser un paramètre résultat en partie droite d’une affectation ou dans
un test.
1 32
Exercice 10. Ecrire une procédure qui teste si un nombre n, non négatif, est un carré
parfait. Cette procédure fournit deux résultats : un booléen qui est vrai si et seulement
si n est un carré parfait, et un entier égal à la partie entière de la racine carrée de n.
Exercice 11. Utiliser la procédure définie ci-dessus dans une autre procédure, qui, pour
tout entier n, imprime la valeur de sa racine carrée ou de la partie entière de celle-ci, ou
bien un message d’erreur.
Exercice 13. Ecrire une fonction qui retourne la valeur de n^p, où p est un nombre entier positif,
et n un entier quelconque. 34