Algorithmes Et Langages
Algorithmes Et Langages
Algorithmes Et Langages
1 Introduction _________________________________________________________ 3
2 Algorithmes et langages ________________________________________________ 9
3 Premiers éléments de Pascal ___________________________________________ 17
4 Instructions alternatives_______________________________________________ 31
5 Instructions itératives _________________________________________________ 35
6 Tableaux ___________________________________________________________ 41
7 Chaînes de caractères_________________________________________________ 45
8 Fonctions et Procédures_______________________________________________ 49
9 Ensembles __________________________________________________________ 59
10 Enregistrements _____________________________________________________ 63
11 Fichiers ____________________________________________________________ 67
12 Récursivité _________________________________________________________ 75
13 Exercices___________________________________________________________ 81
14 Annales d’examens Médians __________________________________________ 113
15 Annales d’examens Finaux ___________________________________________ 123
16 Syntaxe du langage Pascal____________________________________________ 139
-1-
D. Lenne, P. Trigano NF01 – P06
1 Introduction
1.1 Ordinateur et programmation
L’informatique intervient aujourd’hui dans de nombreux secteurs d’activité. Parmi les applications courantes on
peut citer la bureautique, la gestion, le calcul scientifique, la communication, l’accès à des ressources
d’information (au travers d’internet en particulier), le multimédia, les jeux etc.
Ces applications ne sont possibles que grâce à un ordinateur. Cependant, l’ordinateur seul ne suffit pas. Pour
chaque application, il est nécessaire de lui fournir un logiciel (ou programme) adapté.
La programmation est donc une activité fondamentale en informatique. La programmation peut être vue comme
l’art de déterminer un algorithme (une démarche) pour résoudre un problème et d’exprimer cet algorithme au
moyen d’un langage de programmation.
1.2.2 Logiciel
Un ordinateur ne peut pas fonctionner seul. Il doit être doté d’un système d’exploitation.
(Ex : windows, unix, mac os, linux, ...)
Le système d’exploitation est le programme de base d’un ordinateur.
Ce programme permet notamment :
- la gestion de la mémoire,
- la gestion des périphériques,
- l’exécution des programmes,
- la gestion des fichiers.
Les programmes (ou logiciels) d’application s’exécutent généralement en s’appuyant sur le système
d’exploitation.
Ces programmes peuvent être très divers : logiciels de bureautique (traitements de textes, tableurs, présentation
graphique...), logiciels de calcul, systèmes de gestion de bases de données, environnements de programmation,
logiciels de jeux, ...
Ces unités de mesures sont fréquemment utilisées pour indiquer des tailles (ou capacités) de mémoires.
-3-
NF01 – P06 Algorithmique et programmation
1.3 Langages
Les données et les instructions doivent être codées en binaire. Ce codage n’est pas réalisé par l’utilisateur, ni
même en général par le programmeur. Il est réalisé automatiquement par des programmes utilitaires.
Le langage machine est le seul langage directement compréhensible par la machine (l’ordinateur). Un
programme écrit en langage machine est une succession de 0 et de 1 définissant des opérations précises à
effectuer. Ce langage n’est pas utilisé directement pour la programmation.
Le premier langage utilisable pour programmer un ordinateur est l’assembleur. Le langage assembleur dépend
du processeur de la machine. Ses instructions sont proches de celles du langage machine, mais leur forme est
plus utilisable par un programmeur.
Ex : STO (pour store : stocker, ranger en mémoire), JMP (pour jump : branchement en un point du programme)
L’assembleur ne permet de réaliser que des programmes relativement simples, qui dépendent de l’ordinateur
utilisé. Pour réaliser des programmes plus complexes et moins dépendants de la machine, il est nécessaire
d’utiliser un langage de programmation.
Il existe de nombreux langages de programmation : C, C++, C#, Java, Basic, Pascal, Lisp, Prolog, Fortran,
Cobol, ... Le langage Pascal est utilisé dans ce cours en raison de son caractère pédagogique.
1.4.1 Nombres
Le codage dépend du type : entier naturel, entier relatif, réel, ...
Par exemple, si le nombre possède un signe, il est nécessaire de représenter ce signe. Un moyen simple pour cela
est d’utiliser le premier bit (par exemple 0 pour + et 1 pour -), et de représenter le nombre en binaire ensuite.
Ainsi sur un octet on peut représenter les nombres de -128 (1111 1111) à + 127 (0111 1111). Ce n’est cependant
pas ce code qui est utilisé généralement. On lui préfère un code plus complexe mais plus efficace (qui sort du
cadre de ce cours).
Le nombre maximum représentable dépend du nombre de bits utilisables.
-4-
D. Lenne, P. Trigano NF01 – P06
ou encore : N = an an-1......a2a1a0,a-1a-2.....a-p
Exemple :
123,45 = 1x102 + 2x101 + 3x100 + 4x10-1 + 5*10-2
Représentation d'
un entier naturel N :
N = an2n + an-12n-1 + ..... + a222 + a121 + a020 + a-12-1 + a-22-2 + ..... + a-p2-p
avec 0 ai 1
Exemple :
1010,101 = 1x23 + 0x22 + 1x21 + 0x20 + 1*2-1 + 0*2-2 + 1*2-3
= 8 + 2 + 0,5 + 0,125
= 10,625 en base 10
= 10,62510
Exercice : Quel est le nombre de bits nécessaires à la représentation d’un nombre N donné ?
Soit k ce nombre. On a : 2k-1 N 2k
Il faut donc : k = E (log2 N) + 1 bits
1.6 Conversions
Il est recommandé de bien connaître la correspondance des 16 premiers nombres dans les quatre bases :
-5-
NF01 – P06 Algorithmique et programmation
Hexa
Décimal Binaire Octal
décimal
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
-6-
D. Lenne, P. Trigano NF01 – P06
Il suffit donc de regrouper les bits par 3, car nous sommes en base 8, et 8 = 23 => 3 bits.
Exemples :
011 000 111 --> 3078
728 --> 111 010
(le zéro en 4ème position a été ajouté car 2 en binaire ne comporte que deux chiffres)
Ainsi, on convertit chaque chiffre octal en un nombre binaire de 3 bits (conversion octal <--> binaire),
puis on regroupe les bits (chiffres binaires) par 4, pour passer en hexa (conversion binaire <--> hexa).
-7-
NF01 – P06 Algorithmique et programmation
-8-
D. Lenne, P. Trigano NF01 – P06
2 Algorithmes et langages
2.1 Algorithmes
2.1.1 Définition
Etant donné un traitement à réaliser, un algorithme pour ce traitement est l'
énoncé d'
une séquence d'
actions
primitives permettant de le réaliser.
2.1.2 Exemple 1
Pour sortir une voiture du garage :
1. Ouvrir la porte du garage
2. Prendre la clef
3. Ouvrir la porte avant gauche
4. Entrer dans la voiture
5. Mettre au point mort
6. Mettre le contact
2.1.3 Exemple 2
Résolution de l’équation du premier degré : ax +b = 0 dans R :
1. lire les coefficients a et b
2. si a = 0 alors
si b = 0 alors
afficher ("l’ensemble des solutions est R")
sinon
afficher ( "pas de solution")
fsi
sinon
solution - b / a
afficher ("La solution est : ", solution)
fsi
Remarques :
- Les instructions utilisées sont : lire, afficher, si ... alors ... sinon ..., <- (affectation)
- Les symboles a et b représentent les données de l’algorithme
- Le symbole solution représente une variable de l’algorithme
-9-
NF01 – P06 Algorithmique et programmation
2.2.2 Constante
Une constante est une valeur fixe utilisée par le programme.
Exemple : Pi, la constante de gravitation, etc.
2.2.3 Variable
Une variable représente une valeur susceptible de changer au cours de l'
exécution du programme.
Exemples :
- L'
inconnue dans une équation
- La vitesse d'
un objet en chute libre...
2.2.4 Représentation
A une donnée, une variable ou une constante sont associés :
- un nom (ou identificateur),
- un type qui détermine l’ensemble des valeurs possibles,
- une zone mémoire dont la taille dépend du type.
• Affectation
L'
affectation est l'
opération qui consiste à attribuer à une variable la valeur d’une expression.
Notation :
variable expression
Exemples :
z 1 ( z prend la valeur 1 )
resultat 2*3+5 ( resultat prend la valeur du résultat de l' opération 2*3+5, i.e. 11)
solution -b / a (-b/a est évalué à l’aide des valeurs des variables a et b. Le résultat
de cette évaluation est affecté à solution)
nb nb+1 ( nb augmente de 1)
- 10 -
D. Lenne, P. Trigano NF01 – P06
ou
si <condition> alors
< séquence d’instructions >
sinon
< séquence d’instructions >
fsi
• Structures répétitives
tant que <condition> faire
<séquence d’instructions >
Ftq
ou
répéter
<séquence d’instructions>
jusqu’à condition
Exemple :
répéter
ecrire(« entrez un nombre inférieur à 10 »)
lire(n)
jusqu’à n < 10
- 11 -
NF01 – P06 Algorithmique et programmation
2.3.2 Organigramme
sens de lecture
2.3.3 Exemples
• Calcul du PGCD
Le pgcd de deux nombres entiers positifs n1 et n2 est leur plus grand diviseur commun.
On suppose : n1 n2 :
Exemple : PGCD de 30 et 8 = 2
n1 n2 r
30 8 6
8 6 2
6 2
- 12 -
D. Lenne, P. Trigano NF01 – P06
Données :
SH : le salaire horaire
NH : le nombre d' heures
PR : le % de retenues non plafonnées
Calculer :
SB SH * NH : le salaire de base
R SB * PR : les retenues
SN SB - R : le salaire net
Ecrire le résultat :
"Salaire net" = SN
Cette fois-ci, on introduit un plafond pour les charges retenues sur le brut. On écrit alors un algorithme avec
condition. En cas de dépassement du plafond, on ne retient que le plafond.
Données :
SH : le salaire horaire
NH : le nombre d' heures
PR : le % de retenues non plafonnées
PL : le plafond
Calculer :
SB SH*NH : le salaire de base
R SB*PR : les retenues
Si R > PL alors R PL
Calculer SN SB-R : le salaire net
Ecrire le résultat :
"Salaire net" = SN
- 13 -
NF01 – P06 Algorithmique et programmation
- 14 -
D. Lenne, P. Trigano NF01 – P06
Exemples :
- PHRASE
- ARTICLE
• - Affectation
• - Lecture
- 15 -
NF01 – P06 Algorithmique et programmation
Exemple :
<alternative> ::= SI <condition> ALORS <instruction>
<alternative> ::= SI <condition> ALORS <instruction> SINON <instruction>
Un programme est une phrase correcte du langage dérivée à partir d’un symbole initial et ne contenant que des
symboles terminaux.
En Pascal :
<programme> ::= program <identificateur> ; <bloc>.
2.4.3 Programmation
• Ecriture du programme
Après avoir déterminé l’algorithme, il faut écrire le programme source en respectant une syntaxe très précise,
définie par des règles de grammaire dépendant du langage utilisé.
Le programme source peut être écrit à l’aide d’un éditeur de texte tel que notepad. On préférera cependant
utiliser un EDI ou « environnement de développement intégré ». Un EDI facilite l’écriture, la mise au point et
l’exécution des programmes.
• Compilation
Un programme appelé « compilateur » verifie que le programme source respecte la grammaire du langage et le
traduit en langage objet, plus proche de la machine.
Un second programme appelé « éditeur de liens » rend ensuite le programme exécutable par la machine.
Remarque : Un programme peut être syntaxiquement correct sans pour autant fournir les résultats attendus. On
distingue en effet deux types d’erreurs : les erreurs de syntaxe et les erreurs de logique.
- 16 -
D. Lenne, P. Trigano NF01 – P06
En-tête
Déclarations
Constantes
Types
Variables
Fonctions / Procédures
Bloc d’instructions exécutables
• En-tête
C’est la première ligne d'
un programme PASCAL.
L'en-tête commence toujours par le mot-réservé program. Elle est suivie d'
un identificateur choisi par le
programmeur.
Syntaxe :
program identificateur;
Exemple :
program Second_Degre ;
• Déclarations
En Pascal, on peut déclarer des :
• des constantes
• des types
• des variables
- 17 -
NF01 – P06 Algorithmique et programmation
L'
ordre indiqué doit être impérativement respecté.
• Instructions
Une instruction est une phrase du langage représentant un ordre ou un ensemble d'
ordres qui doivent être
exécutés par l'
ordinateur.
On distingue :
Les instructions simples :
Ordre unique, inconditionnel (Ex : affectation)
Les instructions structurées
• instructions composées
• instructions itératives
• instructions conditionnelles
• Structure de bloc
• Exemple de programme
Nous présentons ci-dessous un programme qui donne la moyenne de n nombres entrés au clavier par l' utilisateur,
qui précisera le nombre de données qu' il va taper. A ce stade du cours, il n'
est pas nécessaire de comprendre le
contenu de ce programme. Il suffit simplement de reconnaître l'architecture globale décrite précédemment
(déclarations de variables, blocs, indentations, begin...end)
- 18 -
D. Lenne, P. Trigano NF01 – P06
3.2.1 L'Alphabet
L'
alphabet Pascal est constitué des éléments suivants :
- Les majuscules : A, B,..., Z(26 caractères)
- Les minuscules :a, b,..., z(26 caractères)
- Le caractère "blanc"
- Les chiffres : 0, 1,..., 9
- Les symboles spéciaux :
- Les opérateurs :
o arithmétiques : + - * /
o relationnels :< ; > ; = ; <= ; >= ; <>
- Les séparateurs : ( ) ; { } ; [ ] ;(* *)
- Le signe "pointeur" : ^ (utile pour les fichiers ,Cf. chapitre XI )
- Les signes de ponctuation : . , ; : '` ! ?
• Définition
Un mot est une suite de caractères encadrés par des espaces ou des caractères spéciaux.
Certains mots sont réservés. Ils ne peuvent être redéfinis par l'
utilisateur, parce qu’ils participent à la
construction syntaxique du langage.
- 19 -
NF01 – P06 Algorithmique et programmation
• Les identificateurs
Un identificateur est un nom donné à un élément du programme (constante, variable, fonction, procédure,
programme, ...) par le programmeur.
En Pascal :
• Un identificateur est une suite alphanumérique commençant nécessairement par une lettre de
l'
alphabet et ne comportant pas d' espaces.
• Il est possible de lier plusieurs mots à l'
aide de " _ ".
Exemples d'
identificateurs légaux :
x2 Z31 xBarre SOMME salaire_net
Exemples d'
identificateurs non légaux :
3Mots U.T.C. mot-bis A!8 $PROG AUTRE MOT
Exemples d'
identificateurs standards :
Fonctions :
cos sin exp sqr sqrt succ pred
Constantes :
maxint true false
Types :
integer real boolean char
Procédures :
read write reset rewrite
3.3 Déclarations
En Pascal, tout symbole (constante, type, variable, procédure, fonction) utilisé dans un programme doit être
explicitement déclaré.
3.3.1 Constantes
L'utilisation de constantes en programmation est vivement conseillée.
Les constantes permettent :
• de clarifier le programme
Exemple : PI à la place de 3,141592653
• de faciliter la modification : il suffit de modifier la valeur spécifiée dans la déclaration au lieu d'
en
rechercher les occurrences et de les modifier dans tout le programme.
Syntaxe :
Exemples :
const
DEUX = 2;
PI = 3.14;
- 20 -
D. Lenne, P. Trigano NF01 – P06
VRAI = true; { }
FAUX = false;
CAR_A = 'A';
PHRASE = 'il fait beau';
Le point virgule est obligatoire à la fin de chaque déclaration.
3.3.2 Types
Un type définit l’ensemble des valeurs que peut prendre une donnée.
Il existe des types standard, mais on peut également déclarer de nouveaux types.
• Le type integer :
Les valeurs correspondant à ce type sont des nombres entiers.
Ce sont des suites de chiffres, éventuellement précédées d'
un signe + ou –, qui ne contiennent
ni point décimal, ni exposant.
Exemples d'
entiers corrects :
589 0 7 +7 -28 -9999
Exemples d'
entiers incorrects :
79. 644 895
On ne peut pas représenter en mémoire tous les entiers. Le nombre de bits utilisable pour coder
un entier est fixe, mais varie en fonction des compilateurs.
Sur n bits, il sera possible d'
utiliser des entiers compris entre :
- 2n-1et (2n-1 - 1)
Par exemple, sur 16 bits , les entiers seront compris entre :
-32768 et 32767 (216=32768)
La plupart des compilateurs définissent également le type longint qui permet de coder des
« entiers longs », en doublant le nombre de bits utilisables.
• Le type real
Les valeurs sont des réels.
Représentation décimale :
Signe + partie entière + point + partie décimale
- 21 -
NF01 – P06 Algorithmique et programmation
Diagramme syntaxique général (valable aussi bien pour les entiers que les réels) :
Il est possible de représenter en mémoire de très grandes valeurs, mais là encore il est
impossible de représenter tous les nombres.
• Le type boolean
Les valeurs sont dites logiques.
Ce sont les deux constantes : true (vrai) et false (faux)
Les opérateurs booléens (ou logiques) tels que and ou or sont associés à ce type.
• Le type char
Les valeurs sont les caractères, en particulier :
alphanumériques : ' a'. . '
z''A'. . '
Z''
0'. . '
9'
le caractère blanc : ''
les caractères accentués
les caractères de ponctuation
Dans un programme, les valeurs de type char doivent être entre apostrophes (quotes). Ex : '
d'
• Le type string
Les valeurs sont des chaînes de caractères.
Elles sont également représentées entres apostrophes. Lorsqu’il y a une apostrophe dans la
chaîne de caractères, elle doit être doublée :
Ex : '
il fait beau aujourd''
hui'
Il ne faut pas confondre avec les commentaires, situés entre deux accolades, qui n'
interviennent
pas directement dans le programme.
Ces commentaires servent au programmeur, lorsqu’il doit reprendre le programme plus tard,
pour le modifier.
- 22 -
D. Lenne, P. Trigano NF01 – P06
• Le type énuméré
Un type énuméré est une séquence ordonnée d'
identificateurs.
Syntaxe :
type
identificateur = (id1, id2,..., idn) ;
Exemples :
type
couleur = (jaune, vert, rouge, bleu, marron );
semaine=(lundi,mardi,mercredi,jeudi,vendredi,
samedi,dimanche);
reponse = (oui, non, inconnu);
sexe = (masculin, féminin);
voyelle = (A, E, I, O, U);
Remarques :
- Deux types énumérés différents ne peuvent contenir le même identificateur. Les ensembles
énumérés sont donc disjoints.
- La séquence de valeurs étant ordonnée, le système connaît les successeurs et prédecesseurs d'
un
élément.
mardi : prédécesseur de mercredi.
mercredi : successeur jeudi.
• Le type intervalle
Un type intervalle est nécessairement un sous-type d'
un type scalaire (standard ou énuméré) déjà
défini.
Syntaxe :
type
identificateur = [borne inf] .. [borne sup] ;
Toutes les valeurs de l'
intervalle sont autorisées.
- 23 -
NF01 – P06 Algorithmique et programmation
Exemples :
Intervalle d'
entiers :
type
Decimal = 0 .. 9 ;
Octal = 0 .. 7 ;
Age = 0 .. 150 ;
Intervalle de caractères :
type
ABC = 'A' .. 'C' ;
Maj = 'A' .. 'Z' ;
Remarques :
- On ne peut pas définir un type intervalle à l’aide du type real (type non scalaire).
- L’ordre ascendant est requis : borne-inf doit être placé avant borne-sup dans le type énuméré
source.
3.3.3 Variables
Déclarer une variable, c' est définir l'
ensemble des valeurs qu'
elle peut prendre.
Toutes les variables utilisées dans un programme doivent être déclarées.
On peut déclarer une variable :
• à l' aide d'
un type standard ou d'
un type déclaré au préalable.
• par une déclaration explicite (et spécifique à cette variable) de l'
ensemble des valeurs qu'
elle peut
prendre.
Syntaxe :
var
identificateur : type ;
Diagramme syntaxique :
Remarques :
• var ne peut apparaître qu' une seule fois
• il est possible de grouper plusieurs variables pour le même type (en les séparant par des virgules).
- 24 -
D. Lenne, P. Trigano NF01 – P06
Exemples
var
jour: semaine ;
a, b, c : real;
i, j, k : integer ;
conge : week-end ;
vivant : boolean ;
3.4.1 Lecture
- 25 -
NF01 – P06 Algorithmique et programmation
Cette instruction permet de lire les valeurs entrées par l’utilisateur au clavier et de les stocker dans les variables
v1,..., vn
read (v1, v2, v3, ..., vn); <=> read(v1); read(v2);... read(vn);
L’instruction :
readln (v1, v2, v3, ..., vn);
permet, de manière analogue, de lire n valeurs et passe ensuite à la ligne suivante en ignorant ce qui reste
éventuellement sur la ligne.
Exemple :
program Test;
var
i, j : integer ; {déclaration des variables}
begin
read(i,j); {lecture de deux entiers}
end.
3.4.2 Ecriture
Exemple :
program Test;
var
i : integer;
r : real;
begin
write('Entrez un entier et un réel :');
read(i,r); {lecture des valeurs}
writeln('L''entier vaut : ', i : 5); {affichage de i}
writeln('et le réel est : ', r : 6:2); {affichage de r}
end.
Le programme lit les valeurs de i et r tapées par l'utilisateur et les affiche ensuite à l'
écran, sur 5 caractères pour i,
et sur 6 caractères pour r, dont 2 chiffres après la virgule.
Autre exemple :
program Exemple;
var
a, b : integer;
c1, c2 : char;
resultat : boolean;
x, y : real;
begin
write('entrez 2 entiers : ');
readln(a,b); {lecture des 2 valeurs}
- 26 -
D. Lenne, P. Trigano NF01 – P06
Remarques
- Les types doivent être compatibles (les mélanges de types sont interdits)
- Ne pas confondre ":=", l'opérateur d'affectation et "=", l'
opérateur de test.
Exemple :
Soit X une variable de type integer
X := 10 signifie que l' on affecte la valeur 10 à la variable X, donc X vaut 10 après l’exécution de cette
instruction.
- 27 -
NF01 – P06 Algorithmique et programmation
Exemples
var
A, B, C, D : real;
I, J, K : integer;
begin
A := 7.4 ;
B := 8.3 ;
C := A + B ;
D := A / B + C ;
I := 42 ;
J := 9 ;
K := I mod J ; { K vaut 6 }
end.
3.6.2 Expressions
Une expression est une combinaison d'
opérandes (variables et constantes), d'
opérateur et de fonctions.
Exemples :
"i+1", "2.08E3 * x" ou encore "(x>2) OR (x<8)"
Exemples :
• a*b+c se décompose en :
Expression Expression simple Terme + Terme (Facteur * Facteur) + Facteur
donc a*b+c est équivalent à : (a*b)+c
- 28 -
D. Lenne, P. Trigano NF01 – P06
3.7.1 La Clarté
• Faire des déclarations explicites de toutes les entités manipulées
• Utiliser des noms significatifs (prix pour le prix d'un objet et non pr5...)
• Ne pas employer de méthodes hermétiques
• Ne pas faire de "branchements"
• Utiliser des indentations, c'
est-à-dire des "marges décalées"
3.7.2 La Modularité
• Décomposition du problème en plusieurs sous-problèmes
---> réduction de la complexité
---> synthèse de modules
• Réunion structurée des différents modules
3.7.3 L'Efficacité
• Conformité des résultats
---> Problème de la vérification d'
un programme
• Vitesse d' exécution
• Utilisation optimale de la mémoire
- 29 -
D. Lenne, P. Trigano NF01 – P06
4 Instructions alternatives
4.1 Choix simple
Syntaxe :
Cette instruction évalue l’expression booléenne (condition). Si le résultat est true, c’est le premier bloc
d’instructions (après then) qui est exécuté sinon c’est le second (après else).
Remarques :
• On peut imbriquer plusieurs "if"
• Attention à la présentation : il est souhaitable d’utiliser des indentations (marges décalées) pour
augmenter la lisibilité du programme
Points importants :
• Surtout pas de point virgule immédiatement avant ELSE !
• L’instruction alternative est facultative
• La valeur de la condition doit être booléenne
• Les instructions peuvent être simples ou composées
Ecrire un programme qui résoud une équation du premier degré Ax+b=0 qui lit les valeurs de A et B entrées par
l'
utilisateur.
program Premier_Degre;
var
A, B : real;
begin
write('entrez les coefficients A et B : ');
readln(A,B);
if A=0 {évaluation de la condition}
then
if B=0
then
writeln('Indéterminé !')
else
writeln('Impossible !')
else
writeln('La solution est : ',-B/A:10:3);
end.
- 31 -
NF01 – P06 Algorithmique et programmation
program MAXIMUM_DEUX ;
var
X,Y : real ;
MAX : real ;
begin
writeln('Tapez les deux nombres:')
read (X, Y) ;
if X > Y {évaluation de la condition}
then
MAX := X
else
MAX := Y ;
writeln('Le plus grand nombre est ',MAX);
end.
program GRAND_PETIT ;
var
SEX : (M,F) ;
MAJEUR, PETIT, GRAND, FEMME, HOMME : boolean ;
AGE : 1..120;
TAILLE : 50..250;
begin
read (SEX, AGE, TAILLE) ;
FEMME := SEX=F ; {femme est vrai si sex = F}
HOMME := not FEMME ; {homme vaut le contraire de femme}
MAJEUR := AGE>18 ;
if FEMME then
begin
PETIT := TAILLE<150 ;
{petit est vrai si TAILLE < 150}
GRAND := TAILLE>170 ;
end
else
begin
PETIT := TAILLE<160 ;
GRAND := TAILLE>180 ;
end ;
writeln (MAJEUR, FEMME, HOMME) ;
writeln (AGE, PETIT, GRAND) ;
end.
Au lieu d'utiliser plusieurs if... then... else... imbriqués, il est préférable de choisir une sélection multiple (case
en Pascal).
- 32 -
D. Lenne, P. Trigano NF01 – P06
Syntaxe
Remarque :
L’instruction case of est utile :
• pour remplacer des structures if... then... else... imbriquées
• pour tester l’égalité à des valeurs données d' une expression
Elle améliore la lisibilité du programme !
program calculette ;
var
A, B : real ;
RESULTAT : real;
TOUCHE : char;
begin
write('entrez une opération ');
write('(taper un nombre, un opérateur puis un nombre):');
readln(A,TOUCHE,B);
case TOUCHE of
'+' : RESULTAT:= A+B;
'-' : RESULTAT:= A-B;
'*' : RESULTAT:= A*B;
'/' : RESULTAT:= A/B;
end;
writeln(A, TOUCHE, B,' = ', RESULTAT);
end.
- 33 -
NF01 – P06 Algorithmique et programmation
Exemple 2 : Le loto
program bingo ;
var
x : integer ;
begin
write('entrez un entier : ');
readln(x);
case x of
1..10 : writeln('bingo');
11..50 : writeln('pas de chance');
end;
if x > 50 then
writeln('valeur non autorisée');
end.
Syntaxe
Séquence de deux ou plusieurs instructions comprises entre begin et end et séparées par des points virgules
Remarque :
Il est possible d'
imbriquer des instructions composées.
On utilise alors des indentations pour améliorer la lisibilité du programme.
- 34 -
D. Lenne, P. Trigano NF01 – P06
5 Instructions itératives
Une boucle permet de parcourir une partie d'un programme un certain nombre de fois.
Une itération est la répétition d'
un même traitement plusieurs fois.
Syntaxe :
POUR variable VARIANT DE valeur initiale A valeur finale FAIRE <séquence d'
instructions>
Exemples :
POUR mois VARIANT DE Janvier A Décembre FAIRE <budget>
POUR Jour VARIANT DE Lundi A Vendredi FAIRE <Travail>
POUR i VARIANT DE 1 A nombre_etudiants FAIRE <corriger copies du ième étudiant>
1. Données N, PR, PL
2. Pour I variant de 1 à N,
exécuter les instructions suivantes :
2.1 Lire NH, SH
2.2 SB SH x NH
2.3 R SB x PR
2.4 Si R > PL alors R PL
2.5 SN SB - R
2.6 Ecrire SN
3. Fin de l'
itération
Remarques :
- la variable doit être de type scalaire (entier, énuméré, intervalle ou caractère). Elle ne peut pas être de type
réel.
- si exp.1 > exp.2 le for est ignoré
Exemple :
program boucle_for;
var
i:integer;
begin
for i:=1 to 5 do
writeln('le carré de ', i, ' est :', i*i);
writeln;
writeln('fin');
end.
- 35 -
NF01 – P06 Algorithmique et programmation
Exemples :
Exemple :
program boucle_while;
var
i:integer;
begin
i:=1;
while i <= 5 do
begin
writeln('le carré de ', i, ' est :', sqr(i));
i:=i+1; { incrémentation gérée par le programmeur }
end;
writeln;
writeln('FIN.');
end.
- 36 -
D. Lenne, P. Trigano NF01 – P06
Exemples :
REPETER recherche de la racine carrée
JUSQU' A le nombre considéré est négatif
Remarques :
- La boucle s' effectue tant que la valeur de expression est false. On s’arrête quand l'expression devient
true. C'
est le contraire de la boucle while.
- Contrairement au while, il y a au moins un passage (1 boucle), même si l'expression est vraie au départ.
- De même que pour le while, c' est le programmeur qui gère l'
incrémentation.
Exemple :
program boucle_repeat;
var
i:integer;
begin
repeat
writeln('le carré de ', i, ' est :', sqr(i));
i:=i+1; { incrémentation gérée par le programmeur }
until i>5;
writeln;
writeln('FIN.');
end.
Attention :
Il faut examiner en particulier :
• les conditions initiales,
• les conditions d' arrêt
• l'incrémentation.
Avant de lancer le programme, il est conseillé de le faire "tourner" à la main (c’est-à-dire simuler
l'
exécution du programme pas à pas), en faisant évoluer les variables.
Les instructions contenues dans la boucle doivent permettre l' évolution de la valeur retournée par
l'
expression, sinon le programme peut rester bloqué dans une boucle infinie.
- 37 -
NF01 – P06 Algorithmique et programmation
Remarque : les boucles REPETER et TANT QUE peuvent être utilisées même si les bornes sont définies. Il est
cependant préférable d'
utiliser dans ce cas une boucle POUR (vue précédemment).
Exemple :
Reprenons l'
exemple de la paie de N personnes
1. Données N, PR, PL
2. Initialiser I avec la valeur 1
3. Tant que I est inférieur ou égal à N, faire:
3.1 Lire NH, SH
3.2 SB SH x NH
3.3 R SB x PR
3.4 Si R > PL alors R PL
3.5 SN SB - R
3.6 Ecrire SN
3.7 Donner à I la valeur suivante.
4. Fin de l'itération
5.2.6 Exemples
Exemple1 : Calculer la somme des N premiers entiers naturels
1) Lire N
2) Somme 0
3) Pour i variant de 1 à N faire
Somme Somme + i
4) Ecrire les résultats : '
Résultat = 'Somme
Exemple comparatif :
Nous allons à présent traîter le même exemple, avec trois boucles différentes.
Il s'
agit de reconstruire l'
opération de multiplication, en effectuant des sommes successives.
- 38 -
D. Lenne, P. Trigano NF01 – P06
Forme 1 : POUR
1. Lire K, M
2. P 0
3. Pour i variant de 1 à K faire
P P+M
4. Afficher le résultat P
1. Lire K, M
2. P 0
i 1
3. Tant que i K faire
P P+M
i i+1
4. Afficher le résultat P
1. Lire K, M
2. P 0
i 1
3. Répéter
P P+M
i i+1
Jusqu' à i>K
4. Afficher le résultat P
- 39 -
D. Lenne, P. Trigano NF01 – P06
6 Tableaux
6.1 Tableaux à une dimension
6.1.1 Définition
Un tableau est une collection ordonnée d’éléments ayant tous le même type. On accède à chacun de ces
éléments individuellement à l'
aide d'
un indice.
Un tableau à une dimension est parfois appelé vecteur
Il peut être représenté sous la forme suivante :
• Dimension du tableau : 1
• Taille du tableau : n
• Les Li (i = 1 ... N) doivent être de même type
Remarques :
- L’indice doit être de type ordinal, c' est à dire qu’il doit prendre ses valeurs dans un ensemble fini et
ordonné (l’indice ne peut donc pas être de type réel).
- Les éléments doivent tous être de même type. Tout type est autorisé.
- Quand on ne connait pas exactement le nombre d'
éléments à l'
avance, il faut majorer ce nombre, quitte à
n'
utiliser qu'
une partie du tableau.
- Il est impossible de mettre une variable dans l'intervalle de définition du tableau. Il est conseillé en revanche
d’utiliser des constantes définies au préalable dans la section const.
Exemples :
Liste = array [1..100] of real;
Chaine = array [1..80] of char ;
Symptome = (FIEVRE, DELIRE, NAUSEE) ;
Malade = array [symptome] of boolean ;
Code = 0..99 ;
Codage = array [1..N_VILLE] of code ;
- 41 -
NF01 – P06 Algorithmique et programmation
Exemple :
const
NMAX=100 ;
type
Vecteur=array[1..NMAX] of real ;
var
v : Vecteur;
Remarque :
L'
indiçage peut être un type énuméré :
type
Mois=(janvier, fevrier, mars, ..., decembre);
TnbJours=array[mois] of integer;
var
T: TnbJours
Exemple 1:
Le programme suivant permet de "remplir" un tableau à l' une boucle repeat ... until.
aide d'
program Mon_tableau;
const
Taille_max=10;
type
TAB=array[1..Taille_max] of integer;
var
Tableau:TAB;
indice: integer;
begin
for indice:=1 to Taille_max do
Tableau[indice]:=0;
indice:=1;
repeat
write('entrez l’’élément N° ',indice,':');
readln(Tableau[indice]);
indice:=indice+1;
until indice > Taille_max;
end.
Exemple 2 :
Le programme suivant calcule le produit scalaire de deux vecteurs entrés par l'
utilisateur.
program PRODUIT-SCALAIRE ;
type
COORDONNEE = (X1, X2, X3) ;
VECTEUR = array [coordonnee] of real ;
- 42 -
D. Lenne, P. Trigano NF01 – P06
var
U, V : vecteur ;
RESULTAT : real ;
C : coordonnee ;
begin
resultat := 0 ;
for C := X1 to X3 do
begin
read (u[c]) ;
readln (v[c]) ;
resultat := resultat + u[c] * v[c] ;
end ;
writeln ('le produit scalaire est : ', resultat) ;
end.
Déclaration du type :
type
identificateur = array[1..M, 1..N] of type-éléments;
- 43 -
NF01 – P06 Algorithmique et programmation
6.2.2 Exemples
Déclarations :
type
Tableau = array [1..10,1..20] of integer ;
Point = array [1..50,1..50,1..50] of real ;
Matrice = array [1..M,1..N] of real ;
Carte = array [1..M] of array [1..N] of real ;
var
lieu : Carte;
Exemple de programme :
Initialisation d'
une matrice unité de dimension 10.
Il s'
agit donc d'une matrice à 10 colonnes et 10 lignes, ne comportant que des 0, sauf sur sa diagonale ou il n'
ya
que des 1.
program SOMME_MATRICE ;
const
l_max = 10 ;
c_max = 10 ;
type
Matrice = array [1..l_max,1..c_max] of integer ;
var
i, j : integer;
mat : Matrice;
begin
for i := 1 to l_max do
begin
for j := 1 to c_max do
begin
if i = j then
mat [i, j] := 1
else
mat [i, j] := 0 ;
write (mat [i, j]);
end ;
writeln ;
end ;
end.
- 44 -
D. Lenne, P. Trigano NF01 – P06
7 Chaînes de caractères
7.1 Définition
Une chaîne de caractères est une suite de caractères regroupés dans une même variable.
En Pascal, on utilise le type string, qui n'
est pas un type standard. Il est construit à partir d’un tableau de 255
caractères maximum.
Ce type permet de manipuler des chaînes de longueur variable.
Il est possible de définir un sous-type, comportant moins de caractères :
Déclarations :
var
s : string;
s2 : string(20);
Pour accéder à un caractère particulier de la chaîne s, on écrit simplement, comme pour un tableau :
s[i]
On peut aussi manipuler la chaîne de manière globale, ce qui est très utile pour des affectations ou des tests
Exemples :
s := 'Bonjour';
s[4] := 's';
s[6] := 'i';
{ A présent, s vaut 'Bonsoir' }
s := 'ok';
{ A présent, s vaut 'ok'}
Remarque :
La taille de s est variable (dans l’exemple elle est de 7 caractères au départ et de 2 ensuite).
L'
ordre utilisé est l'
ordre lexicographique (utilisation du code ASCII)
Exemple :
s1:='salut';
s2:='bonjour';
s3:='bonsoir'
alors :
s1 > s3 > s2
7.2.2 Concaténation
La concaténation est une opération qui permet d’accoler 2 ou plusieurs chaines de caratères.
Syntaxe Pascal :
s:= s1 + s2 + s3... ;
- 45 -
NF01 – P06 Algorithmique et programmation
Exemple :
s1:='bon';
s2:='jour';
s3 := s1 + s2 ; { s3 vaut 'bonjour' }
Exemple :
s1:='salut';
s2:='bonjour';
Exemple :
s:=copy('
bonjour monsieur'
, 4, 4)
Exemple :
ord('A') vaut 65 et ord('a') vaut 97
Exemple :
chr(65) vaut '
A'et chr(97) vaut '
a'
7.3.3 Exemple :
On désire transformer une lettre minuscule en lettre majuscule.
Soit c le caractère à transformer. On écrira alors :
- 46 -
D. Lenne, P. Trigano NF01 – P06
Explications :
Si c correspond à la lettre '
a', alors :
ord(c) - ord('a'
) = ord('
a' ) - ord('
a')=0
donc
ord(c) - ord('a'
) + ord('
A' ) = ord('
A') = 65
et :
chr (ord('A')) = chr(65) = ' A'
Nous avons bien transformé ' a'en 'A'
7.4 Exemples
Exemple 1
program ExChaines;
var
s, s1, s2 : string;
begin
write('entrez une chaîne caractères : ');
readln(s1);
write('entrez en une autre : ');
readln(s2);
s:= s1 +' ' + s2 ;
write('La longueur de la 1ère chaîne est ');
writeln(length(s1));
write('La longueur de la 2ème chaîne est ');
writeln(length(s2));
writeln;
writeln('La chaîne finale est : ', s );
writeln('Sa longueur est : ', length(s):3 );
end.
Exemple 2 :
program Test ;
var
s1, s2 : string;
i : integer;
c : char;
begin
write('entrez une chaîne caractères : ');
readln(s1);
s2 := s1;
for i := 1 to length(s1) do
if s[i] in ['a'..'z'] then
begin
c:=chr( ord(s1[i] - ord('a') + ord('A') );
s2[i] := c;
end;
writeln;
writeln('------------------------------------------------');
writeln;
writeln('L''ancienne valeur était : ', s1);
writeln('La nouvelle valeur est : ',s2);
end.
- 47 -
D. Lenne, P. Trigano NF01 – P06
8 Fonctions et Procédures
8.1 Procédures
8.1.1 Définition
Une procédure permet de définir un traitement autonome, nommé par un identificateur et appelable par cet
identificateur à partir du programme principal.
Il est en particulier utile de définir une procédure lorsqu’un même traitement doit être effectué à plusieurs
reprises dans le programme.
L’utilisation de procédures permet de structurer un programme et d’augmenter sa lisibilité.
8.1.2 Déclaration
En Pascal les déclarations de procédures et de fonctions doivent être placées après les déclarations de variables.
Les déclarations s'
effectuent donc dans l'ordre suivant :
En-tête
Déclarations
Constantes
Types
Variables
Fonctions / Procédures
Déclaration d'
une procédure :
procedure <identificateur> <liste de paramètres> ;
Exemple :
Affichage d’un vecteur :
procedure affichage ( v : Vecteur ; n : integer) ;
var
i: integer; {i est une variable locale, Cf. 8.3)
begin
for i:=1 to n do write(v[i]);
writeln;
end;
Cette procédure peut être utilisée pour une variable de type :
Vecteur = array[1..Nmax] of real ; Nmax étant une constante définie au préalable.
- 49 -
NF01 – P06 Algorithmique et programmation
8.2 Fonctions
8.2.1 Définition
Une fonction est analogue à une procédure mais elle doit de plus retourner une valeur.
Le type de cette valeur doit être spécifié explicitement.
8.2.2 Déclaration
On déclare les fonctions au même niveau que les procédures (après const, type, var)
Diagramme de déclaration d'
une fonction :
8.2.3 Appel
On appelle une fonction au niveau d'
une expression et non d'
une instruction comme c’était le cas pour une
procédure.
La fonction est appelée lors de l’évaluation de l’expression et c’est la valeur qu’elle retourne qui est utilisée dans
l’évaluation.
Diagramme d'
appel d'
une fonction :
- 50 -
D. Lenne, P. Trigano NF01 – P06
• Une fonction quant à elle renvoie toujours une "valeur". Elle nécessite donc un type (entier,
caractère, booléen, réel, etc...).
Remarque :
Il est interdit d'utiliser l'
identificateur d'
une fonction comme nom de variable en dehors du bloc
correspondant à sa déclaration.
Exemple :
Examinons le programme suivant
program exemple;
var
x,y : integer;
begin
readln(x);
y := double(x);
double := 8; {erreur à cette ligne lors de la compilation}
end.
Ce programme ne pourra pas fonctionner, car on lui demande d'affecter la valeur 8 à la fonction double. Or, il est
interdit d'utiliser l'
identificateur d'
une fonction comme nom de variable en dehors du bloc correspondant à sa
déclaration, d'où l'erreur.
Dans l’exemple suivant N et T sont des variables globales, Y et I sont locales à la fonction puissance.
program EXPOSANT ;
var
N : integer;
T : real;
function puissance (X : real; N : integer) : real;
var
Y : real;
I : integer;
- 51 -
NF01 – P06 Algorithmique et programmation
if N > 0 then
for I := 1 to N do Y := Y * X;
else
for I := -1 downto N do Y := Y / X;
puissance:= Y;
end; { Fin du code de la fonction }
begin
readln (T, N);
writeln (puissance (T, N)); { appel de la fonction }
end.
procedure NIVEAU-SUP;
var
X, Y, ...
procedure NIVEAU-INF;
var
X,Z,...
begin
X:=...
Y:=...
Z:=...
end;
begin
end.
Remarques :
Dans le cas où un même nom est utilisé pour une variable globale et pour une variable locale, cette dernière
à la priorité dans la procédure ou dans la fonction où elle est déclarée (niveau local).
Dans le cas où un même nom est utilisé pour une variable locale et pour une variable globale, le programme
considère ces variables comme deux variables différentes (mais ayant le même nom).
- 52 -
D. Lenne, P. Trigano NF01 – P06
Exemple :
program Portee;
var
x : real;
procedure proc1;
var
x : real;
begin
x:=0;
writeln (x);
end;
8.4 Paramètres
8.4.1 Exemple
Supposons qu'
on ait à résoudre des équations du second degré en divers points d’un programme :
- la première fois Rx2 + Sx + T= 0,
- la deuxième fois Mx2 + Nx + P = 0,
- la troisième fois Ux2 + Vx + W = 0.
Comment faire en sorte qu' est-à-dire travailler sur des
une même procédure puisse les traiter toutes les trois, c'
données différentes ?
• 1ère possibilité : utiliser des variables globales A, B, C pour exprimer les instructions dans la procédure, et,
avant l'
appel de la procédure, faire exécuter des instructions telles que :
A := R, B := S, C := T, etc.
Cette solution utilise des variables globales et multiplie les affectations. Il faut donc l’écarter !
• 2ème possibilité : définir une procédure de résolution d'
une équation du second degré avec une liste de
paramètres.
- 53 -
NF01 – P06 Algorithmique et programmation
La déclaration sera :
procedure second_degre(A,B,C:integer);
Un paramètres est spécifié par un identificateur et par une déclaration de type. On peut grouper plusieurs
paramètres de même type en les séparant par des virgules.
A l'
appel, on écrira :
second_degre (M, N, P); { appel avec les valeurs de M, N et P }
second_degre (R, S, T); { appel avec les valeurs de R, S et T }
Lors de l'appel de la procédure, il y a remplacement de chaque paramètre formel par un paramètre effectif, bien
spécifié.
Ainsi, au premier appel, A prendra la valeur de M, B celle de N et C celle de P. Au second appel : A prendra la
valeur de R, B celle de S et C celle de T.
Cette transmission d' information est équivalente à une affectation de valeurs dans des sortes de variables
locales, qui sont en fait représentées par les paramètres (ou arguments) de la procédure.
Points importants :
• Les paramètres formels sont des variables locales à la procédure, qui reçoivent comme valeurs initiales
celles passées lors de l'
appel
Exemple :
ID_PROC (A, B, 5, true);
X a alors pour valeur initiale celle de A, Y celle de B, I a pour valeur initiale 5, et TEST true
• Le traitement effectué dans la procédure, quel qu' il soit, ne pourra modifier la valeur des paramètres
effectifs.
Par exemple : après exécution de ID_PROC, A et B auront toujours la même valeur qu'auparavant,
même s' il y a eu des changements pour ces variables, dans la procédure. La transmission est unilatérale.
Avantages :
• les paramètres effectifs peuvent être des expressions.
• les erreurs et les effets de bord sont évités (Cf exemple 2).
• les paramètres sont utilisés pour passer des valeurs à la procédure, mais ne sont jamais modifiés.
A noter :
Le résultat de l' action accomplie par la procédure n' est pas transmis au programme appelant (Cf.
exemple 1).
Si on désire récupérer, le paramètre modifié, il faut alors utiliser un autre procédé, décrit dans la section
suivante (passage par adresse).
- 54 -
D. Lenne, P. Trigano NF01 – P06
Exemple 1 : Nous cherchons à écrire un programme qui échange les valeurs de deux variables saisies par
l'
utilisateur.
program TEST;
var
A, B : real;
begin
readln (A, B);
ECHANGE (A, B);
writeln (A, B);
end.
Cette solution est mauvaise. En effet, une simulation de son exécution donnera :
A=5B=7 {saisie}
X=7Y=5
A=5B=7 {A et B restent inchangés !}
program Effet-de_bord;
var
i,j : integer;
- 55 -
NF01 – P06 Algorithmique et programmation
Exemple de déclaration :
procedure ID_PROC (var X, Y : real; Z : integer);
Points importants :
• Lors de l' appel, des paramètres réels sont substitués aux paramètres formels.
• Tout changement sur le paramètre formel variable change aussi le paramètre effectif spécifié lors de
l'
appel.
• Seule une variable peut être substituée aux paramètres réels, il est impossible de faire l'
appel avec une
constante ou une expression évaluable.
Exemple :
ID_PROC (U, V, 7); { correct }
ID_PROC (4, A - B, 8); {tout à fait incorrect }
A noter : lorsqu’il y a nécessité de renvoyer une modification au programme appelant, on emploie un passage
par adresse.
Exemple 1 :
program essai;
var
i : integer;
procedure double (x : integer ; var res : integer);
begin
res := 2 * x;
end;
begin
i := 1; {i=1}
double (5,i); {i=10}
end;
Dans cet exemple, x est un paramètre transmis par valeur, alors que res est un paramètre passé par adresse.
Exemple 2 : reprenons et corrigeons le programme qui échange les valeurs de deux variables saisies par
l'
utilisateur.
- 56 -
D. Lenne, P. Trigano NF01 – P06
program TEST_BIS;
var
A, B : real;
begin
readln (A, B);
ECHANGE (A, B);
writeln (A, B);
end.
Le résultat de l'
action de la procédure a été transmis au programme appelant.
Exemple :
function LETTRE (c : char) : boolean;
begin
if (c in ['A'..'Z']) or (c in ['a'..'z'])
then
lettre := true
else
lettre := false;
end;
- 57 -
NF01 – P06 Algorithmique et programmation
La première fonction utilise un passage de paramètre par valeur car nous n' avons pas besoin de modifier ce
paramètre ; cette fonction est utilisée pour tester si un caractère est une lettre (minuscule ou majuscule).
La fonction MAJ (qui utilise la fonction précédente) modifie un caractère qui est une lettre minuscule en sa
majuscule correspondante.
program DEMONSTRATION;
var
TAN, COT, LOG_A : real;
- 58 -
D. Lenne, P. Trigano NF01 – P06
9 Ensembles
En Pascal, il est possible de définir des ensembles finis et d’effectuer des operations sur ces ensembles.
Syntaxe
type
identificateur = set of type_simple;
Exemple 1 :
type
Palette = (bleu, blanc, rouge);
Couleur = set of Palette ;
var
teinte : Couleur ;
...
Le type ensemble associé à Palette contient tous les sous-ensembles de Palette :
{ } {bleu} {blanc} {rouge} {bleu, blanc} {bleu, rouge} {blanc, rouge} {bleu, blanc, rouge},
soit 23=8 valeurs.
De manière plus générale, si card E = n, le nombre de valeurs possibles est : 2n
Avec les déclarations de l’exemple 1, on peut écrire des instructions telles que :
teinte := [ ] ; { ensemble vide }
teinte := [blanc,rouge] ; { 2 éléments : bleu et rouge }
teinte := [bleu. rouge]; { toutes les valeurs de bleu à rouge }
Exemple 2 :
type
Decimal = 0..9 ;
EnsChiffres = set of Decimal ;
var
tirage : EnsChiffres ;
- 59 -
NF01 – P06 Algorithmique et programmation
Exécution : C = [2, 3, 5, 7, 9]
var
A,B,C : set of 1..10;
begin
A := [2, 5, 9] ;
B := [3, 5, 7] ;
C := A * B ;
end.
Exécution : C = [5]
Exécution : C = [2, 9]
type
Note = (do, ré, mi, fa, sol, la, si) ;
var
accord : set of Note;
On pourra écrire :
if accord = [do, mi, sol] then ...
type
Note = (do, ré, mi, fa, sol, la, si) ;
var
accord : set of Note;
On pourra écrire :
- 60 -
D. Lenne, P. Trigano NF01 – P06
type
Note = (do, ré, mi, fa, sol, la, si) ;
var
accord : set of Note ;
if note in accord
if note in [do, mi , sol]
- 61 -
D. Lenne, P. Trigano NF01 – P06
10 Enregistrements
10.1 Définition
Une variable de type enregistrement est une variable structurée avec plusieurs champs.
Les champs sont les attributs ou caractéristiques de l'
enregistrement.
Ils sont parfois appelés rubriques ou propriétés.
Alors que les éléments d’un tableau sont nécessairement de même type, les champs d’un enregistrement peuvent
être de types différents.
Spécification d'
un champ dans la déclaration :
identificateur : type_champ ;
identificateur1, identificateur2, ............. : type_champ ;
Exemples :
type
personne = record
nom:string[40];
prenom:string[50];
age:integer;
end;
voiture = record
marque : string ;
cylindree : real ;
couleur : string;
nom : string ;
prix : integer ;
end ;
une_couleur = (trefle, carreau, coeur, pique);
une_valeur = (sept, huit, ..., dame, roi, as);
carte = record
couleur : une_couleur;
valeur : une_valeur;
end;
- 63 -
NF01 – P06 Algorithmique et programmation
Il suffit d'
écrire les instructions suivantes :
auto.marque := 'Peugeot' ;
auto.cylindree := 2.0 ;
auto.couleur := 'gris' ;
auto.nom := '307 HDI' ;
auto.prix := 18000 ;
Universite = record
nom : string;
tel : string;
batiment : Bat;
end;
- 64 -
D. Lenne, P. Trigano NF01 – P06
var
fac : Universite ;
begin
...
fac.tel := '0344234423';
fac.nom := 'Universite de Technologie de Compiègne' ;
fac.batiment.nom := 'Franklin' ;
fac.batiment.adresse.rue := 'Personne de Roberval' ;
fac.batiment.departement[1] := 'GI' ;
fac.batiment.departement[2] := 'GM' ;
...
Syntaxe :
with <enregistrement> do
begin
<Bloc d'instructions>
end;
Exemple :
with auto do
begin
marque := 'Peugeot' ;
cylindree := 2.0 ;
couleur := 'gris' ;
nom := '307 HDI' ;
prix := 18000 ;
end ;
const
Max = 160;
type
Etudiant = record
nom, prenom : string;
sexe : (M,F);
numInsee : string;
age : integer;
end;
UV : array[1..Max] of ETUDIANT;
var
NF01 : UV;
- 65 -
NF01 – P06 Algorithmique et programmation
La variabl e NF01 est de type UV. Sa valeur est un tableau d’éléments de type ETUDIANT.
On peut accéder à un étudiant particulier, par son indice dans le tableau NF01.
Ainsi,
NF01[1] correspondra au premier élément du tableau,
NF01[12] au 12ème étudiant contenu dans ce tableau...
On pourra alors écrire :
NF01[1].nom:='Machin';
NF01[1].age:=19;
NF01[2].nom:='Martin';
- 66 -
D. Lenne, P. Trigano NF01 – P06
11 Fichiers
11.1 Définitions
Un fichier est une collection d'
informations stockée sur un support physique (disque, bande, CD-Rom...).
Un fichier permet de conserver durablement l'
information (données programmes, résultats). L’information
persiste à l'
arrêt du programme.
11.4.1 Définition
L'organisation d'un fichier est la manière dont sont rangés les enregistrements du fichier sur le support
physique.
L'organisation est choisie à la création du fichier. Le choix d'
une organisation correspond à un compromis entre
rapidité d'
accès et espace de stockage disponible.
- 67 -
NF01 – P06 Algorithmique et programmation
Pour accéder à une information particulière, il faut nécessairement parcourir le fichier à partir du début, et ce
jusqu'
au moment où cette information est retrouvée.
- 68 -
D. Lenne, P. Trigano NF01 – P06
On parcourt un index pour rechercher une clef. On obtient ainsi l'adresse exacte de l'information recherchée.
On peut utiliser des opérateurs de comparaisons, sur les index (=, <>, <, <=, >, >=).
Il est alors possible, par exemple, de retrouver rapidement toutes les personnes de nom '
Dupont'ou de prénom
'André' , ou toutes celles de plus de 18 ans....
Dans l'exemple schématisé ci-dessus, on pourrait, grâce aux index, retrouver rapidement des livres à partir de
leur auteur, de leur titre ou de leur thème.
La longueur du fichier est le nombre d’enregistrements du fichier. Elle n’est pas définie lors de la déclaration
du fichier.
Tous les types sont autorisés pour les éléments (sauf le type fichier !).
Exemple :
type
CODES = file of integer ;
TEXTE = file of char ;
ADRESSE = record
......
end;
REPERTOIRE = file of ADRESSE ;
COORDONNES = record
abscisse, ordonnee : real ;
end ;
TRACE = file of coordonnees ;
var
fichier_client : REPERTOIRE ;
courbe : TRACE ;
- 69 -
NF01 – P06 Algorithmique et programmation
Le pointeur de fichier est un repère (un marqueur) servant à indiquer au système d’exploitation l'
adresse à
laquelle il faudra lire ou écrire le prochain enregistrement.
Syntaxe :
write (f,x)
Ecriture de l'
enregistrement x dans le fichier logique f.
Remarque : Le type de x doit être compatible avec le type des enregistrements du fichier.
Principe :
• avant l'
exécution de la commande :
• après l'
exécution de la commande :
instruction reset.
On utilise pour cela l'
Syntaxe
reset (id_fichier);
- 70 -
D. Lenne, P. Trigano NF01 – P06
Remarque :
Il n' en écriture'
est pas possible de lire des informations dans un fichier ouvert avec rewrite (ouverture ' ). En
effet, nous avons vu précédemment que lorsqu’on ouvre un fichier existant avec rewrite les anciennes
données sont perdues (le fichier est « écrasé »).
Syntaxe
read(f,x);
Cette instruction permet de lire l'
enregistrement du fichier repéré par le pointeur de fichier, puis de placer cet
enregistrement dans la variable x passée en paramètre.
De même que pour l'
instruction write, le type de x doit être le même que celui spécifié lors de la déclaration du
fichier.
Cette instruction ne peut être exécutée que si la commande reset(f) a été utilisée auparavant.
Principe :
• avant l'
exécution de la commande :
• après l'
exécution de la commande :
Le nom externe (ou nom physique) représente quant à lui le nom utilisé sur le disque, visible dans le répertoire
(dossier ou directory).
Il s'
agit donc du nom de fichier vu par l'
utilisateur et par le système d'
exploitation.
Certains compilateurs permettent l’association des deux noms au niveau des instructions rewrite ou reset :
- 71 -
NF01 – P06 Algorithmique et programmation
rewrite(ID_FICHIER_INTERNE, ID_FICHIER_EXTERNE);
reset(ID_FICHIER_INTERNE, ID_FICHIER_EXTERNE);
Exemple :
rewrite (fOut, 'FichierSortie.txt') ;
reset (fIn, 'FichierEntree.txt') ;
Exemple :
assign(f, 'mon_fichier') ;
rewrite (f); {ou reset(f) pour une ouverture en lecture }
Remarque : Il est préférable d’utiliser une constante ou une variable pour le nom du fichier externe.
Exemple :
write('nom du fichier externe ? '
readln(nom_externe);
assign(f, nom_externe) ;
rewrite(f) ;
...
L’exécution de cette instruction garantit l’écriture de tous les enregistrements (pour un fichier ouvert en écriture)
et met fin à l’association nom interne-nom externe.
type
Adresse = record
nom, rue, ville : string;
numero : integer;
end;
Fichier = file of Adresse ;
var
carnet : Fichier;
client : Adresse;
begin
assign(carnet, 'carnet_adresses') ;
reset(carnet) ;
- 72 -
D. Lenne, P. Trigano NF01 – P06
with client do
while not eof (carnet) do
begin
read(carnet, client);
write ('NOM :', nom) ;
write ('NUMERO, numero) ;
write ('RUE :', rue) ;
write ('VILLE :', ville) ;
end ;
close (carnet) ;
end.
11.7.1 Déclaration
Le type Text est un type prédéfini en Pascal pour les fichiers texte.
Il suffit donc de déclarer une variable de type Text :
var
fich : Text ;
Remarque : en fonction des compilateurs, on doit parfois utiliser à la place de Text : File of char;
File of string; File of Text; ou TextFile;
- 73 -
NF01 – P06 Algorithmique et programmation
program MON_TEXTE;
var
f: Text;
s: string;
begin
assign(F, 'montexte.txt' );
rewrite(f);
writeln(' Tapez un texte et terminez par $' );
readln(s) ;
while (s <> '$') do
begin
writeln(f,s);
readln(s);
end;
close(f);
end.
program Lecture;
var
f: Text;
s: string;
begin
assign(f, 'montexte.txt' );
reset(f);
while not eof(f) do
begin
readln(f,s);
writeln(s);
end;
close(f);
end.
- 74 -
D. Lenne, P. Trigano NF01 – P06
12 Récursivité
12.1 Introduction
12.1.1 Définition
Une fonction ou une procédure est dite récursive s’il est fait appel à cette fonction ou à cette procédure dans le
corps d'
instructions qui la définit.
En d’autres termes, la fonction (ou la procédure) s'
appelle elle-même.
• Programmation itérative
Soit n un nombre entier :
n! = 1 * 2 * ... * (n - 1) * n
Ceci est une définition itérative, car il faut utiliser une boucle pour réaliser l'
algorithme associé.
La fonction Pascal correspondante est :
function factorielle(n:integer):longint;
var
i : integer;
fact : longint;
begin
fact:=1;
for i := 1 to n do
fact := fact * i;
factorielle := fact;
end;
• Programmation récursive.
Une définition récursive de la fonction factorielle est :
n! = n * (n - 1)!
arrêt qui est : 1! = 1.
avec une condition d'
Voici la fonction Pascal correspondante :
function factorielle(n:integer):longint;
begin
if (n > 1) then
factorielle:= n * factorielle (n-1)
else
factorielle:= 1;
end;
- 75 -
NF01 – P06 Algorithmique et programmation
function somme(N:integer):longint;
var
i : integer;
sum : longint;
begin
sum:=0;
for i := 1 to N do sum := sum + i;
somme := sum;
end;
Mais on peut aussi définir cette fonction de façon récursive en utilisant le fait que :
S(n) = S(n - 1) + n
S(0) = 0 pour la condition d'
arrêt
Voici le programme complet :
program SommePremiersEntiers ;
var
n:integer;
begin
readln(n);
writeln(somme (n));
end.
La fonction somme est une fonction récursive car la définition de somme utilise somme elle-même.
exécution du programme, à chaque appel de la fonction somme, le système va effectuer un empilement
Lors de l'
(sauvegarde) des valeurs paramètres et des résultats de calculs.
elles sont dépilées) et réinjectées dans le
A la sortie de la fonction, ces valeurs seront restituées (on dit qu'
programme.
- 76 -
D. Lenne, P. Trigano NF01 – P06
program Puiss;
var
x : real ; p: integer ;
begin
write('Nombre :');
readln(x);
write('Exposant entier :');
readln(p);
writeln('Le résultat est :', Puissance (x, p) ) ;
end.
procedure FAIRE ;
var
CAR : char ;
begin
read (CAR) ;
if CAR <> POINT then FAIRE ;
write (CAR) ;
end;
begin
writeln ('Entrez un texte') ;
FAIRE ;
writeln;
end.
Condition d'
arret : PGCD (a , b) = b si r = 0
Exemple :
PGCD (20 , 6) = PGCD (6 , 2) = 2
- 77 -
NF01 – P06 Algorithmique et programmation
program PgcdRec ;
var
a, b : integer
begin
readln (a , b) ;
writeln ('Le PGCD est :', PGCD (a , b) ) ;
end.
12.3.2 Analyse
On va imaginer, afin de ramener le problème à un nombre de disques plus petit, que l'
on sait faire passer tous les
disques sauf le dernier, d'
un pilier à un autre.
On a donc diminué de un le nombre de disques à déplacer.
- 78 -
D. Lenne, P. Trigano NF01 – P06
12.3.3 Programme
program HANOI ;
var
nbDisques : integer ;
begin
writeln('Entrez le nombre de disques :');
readln(nbDisques);
deplacer (nbDisques, 1 , 3 , 2 );
end.
- 79 -
D. Lenne, P. Trigano NF01 – P06
13 Exercices
13.1 Programmation et boucles
13.1.1 Enoncé 1
I. Programmation
Il est maintenant temps de vous confronter à un problème complet et d' en résoudre toutes les étapes. Ecrire un
programme réalisant la facturation d' un article livré en un ou plusieurs exemplaires. On fournira en données le
nombre d' articles et leur prix unitaire hors-taxe. La taux TVA sera toujours de 18.6 %. Si le montant TTC
dépasse 1000 FF, on établira une remise de 5 %. On cherche à ce que le dialogue se présente ainsi :
N'oubliez pas de rester synthétique et de ne pas brûler les étapes. Prenez suffisamment de temps pour bien
analyser le problème, et éventuellement le décomposer en sous-problèmes. Cernez les entrées et les sorties, ainsi
que l'
usage précis que vous ferez des différentes variables. Une fois l'
algorithme élaboré, le codage en Pascal ne
devrait pas vous poser trop de difficultés. Essayez de vous habituer à commenter le programme, et utiliser des
noms de variables significatifs (compléter la table A). On affichera les résultats sur 8 caractères avec 2 chiffres
après la virgule.
II. Boucles
Il s'
agit cette fois de comprendre les méandres d' un programme qui n' est pas de votre cru. Les plus courageux
pourraient essayer de le faire tourner à la main, mais une série d' exécutions en machine devrait vous être plus
profitable. Une fois le principe compris et clairement expliqué, vous pourrez formuler des suggestions quant à
d'éventuelles modifications tant sur la forme que sur le fond. Faites attention à ne pas généraliser trop rapidement
un comportement singulier.
1. Ce programme est très mal présenté, recopiez-le proprement en utilisant les règles
d'indentation du Pascal.
2. Un bon moyen pour découvrir le but d' un programme est de le tester (compléter la
table B).
3. Réécrivez le programme en ajoutant des commentaires.
- 81 -
NF01 – P06 Algorithmique et programmation
- 82 -
D. Lenne, P. Trigano NF01 – P06
13.1.2 Corrigé 1
I. Programmation
Programme réalisant la facturation d' un article livré en un ou plusieurs exemplaires. On fournira en données le
nombre d' articles et leur prix unitaire hors-taxe. La taux TVA sera toujours de 18.6 %. Si le montant TTC
dépasse 1000 FF, on établira une remise de 5 %. On affichera les résultats sur 8 caractères avec 2 chiffres après
la virgule. On cherche à ce que le dialogue se présente ainsi :
PROGRAM Facturation_avec_remise;
USES WINCRT;
CONST
taux_tva = 0.186;
taux_remise = 0.05;
VAR
prix_ht, prix_ttc, montant_ttc, remise, net_a_payer : REAL;
n_articles : INTEGER;
BEGIN
WRITE('Introduisez le nombre d'articles : ');
READLN(n_articles);
WRITE('Introduisez le prix unitaire : ');
READLN(prix_ht);
montant_ttc := prix_ht * n_articles * 1.186;
IF montant_ttc > 1000 THEN
remise := montant_ttc * 0.05
ELSE
remise := 0;
net_a_payer := montant_ttc - remise;
WRITELN('Nombre d'articles : ',n_articles:8:2);
WRITELN('Prix unitaire HT : ',prix_ht:8:2,' FF');
WRITELN('Montant TTC : ',montant_ttc:8:2,' FF');
- 83 -
NF01 – P06 Algorithmique et programmation
II. Boucles
entier i, n, m, p
répèter
écrire " Introduisez un entier m : "
lire m
écrire " Introduisez un entier p : "
lire p
écrire m," avec ",p," donne : "
pour i = 1 jusqu'à m faire
n = 1 + p * (i - 1)
écrire n
fpour
jusqu'à m = 0
PROGRAM De_p_en_p;
USES WINCRT;
VAR
i, n, m, p : INTEGER;
BEGIN
REPEAT
- 84 -
D. Lenne, P. Trigano NF01 – P06
- 85 -
NF01 – P06 Algorithmique et programmation
13.1.3 Enoncé 2
Exercice 1 :
Ecrire un programme Pascal qui permet d' afficher le triangle de Pythagore ; triangle dans lequel l'
insertion d'
une
ligne correspond au résultat de la multiplication de l'indice de la ligne avec les indices des colonnes.
Exemple : (pour n = 5)
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
Exercice 2 :
La suite de fibonacci forme une séquence intéressante, dans la quelle chaque terme est égal à la somme des deux
termes précédents. Formellement la suite est définie par :
Fi+1 = Fi + Fi-1
où Fi correspond au iième terme de Fibonacci. Par définition,les deux premiers termes de Fibonacci sont égaux à
1 (F1 = F2 = 1).
F3 = F2 + F1 = 2
F4 = F3 + F2 = 3
F5 = F4 + F3 = 5
et ainsi de suite . . .
• Ecrivez un programme Pascal affichant les n premiers termes de Fibonacci. Testez le avec n = 23
• Partez ensuite de ce premier programme pour en concevoir un second permettant de lire la valeur d' un
entier positif et de déterminer s'il fait partie de la suite de Fibonacci.
• Rédigez tout programme de manière à ce qu' il s'exécute de manière répétitive (boucle) jusqu' à ce que
l'
utilisateur spécifie la valeur zéro en entrée, indiquant ainsi que l' utilisateur veut quitter le programme.
Effectuez des tests pour plusieurs valeurs entières de votre choix.
NB : faites en sorte que vos programmes soient lisibles (commentés et bien structurés)
13.1.4 Corrigé 2
Programme 1
Program Pythagore;
var
i, j , n : integer ;
begin
(* Lecture des variables *)
writeln('n = ' ); readln(n) ;
(* Calcul et Affichage du triangle*)
for i := 1 to n do
begin
for j:= 1 to i do write(i*j :3,' ');
writeln;
end ;
end;
- 86 -
D. Lenne, P. Trigano NF01 – P06
Programme 2
program Fibonacci;
var
n , x, y, z : integer ; (* x = Fn ; y = Fn-1 ; z = Fn-2 *)
begin
(* lecture des variables *)
write(' n = ');
readln(n);
while (n > 0) do (* condition d' arret *)
begin
writeln(' voici les '
,n, 'premiers termes de la suite:') ;
if (n >= 1) then writeln(' Terme 1 = 1' ); (* Affichage du premier terme *)
if (n >= 2) then writeln(' Terme 2 = 1'); (* Affichage du second terme *)
y:=1; z:=1;
for i:=3 to n do
begin
x := y + z ; (* Fn = Fn-1 + Fn-2 *)
z := y ; (* Fn-2 := Fn-1 *)
y := x ; (* Fn-1 := Fn *)
writeln('Terme '
,i, '= ', x);(* Affichage de la suite*)
end;
write('
Entrer un nombre, 0 pour terminer, n= '
);
readln(n);
end;
end.
program TestFibo;
var
k, x, y, z ,i: integer ; (* x = Fn ; y = Fn-1 ; z = Fn-2 *)
begin
(* lecture des variables *)
write('Entrer un nombre : ' ) ; readln(k);
while (k<>0) do
begin
if (k = 1) then
writeln( '1 fait partie de la suite de Fibonacci
F1=F2=1')
else
begin
i:=2; (* l'indice du terme *)
y=1 ; z=1; x:=2;
while (x<k) do (* tant que le terme calcule
est < a k continuer la recherche *)
begin
i := i+1;
x := y + z ; (* Fn = Fn-1 + Fn-2 *)
z := y ; (* Fn-2 := Fn-1 *)
y := x ; (* := Fn-1 Fn *)
end;
(* tester si k est de fibonacci *)
if (k=x) then
writeln(' k, ' fait partie de la suite de
Fibonacci, c'est le terme ',i )
else writeln(' k, ' ne fait pas partie de la suite
de Fibonacci' );
end;
write('entrer un autre nombre , 0 pour terminer); readln(k);
- 87 -
NF01 – P06 Algorithmique et programmation
end;
end .
Exercice
On souhaite gérer les notes finales de NF01 des étudiants inscrits dans cette UV. Pour ceci nous utilisons deux
tableaux. Le premier pour sauvegarder les noms des étudiants, le second contient les notes finales.
Menu principal
Choix :
et s'
exécute de manière répétitive jusqu'
à ce que l'
utilisateur entre '
F'indiquant le fin du programme
Pour l'
affichage, utiliser :
NB. Faites en sorte que vos programmes soient lisibles (commentés et bien structurés).
- 88 -
D. Lenne, P. Trigano NF01 – P06
var i: integer;
begin
write('Donner le nombre d''etudiants inscrits en NF01: '); readln(taille );
writeln(Vous allez saisir les noms et les notes de tous les etudiant
inscrits');
for i := 1 to taille do
begin
write(' Le nom de l''etudiant :,') ; readln(t1[i]);
write(' Sa note finale : ') ; readln(t2[i]);
end;
end;
{===============PROCEDURE AFFICHAGE DES NOTES==============}
procedure affiche(taille : integer ; t1 : etudiants ; t2: notes);
{============================================================}
var i: integer;
begin
clrscr;
writeln('Voila la liste des notes : ');
for i := 1 to taille do writeln(t1[i],' ', t2[i]:2:2);
end;
{============PROCEDURE CALCUL MOYENNE GENERALE===========}
function moyenne(taille:integer ; t2 : notes ) : real;
{============================================================}
var i : integer;
moy : real;
moy:=0;
begin
clrscr;
for i := 1to taille do moy := moy + t2[i];
moyenne := moy/taille;
end;
{===================FONCTION RECHERCHE=================}
function recherche(taille : integer ; t1:etudiants ; t2 : notes ): integer;
{==========================================================}
var i : integer;
nom : string[25];
begin
clrscr;
i:=1;
write(' Entrer le nom de l'étudiant : '); readln (nom);
while (t1[i] <> nom) and (i<= taille) do i:=i+1;
if (i<=taille) then
begin
recherche:= i;
writeln('Nom : ', nom,'Note = ', t2[i]:2:2);
end
else
begin
recherche:=0;
writeln ('Cet etudiant n''est pas inscrit');
end;
end;
{===================PROCEDURE CHANGEMENT DE NOTE============}
procedure change(taille : integer ; t1:etudiants ; var t2 : notes );
{=================================================================}
var
i: integer;
begin
i :=recherche(taille,t1,t2);
if (i>0) then
begin
- 89 -
NF01 – P06 Algorithmique et programmation
case choix of
'S' : saisie(n , etud, not);
'A' : affiche(n , etud , not) ;
'M' : writeln(' la moyenne est = ', moyenne(n, not));
'C' : change(n , etud, not);
'R' : writeln('L''indice de l''etudiant recherche est : ', recherche(n ,
etud, not));
until choix = 'F';
end.
I. Programmation
Il est maintenant temps de vous confronter à un problème complet et d'en résoudre toutes les étapes. Ecrire un
programme pour transformer des coordonnées cartésiennes (x,y) en coordonnées polaires ( , ) sachant que :
avec
a.
si x < 0
b.
si x = 0 et y > 0
c.
si x = 0 et y < 0
d.
n'
existe pas si x = 0 et y = 0
- 90 -
D. Lenne, P. Trigano NF01 – P06
N'oubliez pas de rester synthétique et de ne pas brûler les étapes. Prenez suffisamment de temps pour bien
analyser le problème, et éventuellement le décomposer en sous-problèmes. Cernez les entrées et les sorties, ainsi
que l'
usage précis que vous ferez des différentes variables. Une fois l'
algorithme élaboré, le codage en Pascal ne
devrait pas vous poser trop de difficultés. Essayez de vous habituer à commenter le programme, et utiliser des
noms de variables significatifs (compléter la table A). On prendra et on affichera les résultats sur 8
caractères avec 4 chiffres après la virgule.
II. Boucles
Il s'
agit cette fois de comprendre les méandres d' un programme qui n' est pas de votre cru. Les plus courageux
pourraient essayer de le faire tourner à la main, mais une série d' exécutions en machine devrait vous être plus
profitable. Une fois le principe compris et clairement expliqué, vous pourrez formuler des suggestions quant à
d'éventuelles modifications tant sur la forme que sur le fond. Faites attention à ne pas généraliser trop rapidement
un comportement singulier.
1.
Ce programme est très mal présenté, recopiez-le proprement en utilisant les règles d'
indentation du
Pascal.
2.
Un bon moyen pour découvrir le but d'
un programme est de le tester (compléter la table B).
3.
Que fait ce programme ?
4.
Réécrivez le programme en ajoutant des commentaires.
- 91 -
NF01 – P06 Algorithmique et programmation
Corrigés
I. Programmation
Programme pour transformer des coordonnées cartésiennes (x,y) en coordonnées polaires ( , ) sachant que :
avec
a.
si x < 0
b.
si x = 0 et y > 0
c.
si x = 0 et y < 0
d.
n'
existe pas si x = 0 et y = 0
- 92 -
D. Lenne, P. Trigano NF01 – P06
PROGRAM CartesienPolaire;
VAR
x, y, rho, theta, pi : REAL;
BEGIN
WRITE('Introduisez l''abscisse x : ');
READLN(x);
WRITE('Introduisez l''ordonnée y : ');
READLN(y);
pi := 3.1416;
rho := SQRT(x * x + y * y);
IF x = 0 THEN
IF y > 0 THEN
WRITELN('rho =', rho:8:4 ,' et theta = ', pi/2:8:4)
ELSE
IF y < 0 THEN
WRITELN('rho = ', rho:8:4 ,' et theta = ', -pi/2:8:4)
ELSE
WRITELN('rho = ', rho:8:4 ,' et theta n''existe pas.')
ELSE
BEGIN
theta := ARCTAN(y/x);
IF x < 0 THEN theta := theta + pi;
WRITELN('rho = ', rho:8:4 ,' et theta = ', theta:8:4);
END;
READLN;
END.
- 93 -
NF01 – P06 Algorithmique et programmation
II. Boucles
1.
demander et lire un nombre n entier positif non nul.
2.
si n est pair, il est divisé par 2.
3.
si n est impair, il est multiplié par 3 et augmenté de 1.
4.
arrêter quand n vaut 1 sinon repartir de l'
étape 2.
Note : Il a été vérifié par ordinateur que tout nombre entier compris entre 1 et 1 099 511 627 776 était ramené à 1
après un nombre fini d' étapes. On attend toujours la découverte d'un nombre pour lequel cette propriété ne serait
pas vraie. Exemple : n = 26 devient 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.
lire n
tant que n <> 1 faire
si n mod 2 = 0 alors n = n / 2
- 94 -
D. Lenne, P. Trigano NF01 – P06
sinon
n=3*n+1
fsi
écrire ``n = '
',n
ftant
PROGRAM PropNaturel;
VAR
n : LONGINT;
BEGIN
WRITE(' Introduisez un entier n : ');
READLN(n);
WRITE(n,' donne');
WHILE NOT(n = 1) DO
BEGIN
IF n MOD 2 = 0 THEN
n := n DIV 2
ELSE
n := n * 3 + 1;
WRITE(' ',n);
END;
READLN;
END.
- 95 -
NF01 – P06 Algorithmique et programmation
Exercice 1 :
Ecrire un programme Pascal qui calcule la somme suivante
(une seule boucle est suffisante) :
i =n
x 2i
S= ( −1) i
i =0 ( 2i )!
Compléter le tableau suivant :
n x S
4 2
3 0
7 0.75
0 0
10 1.5
0 3.25
Exercice 2 :
Ecrire un programme Pascal qui affiche à l’écran les 20 premiers nombres premiers
NB : faites en sorte que vos programmes soient lisibles (commentés et bien structurés)
Correction
Programme 1 :
program Somme ;
var
den , n , i, sign: integer ;
som, num, x : real ;
begin
(* lecture des variables *)
writeln( ' n= ' ); readln(n) ;
writeln(‘x = ‘ ); readln(x) ;
(* calcul de la somme *)
for i := 1 to n do
begin
den:= den * (2*i – 1) * (2*i) ;
num := num * x * x ;
som := som + sign* num / den;
sign := -sign ;
end ;
- 96 -
D. Lenne, P. Trigano NF01 – P06
(* Affichage du résultat *)
writeln(‘S : = ‘, Som) ;
end .
n x S
4 2 -0.4159
3 0 1
7 0.75 0.7317
0 0 1
10 1.5 0.0707
0 3.25 1
Programme 2
program Nb_Premiers ;
var
n , k , i : integer ;
begin
writeln(‘voici les 20 premiers nombres premiers :’ ) ;
writeln(2) ; (* le 2 est un nombre premier *)
n := 3 ; (* commencer le test à partir de n =3 *) ;
k :=1 ; (* compteur de nombres premiers affichés*)
while ( k< 20) do (* chercher 20 nb premiers *)
begin
i :=2 ; (* les diviseurs possibles de n sont i ∈ [2 , n div 2] *)
while ((i<= n div 2) and (n mod i <> 0)) do i :=i+1 ;
(*chercher un diviseur*)
if (i > n div 2) then (*aucun diviseur de n n’a été trouvé*)
begin
writeln(n) ; (* afficher n *)
k :=k+1 ;
(* incrémenter le compteur de nombres premiers *)
n :=n+2 ;
- 97 -
NF01 – P06 Algorithmique et programmation
Menu principal
1- Initialisation du tableau
2- Affichage des éléments
3- Valeur minimale
4- Tri des éléments
5- Fin
Choix :
Affichage :
Pour pouvoir utiliser ces procédures et fonctions mettre en début de programme (après program toto;) la
commande : uses crt ;
- clrscr : procédure sans paramètre ; efface le contenu de l’écran et positionne le curseur au coin supérieur
gauche
- goto(x,y) procédure à deux paramètres entiers 1≤ x≤ 24 et 1≤ y≤ 80 ; positionne le curseur au point de
coordonnées (x,y) ; Le point supérieur gauche a comme coordonnés (1,1).
I. Programmation
Il est maintenant temps de vous confronter à un problème complet et d'
en résoudre toutes les étapes.
Comme tout le monde, vous avez besoin d' argent. Un banquier sympa (si, ça existe !) a mis en place un système
d'
emprunt à taux fixe dont le niveau des intérêts dépend de votre situation sociale. Le taux d' intérêt annuel
nominal est de 9%. Une réduction de 2% est attribuée d'
office aux 18-25 ans et aux étudiants de moins de 30 ans.
Si, en plus, vous faites partie d'
une grande école, vous bénéficiez d'
une réduction supplémentaire de 1%. Les
moins de 18 ans n'ont pas droit au prêt.
Ecrivez un programme qui calcule le montant du remboursement global à effectuer en partant du principe que
tout client doit rendre la somme empruntée (avec les intérêts) au bout d'
un an et en un seul paiement. Testez
votre programme à l' aide de la table A.
N’oubliez pas de rester synthétique et de ne pas brûler les étapes. Prenez suffisamment de temps pour bien
analyser le problème, et éventuellement le décomposer
- 98 -
D. Lenne, P. Trigano NF01 – P06
en sous-problèmes. Cernez les entrées et les sorties, ainsi que l’usage précis que vous ferez des différentes
variables. Une fois l’algorithme élaboré, le codage en
Pascal ne devrait pas vous poser trop de difficultés. Essayez de vous habituer à commenter le programme, et
utiliser des noms de variables significatifs.
Table A
Grande Somme à
Somme Age Etudiant
école rembourser
15000 17 - -
15000 22 N -
15000 26 O N
20000 23 O O
17000 31 O N
22000 27 N -
II. Boucles
Il s'
agit cette fois de comprendre les méandres d' un programme qui n'
est pas de votre cru. Les plus courageux
pourraient essayer de le faire tourner à la main, mais
à d'éventuelles modifications tant sur la forme que sur le fond. Faites attention à ne pas généraliser trop
rapidement un comportement singulier.
1. Ce programme est très mal présenté, recopiez-le proprement en utilisant les règles d'
indentation du Pascal.
- 99 -
NF01 – P06 Algorithmique et programmation
Corrigés
I. Programmation
PROGRAM Emprunt;
USES WINCRT;
CONST
NOMINAL = 9; {Valeur de départ du taux d'intérêt}
VAR
somme, age, taux : INTEGER; {somme à emprunter, age de
l'emprunteur et taux d'intérêt }
etudiant, gde_ecole : CHAR; {situation sociale de l'emprunteur}
total : REAL; {Somme totale à rembourser}
BEGIN
{Saisie de l'âge de l'emprunteur}
WRITELN ('Entrez votre age :');
READLN(age);
{Rejet des clients trop jeunes, et donc pas solvables}
IF age < 18 THEN
WRITELN('Vous n''avez pas droit au prêt.')
ELSE
BEGIN
{Initialisation du taux à la valeur nominale}
taux := NOMINAL;
- 100 -
D. Lenne, P. Trigano NF01 – P06
Table A
Grande Somme à
Somme Age Etudiant
école rembourser
15000 17 - - -
15000 22 N - 16050
15000 26 O N 16050
20000 23 O O 21200
17000 31 O - 18530
22000 27 N - 23980
II. Boucles
Voici le programme indenté :
PROGRAM Inconnu;
USES WINCRT;
VAR
x,y,z,i : INTEGER;
BEGIN
WRITELN ('Entrez x :');
READLN(x);
WRITELN ('Entrez y :');
READLN(y);
WRITELN ('Entrez z :');
READLN(z);
i := x;
WHILE i <= y DO
BEGIN
IF (i mod z = 0) THEN
WRITE(' ', i)
ELSE
WRITE(' ',i mod z);
i := i + 1;
END;
END.
Ce programme n' a strictement aucun intérêt. Il scrute un ensemble de valeurs entières entre deux bornes et
affiche les valeurs divisibles par une valeur z quelconque, ou le reste de la division de ces valeurs par z quand
cette division n'est pas entière. La seule chose importante à voir dans ce code est qu'on peut remplacer la boucle
WHILE par une boucle FOR puisqu' on doit parcourir l'
ensemble des valeurs de l'intervalle [x,y]. Le programme
peut donc s' écrire :
PROGRAM Inconnu;
USES WINCRT;
VAR
x,y,z,i : INTEGER;
BEGIN
WRITELN ('Entrez x :');
READLN(x);
WRITELN ('Entrez y :');
READLN(y);
WRITELN ('Entrez z :');
READLN(z);
FOR i := x TO y DO {On gagne deux lignes !}
- 101 -
NF01 – P06 Algorithmique et programmation
BEGIN
IF (i mod z = 0) THEN
WRITE(' ', i)
ELSE
WRITE(' ',i mod z);
END;
END.
- 102 -
D. Lenne, P. Trigano NF01 – P06
Exercice 1 :
2. Proposer une méthode qui permet de classer les éléments du premier tableau dans l'
ordre indiqué
dans la question ii sans utiliser un deuxième tableau.
Exemple :
tableau initial 25.25 40.05 10.00 20.50 18.75 40.00 5.25 15.20
Exercice 2 :
o Ecrire un programme Pascal qui permet premièrement de remplir un tableau avec n nombres
entiers générés aléatoirement et de supprimer en suite tous les nombres non premiers du
tableau.Vous affichez sur ecran les résultat de chaque étape du traitement.
NB : faites en sorte que vos programmes soient lisibles (commentés et bien structurés)
Corrigé
Programme 1
1.
Program positions;(* Ce programme classe les éléments d' un tableau suivant leur position*)
const
nmax=100; (* Ceux en position paire d' abord, ensuite ceux en position impaire *)
type
tab = array[1..nmax] of real;
var
t1, t2 : tab;
n , i : integer ;
begin
writeln(' Combien d"éléments vous souhaitez ?? ) ;
(* Saisie de la taille et des éléments du tableau *)
readln(n);
- 103 -
NF01 – P06 Algorithmique et programmation
Programme 2
Program sup_premier; (* Ce programme supprime les nombres premiers
dans un tableau *)
const
nmax=100; (* d' éléments générés aléaloirement *)
type
tab = array[1..nmax] of integer;
var
t : tab;
n , i , k, j : integer ;
begin
write(' Combien d"éléments souhaitez-vous (< 100) ? ' );
readln(n);
(*génère aléaloirement et affiche les éléments du tableau*)
randomize;
Clrscr; writeln(' Un tableau de ' , n,'elements :) ;
for i := 1 to n do begin
t[i] : = random(100);
writeln(' t['
,i,'
]=' , t[i]);
end;
i :=1;
while (i<=n) do (* arret quand tous les éléments on été testés *)
begin
k :=2 ; (* les diviseurs possibles de t[i] sont k dans l' intervalle [2 , t[i] div 2] *)
while ((k< t[i] div 2) and (t[i] mod k<> 0)) do k :=k+1 ; (*chercher un diviseur*)
if (k = t[i] div 2) then (*aucun diviseur de n n' a été trouvé*)
begin
for j : = i to n-1 do t[i] : = t[i+1];
(*suppression de l'
élément par decalage*)
n :=n-1;
(*decrementer la taille du tableau *)
end
else
(* t[i] est non premier *)
i:=i+1 ;
(*tester l' élément suivant *)
end ;
writeln(' Voici les elements non premiers du tableau' );
(* affichage des éléments restants du tableau*)
for i := 1 to n do writeln(' t[',i,'
]=' , t[i]);
end.
- 104 -
D. Lenne, P. Trigano NF01 – P06
Exercice 1 :
i. Ecrire une procédure FREQ qui détérmine les fréquences des lettres de "a" à "z" d'
un texte de moins
de 255 caractères.
ii. Ecrire une fonction DEL qui supprime tous les espaces dans le texte.
iii. Ecrire une procédure DIV qui découpe ce texte en une série de chaines de caractères (<25
caractères) et les range dans un tableau "chaines".
iv. Proposer une méthode simple et rapide TRI pour trier ce tableau dans un ordre croissant.
v. Ecrire une fonction FUS qui fusionne deux tableaux de chaines de caractères dèja triés par la méthode
proposée en iv.
• Toutes les procédures et fonctions doivent avoir des arguments. Justifier votre mode de passage de
paramètres (par adresse ou par valeur).
• Le programme principal ne doit comporter que des appels de fonctions et procédures.
• Penser à des procédures d' affichage visualisant le résultat pour chaque réponse.
• Le jeu d'
essai doit suivre les étapes suivantes :
NB : faites en sorte que vos programmes soient lisibles (commentés et bien structurés)
Corrigé
program sort;
uses wincrt;
type
frequence = array['a'..'
z'] of integer; (* tableau d'
entier indexé par caractère*)
texte = string[255];
chaines = array[1..50] of texte
var
FR : frequence;
CH : texte;
T_ch : chaines;
choix : char;
{===================PROCEDURE FREQUENCE=================}
procedure FREQ(S:texte ; var F : frequence);
- 105 -
NF01 – P06 Algorithmique et programmation
{-=========================================================}
var
i : char;
j : integer;
begin
write(' Entrer le texte (<255 caracteres) : readln(S);
for i := ' a'to ' z'do F[i] := 0; (* initialisation du tableau des fréquences*)
for i := ' a'to ' z'do
for j := 1 to length(S) do
if (S[j] = i) then F[i] := F[i] +1;
(* incrémenter le nombre de fréquence de i *)
writeln(' Les frequence des letteres :' ) ; (* affichage du résultat*)
for i := ' a'to '
z'do writeln(i,'===> ' , F[i]);
end;
{===================PROCEDURE DEL ESPACE=================}
function DEL(S:texte) : texte
{-===========================================================}
var
i , l : integer;
begin
writeln( ' Texte avant suppression : ' , S);
l :=length(S);
for i:= 1 to l do
begin
if S[i]="" then
begin
S := delete(S,i,1); (* suppression du caractère espace*)
l := l -1;(*décrémenter la taille de la chaine *)
i := i-1;
end;
end;
DEL:=S;
end;
{=============PROCEDURE AFFICHAGE DES ELEMENT================}
procedure AFF(taille : integer ; t : table);
{================================================================}
var
i: integer;
begin
clrscr;
writeln(' les éléments du tableau : ' );
for i := 1 to taille do write(t[i],' ' );
end;
{============PROCEDURE DECOUPAGE EN CHAINES==============}
procedure DIV(S : texte ; var T : chaines);
{===============================================================}
var
i : integer;
begin
i:=1; j:=1;
while (i<length(S)) do
begin
T[j] := copy(S,i,8); (* extraire 8 caractères de la chaine *)
j := j+1;
i := i+8;
end;
end;
{=====================PROCEDURE ECHANGE=======================}
procedure echange (i , j : integer ; var t : table ):
{=================================================================}
- 106 -
D. Lenne, P. Trigano NF01 – P06
var
c: integer;
begin
c := t[i];
t[i] := t[j];
t[j] : = c;
end;
- 107 -
NF01 – P06 Algorithmique et programmation
{===================PROGRAMME PRINCIPAL================}
BEGIN
repeat
clrscr;
gotoxy(24,9); writeln('Menu Principal ' );
gotoxy(22,10);writeln('======================================='
);
gotoxy(25,11);writeln('1.
saisie du texte ');
gotoxy(25,12);writeln('2. fréquence des lettres'
);
gotoxy(25,13);writeln('3. Suppression de espaces ' );
gotoxy(25,14);writeln('4. Decoupage en chaines' );
gotoxy(25,15);writeln('5. Tri du tableau de chaines '
);
gotoxy(22,16);writeln('6. Fusion de deux tableaux ' );
gotoxy(22,17);writeln('7. Fin ');
gotoxy(30,18);write('========================================'
);
gotoxy(30,19);write(' Votre choix : ' );
readln(choix);
case choix of
'1': saisie(CH);
'2': FREQ(CH, FR);
'3': writeln('Apres suppression'
, Del(CH));
'4': DIV(CH , T_ch);
'5': Tri(T_ch);
'6': FUS(T_ch1, Tch_2, Tch3);
end;
until choix = '
5';
END.
- 108 -
D. Lenne, P. Trigano NF01 – P06
Exercice 2 :
La suite de Newton permet de calculer de manière itérative, la racine carrée
d'
un nombre A. La suite est définie par :
A
U i−1 +
U i −1
Ui =
2
A
U0 =
2
Ecrire un programme Pascal qui calcul la racine carrée d'un réel. Le calcul
doit s'
arrêter lorsque La condition suivante est satisfaite :
U i − U i−1 ≤ Epsilon
avec :
Epsilon : précision du calcul
Le programme doit afficher la valeur de la racine carrée et le nombre d'
itération
nécessaire pour le calcul.
A Epsilon A
Nbr d'
itérations
144 0.1
529 0.01
4588.654 0.001
35435.7584 0.0001
- 109 -
NF01 – P06 Algorithmique et programmation
N
d= ( Ai − Bi ) 2
1
EXERCICE 2 :
X[i,j] ≤ X[i,j+1]
X[i,j] ≤ X[i+1,j]
Exemple : N = 3, M = 4
1 3 7 14
2 5 9 15
5 8 13 19
- 110 -
D. Lenne, P. Trigano NF01 – P06
2. Ecrire une procédure Réduction qui permet de transformer une chaîne de caractère résultant de (1.) en
majuscules. Tout caractère autre que les caractères alphabétiques sont remplacés par des blancs.
3. Ecrire une procédure remplir_tableau qui permet de remplir un tableau de mots par la série des mots
de la phrase réduite. L’ensemble du texte doit se trouver dans ce tableau.
Remarque : le tableau peut comporter jusqu’à 100 mots de 20 caractères au maximum par mot.
4. Ecrire une fonction occurrence qui permet de calculer le nombre d’occurrence de chaque mot du texte.
5. Ecrire une procédure Tri qui permet de trier le tableau dans l’ordre alphabétique des mots.
6.
7. Ecrire une procédure affichage qui permet d’afficher la liste des mots par ordre alphabétique tel que
chaque mot est suivie de son occurrence.
• Toutes les procédures et fonctions doivent avoir des arguments. Justifier votre mode de passage de
paramètres (par adresse ou par valeur).
• Le programme principal ne doit comporter que des appels de fonctions et procédures. Une procédure ou
fonction peut appeler une autre procédure ou fonction.
• Le jeu d'essai doit suivre les étapes suivantes :
• afficher le texte saisi
• afficher le texte réduit
• afficher la liste des mots par ordre alphabétique, où chaque mot est suivi de son occurrence
NB : faites en sorte que vos programmes soient lisibles (commentés et bien structurés)
- 111 -
D. Lenne, P. Trigano NF01 – P06
Ecrire un programme Pascal qui construit une matrice carrée NxN (N vaut au maximum 10, la valeur de N
étant saisie par l’utilisateur) dans laquelle le carré le plus externe ne contient que des 1, le carré interne voisin
du carré externe ne contient que des 2, et ainsi de suite...
Q1 : Si l’utilisateur d’un tel programme saisit la chaîne de caractère ‘alpha’ dans la variable i :
a/ Que vaut j div 2 ?
b/ Donner pour toutes les valeurs de k les valeurs respectives de a, i[k] et i[j-k+1]
Q3 : Réécrire ce programme en donnant des noms d’identificateurs signifiant quelque chose à la lecture du
programme et en le présentant correctement.
NB : On rappelle que la fonction length retourne la longueur de la chaîne de caractère fournie en paramètre.
Problème n°3 :
a/ Langage (2 points) 10 mn
Définir le langage exprimé par le diagramme suivant :
- 113 -
NF01 – P06 Algorithmique et programmation
NOMBRE A B
A 0 A 1
B 2 B
Que génère cette grammaire ? Donner des exemples de phrases acceptées par ce langage ?
b/ Numération (4 points) 20 mn
Convertir en base 10 les nombres suivants : 111111102, 110111012, 12658, ADBC16
Convertir en binaire les nombres suivants : 102510, 102310, 12910 , 76848, F32E3D16
Convertir en octal les nombres suivants : 2ABC916, 100110112
Convertir en hexadécimal les nombres suivants : 110010112, 567348
Problème n° 4 :
A/ Que fait le programme suivant ? (3 points) 10 mn
program abc;
var a, b, c, temp : integer;
begin write('a='); readln(a);
write('b='); readln(b); write('c='); readln(c);
if b > a then begin temp := a;
a := b; b := temp;end;
if c > a then begin
temp := a; a := c; c := temp;end;
if c > b then begin
temp := b; b := c;
c := temp;end;
writeln(a, b, c); end.
Ecrire un algorithme qui demande une valeur V (réelle) comprise entre 1 et 2, et qui calcule le plus petit N (entier) tel
que: 1 + 1/2 + 1/3 + ... + 1/N > V
Je voudrais calculer les impôts de ma famille. Soit MI le montant imposable de ma famille (montant imposable de mon
conjoint et de moi-même). Je dois d’abord calculer RI le revenu imposable, en appliquant d’abord un abattement de 10 %
sur MI, puis un abattement de 20% sur le résultat précédent.
- 114 -
D. Lenne, P. Trigano NF01 – P06
1 - Ecrire un programme PASCAL permettant de calculer l’imposition d’une famille ou d’un célibataire.
2 - Sachant que les salaires augmentent en fonction du coût de la vie (1,5% par an) et que l’on peut espérer une
augmentation de 500 F tous les deux ans, calculer l’imposition de cette famille sur les 20 ans à venir (on ne considérera
pas de changement de N).
Le programme écrira le résultat sous la forme :
Imposition année 1 : 12980 F
Imposition année 2 : 13380 F
Imposition année 3 : 13580 F
....
Imposition année 20 : 20765 F
- 115 -
NF01 – P06 Algorithmique et programmation
Question 1 : (1 point)
Ce programme est très mal présenté, en effet l'
impression ne marche plus très bien. Réécrivez-le proprement en
utilisant les règles d'
indentation du pascal.
Question 2 : (1 point)
Un bon moyen pour savoir ce que fait un programme est de le faire fonctionner manuellement une fois. Donnez
exactement les affichages que fait le programme quand on le fait fonctionner en saisissant la valeur 9.
Question 3 : (1 point)
Vous commencez probablement à avoir une petite idée de ce que fait ce programme. Mais un deuxième essai est
nécessaire. Donnez exactement les affichages que fait le programme quand on le fait fonctionner en saisissant la
valeur 2.
Question 5 : (1 point)
Vous n'
êtes probablement pas comme cette personne et vous ne commettez jamais deux fois la même erreur.
Réécrivez le programme en donnant des noms d'
identificateurs qui veulent dire quelque chose et en ajoutant des
commentaires.
Question 7 : (1 point)
1 a
Soit la formule de récurrence suivante : xn+1 = xn + 3 ( - xn)
(xn)2
- 116 -
D. Lenne, P. Trigano NF01 – P06
Ecrire un algorithme puis un programme Pascal qui lit un entier n positif et non nul, puis
calcule le nème nombre de la suite de Fibonacci. La suite se définie ainsi :
F(0) = 0, F(1) = 1 et F(i) = F(i-1) + F(i-2) pour i > 1.
Ecrire l'
algorithme et le programme Pascal correspondant.
Il s'
agit de comprendre les méandres d' un programme qui n' est pas de votre cru. Les plus
courageux pourraient essayer de le faire tourner à la main. Faites attention à ne pas généraliser
trop rapidement un comportement singulier.
PROGRAM Inconnu; VAR n : LONGINT; BEGIN WRITE(' Introduisez un entier n :
'); READLN(n); WRITE(n,' donne'); WHILE NOT(n = 1) DO BEGIN IF n MOD 2 = 0
THEN n := n DIV 2 ELSE n := n * 3 + 1; WRITE(' ',n); END; READLN; END.
1. Ce programme est très mal présenté, recopiez-le proprement en utilisant les règles
d'indentation du Pascal.
2. Un bon moyen pour découvrir le but d' un programme est de le tester (compléter la table
B). On vous demande d' écrire la valeur de la variable n pour chaque itération. Chaque ligne
du tableau correspond à une valeur initiale différente pour n. Chaque colonne correspond à
une itération.
- 117 -
NF01 – P06 Algorithmique et programmation
Effectuez les conversions demandées. On justifiera en expliquant clairement chaque conversion. La base de
chaque nombre à convertir est indiquée en indice.
On vous demande de dessiner les diagrammes de CONWAY qui permettent de vérifier la grammaire suivante :
aa+, ba+, ab+, bb+, aa-, ab-, ba-, bb-, aaa++, aba+-, bab-- ; soit une suite de signes a ou b, suivie d'
une suite de
signes + ou -. On remarquera cependant qu' il y a toujours un signe de type '
a'ou 'b'de plus que de signe '
+'ou ' -'
.
Program inconnu;
var i,j : integer; a,d,c,b,m :longint;
begin read(i,j);m:=0; a:=1;
for b:=1 to j do a:=a*i; d:=1;
writeln('étape 1 : valeur de a et de d :',a:6,d:6);
for c:=1 to a do
d:=d*c; writeln('étape 2 : valeur de a et de d :', a:6,d:6);
d:=1;a:=0;for b:=1 to j do d:=d*b;
writeln('étape 3 : valeur de a et de d :', a:6,d:6);
- 118 -
D. Lenne, P. Trigano NF01 – P06
Q2 : Réécrire ce programme en donnant des noms d’identificateurs signifiant quelque chose à la lecture du
programme, en le présentant correctement et en y ajoutant des commentaires.
Q4 : A quoi correspond chaque writeln lors des 4 étapes ? Quel est le calcul présenté ?
Voici les tableaux que vous devez remplir pour répondre à la question Q1 :
i =2 et j=3 a b c d
étape 1
étape 2
étape 3
étape 4
i =3 et j=2 a b c d
étape 1
étape 2
étape 3
étape 4
On se propose de calculer x puissance y (noté x^y avec x et y des entiers) sachant que l’on ne dispose que de
l’élévation au carré, de la division euclidienne par 2 et de la multiplication de deux nombres, le tout en
minimisant le nombre d’opérations.
Dans le cas où y est pair les facteurs de x sont regroupés deux à deux. Prenons un exemple : x^8
Il n’y a donc que 3 multiplications à effectuer : x*x, x^2 * x^2 et x^4 * x^4
contre 7 dans le calcul classique : x*x*x*x*x*x*x*x
Dans le cas ou y est impair on se ramène au cas précédent. Exemple avec x^5
- 119 -
NF01 – P06 Algorithmique et programmation
1 ) Donner l’algorithme qui calcul la puissance x^y grâce à cette méthode, les valeurs de x et de y étant entières
et à demander à l’utilisateur.
2) Exécuter cet algorithme dans les deux cas de figure suivants : x=3, y=4 et x=2, y=10. On donnera dans un
tableau la valeur des variables dans leur état initial et à la fin de chaque boucle de calcul.
* * * * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
L'utilisateur doit préciser le nombre (toujours impair) de lignes et de colonnes souhaitées. Il y a toujours autant
de lignes que de colonnes (il s' agit d'
une matrice carrée). Dans notre exemple, ce nombre est 11.
Une expression est une combinaison d' opérandes (variables et constantes), d'
opérateurs et de fonctions, comme
par exemple : "i+1", "2.08E3 * x" ou encore "(x2) OR (x<8)" .
Pour évaluer des expressions, il suffit d'utiliser les règles de décomposition syntaxique inscrites dans les
diagrammes de Conway du langage Pascal.
Ainsi, par exemple, l'
expression "a*b+c"se décompose en :
- 120 -
D. Lenne, P. Trigano NF01 – P06
donc "a*b+c"est correct en Pascal. De plus, cette expression correspond à la somme de la variable c avec le
résultat du produit de la variables a par la variable b.
Utiliser les diagrammes de Conway et les règles de décomposition syntaxique pour déterminer si les expressions
suivantes sont correctes en Pascal. Préciser, en cas de succès, l'
ordre de priorité des opérations
1) 2*sqrt(5+x)+a*b-6
2) a + ord((i)*10) < sqr(b*i+a)
3) sqr(x*sqr(y+15)) > sqrt(x+y)
- 121 -
D. Lenne, P. Trigano NF01 – P06
On dispose de deux fichiers de texte, contenant chacun une liste de noms et prénoms d’étudiants, ainsi
qu’une moyenne pour chaque étudiant. Chaque fichier correspond en fait à une matière (ou une UV). Les
données sont rangées en lignes, chaque ligne correspondant à un étudiant. Une ligne comporte le nom, le prénom
(séparé par un espace) et la moyenne (séparée également par espace), selon le format suivant :
Chaque fichier est déjà trié, par ordre alphabétique sur le nom de l’étudiant. Ces fichiers peuvent comporter
des noms et des prénoms communs, c’est à dire qu’un même étudiant peut être enregistré dans les deux fichiers,
avec une moyenne éventuellement différente (il s’agit de matières distincts). On peut également trouver des
étudiants ayant le même nom, mais un prénom différent (exemple : ‘Bennani Youssef’ et ‘Bennani Younes’ ou
‘Joly Fabien’ et ‘Joly Guilhem’). Les fichiers se terminent tous deux par une ligne composée uniquement de
blancs.
Nous désirons écrire un programme effectuant la fusion des deux fichiers. On fabriquera un troisième
fichier de texte, contenant une seule liste d’étudiants, triée par ordre alphabétique sur le nom, et comportant pour
chaque ligne le nom de l’étudiant, son prénom (séparé par un espace), ainsi que sa note globale, recopiée à partir
des deux fichiers (séparée par un espace). Dans le cas d’un étudiant présent dans les deux fichiers, il faudra
calculer la moyenne générale des deux notes obtenues. Dans le cas contraire, il suffira de recopier la note de
l’étudiant, à partir du fichier concerné.
1. Ecrire une procédure permettant de lire des nombres réels, écrits sous forme de caractères (chiffres séparés
éventuellement par un point), et de convertir ces caractères en un nombre réel (type real).
5. Réaliser le programme en entier, en utilisant les procédures définies précédemment. Bien identifier les
types de données, la partie lecture/écriture, ainsi que la fusion.
avant appel
chaine1 = "aaaa"
chaine2 = "bbbb"
ajout(chaine1,chaine2)
- 123 -
NF01 – P06 Algorithmique et programmation
après appel
chaine1 = "aaaab"
chaine2 = "bbb"
Un voyageur, devant visiter N villes (N 20), désire le faire au moindre coût. Ce voyageur averti utilise
l'
algorithme suivant : à partir d'
une ville, il se rend à la ville la plus proche qu'
il n'
ait pas encore visitée. On veut
écrire un programme PASCAL qui mette en œuvre cet algorithme.
Les distances entre villes, prises deux à deux, sont enregistrées dans un tableau à deux dimensions.
On pourra à cet effet adopter la déclaration commune suivante :
var RESEAU : array [1 . . 20, 1 . . 20] of real ;
Lors de la seconde guerre mondiale, la 7ème Compagnie avait eu de gros problèmes d’orientation
lorsqu’elle s’est retrouvée au milieu des lignes allemandes. De façon à obvier à ce genre de désagrément, le
Colonel Urbain Théodore Constant aimerait que vous informatisiez un certain nombre de tâches inhérentes à la
localisation des compagnies de son régiment et notamment de la 7ème Compagnie.
La 7ème Compagnie est commandée par le Capitaine Théophile Perron assisté de son fidèle Lieutenant
Frédéric Dominici (Commandant Adjoint) et du Sous-lieutenant Christophe Hamel (Officier d’instruction). Cette
compagnie est composée de quatre sections dirigées respectivement par les Aspirants Ghislaine Monchy-
Humière et Bruno François, et les Adjudants Laurent Salant et Didier Von Moeschler. Au sein d’un régiment,
chaque compagnie possède un numéro, un commandant, un commandant adjoint, un officier d’instruction,
différentes sections dont le nombre varie (au maximum : huit ; pour la 7ème Compagnie : quatre), et différentes
positions en fonction de dates. Chaque position est repérée par une coordonnée (latitude, longitude). On ne
conserve en mémoire que les dix dernières positions d’une compagnie, ceci au sein d’un tableau contenant pour
chaque position sa date et ses coordonnées. Par exemple, le 04/06/96 la 7ème Compagnie se trouvait à la
position 45.3° (latitude), 5.1° (longitude). Chaque section comporte un numéro, un chef, un adjoint et vingt
soldats. Par exemple, la section n°1 est dirigée par l’Aspirant Ghislaine Monchy-Humière assistée du Chef
Thibault Monestier, son adjoint, et comporte vingt soldats. Chaque soldat possède un numéro matricule, un nom,
un prénom et un grade sur vingt caractères chacun, ainsi qu’une date de naissance qui se compose d’un jour
compris entre 1 et 31, d’un mois entre 1 et 12 et d’une année. Par exemple, le Soldat de 1ère classe Raymond
Noël a le numéro matricule 20007 et est né le 20/01/72. Quant au Caporal Stéphane Simonin, il est né le
25/11/71 et a le numéro matricule 12045.
- 124 -
D. Lenne, P. Trigano NF01 – P06
2) Réalisez la fonction Ajout permettant d’ajouter une compagnie passée en paramètre dans le fichier
(regiment.doc) des compagnies du régiment. Cette fonction renverra le résultat de la fonction prédéfinie
IORESULT. La fonction IORESULT renvoie “0” si l’opération d’écriture s’est bien passée, un autre nombre
sinon. L’ajout de la compagnie s’effectuera en fin de fichier et toutes les opérations inhérentes à la gestion du
fichier s’effectueront dans cette fonction. Aucune variable globale ne sera utilisée, hormis la variable “rgt” de
type RÉGIMENT (le type RÉGIMENT correspond au type du fichier “regiment.doc”).
3) Réalisez la procédure Saisie_position permettant de saisir une position (latitude, longitude) ainsi que
la date d’une compagnie donnée dont on affichera le numéro sur deux caractères, ceci pour un emplacement “i”
entre 1 et 10, dans le tableau des positions de la compagnie. Cette procédure n’utilisera pas de variables globales.
Si vous réussissez cette mission, le Capitaine Théophile Perron soumettra sûrement au Commandant Walter
Piget votre nomination au grade supérieur. De plus, si vous persévérez dans la voie de la réussite, vous serez
certainement décoré par le Général Philippe Ferrer d’ici cinq ans.
NB : Toute ressemblance avec des personnes ou des événements existant ou ayant existé ne serait que pure
coïncidence.
- 125 -
NF01 – P06 Algorithmique et programmation
then begin
TREE_PRINT(t, i) ; TREE_PRINT(t, j) ;
end ;
writeln(t[sub_root]) ;
t[sub_root] := 0 ;
end ;
begin
for index := 1 to 100 do tab[index] := 0 ;
root := 1 ;
tab[1] := 50 ; tab[2] := 60 ; tab[3] := 70 ; tab[6] := 35 ;
tab[7] := 80 ; tab[12] := 1 ; tab[13] := 2 ; tab[14] := 34 ;
tab[15] := 36 ; tab[28] := 4 ; tab[29] := 7 ;
TREE_PRINT(tab, root) ;
end.
On considère que chacun des trois fichiers possède un enregistrement sur chacune des personnes.
On se propose de créer un seul fichier regroupant les informations des trois autres fichiers.
On désire programmer un agenda, dans le but de mémoriser une liste de rendez-vous (100 rendez-vous
maximum). Un rendez-vous est défini par sa date, ses horaires de début et de fin (à la minute près) et sa
description (message de 200 caractères au plus).
Le programme demande d' abord de saisir tous les rendez-vous. L' utilisateur entre ensuite la date d'
un jour
(exemple : 16 11 1997), et le programme affiche alors tous les rendez-vous de ce jour.
1 - Indiquer les structures de données qu' utilisera le programme, c' est-à-dire les déclarations Pascal des
constantes, types et variables du programme principal. Commenter chaque déclaration pour en expliquer la
signification.
- 126 -
D. Lenne, P. Trigano NF01 – P06
4 - Ecrire la procédure afficher_rdv_du_jour, qui prend comme paramètres d' entrée la date d'
un jour et
une liste de rendez-vous, et affiche à l'
écran les rendez-vous du jour spécifié. Exemple d'
affichage :
Journée du 16 11 1997
8h15 - 10h15 réunion équipe logicielle
17h23 - 17h45 prendre le bus !!
18h30 - 19h30 tennis jp
3 rendez-vous pour cette journée
program croise ;
{===========}
var nb, res : integer;
begin
if n = 1
then f := 0
else f := g (n)
end;
begin
readln(nb);
res := f(nb);
writeln ('f (', nb, ') = ', res)
end.
Pour trier un tableau T contenant des nombres réels compris entre 1 et 1000 et ayant des parties entières
différentes, on opère de façon suivante :
• on place les nombres dans un tableau intermédiaire INTER, chaque nombre X étant placé à l'
indice
ENT(X) (ENT désigne la fonction "partie entière"). Cette opération fournit un tableau trié contenant des "cases
vides".
• on transfère ensuite les nombres de INTER vers un tableau de résultat R, pour obtenir un tableau trié sans
"case vide".
- 127 -
NF01 – P06 Algorithmique et programmation
1 2 3 4 5
1 2 3 4 5 6 7 8 9
1 2 3 4 5
Au lancement du programme, on commence avec une liste vide. On propose ensuite de façon répétitive un menu
principal où l’utilisateur peut choisir entre 4 types d’action :
• s’il entre s, on lui demande de saisir un nouveau nom (qui ne doit pas encore exister dans la liste) puis on lui
demande de saisir la valeur à mémoriser et son unité ; le nombre ainsi entré est ajouté à la fin de la liste ;
exemple de saisie :
--- Saisie d’un nouveau nombre ---
Nom : distance
Valeur : 120
Unité : km
• s’il entre a, on affiche la liste des nombres déjà entrés, chaque nombre sur une ligne (son nom, sa valeur et son
unité) ; exemple d’affichage après la saisie précédente :
--- Liste des nombres mémorisés ---
temps 2.00 h
distance 120.00 km
• s’il entre +, -, * ou /, on demande de saisir le nom de deux nombres (qui doivent déjà exister dans la liste) et le
nom du nombre résultat (qui doit être différent des noms existants dans la liste) ; on effectue alors l’opération
demandée entre les deux nombres désignés, et on stocke le résultat dans le nouveau nombre, celui-ci étant ajouté
à la fin de la liste (son unité est déduite de l’unité des opérandes); exemple d’opération :
--- Opération / ---
Nom du premier opérande : distance
Nom du second opérande : temps
Nom du résultat : vitesse
Résultat : vitesse = distance / temps = 60.00 km/h
- 128 -
D. Lenne, P. Trigano NF01 – P06
1- Quelles informations ce programme prend-il en entrée ? Quel résultat produit-il en sortie ? Définir les
principales variables utilisées dans le programme et leur type.
2- Décrire l’architecture globale du programme. Pour traiter les choix a, s, et [+ - * ou /] du menu principal, on
appelle respectivement les procédures afficher_liste, saisir_nombre et calculer_operation
(voir question suivante).
5- Ecrire en Pascal la fonction cherche_nom, qui prend comme paramètres un nom et une liste de valeurs
nommées ; si le nom donné existe dans la liste, cette fonction retourne la position du nombre correspondant, et 0
sinon.
N.B.: Pour les questions 1 à 3, décrivez la solution proposée de façon informelle, de façon à en faire ressortir
les grandes lignes - comme si vous deviez expliquer le fonctionnement du programme à un interlocuteur
non-informaticien. Pour cela, n’utilisez ni du code Pascal, ni une traduction littérale du Pascal en
français, mais des phrases rédigées.
Indiquez, dans les cases correspondantes de la feuille fournie pour répondre à cet exercice, la nature, le type
et la valeur des identificateurs utilisés dans le programme suivant aux points indiqués. Les instructions de la
ligne où est posé le point sont exécutées avant de déterminer la nature, le type et la valeur des identificateurs
quand le programme s' exécute.
La nature est soit une variable globale (notée VG), soit une variable locale (notée VL), soit un paramètre
formel (noté PF). Le type sera à déterminer parmi les types simples du langage PASCAL, soit integer (I), soit
real (R), soit boolean (B), soit char (C). La valeur sera à déterminer. Par conséquent une réponse sera un triplet,
par exemple (VG, I, 34), autre exemple (PF, C, ' g'
).
var
a,b : integer; c : real; d : boolean;
- 129 -
NF01 – P06 Algorithmique et programmation
c := chr(b) ;
c := chr((2 * a) + ord(c));
a := ord(‘A’) ; { point 3 }
end;
begin { et voici le programme principal }
a := 9 ;
b := 6 ;
d := true ;
c := F1( a, b, 1 ) ;
d := F2( 7, 3 ) ;
F3( b , 53) ; { point 4 }
end.
Voici un extrait de la table des codes ASCII qui peut vous être utile pour répondre à la question.
code base 10 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
caractère 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F
Voici le tableau que vous devez remplir pour répondre à la question numéro 3 :
a b c d
point 1
point 2
point 3
point 4
Je désire gérer ma cave à vin. Une bouteille de vin est caractérisée par :
- son nom
- son type (rouge, blanc, rose)
- son annee (1800 .. 1998)
- sa note (0 .. 20)
2 – Ecrire une procédure creeCave(nom-du-fichier), qui créer le fichier nom-du-fichier et enregistre dans celui-ci
l’ensemble des vins constituant la cave.
- 130 -
D. Lenne, P. Trigano NF01 – P06
4 – Ecrire une procédure eclate(nom-du-fichier) qui, à partir du fichier principal nom-du-fichier, va créer 3 fichiers :
rouge, blanc et rose contenant uniquement les vins de même nature.
On considère un jeu de dominos, comportant bien sûr 28 dominos. On rappelle que chaque domino présente sur
l’une des faces (l’autre étant pleine) une paire de chiffres {i,j}
avec 0 ≤ i,j ≤ 6. On considère dans cet exercice des séquences de dominos, le principe de constitution d’une
séquence étant le suivant : deux dominos d1 = {i1,j1} et d2 = {i2,j2} peuvent être accolés l’un à l’autre à condition
d’avoir un chiffre en commun : ainsi, si j1 = j2, alors d1 pourra être suivi de d2, formant au total la séquence
(i1,j1,j2,i2).
2) Choisir l’une de ces représentations. Soit alors D une séquence de dominos déjà existante. Concevoir une
fonction qui admettant D en argument renvoie vrai si D respecte bien le principe de formation, et faux sinon.
3) Soit J un joueur qui va puiser successivement (on dit piocher) dans le tas des 28 dominos. On demande ici de
réaliser une procédure qui permette à J, en effectuant des tirages successifs, de mener jusqu’à son terme la
constitution d’une séquence de dominos. Pour simplifier , on admettra que le tirage d’un domino est simplement
réalisé par une lecture de deux chiffres compris entre 0 et 6. Une fois le domino tiré, si l’application du principe
de chaînage est possible, ce domino sera ajouté à la séquence, là où il convient (nécessairement en début ou en
fin de séquence), sinon il sera définitivement éliminé. Ce processus s’arrêtera lorsqu’il n’y aura plus rien à
piocher.
Sur la planète Infok les Pascalok jouent à un jeu très populaire. Mais dans chaque région d’Infok où ce joue un
match, les Pascaloks ont la mauvaise habitude de ne pas utiliser les mêmes techniques d’affichage des scores.
Néanmoins tous les scores doivent apparaîtrent sur toute la planète. Aidez les Pascaloks chargés des affichages à s’y
retrouver :
- Les Binoks n’utilisent que des lampes éteintes ou allumées pour afficher les résultats. Ils sont donc en base 2.
- Les Octoks, toujours étourdis, ont malencontreusement perdu les chiffres 8 et 9. Ils sont donc en base 8.
- Les Hexadécimoks, réputés pour leur avarice, ne veulent utiliser que deux caractères pour afficher les scores,
ainsi la base 16 leur suffit.
- Enfin les Décimoks, qui sont la honte des Pascaloks, n’utilisent que des chiffres dans une bête base 10.
- 131 -
NF01 – P06 Algorithmique et programmation
program pro_c_est_dur;
Procedure BAZAR ;
Begin
x := x*2 ;
y := y*10 ;
z := z*100 ;
AFFICHE(8,x,y,z) ;
End ;
Procedure MACHIN(x,y,z : integer) ;
Begin
z := x*2 ;
x := y ;
y := z+3 ;
End ;
- 132 -
D. Lenne, P. Trigano NF01 – P06
k := 25 ;
AFFICHE(1,i,j,k);
BIDULE(i,j,k);
AFFICHE(10,i,j,k);
End.
Remplir le tableau de la page suivante, en respectant bien les valeurs données pour le premier paramètre (n) de la
procédure AFFICHE (ces valeurs de n indiquent l’ordre d’appel de la procédure). Par exemple, lorsque n vaut 1,
x a pour valeur 100, y vaut 50 et z vaut 25. Compléter le tableau pour les autres valeurs de n.
Voici le tableau que vous devez remplir pour répondre à la question numéro 4 . Il correspond à l’affichage
effectué avec l’instruction writeln(n,x,y,z) dans la procédure AFFICHE, selon la valeur du paramètre n
(premier paramètre de la procédure AFFICHE). Par exemple, lorsque n vaut 1, x a pour valeur 100, y vaut 50 et
z vaut 25. L’instruction writeln(n,x,y,z) donne alors : 1 100 50 25 (ce qui correspond à la première ligne du
tableau).
Compléter le tableau pour les autres valeurs de n.
n x y z
1 100 50 25
10
Le responsable d’une vidéothèque désire connaître chaque jour la liste de toutes les cassettes qui sont louées,
avec le nom du client emprunteur. Chaque cassette est identifiée par un numéro unique. Il dispose de trois
fichiers :
- 133 -
NF01 – P06 Algorithmique et programmation
Fichier 3 : «Client» contient le nom du client, son prénom, son adresse, son numéro de téléphone
(On suppose que deux clients ne portent pas le même nom).
1pt 1 – Indiquez les structures de données qu’utilisera le programme : c’est à dire les déclarations des
constantes, des types et des variables du programme principal.
2pts 2 – Ecrire une procédure Recherche_Dernier_Emprunt qui renvoie à partir d’un numéro de cassette, le
dernier emprunt de la cassette : c’est à dire la date de début, la date de fin de l’emprunt et le nom de
l’emprunteur.
2pts 3- Ecrire une procédure Recherche_Client qui recherche le prénom, l’adresse et le numéro de téléphone à
partir du nom du client.
On cherche à réaliser un petit logiciel de traitement de texte (Mon Mini-Word). Ecrire un programme qui justifie
une phrase, c'
est-à-dire qui l'étend depuis la marge gauche jusqu' à la marge droite de la feuille. Ce programme
commence par demander la largeur de la feuille.
1. Ecrire un programme qui commence par demander une largeur, puis demande une chaîne de longueur
inférieure à cette largeur qui se termine par un point, et compte le nombre de mots de cette chaîne.
2. Ecrire le programme qui décompose la chaîne de façon à répartir ''au mieux''les blancs qui s'y trouvent.
Exemple :
largeur : 27
La chaîne
t o t o n' e s t p a s c o n t e n t .
devient :
t o t o n' e s t p a s c o n t e n t .
Problème n°19 (6 points) : Var ou pas Var, Local ou pas ? telle est la question...
Voici un programme qui ne sert à rien mais qui affiche plein de choses.
-----------------------------------------------------------------------------------------------------------------
PROGRAM TRUC
CONST C=30;
VAR A,B,D,E : integer;
- 134 -
D. Lenne, P. Trigano NF01 – P06
end;
begin
A:=10; B:=20; E:=70;
Affiche(A,B);
D:=Calcul(A,B);
writeln(‘Truc’);
writeln(‘A=‘,A); writeln(‘B=‘,B); writeln(‘C=‘,C); writeln(‘D=‘,D); writeln(‘E=‘,E);
end.
-----------------------------------------------------------------------------------------------------------------
Q2 - On modifie les paramètres de la fonction -Calcul- et de la procédure -Affiche- comme suit : PROCEDURE
Affiche(D : integer; var E : integer);
FUNCTION Calcul(var D : integer; E : integer);
Complétez le tableau Q2 avec les valeurs affichées lors de l’exécution après modifications.
Complétez le tableau Q2 avec les valeurs affichées lors de l’exécution après modifications.
Q1 Q2
avant modifications après modifications
Affiche Affiche
A= A=
B= B=
C= C=
D= D=
E= E=
Calcul Calcul
A= A=
B= B=
C= C=
D= D=
E= E=
Truc Truc
A= A=
B= B=
C= C=
D= D=
E= E=
Afin de représenter des images en informatique on utilise des tableaux de points (ou pixels). Dans le cas
d'
images en noir et blanc chaque point est doté d'
une luminosité plus ou moins forte entre le noir et le blanc, on
- 135 -
NF01 – P06 Algorithmique et programmation
appelle cela les niveaux de gris. Dans le cadre de cet exercice on travaillera avec des images en 256 niveaux de
gris. Par convention on adopte que le noir vaut 0 et le blanc 255.
Question 1 : Proposer un type IMAGE permettant de représenter une image de résolution 640 x 480 points.
Question 2 : Proposer une procédure qui éclaircit une IMAGE passée en paramètre. L' éclaircissement consiste à
augmenter la luminosité de chaque pixel d' une intensité comprise entre 1 et 255. Ce nombre sera également
passé en paramètre à la procédure. Attention la luminosité maximum est 255 !
Question 3 : Proposer une procédure qui contraste une IMAGE passée en paramètre. Cette procédure de
contraste consiste à éclaircir les points clairs (de luminosité supérieure à 127) et à assombrir les points sombres
(de 0 à 127). Comme dans la question précédente l' intensité du contraste sera passée en paramètre.
Question 4 : Proposer une fonction booléenne qui détermine si deux IMAGES passées en paramètre sont
identiques.
Certains romanciers ont imaginé les ravages qu' occasionnerait la disparition de l' électricité dans notre monde.
Imaginons ceux que causerait la disparition des boucles dans un monde un peu particulier … Dans ce monde un
programme permet de calculer la durée de vie d'un être vivant, selon la loi suivante :
Chaque être a (150-x)% de chance de survie chaque année.
ou x représente l'âge courant de l'être concerné.
Le programme actuellement utilisé pour faire fonctionner cette loi est le suivant:
program avec_boucles;
function age_deces (age_naissance:integer):integer;
var age_courant:integer;
begin
age_courant:=age_naissance;
randomize;
while random(100) < (150-age_courant) do
age_courant:=age_courant+1;
age_deces:=age_courant;
end;
begin
writeln(age_deces(0));
end.
Note : La fonction random(x) renvoi un nombre entier aléatoire entre 0 et x-1. La procédure randomize permet
de réinitialiser le générateur de nombre aléatoire pour obtenir un nombre différent à chaque appel de random.
- 136 -
D. Lenne, P. Trigano NF01 – P06
Question : Réécrivez la fonction age_deces de façon à la rendre récurssive (et donc sans utiliser de boucle
while).
Le gérant d’une petite confiserie ne proposant que 5 types de bonbons et 5 types de chocolats
s’est amusé durant ses loisirs à concocter son propre programme Pascal de facturation. Cette
première version ne lui permet pour l’instant que de calculer le montant de la facture de
chaque client. Ce programme demande tout d’abord de rentrer le code de l’article acheté puis
la quantité, ce processus se répétant jusqu’à ce que l’utilisateur tape le code –1 qui a pour
conséquence l’arrêt de la saisie et l’affichage du montant global des achats. Ce programme
permet également de rejeter la prise en compte de codes incorrects ne correspondant à aucune
marchandise. Le listing de ce programme vous est donné en annexe (feuille séparée). Prenez-
en d’abord connaissance.
Question 1 : Dans ce programme, le gérant a déclaré en constante les différents types de marchandises dont il
dispose. Une malencontreuse erreur de frappe a fait disparaître certaines déclarations de types utilisés dans le
programme. Remédiez à cela en complétant les zones correspondantes sur le listing fourni, sur la feuille
détachable.
Complétez toutes les cases des tableaux fournis en annexe (feuille séparée) en spécifiant les valeurs prises par les
différentes variables en question après le traitement de chaque client.
**********************
* Nouveau client *
**********************
Référence de l' article (-1 pour sortir) : 0010
Quantité : 4
Référence de l' article (-1 pour sortir) : 1001
Quantité : 4
Référence de l' article (-1 pour sortir) : 1111
Quantité : 3
Cet article n’existe pas
Référence de l' article (-1 pour sortir) : 0001
Quantité : 4
Référence de l' article (-1 pour sortir) : 0101
Quantité : 5
Référence de l' article (-1 pour sortir) : -1
Somme dûe :
qte ?, emplacement ?, somme ?, j ?
(Nouveau client : « n » ; Quitter : « q »)
n
********************
* Nouveau client *
********************
Référence de l'
article (-1 pour sortir) : 1010
Quantité : 3
Référence de l'
article (-1 pour sortir) : 1001
Quantité : 3
Référence de l'
article (-1 pour sortir) : 0110
Quantité : 3
- 137 -
NF01 – P06 Algorithmique et programmation
Référence de l'
article (-1 pour sortir) : -1
Somme due :
qte ?, emplacement ?, somme ?, j ?
(Nouveau client : « n » ; Quitter : « q »)
n
Question 3 : Le gérant souhaite de plus afficher une facture détaillée des achats de chaque client en présentant
tout d’abord les bonbons puis les chocolats. Un exemple de la présentation souhaitée est donné ci-dessous. Créez
une procédure qui vous permette d’obtenir un affichage de ce type. Placez également dans le programme
principal la ligne de commande faisant appel à cette procédure.
FACTURE
4 bonbons « Ourson » : 0.8 F
4 bonbons « Frite : 0.4 F
TOTAL : 20 F
- 138 -
D. Lenne, P. Trigano NF01 – P06
- 139 -
NF01 – P06 Algorithmique et programmation
- 140 -