Académique Documents
Professionnel Documents
Culture Documents
ELEMENTAIRES
1
1 ELEMENTS ELEMENTAIRES DES ALGORITHMES.
1.1. Chaînes de caractères
1.2. Procédures et variables entières
1.3. Itérations et conditions
1.4. Transmission des paramètres
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 2
1. ELEMENTS ELEMENTAIRES DES ALGORITHMES
4
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;
9
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,
1 d’opérateurs, et 10
fonction exerc
x, y : entier;
defonc
x := 7;
z := x;
x*2 := 3 + z;
y := x + 5w;
finfonc;
1 16
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");
finsi;
Si la condition est vraie, la suite d’instructions 1 est effectuée; si elle est
fausse, on effectue la suite d’instruction 2.
Les 2 suites d’instructions peuvent comporter à leur tour des instructions d’
itérations ou encore d’autres instructions conditionnelles.
Dans certains cas, on peut vouloir ne rien faire si la condition est fausse. On
pourra se passer de la partie sinon, et la forme se réduit à :
si condition alors
suite d’instructions
finsi;
Pour arrêter l’itération, nous avons introduit une variable de type booléen,
ou variable booléenne, stop. Ce type signifie que la variable ne peut prendre
que l’une de deux valeurs suivantes : vrai ou faux.
La première opération que nous pouvons introduire sur cette variable est la
négation.
A non A
Négation (non)
Vrai faux
faux vrai
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; 22
finfaire;
finproc;
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.
Intersection (et) A B A et B
vrai vrai vrai
vrai faux faux
faux vrai faux
Dans certains cas nous serons faux
faux amener à faux
utiliser l’opération d’union.
Union (ou)
A B A ou B
vrai vrai vrai
vrai faux vrai
faux vrai vrai
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 25
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. 26
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 27
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} 28
finsi;
finfonc;
Les solutions correctes seraient les suivantes.
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).
32
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 33
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.
d r dr
« donnée » « résultat » « donnée- résultat »
Valeur doit être définie quelconque doit être définie
initiale
Valeur finale Identique à la valeur définie (doit avoir été définie (doit avoir
initiale affectée dans l’algo.) été affectée dans
l’algo.)
Paramètre expression ou identificateur identificateur
effectif identificateur initialisé initialisé
Exercice
contrainte13. Ecrire
Ne une
doit fonction qui retourneNe
jamais être la valeur de n être
doit jamais p, où p est un nombre entier
positif, et n un entier
modifiéquelconque.
(jamais à gauche utilisé (jamais à droite 35