Professional Documents
Culture Documents
Support de Cours Algorithmique
Support de Cours Algorithmique
Support de Cours Algorithmique
Les résultats représentent ici la solution au problème à résoudre dont les étapes de résolution ne
sont pas uniques.
5. Fonctionnement de l’ordinateur
En première approche, un ordinateur est constitué des éléments suivants :
- une unité centrale (contenant le processeur),
- une mémoire centrale,
- des organes périphériques permettant :
✓ la communication avec l'utilisateur : écran, clavier, souris, imprimante ...
✓ le stockage : disque dur, lecteurs de cd, de dvd, de bandes, ...
- des composants matériels divers : cartes son, vidéo, cartes d'acquisition ...
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.
6. Comment parler à l’ordinateur
L’exécution des programmes permettent de parler à l’ordinateur en outre les périphériques d’entrées
usuelles. Un ordinateur est un puissant calculateur dont la mise sur pied des programmes améliore la
qualité des résultats recherchés. Il y a deux étapes importantes pour communiquer avec un ordinateur :
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 le bloc-notes de windows. 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.
7. Pratique de l’algorithmique
L'algorithme est un moyen pour le programmeur de présenter son approche du problème à d'autres
personnes. En effet, un algorithme est l'énoncé dans un langage bien défini d'une suite d'opérations
permettant de répondre au problème. Un algorithme doit donc être :
− lisible: l'algorithme doit être compréhensible même par un non informaticien de haut niveau:
l'algorithme doit pouvoir être traduit en n'importe quel langage de programmation, il ne doit donc pas
faire appel à des notions techniques relatives à un programme particulier ou bien à un système
d'exploitation donné.
− précis: chaque élément de l'algorithme ne doit pas porter à confusion, il est donc important de lever
toute ambiguïté.
− concis: un algorithme ne doit pas dépasser une page. Si c'est le cas, il faut décomposer le problème
en plusieurs sous problèmes.
− structuré: un algorithme doit être composé de différentes parties facilement identifiables.
En d’autres termes, un algorithme :
- ne doit pas être ambigu
- doit être une combinaison d'opérations élémentaires
- doit fournir un résultat en un nombre fini d'opérations, quelles que soient les
données d'entrée.
Pour mieux cerner les contours d’un algorithme, il faudrait suivre cette démarche méthodologique :
- Définir clairement le problème
- Etablir l'algorithme au moyen d'une analyse descendante
- Déterminer une séquence d'instructions de niveau supérieur (sans entrer dans les détails)
- Ecrire chaque instruction de niveau supérieur à l'aide d'instructions élémentaires
- Ecrire le programme et la documentation
- Tester
- Revenir sur les étapes précédentes si nécessaire
8. Les problèmes fondamentaux en algorithme
Un algorithme se compose de deux parties étroitement liées :
− les données (i.e. les matériaux sur lesquels on agit).
− le processus de calcul, composé d’une suite d’instructions.
La complexité d’un algorithme est fonction de cet algorithme et des paramètres fournis à celui-ci.
Souvent, un calcul exact de la complexité s’avère très difficile, voire impossible.
On s’oriente en général vers les calculs suivants :
• La complexité en pire cas consiste `a calculer la quantité égale au maximum des complexités pour
toutes les données de taille N.
• La complexité en moyenne consiste `a associer aux données X de taille N une probabilité, et à
considérer la moyenne de la complexité de l’algorithme sur toutes ces données.
Chacune de ces deux complexités est importante. La complexité en pire cas est rassurante. Elle nous
affirme que jamais l’algorithme ne se comportera de façon imprévue. La complexité en moyenne nous
dit que certains algorithmes, même s’ils s’avèrent peu intéressants sur certaines données, peuvent se
comporter de façon tout `a fait correcte en général.
En bref, on peut résumer les complexités de l’algorithme par :
- Durée du temps d’exécution : se termine en un temps fini
- Ressources matérielles allouées à son exécution numérique :
- Résultats fiables : solution proposée correcte ou pas
- Complétude : donnera-t-il toujours des propositions de solutions.
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 1/7
Chapitre 2 – CONCEPTS ET INSTRUCTIONS DE BASE DE
L'ALGORITHMIQUE
- caractère (lettre, chiffre, ponctuation, espace, retour chariot,… et plus généralement toutes les
touches que l'on peut trouver sur une machine à écrire)
- booléen (les variables booléennes n’ont que deux valeurs possibles: soit VRAI, soit FAUX)
A partir de ces types de base, on peut définir des types plus complexes appelés types composés.
2-1. Variable
Les variables sont des données manipulées par le programme lors de son exécution. Elles
correspondent à des emplacements situés dans la mémoire vive de l’ordinateur et permettant de
stocker des valeurs.
2-2. Constante
Une constante est, comme une variable, un emplacement de la mémoire mais sa valeur ne peut pas
changer au cours de l'exécution du programme.
identificateur : type
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 2/7
Exemple
a : entier
permet de réserver un emplacement mémoire pour le stockage d’un entier qui sera nommé a
dans la suite du programme.
On peut déclarer en même temps plusieurs variables de même type en séparant les identificateurs
par des virgules.
Exemple
x, y, z : entier
La déclaration d’une constante est toujours associée à son initialisation (première valeur).
Exemple
Début
instructions
Fin
Un algorithme commence par le mot Programme suivi de son identificateur (le nom du
programme).
Ensuite viennent la définition de types annoncée par le mot Type, la déclaration de constantes,
annoncée par le mot Constante puis celle de variables, annoncée par le mot Variable et la
définition de procédures et de fonctions.
Le corps du programme commence par Début et se termine par Fin.
On peut insérer des commentaires, soit entre les balises /* */, soit après // jusqu'à la fin de la ligne.
Remarque:
Les types de base font partie du langage et n'ont pas à être définis par le programmeur.
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 3/7
"Bonjour" , "93000",
longueur, concaténation, longueur , + ,
chaîne "toto@caramail.com"
comparaison , , , , = =,
Remarques
- Pour les entiers, la division est notée div. Elle est nommée division entière et ne donne que le
chiffre avant la virgule du résultat (elle renvoie un entier).
Les entiers supportent une opération supplémentaire appelée modulo, notée mod et qui renvoie le
reste de la division entière.
Exemple:
7 div 2 donne 3
7 mod 2 donne 1
- Une valeur de type caractère doit être ente apostrophes (sinon le compilateur pourrait la confondre
avec un nom de variable).
- Une valeur de type chaîne doit être entre guillemets (sinon le compilateur pourrait la confondre
avec un nom de variable).
- Les caractères sont comparés selon l’ordre du code ASCII. C’est ainsi qu’on peut comparer tous
les caractères entre eux. Par exemple le caractère 'Z' (majuscule), de code ASCII 90 est inférieure
au caractère 'a' (minuscule) de code ASCII 97.
Soit la variable c de type caractère:
succ(c) permet d’obtenir le caractère qui suit le caractère c selon le code ASCII
pred(c) permet d’obtenir le caractère qui précède le caractère c selon le code ASCII
ord(c) permet d’obtenir code ASCII du caractère c.
car(n) permet d’obtenir le caractère correspondant au code ASCII n.
Par exemple :
ord(‘A’) vaut 65
succ(‘A’) vaut ‘B’
pred(‘A’) vaut @
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 4/7
car(65) donne ‘A’
- Pour le type chaîne, L’opérateur + sert à concaténer des chaînes de caractère, ce qui signifie
transformer plusieurs chaînes en une seule en les ajoutant les unes à la suite des autres.
Exemples :
Bonjour + à tous donne Bonjour à tous
longueur(Bonjour) donne le nombre de caractères de la chaîne Bonjour, c’est à dire 7.
- Pour le type booléen, les deux seules valeurs possibles sont Vrai et FAUX. Les opérateurs de base
ET, OU, NON sont définies par la table de vérité suivante (étant données deux variables A et B de
type booléen) :
A B A ET B A OU B NON A
VRAI VRAI VRAI VRAI FAUX
VRAI FAUX FAUX VRAI FAUX
FAUX VRAI FAUX VRAI VRAI
FAUX FAUX FAUX FAUX VRAI
5. Notion d'expression
Une expression conditionnelle (ou expression logique ou expression booléenne ou condition) est
une expression dont la valeur est soit VRAI soit FAUX. On peut donc affecter une expression
conditionnelle à une variable booléenne. Il existe plusieurs types d’expressions conditionnelles.
Une condition simple est une comparaison de deux expressions de même type.
Exemples
a<0
op = =‘s’
(a + b - 3) * c = = (5 * y –2) / 3
Pour les comparaisons de caractères, on utilise l'ordre ASCII, qui respecte l’ordre alphabétique. Une
lettre placée avant une autre dans l'ordre alphabétique sera inférieure à l'autre. Par exemple: ‘a’ est
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 5/7
inférieur à ‘b’, mais ‘s’ est supérieur à ‘m’.
Les conditions peuvent aussi être complexes, c'est à dire formées de plusieurs conditions simples ou
variables booléennes reliées entre elles par les opérateurs logiques ET, OU, NON.
Exemples
(a < 0) ET (b < 0)
Une condition composée de deux conditions simples reliées par ET est vraie si les deux conditions
sont vraies.
Exemple: (a < 0 ) ET (b < 0) est vraie si a < 0 est vraie et si b < 0 est vraie
Une condition composée de deux conditions simples séparées par OU est vraie si au moins l'une des
conditions simples est vraie.
Exemple: (a <0) OU (b < 0) est vraie si a < 0 ou si b < 0 ou si a et b sont négatifs.
Une condition précédée par NON est vraie si la condition simple est fausse et inversement.
Exemple: NON (a < 0) est vraie si a >=0
L'usage des parenthèses permet de régler d'éventuels problèmes de priorité des opérateurs logiques.
7-1. L’affectation
L’affectation consiste à mettre une valeur dans une variable (ce qui revient à changer le contenu de
cette variable). La nouvelle valeur est évaluée à partir d'une expression.
En algorithmique, pour représenter l’opération d’affectation, on va utiliser le symbole =
Exemples
x=5
x=y
x=5+8
x=5+y
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 6/7
- Tout d’abord elle détermine la valeur de l’expression située à droite du symbole =
- puis elle range le résultat dans la variable située à gauche.
Remarques
- On ne peut affecter de valeur qu’à une variable. Il est impossible d’affecter une valeur à une
constante ou à une expression. Par exemple, l’instruction a + 5 = b n’a pas de sens.
- Il est possible de retrouver la même variable à droite et à gauche de l’expression. Par exemple,
l’instruction a = a + 3 a un sens. Cela signifie que l’on évalue a + 3 avec l'ancienne valeur de a et
qu’on range le résultat dans a. La valeur de a sera donc augmentée de 3 par cette opération.
7-2. La lecture
L’instruction de lecture permet au programme de lire des données entrées au clavier par l'utilisateur.
Cette instruction affecte les valeurs entrées au clavier à des variables du programme..
Syntaxe
Exemples
Lire(x)
Cette instruction lit la valeur entrée au clavier et l'affecte à la variable x
Lire(x, y)
Cette instruction lit la première valeur entrée au clavier et l'affecte à x, puis lit la deuxième valeur
et l'affecte à y
7-3. L'écriture
Syntaxe
Exemples
Ecrire(ch)
Cette instruction permet d'afficher la valeur de la variable ch à l'écran
Si ch est une chaîne qui vaut "toto", cette instruction affichera toto à l'écran
Ecrire("Bonjour!")
Celle-ci permet d'afficher la chaîne Bonjour! à l'écran
Ecrire(a, b)
Si a vaut 5 et b vaut 10, on obtient alors à l'écran:
5 10
M. MBADJOUN / JFN-IT
Chapitre 2 – Concepts et instructions de base de l'algorithmique
Page 7/7
On peut mélanger l'affichage de valeurs littérales et de variables. Cela est particulièrement utile si
on veut voir apparaître un libellé (texte accompagnant la saisie des données ou l'édition des
résultats, permettant de guider l'utilisateur).
Exemple
8. Exemple d'algorithme
Algorithme pour échanger le contenu de deux variables saisies au clavier par l'utilisateur.
Programme Echange
Variable
x , y : entier
tmp : entier
Début
Ecrire("Donner la valeur de l'entier x:")
Lire(x)
tmp = x
x=y
y = tmp
M. MBADJOUN / JFN-IT
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
2- La structure conditionnelle
simple a. Activité :
Qu'est ce qu'une condition ?
Constatation
Une condition est une expression booléenne qui peut prendre la valeur vrai ou faux.
b. Syntaxe :
Syntaxe en algorithmique Syntaxe en Pascal
If
conditions then
Si conditions alors Begin
Traitement1 Traitement 1.1;
Traitement 1.2;
Sinon End
Traitement 2 Else
Begin
Fin si Traitement 2;
End;
Si la condition est vraie, le programme exécute le premier traitement, sinon, il saute
pour exécuter le deuxième traitement.
c. Définition :
La structure conditionnelle simple est une structure algorithmique qui exécute un
traitement parmi deux et ce suivant le résultat de l’évaluation de la condition.
Remarques :
La condition peut être composée.
Si le traitement2 est vide, on parlera de structure conditionnelle simple réduite qui
aura la syntaxe suivante :
MBADJOUN/JFN-IT 1
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
b. Syntaxe :
Syntaxe en algorithmique Syntaxe en Pascal
IF
condition_1 THEN
Begin
Traitement_1
SI condition_1 ALORS
End ;
Traitement_1 ELSE IF condition_2 THEN
SINON SI condition_2 ALORS Begin
Traitement_2 Traitement_2
SINON SI End ;
…. ELSE IF
SINON SI condition_n-1 ALORS ………
ELSE IF condition_n-1 THEN
Traitement_n-1
Begin
SINON Traitement_n-1
Traitement_n End ;
FIN SI ELSE
Begin
Traitement_n
End ;
L’exécution d’une telle structure commence par l’évaluation de la condition_1, deux
états peuvent se reproduire
Si condition_1 est vérifiée alors le traitement_1 qui sera exécuté
Si condition_1 n’est pas vérifiée alors il y a un passage automatique pour vérifier la
condition suivante et ainsi de suite pour chacune des conditions.
Si aucune condition n’est vérifiée alors le traitement_n qui sera exécuté.
c. Définition :
La structure conditionnelle généralisée est une structure algorithmique qui fait appel
à plus que deux traitements. L’exécution d’un traitement donné dépend de la condition à
vérifier.
MBADJOUN/ JFN-IT 2
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
4- La structure à choix
a. Activité :
Qu'est ce qu'une condition à choix ?
Constatation
La structure conditionnelle à choix permet de faire un choix parmi plusieurs choix
proposés. Le sélecteur permet de définir le choix du traitement à effecteur.
b. Syntaxe :
La structure conditionnelle à choix aura la syntaxe suivante :
Syntaxe en algorithmique Syntaxe en Pascal
Selon sélecteur faire CASE sélecteur OF
Valeur_1 : traitement_1 Valeur_1 : traitement_1
Valeur_2 : traitement_2 Valeur_2 : traitement_2
…. ….
…. ….
Valeur_n-1 : traitement_n-1 Valeur_n-1 : traitement_n-1
Sinon ELSE
traitement_n traitement_n
Fin selon End ;
c. Définition :
La structure conditionnelle à choix est une structure algorithmique utilisée dans des
structures à plusieurs traitements selon des conditions. L’exécution d’un traitement
entraîne automatiquement la non exécution des autres. Le choix d’un traitement se fait
suivant la valeur d’un sélecteur.
Remarques
Le sélecteur doit être de type scalaire discret et non réel.
Comme dans le cas des autres structures conditionnelles, chaque traitement peut
comporter une ou plusieurs instructions.
Valeur_i peut être un ensemble de valeurs qui seront séparées par des virgules ou un
intervalle de valeurs [Vi.. Vf]
Si la valeur du sélecteur est différente des valeurs proposées alors c'est le traitement
qui suit la clause sinon qui sera exécuté.
La clause sinon et son traitement sont facultatifs dans la structure.
MBADJOUN/JFN-IT 3
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
Remarques
1. Le compteur de la boucle est de type scalaire.
2. Le pas est par défaut de 1.
3. Si le pas est de -1, la syntaxe en pascal devient
FOR Cp := Vi DOWNTO Vf do
4. Le changement de la valeur du compteur est automatique, le pas est de 1 ou de -1
MBADJOUN/JFN-IT 4
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
c. Applications
Application 1
Ecrire un algorithme d’un programme qui chercher puis afficher le nombre de lettres
NL, le nombre de chiffres NC et le nombre de symbole NS dans une chaîne de
caractères CH saisie au clavier.
Application 2
Ecrire une analyse d’un programme qui permet d’effectuer la multiplication de deux
entiers positifs P et Q données en utilisant uniquement l’addition entière.
Application 3
b. Définition
La structure REPETER…JUSQU'A... est utilisée quand il s'agit de répéter un traitement
un nombre de fois Inconnu à l’avance et qu’on est sûr que le traitement itératif
s'exécutera au moins une fois.
MBADJOUN/JFN-IT 5
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
c. Syntaxe
Activité 2 :
En se basant sur le code source du fichier " StrRep.pas" déterminer la syntaxe de la
structure répétitive à condition d’arrêt REPETER…JUSQU'A
Remarques :
1. La condition d'arrêt est considérée comme une condition de sortie de da la boucle.
2. La condition d'arrêt de la boucle peut être simple ou composée.
3. les caractéristiques de la boucle REPETER…JUSQU'A en font une structure adaptée
pour le contrôle de la saisie des données. On répète la saisie jusqu'à à ce que les
contraintes spécifiées dans l’énoncé du problème soient respectées.
d. Applications
Application 1 : Stocker une série d’éléments dans un vecteur de 100 éléments au maximum
compris entre 1 et 50. Le zéro est admis comme fin de saisie. Rechercher ensuite et afficher le
minimum et le maximum des nombres entrés
Application 2 : Ecrire un programme permettant de :
Saisir les éléments d’un tableau T de N entiers formés chacun de trois chiffres 5 ≤ N ≤ 20
Afficher les éléments du tableau T dont la permutation des chiffres donne la valeur du
premier élément du tableau T
MBADJOUN/JFN-IT 6
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
Réponse :
2. Le programme "while.exe " sauvegarde puis affiche les 5 premiers valeurs tapées par
l’utilisateur (cas 1) ou les N valeurs tapées avec N <= 5 le sauvegarde s’arrêt lorsque
l’utilisateur tape un zéro (cas 2), Si dès le départ l’utilisateur tape un zéro le
traitement répétitif n’aura pas lieu et l’exécution passe directement à l’affichage du
résultat (cas 3).
3. La sauvegarde des valeurs données par l’utilisateur est un traitement répétitif à
condition d’arrêt
4. Le traitement répétitif peut ne pas avoir lieu (cas 3) lorsque l’utilisateur tape un zéro
dès le départ on ne peut pas alors utiliser la structure répétitive à condition d’arrêt
REPETER…JUSQU'A il faut utiliser la structure répétitive à condition d’arrêt
TANTQUE…FAIRE
b. Définition
La structure TANT QUE...FAIRE... est utilisée quand il s'agit de répéter un traitement un
nombre de fois inconnu à l’avance et que le traitement itératif peut ne pas s'exécuter.
Activité :
1. Ouvrir le fichier "While.pas" se trouvant dans "C:\TPW\"
2. En se basant sur le code source du fichier "While.pas" et on vos aidons des exécution
du fichier "While.exe" déterminer le principe de fonctionnent de la structure
répétitive à condition d’arrêt TANTQUE…FAIRE
Constatation
c. Syntaxe
La structure TANTQUE…FAIRE est représentée comme suit :
MBADJOUN/JFN-IT 7
Chapitre 3 : LES STRUCTURES ALGORITHMIQUES DE CONTROLE ET ITERATIVES
Remarques :
1. La condition d'arrêt est considérée comme une condition d'entrée dans la boucle car,
une fois qu'elle n'est pas vérifiée, on quitte la boucle sinon on itère encore jusqu'à sa
non vérification.
2. La condition d'entrée dans la boucle peut être simple ou composée.
Applications
Application 1
On se propose d’écrire un algorithme qui permet de saisir une suite d’entiers qui se
termine par -1 puis de calculer et d’afficher la somme de ces valeurs sauf la dernière.
MBADJOUN/JFN-IT 8
Les sous programmes
1. Généralités.
2. Avantages des sous programmes.
3. Structure d'un programme .
4. Procédure et fonction .
5. Déclaration de procédure simple.
6.Procédure simple avec des variables locales.
7.Procédure paramétrée.
8. Communication entre procédures.
9. Mode de passage de Paramètres.
10. Les fonctions.
****************************************************
1°) GENERALITES.
Lors de la conception d’un programme résolvant un problème général, il est nécessaire de décomposer le problème en
différent sous-problèmes moins complexe à résoudre : Démarche ascendante.
Ces différents sous-problèmes peuvent être résolus grâce à des sous-programmes particuliers : Procédures et fonctions.
Exemple : Écrire un programme qui affiche en ordre croissant les notes d'une promotion suivies de la note la plus faible,
de la note la plus élevée et de la moyenne
Revient à résoudre les problèmes suivants :
- Remplir un tableau de réels avec des notes saisies par l'utilisateur
- Trouver le plus petit réel d'un tableau
- Trouver le plus grand réel d'un tableau
- Calculer la moyenne d'un tableau de réels.
Donc écrire un programme qui résout un problème revient toujours à écrire des sous-programmes qui résolvent des
sous parties du problème initial
Un sous-programme est obligatoirement caractérisé par un nom (un identifiant) unique
Lorsqu'un sous programme a été explicité (on a donné l'algorithme), son nom devient une nouvelle instruction, qui peut
être utilisé dans d'autres (sous-)programmes
Le (sous-)programme qui utilise un sous-programme est appelé (sous-)programme appelant.
2°) Avantages des sous programmes.
● Les sous programmes permettent de ne pas répéter plusieurs fois une même séquence d’instructions au sein du
programme.
● La mise au point du programme est plus rapide en utilisant des sous programmes. En effet, elle peut être réalisée
en dehors du contexte du programme.
● Un sous programmes peut être intégré à un autre programme, ou elle pourra être rangée dans une bibliothèque
Fin
Dans cet algorithme le calcul de la valeur absolue a été effectué 3 fois de la même manière
è Il est préférable d’écrire un sous programme consacré au calcul de la valeur absolue.
è On peut aussi écrire un sous programme pour le calcul de la moyenne de 3 nombres.
Algorithme MoyValAbsoluVers2
déclaration
A,B,C:entier ; M : réel
fonction Absolu(X :entier) :entier
Début
Si X < 0 alors
Absolu← -X
Sinon
Absolu ← X
Fin si
Fin
fonction Moyenne(X :entier ; Y :entier ; Z :entier):réel ;
Début
Moyenne ← (X+Y+Z)/3
Fin
Début
Lire(A,B,C)
M ← Moyenne(Absolu(A),Absolu(B),Absolu(C))
Écrire(M)
Fin .
3°)Structure d'un programme :
Un programme doit suivre la structure suivante :
Programme nom du programme
Définition des constantes
Définition des types
Déclaration des variables globales
Définition des sous-programmes
début
instructions du programme principal
fin
(mot-passe )
--
--
Afficher( ) ;
--
--
Exemple :
Exemple :
X de A
Y de A
Y de B
X d'Essai
Y d'essai
I : erreur , inaccessible
Les paramètres effectifs : ce sont les données communiquées à la procédure au moment de son appel, les paramètres
effectifs sont substitués par les paramètres formels ; et doivent correspondre en nombre , en type et en ordre aux
paramètres formels.
Exemple :
Procedure ligne ( c ;char , i : integer) ;
Var j: integer;
Begin
For j := 1 to I do
Write ( c);
End;
Ligne ( * , 2 ) affichera : **.
Ligne ( Z, X) ou x = 5 affichera : ZZZZZ .
Var K : integer ;
{1}
Begin
K := 2 ; X := X + K ; Y := Y + K ;
writeln ('X=',X,' & Y=',Y, '&K=', K); {2}
End ;
Var A, B, K : integer ;
Begin
A := 3 ; B := 2 ; K := 3 ;
Incrementer (A, B) ;
writeln ('A=',A,' & B=',B, ' & K=', K)
End.
Exemple 1.
Soit deux tableaux
TC=tableau[1..10]de car;
TE=tableau[1..10]d'entiers;
2. Déclaration dans les tableaux
Déclaration du type tableau
Initialisation du tableau
Déclaration du type tableau
Pour déclarer une variable du type tableau, il est préférable que le type soit déclaré auparavant.
3. Opération sur les tableaux
Introduction
Contrairement aux tableaux qui sont des structures de données dont tous les éléments sont de même type, les
enregistrements sont des structures de données dont les éléments peuvent être de type différent et qui se rapportent à
la même entité (au sens de Merise)
Les éléments qui composent un enregistrement sont appelés champs.
Avant de déclarer une variable enregistrement, il faut avoir au préalable définit son type, c'est à dire le nom et le type
des champs qui le compose. Le type d'un enregistrement est appelé type structuré. (Les enregistrements sont parfois
appelé structures, en analogie avec le langage C)
Jusqu'à présent, nous n'avons utilisé que des types primitifs (caractères, entiers, réels, chaînes) et des tableaux de types
primitifs. Mais nous pouvons créer nos propres types puis déclarer des variables ou des tableaux d'éléments de ce type.
Pour créer des enregistrements, il faut déclarer un nouveau type, basé sur d'autres types existants, qu'on appelle type
structuré Après avoir défini un type structuré, on peut l'utiliser comme un type normal en déclarant une ou plusieurs
variables de ce type. Les variables de type structuré sont appelées enregistrements.
La déclaration des types structurés se fait dans une section spéciale des algorithmes appelée Type, qui précède la section
des variables (et succède à la section des constantes).
Syntaxes :
(notation inspirée du Pascal) (notation inspirée du C)
Type ou Type
nom_type = enregistrement Structure nom_type
nom_champ1: type_champ1 nom_champ1: type_champ1
… …
nom_champn: type_champn nom_champN: type_champN
finenreg FinStruct
Exemple:
Type ou Type
tpersonne = enregistrement Structure tpersonne
nom : chaîne nom : chaîne
prénom : chaine prénom : chaîne
âge : entier âge : entier
finenreg FinStruct
Une fois qu'on a défini un type structuré, on peut déclarer des variables enregistrements exactement de la
même façon que l'on déclare des variables d'un type primitif.
1
JFN-IT GI 1
Syntaxe
Var
nom_var : nom_type
Exemple:
Var
pers1, pers2, pers3 : tpersonne
Représentation:
les enregistrements sont composés de plusieurs zones de données, correspondant aux champs
pers1.nom pers1.age
pers1
pers2.nom pers2.age
pers2
Exemple:
Soit l'entité suivante: PRODUIT légende:
code code: code alphanumérique du produit
lib lib: libéllé
paht paht: prix d'achat hors taxes
pvht pvht: prix de vente hors taxes
txtva txtva: taux de TVA applicable
Voici comment déclarer deux occurrences (variables enregsitrements) du type structuré correspondant
à cette entité.
La manipulation d'un enregistrement se fait au travers de ses champs. Comme pour les tableaux,
il n'est pas possible de manipuler un enregistrement globalement, sauf pour affecter un enregistrement
à un autre de même type. Par exemple, pour afficher un enregistrement il faut afficher tous ses champs
uns par uns.
2
JFN-IT GI 1
Alors que les éléments d'un tableau sont accessibles au travers de leur indice, les champs d'un
enregistrement sont accessibles à travers leur nom, grâce à l'opérateur '.'
nom_enregistrement . nom_champ
représente la valeur mémorisée dans le champ de l'enregistrement
Attention : le nom d'un champ est TOUJOURS précédé du nom de l'enregistrement auquel il
appartient. On ne peut pas trouver un nom de champ tout seul, sans indication de l'enregistrement.
Les champs d'un enregistrement, tout comme les éléments d'un tableau, sont des variables à qui on
peut faire subir les mêmes opérations (affectation, saisie, affichage,…).
Exemple 1:
Programme de saisie des données concernant les personnes pers1 et pers2, puis affichage de la
différence d'âge entre ces deux personnes
Programme Exemple
Type
Structure tpersonne
nom : chaîne
prénom : chaîne
âge : entier
FinStruct
Var
pers1, pers2 : tpersonne
Début
Aff "Entrez le nom puis l'age de la personne 1"
Saisir pers1.nom, pers1.age // il est impossible d'écrire Saisir pers1
Aff "Entrez le nom puis l'âge de la personne 2"
Saisir pers2.nom, pers2.age
Aff "La différence d'âge entre ", pers1.nom, " et ", pers2.nom, " est de "
Si pers1.age > pers2.age
Alors Aff pers1.age – pers2.age, " ans "
Sinon Aff pers2.age – pers1.age, " ans "
FinSi
Fin
Il est possible de passer tout un enregistrement en paramètre d'une fonction ou d'une procédure (on
n'est pas obligé de passer tous les champs uns à uns, ce qui permet de diminuer le nombre de
paramètres à passer), exactement comme pour les tableaux.
Exemple :
Voilà une fonction qui renvoie la différence d'age entre deux personnes
3
JFN-IT GI 1
Exemple 2 :
Voilà une procédure qui permet de modifier le prix de vente hors taxes d'un produit passé en
paramètre. Cette procédure commence par afficher le libellé et l'ancien prix de vente hors taxes du
produit puis saisit le nouveau prix de vente entré par l'utilisateur.
B. L'imbrication d'enregistrements
Supposons que dans le type personne, nous ne voulions plus l'âge de la personne, mais sa date de
naissance. Une date est composée de trois variables (jour, mois, année) indissociables. Une date
correspond donc à une entité du monde réel qu'on doit représenter par un type enregistrement à 3
champs.
Si on déclare le type date au préalable, on peut l'utiliser dans la déclaration du type personne pour le
type de la date de naissance.
Un type structuré peut être utilisé comme type pour des champs d'un autre type structuré
TYPE
Structure date
jour: entier
mois: chaîne
année: entier
FinStuct
Structure personne
nom: chaîne
ddn: date
FinStruct
Pour accéder à l'année de naissance d'une personne, il faut utiliser deux fois l'opérateur '.'
pers1.ddn.année
Il faut lire une telle variable de droite à gauche : l'année de la date de naissance de la personne 1.
4
JFN-IT GI 1
Exemple Complet
Un produit (cf. ex précédents) est livré par un seul fournisseur. Un fournisseur est caractérisé par son code, sa
raison sociale et son numéro de téléphone.
Type
Structure adresse
num : entier
rue: chaîne
cp: chaîne
ville: chaîne
FinStruct
Structure fournisseur
code_frs : chaine
raison_sociale: chaine
ad_frs: adresse
tel: chaine
FinStruct
Structure Produit
code: chaîne
lib: chaîne
paht: réel
pvht: réel
txtva: réel
frs: fournisseur
FinStruct
Var
p: produit
Voilà l'instruction qui permet d'afficher le numéro de téléphone du fournisseur du produit p.frs.tel
FOURNISSEUR
PRODUIT
code code_frs
1,1 raison_sociale
lib 0,n
paht est livré par tel
pvht
txtva
Fournisseur qui est en dépendance fonctionnelle sur produit est imbriqué dans produit.
De façon générale, une entité 1 en dépendance fonctionnelle sur une autre entité 2 est représentée en
programmation par un type structuré imbriqué dans le type structuré correspondant à l'entité 1.
5
JFN-IT GI 1
Const
NP = 20 // nombre de personnes du groupe
Type
Structure personne
nom: chaîne
age: entier
FinStruct
Var
groupe: tableau[1..NP] de personnes
Chaque élément du tableau est un enregistrement, contenant plusieurs variables de type différent. On
accède à un enregistrement par son indice dans le tableau.
groupe[2] représente la deuxième personne du groupe
groupe[2].nom représente le nom de la deuxième personne du groupe
nom âge nom des champs
1
indices du tableau
Attention!
groupe.nom[3] n'est pas valide.
Pour accéder au nom de la troisième personne du tableau, il faut écrire g roupe[3].nom
6
Chapitre 7 : Problèmes de recherche et de tri
I- Problème de tri
1. Définition d’un algorithme de Tri
Les tableaux permettent de stocker plusieurs éléments de même type au sein d’une seule
entité, Lorsque le type de ces éléments possède un ordre total, on peut donc les ranger en
ordre croissant ou décroissant,
Trier un tableau c’est donc ranger les éléments d’un tableau en ordre croissant ou décroissant
Dans ce cours on ne fera que des tris en ordre croissant
Il existe plusieurs méthodes de tri qui se différencient par leur complexité d’exécution et leur
complexité de compréhension pour le programmeur.
Examinons tout d’abord : le tri par minimum successif
Commençons par évoquer la procédure échange.
• La procédure échanger...
Tous les algorithmes de tri utilisent une procédure qui permet d’échanger (de permuter) la
valeur de deux variables Dans le cas où les variables sont entières, la procédure échanger est
la suivante : procédure échanger (E/S a,b : Entier )
Déclaration temp : Entier
Début
temp ← a
a←b
b ← temp
fin
Exemples :
• Le tri rapide
• Tri par sélection
- Algorithme de tri par sélection
Tri fusion
• La partition
Pour aller plus vite, on peut utiliser les tableaux triés et la dichotomie (méthode
«diviser pour régner») :
Retenir (Idée)
Si le tableau tab est trié, pour tout indice i,
les éléments e ≤ tab[i] sont d’indice ≤ i ;
les éléments e > tab[i] sont d’indice > i.
On essaye avec i au milieu du tableau.
• Recherche dichotomique
Algorithme (RechDichoRec : recherche dans un tableau trié)
Entrée : un tableau trié tab, un intervalle [min; max] avec
0 ≤ min ≤ max < taille et un élément e.
Sortie : i tel que tab[i] = e ou NonTrouvé (ex : -1).
si min = max alors
si tab[min] = e alors retourner min
sinon retourner NonTrouvé
mid <- (min + max) / 2
si tab[mid] < e alors
retourner RechDichoRec(tab, mid+1, max, e)
sinon
retourner RechDichoRec(tab, min, mid, e)
• La méthode d'accès que l'on veut utiliser doit être spécifiée au moment de l'ouverture du
fichier. Un même fichier peut être accédé par des méthodes différentes selon son organisation qui elle
a été définie au moment de sa création.
Rq : il existe deux variables fichiers prédéfinies, input et output de type text qui n’ontpas besoin d’être
déclarées
• Assignation physique :
Algorithme 1: estPair
Données : a ∈ N
Résultat : VRAI si a est pair, FAUX sinon
début
si a modulo 2 = 0 alors
renvoyer VRAI
sinon
renvoyer FAUX
fsi
fin
2
Explications : ici modulo sert à renvoyer le reste de la division euclidienne de a par 2. La
division euclidienne de a par b s’écrit d’une manière unique a = b × q + r avec q le quotient et r
le reste tels que 0 ≤ r < b.
Une fois un algorithme écrit, on l’utilise par application à des arguments.
Par analogie avec les mathématiques, un algorithme est semblable a une fonction f , les objets x sur
lesquels agit f portent là aussi le nom de variables, et leurs images y = f (x) car elles peuvent servir
de nouvelles variables sur lesquelles faire agir une autre fonction g. Dans un souci de simplification, on
admet généralement que les constantes sont des cas particuliers de variables.
Plus précisément, une variable est une donnée désignée par un nom précis et immuable, mais dont la
valeur est susceptible de changement au cours du déroulement de l’algorithme.
Reprenons l’analogie avec les mathématiques : une fonction f définie sur un ensemble E, est à valeurs
dans un ensemble F très souvent distinct de E.
L’algorithmique fait un grand usage du cas où F ne possède que deux éléments, appelés selon le contexte
0 et 1, oui et non, vrai ou faux. On appelle alors variables booléennes, ou indicateurs booléens
les variables dont les images (leurs valeurs) sont nécessairement vrai ou faux.
Dans la pratique, il s’agit toujours de propositions logiques simples, souvent dépendant d’un ou plusieurs
paramètres, auxquels les mathématiques donnent une valeur de vérité : ainsi la proposition “a est un
nombre pair” est vraie si a = 3 et fausse si a = 4.
3
en 1986. Mais attention, ce dernier n’est pas un langage de programmation, c’est un environnement de
dévolopement intégré2 assez complet pour le langage Pascal.
2
un EDI est un programme regroupant un éditeur de texte, un compilateur, des outils automatiques de fabrication,
et souvent un débogueur.
4
2 Structure d’un programme en Pascal
1. Déclaration du programme.
C’est l’entête du programme. Sa syntaxe est :
PROGRAM nom;
2. Déclaration des objets.
On déclare tous les objets utilisés dans le programme : constantes puis variables.
Sa syntaxe est :
CONST a=2;
vrai=TRUE;
VAR i,k,n : integers {i,k,n sont de types entier}
x,a,b : real {x,a,b de type réel}
test : boolean {variable de type booléenne : }
{ sa valeur est true ou false}
liste : array [1..10] of integer {variable de type tableau}
Remarque : Avant la déclaration des objets, si l’on utilise une bibliothèque particulière, il
faut l’indiquer avec la syntaxe suivante : uses la bibliothèque ;.
Les bibliothèques sont différentes en fonction de l’environnement utilisé et permettent d’uti-
liser des fonctions particulières.
Par exemple, afin de pouvoir effacer l’écran sous l’environnement DOS on inclut dans le pro-
gramme la bibliothèque crt. La fonction a utilisée dans le programme pour effacer l’écran est
alors : clrscr ;.
3. Définition des procédures et fonctions.
Les fonctions et procédures seront vues ultérieurment.
La structure d’un programme simple est : 1.2.4. ; celle d’un programme structuré comporte cette
3˚ partie.
4. Programme principal.
C’est le corps du programme : on liste les instructions à exécuter.
Sa syntaxe est :
BEGIN instructions END.
Sauf mention contraire, chaque ligne de commande et instruction se finit par un ;.
Afin de faciliter la lisibilité du programme, on peut y ajouter des commentaires pour expliquer
certaines instructions ou nom de variable. Ces commentaires peuvent être insérées n’importe où du
moment qu’ils sont placés entre accolades.
A noter que que le code source brut d’un programme Pascal peut porter les extensions3 .pas,
le plus courant, .p ou encore .pp.
3
L’extension d’un fichier est ce qui permet d’identifier son format, elle se situe après un ’.’ : par exemple image.jpg,
.jpg indentifie un fichier de type image de format jpeg dont le nom est image ou alors texte.txt qui correspond à
un fichier texte donc le nom est texte.
5
3 Objets et actions élémentaires
3.1 Les objets
Les objets sont des données constantes ou variables :
• une donnée constante est une donnée dont la valeur est fixée par le programmeur et qui reste
inchangée au cours de l’exécution du programme.
Un exemple important est la constante “chaı̂ne de caractères” (ou string) : ’bonjour’ ou
’rerevgeetr’ . . . Pour définir une chaı̂ne de caractères, il suffit de mettre une suite caractères à
l’intérieur de ’ ’.
• une donnée variable est une donnée dont la valeur est initialisée par le programmeur ; cette
valeur peut-être modifiée au cours de l’exécution du programme.
Tous ces objets vont avoir des noms définis par le programmeur : ces noms s’appellent des identi-
ficateurs. Ces derniers ne peuvent pas être des mots réservés, i.e. des mots dont la signification est
prédéfinie par le logiciel, tels que REAL, BEGIN, . . .
Il y a quelques règles supplémentaires : il ne peut y avoir ni espaces, ni lettres accentuées dans un
identificateur, et le premier caractère ne doit pas être un chiffre.
Le compilateur Pascal ne distinguant pas les majuscules des minuscules, les identificateurs IDEM, Idem,
iDEm, idem sont confondus.
Chaque identificateur devra être déclaré en 2. pour être compris.
6
• pour les variables d’entrée : par lecture
Exemple :
writeln(’écrire les valeurs de a et b’);
Quand le programme s’exécute, il s’affiche sur l’écran : écrire les valeurs de a et b.
writeln() ; est une commande d’écriture.
readln(a,b);
les deux valeurs alors écrites par l’utilisateur sont affectées aux variables a et b. readln() ;
est une commande de lecture.
Remarques :
• On aurait pu utiliser les commandes write() ; et read() ; : la seule différence est que
dans ce cas, le curseur de l’écran d’affichage ne passe pas à la ligne suivante à la fin de la
commande : il n’y a pas de saut de ligne.
• Complément sur l’instruction write() :
L’instruction write(expression 1,...,instruction n) ; permet d’afficher une liste d’ex-
pressions (ici n expressions) sur l’écran de sortie du programme. Une expression peut être
un nombre, une variable numérique, le résultat numérique entre plusieurs variables, ou une
chaı̂ne de caractères quelconque (qui peut comporter des lettres accentuées et des espaces) :
dans ce dernier cas, il est nécessaire de mettre la chaı̂ne entre deux apostrophes.
• Complément sur l’instruction read() :
L’instruction read(x1 , . . . , xn ) ; permet d’affecter aux variables x1 , . . . , xn préalablement
déclarées, n données numériques entrées au clavier. Ces données doivent être séparées par
un caractère espace ou un retour à la ligne.
• pour les variables de sorties : par affectation
Exemple :
x := 1;
Ou si a et b ont déjà été initialisées :
x := (a+b)/2;
! Si l’on écrit a := b, il faut que les variables a et b soient de même type.
Ne pas confondre également le ’:=’ de l’affectation et le ’=’ réservé aux données
constantes et au symbole de comparaison.
7
3.2.1 Opérateurs et fonctions arithmétiques
8
4 Instructions et instructions conditionnelles
4.1 Instructions
Une instruction peut être simple, i.e. d’une seule commande : par exemple writeln(’bonjour’) ;
ou l’affectation d’une variable s := 0 ;.
Une instruction composée est une suite d’instructions terminées par un ’ ;’ : l’ensemble de ces instructions
doit alors commencer par un BEGIN et finir par un END ;.
! Le BEGIN .. END . du programme principal se termine par un ’.’ et non un ’ ;’.
Pour des raisons de lisibilité, on utilise très souvent une indentation en décalée :
BEGIN
instruction1 ;
instruction2 ;
instruction3
END ;
où instruction1, instruction2 et instruction3 peuvent être des instructions simples ou com-
posées.
Le point virgule est en fait un séparateur d’instructions : c’est pourquoi il n’est pas nécessaire d’en
insérer un à la fin de instruction3.
IF relation THEN
BEGIN
instructions B ;
END
ELSE
BEGIN
instructions C ;
END ;
instructions D ;
Remarques :
i. Si les instructions B ou C sont simples, le BEGIN END correspondant est inutile.
ii. Le ELSE est facultatif ; mais il ne doit pas être précédé immédiatement d’un ’ ;’.
9
5 Boucles itératives
5.1 Boucle for
Cette structure est utile pour répéter une suite d’instructions n fois, lorsque n est connu à l’avance.
La syntaxe est la suivante :
FOR i:=n TO m DO
BEGIN
instructions_B ;
END ;
instructions_C ;
Variante :
Si l’on veut aller de m à n dans l’ordre décroissant, la syntaxe devient :
instructions_A ;
WHILE relation DO
BEGIN
instructions_B ;
END ;
instructions_C ;
iii. !Il faut s’assurer avant de lancer le programme que la relation devient fausse
au bout d’un certain temps, sinon le programme ne s’arrêtera jamais !
4
Si dès le départ la relation est fausse
10
5.2.2 Boucle repeat ... until
L’utilisation se fait lorsque l’on veut répéter une suite d’instructions jusqu’à ce qu’une relation soit
vraie (c’est à dire qu’un objectif soit atteint).
La seule différence avant la boucle while est que dans la boucle repeat, instructions B est exécuté
avant de tester la relation au mois une fois. La syntaxe devient :
instructions_A ;
REPEAT
instructions_B ;
UNTIL relation ;
instructions_C ;
ii. ! Il faut s’assurer avant de lancer le programme que la relation devient vraie
au bout d’un certain temps, sinon le programme ne s’arrêtera jamais !
11
6 Fonctions et Procédures
6.1 Notion de sous-programme
La notion de sous-programme représente toute la puissance du langage Pascal. En fait, c’est la
possibilité de structurer encore davantage le programme en créant de nouveaux ordres utilisables dans
le corps du programme mais non définis dans celui-ci. Celà permet d’avoir un programme beaucoup plus
lisible puisque l’on décompose ainsi le programme en actions simples ou blocs d’instructions.
Le principe :
Il peut arriver que l’on doive utiliser une même séquence d’instructions à différents endroits d’un pro-
gramme. Il est alors judicieux de créer un sous-programme5 dont le code sera défini une fois pour toutes
dans l’étape 3., et que l’on appellera dans le corps du programme aux différents endroits souhaités.
L’avantage est que le code du programme est beaucoup plus court puisque l’on évite ainsi des répétitions
de code.
n!
Exemple : Le calcul de Cnk = k!(n−k)! nécessite le calcul de 3 factorielles ; donc on pourra écrire
une fonction factorielle en amont, et ensuite l’appeler 3 fois.
On doit pouvoir utiliser un sous-programme sans savoir ce qu’il se passe dedans : Les informations mises
à notre disposition sont les paramètres d’entrées et le résultat produit.
De même, un sous-programme ne doit pas savoir ce qui se passe à l’extérieur : son seul lien avec
l’extérieur sont ses paramètres d’entrées.
Un sous-programme a la même structure qu’une programme mais le END du corps du sous-programme
est suivi d’un ’ ;’ et non d’un ’.’. Il faut déclarer ces sous-programmes dans la partie 3., juste avant
le corps du programme principal. Toutes les variables utilisées dans un sous-programme doivent être
définies soit comme un paramètres d’entrée soit comme les variables locales6 .
Mais l’appel du sous-programme se fait dans le corps du programme (étape 4.)7 .
Il y a deux sortes de sous-programmes : les fonctions et les procédures.
ii. ! S’il y a plusieurs paramètres d’entrées dans une fonction, ils sont séparés
par un ’ ;’ mais lors de l’appel de la fonction ils seront séparés par une ’,’.
5
Fonction ou Procédure
6
Les variables du programme sont alors des variables globales
7
Un sous-programme peut utiliser d’autres sous-programmes si ceux-ci ont été définis avant, ou peut s’utiliser
soi-même : dans ce dernier cas on parle de sous-programme récursif.
12
6.3 Les procédures
Contrairement aux fonctions, la procédure ne fournit pas un résultat mais crée une action ou une suite
d’actions (instructions) : on utilisera les procédures principalement lorsqu’on manipulera des tableaux
(matrices ou autres). En effet, une fonction ne permet pas de modifier un tableau puisque son but est
de renvoyer une valeur.
Sa syntaxe reste analogue à la syntaxe d’une fonction :
Quelle est la différence entre ces deux syntaxes ? Voyons ceci sur un exemple :
Exemple :
PROGRAM proc ;
var A : real ;
procedure P(x:real);
BEGIN
write(x);
x := x+1;
writeln(x);
END;
BEGIN
A:=5
P(A);
write(A);
END.
L’affichage est :
56
5
Une variable locale x est créée et elle prend la valeur 5 puis la valeur 6 et qui est ensuite détruite
à la fin de la procédure. Mais la variable A est inchangée.
Si maintenant la première ligne de la procédure est :
l’affichage devient :
56
6
En effet, lors de l’exécution de la ligne de commande P1(A) ; la variable locale x n’est plus créée,
c’est la variable A qui est utilisée pour faire les instructions. Après le traitement A est donc modifiée
et prend la valeur 6. Cette variante au niveau syntaxe permet de changer des variables globales.
Remarques :
13
i. On dira dans la première syntaxe, que le paramètre d’entrée passe par valeur8 , alors que
dans la deuxième syntaxe, il passe par variable9 .
ii. Dans un passage par valeur, le paramètre d’entrée peut être n’importe quoi du type défini :
P(5) ; a un sens.
Alors que dans un passage par variable, le paramètre d’entrée doit être nécessairement une
variable : ainsi dans l’exemple précédent, P1(5) ou P1(x+5) n’a aucun sens.
8
On n’utilise que la valeur A dans P
9
La variable A est utilisée et changée dans P
14
7 Les tableaux
L’utilité des tableaux :
• Pour stocker des données. Par exemple, pour stocker les résultats d’expériences aléatoires, avant
de les analyse ou dans la présentation de données retraçant un historique complet de l’évolution
discrète d’un paramètre.
• Pour travailler formellement sur les polynômes.
• Pour traiter des problèmes matriciels.
Dans cette syntaxe, deb et fin sont de type integer, sous la contrainte deb ≤ fin. La variable
tableau est alors un tableau composé de colonnes numérotées de deb à fin. Ce tableau comportera
donc fin - deb + 1 cases, remplies par des éléments de type type. Chaque case du tableau est alors
une variable identifiée par tableau[i] (avec i un entier compris entre deb et fin).
Exemple : Les coordonées d’un point A du plan peuvent être représentées par le tableau
suivant :
Exemple : Un polynôme P de degré au plus 10 à coefficients réels peut être représenté par le
tableau suivant :
Le polynôme P (x) = 1 + 2x + 4x3 + 5x6 − 3x9 est alors représenté par le tableau :
1 2 0 4 0 0 5 0 0 −3 0
Tandis qu’un polynôme Q de degré au plus 5 à coefficients entiers (relatifs) sera déclaré par :
Exemple : Un tableau représentant une matrice A de M2,3 (R) sera déclaré par la syntaxe :
15
7.2 Créer un type “tableaux”
Dans certains cas, il sera nécessaire de fabriquer un nouveau TYPE d’objet Pascal, afin de simplifier
la déclaration des tableaux utilisés et surtout de pouvoir appliquer des fonctions ou des procédures à
des tableaux.
Rappel 7.1. La syntaxe d’une fonction comme d’une procédure nécessite la connaissance du type
du paramètre d’entrée.
La déclaration d’un nouveau type se fait juste après la déclaration des constantes (dans la structure
général d’un programme) :
• déclarations des types :
TYPE polynome = ARRAY[0..10] OF real ;
• Ensuite, se fait la déclaration des variables :
VAR P,Q,R : polynome;
Dès que l’on a défini un tel type polynome, on peut appliquer une fonction ou une procédure à un
polynome.
! Il faut garder en mémoire qu’une fonction ne pourra jamais renvoyer un polynôme :
sa sortie ne peut être qu’un type simple.
Par contre, si la procédure fait un passage par variable, elle pourra changer la variable polynôme d’entrée.
Exemple : Lorsque l’on souhaitera travailler commodément avec plusieurs matrices de M3 (R), et
créer des fonctions et procédures s’y rapportant on procédera en déclarant :
Tableaux à 1 dimension :
Exemple :
• Déclaration :
VAR T : ARRAY[1..50] of REAL ;
16
• Déclaration du type :
TYPE tab = ARRAY[1..50] of REAL ;
VAR T : tab ;
• Initialiser la 15-ièmme case de T à 0 :
T[15] := 0 ;
• Initialiser la 18-ième case de T à une valeur entrée par l’utilisateur :
WRITELN(’Entrer la valeur de la case 18’);
READLN(T[18]);
• Afficher la valeur de la case 25 du tableau :
WRITELN(T[25]);
• Initialiser tout le tableau T à 0 :
FOR k := 1 TO 50 DO T[k] := 0 ;
• Initialiser tout le tableau T à des valeurs entrées par l’utilisateur :
FOR k := 1 TO 50 DO
BEGIN
WRITELN(’Entrer la valeur de la case ’,k);
READLN(T[k]);
END ;
• Afficher la valeur de tout le tableau :
FOR k := 1 TO 50 DO WRITELN(T[k]) ;
Tableaux à 2 dimensions :
Exemple :
• Déclaration :
VAR U : ARRAY[1..50,1..40] of REAL ;
• Initialiser la case située à la 11-ième ligne et 23-ième colonne de U à 0 :
U[11,23] := 0 ;
• Initialiser la case située à la 8-ième ligne et 27-ième colonne de U à une valeur entrée par
l’utilisateur :
WRITELN(’Entrer la valeur de la case 8,27’);
READLN(T[8,27]);
• Afficher la valeur de la case (25,17) du tableau :
WRITELN(T[25,17]);
• Initialiser tout le tableau U à 0 :
FOR i := 1 TO 50 DO
FOR j := 1 TO 40 DO
U[i,j] := 0 ;
• Initialiser tout le tableau U à des valeurs entrées par l’utilisateur :
FOR i := 1 TO 50 DO
FOR j := 1 TO 40 DO
BEGIN
WRITELN(’Entrer la valeur de la case (’,i,j,’)’);
READLN(U[i,j]);
END ;
• Afficher la valeur de tout le tableau :
FOR i := 1 TO 50 DO
FOR j := 1 TO 40 DO WRITELN(U[i,j]) ;
17
Chapitre 10 : Les pointeurs en Pascal
1. Généralités
Jusqu'à présent la représentation d'un groupe de données de même nature (même type) n'est possible
qu'au moyen des tableaux. Or leur facilité d'utilisation peut être fortement réduite lorsque :
a) la structure séquentielle d'un tableau ne reflète pas l'organisation globale des données comme
par exemple : les liaisons ferroviaires ou routières entre les différentes gares ou villes d'une région ;
tout arbre de calcul.
En effet un tableau peut difficilement refléter les successeurs ou prédécesseurs d'une donnée, les
relations existantes entre certaines données.
b) le nombre maximal d'éléments du tableau n'est pas connu à la compilation (ne peut pas être
fixé par le programmeur), à savoir
- si ce nombre est choisi trop petit le programme ne pourra représenter et traiter toutes les
données ;
- s'il est pris (beaucoup) trop grand le gaspillage de mémoire peut pénaliser non seulement le
fonctionnement du programme mais aussi celui du système informatique entier.
On a besoin d’une structure plus souple pour manipuler les données, pour cela nous allons étudier un
autre moyen d’y accéder : les pointeurs.
2. Notions de zones mémoires
• zones mémoires utilisées par l’exécution d’un programme
Un programme qui s’exécute utilise au moins deux zones mémoires, appelées segments :
• Le segment de code : contient les instructions du programme;
• Le segment de données : contient les données utilisées par le programme.
Le segment de données est découpé en trois parties :
• la zone statique : contient les variables statiques, c’est-à-dire les variables ayant une durée de vie
égale à celle du programme : c’est le cas des variables globales.
• la pile : sert à gérer les éléments du programmes dont la durée de vie est limitée à un bloc : c’est le
cas des paramètres des appels de fonctions/procédures, des variables locales. Elle sert également à
renvoyer les résultats des fonctions.
• le tas : tout ce qui reste... Un programme ne peut accéder directement aux emplacements du tas. Par
contre, on peut allouer des emplacements dans le tas et les référencer ensuite à l’aide de pointeurs.
La gestion du tas est à la charge du programmeur.
3. Pointeurs : déclaration et allocation
Un pointeur permet de représenter des données complexes, de modifier le contenu d’une variable, de
travailler directement sur le contenu de la mémoire en utilisant le principe de l’allocation dynamique.
Un pointeur est ni plus ni moins un moyen d’accéder indirectement à une variable : au lieu d’accéder à
celle-ci, on passe par le pointeur qui nous dirige vers celle-ci.
4. Pointeurs : utilisation sans allocation
• Pointeurs : la valeur < nil >
• Pointeurs : comparaison et affectation