Compléments algorithmiques

publicité
COMPLEMENTS ALGORITHMIQUES
I. Les tableaux
A. Tableau à une dimension
1) définition
Un tableau est une structure de données regroupant une suite de variables de même type.
Par définition, un tableau
a une dimension,
a une taille définie une fois pour toute,
contient des éléments de même type.
Pour déclarer un tableau, il est nécessaire d'indiquer sa dimension, sa taille et le type de ses éléments.
Syntaxe en notation BNF
<tableau de dimension 1> ::= <identificateur> : Tableau(1..<taille>) de <type>
Soit N un entier positif, déclaré en tant que constante, on peut déclarer un tableau de la manière suivante :
TAB1 : tableau (1..N) de entier
Ici, le tableau a pour identificateur TAB
dimension 1
taille N
éléments de type entier
On atteint un élément du tableau par son indice i
i appartient à [1,N]
Par exemple TAB1(3)
Comme toute variable, un tableau se déclare en début d'algorithme.
JOUR
Lundi
Mardi
Mercredi
Jeudi
Vendredi
Samedi
Dimanche
1
2
3
4
5
6
7
Ce tableau se déclare de la manière suivante, JOUR : tableau (1..7) de chaîne
JOUR(1) = ′Lundi′
JOUR(4) = ′Jeudi′
JOUR(8) = indéterminé
Un programme ne doit jamais être amené à dépasser les limites d’un tableau.
2) exercice
Ecrire un algorithme permettant de créer puis de remplir un tableau à une dimension avec des entiers
donnés par l'utilisateur. Une fois ce tableau rempli, il sera édité à l'écran.
1er algorithme en utilisant TANTQUE
2e algorithme en utilisant POUR
Programme Premier_tableau
CONST n=10
VAR i : entier
tab : tableau(1..n) de entier
DEBUT
AFFICHER 'Premier tableau'
POUR i←1 à n FAIRE
AFFICHER 'Entrez la valeur n° ',i
SAISIR tab(i)
FPOUR
AFFICHER 'Contenu du tableau : '
POUR i←1 à n FAIRE
AFFICHER tab(i),' '
FPOUR
FIN
Programme Premier_tableau
CONST n=10
VAR i : entier
tab : tableau(1..n) de entier
DEBUT
AFFICHER 'Premier tableau'
i←1
TANTQUE i<=n FAIRE
AFFICHER 'Entrez la valeur n° ',i
SAISIR tab(i)
i←i+1
FINFAIRE
AFFICHER 'Contenu du tableau : '
i←1
TANTQUE i<=n FAIRE
AFFICHER tab(i),' '
i←i+1
FINFAIRE
FIN
B. Tableaux à deux dimensions
1) définition
***
2) exercice
***
II. Algorithmes de traitement de tableaux
A. Recherche du minimum et du maximum dans un tableau à 1 dimension
1) recherche du maximum
***
2) recherche du minimum et du maximum
***
B. Recherche d'un élément dans un tableau
1) cas d'un tableau non ordonné
***
2) cas d'un tableau ordonné
***
C. Etablissement d'une table de multiplication
***
III. Notions de sous-programmes
Cette notion intervient lorsque l'on affaire à des traitements qui se reproduisent souvent et qu'il serait
intéressant de :
-
pouvoir écrire une fois pour toute
pouvoir appeler comme s'il constituait une nouvelle instruction
Ex : saisie et affichage d'un tableau
A. Procédures
1) définition
Une procédure est un sous-programme écrit à l'intérieur ou éventuellement à l'extérieur d'un programme
principal, assurant de manière autonome un traitement particulier.
Ce traitement peut alors être répété dans le programme principal par simple appel de la procédure.
Remarque : la notion de procédure comporte 2 aspects qu'il est très important de distinguer :
- la définition de la procédure appelée déclaration de procédure, qui est placée en tête de
l'algorithme principal après la déclaration des variables, et qui décrit le traitement effectué par la
procédure.
- l'utilisation de la procédure appelée appel de la procédure, qui se situe dans le bloc de
l'algorithme complet.
2) syntaxe
En notation BNF
<procédure> ::= <entête de procédure><bloc>
<entête de procédure> ::= procédure<identificateur><liste des paramètres>
<liste des paramètres> ::=
|
(<identificateur>{,<identificateur>}*:<type>{;<identificateur>{,<identificateur>}*:<type>}*)
Ex :
procédure AA
procédure AA (x:entier)
procédure AA (x,y,z:entier)
procédure AA (x,y,z:entier; a:booléen; b,c,d,e:réel)
Le bloc contient toutes les rubriques d’un algorithme complet :
- déclaration de variables, qui seront alors des variables locales à la procédure
- éventuellement la déclaration de procédures qui seront utilisées dans le corps de celle-ci
- une suite d’instructions entourée par les mots début et fin.
Remarque : la déclaration des procédures est dans la partie déclarative de l’algorithme et leurs appels
apparaissent dans le corps de l’algorithme comme une instruction quelconque.
3) exemples
. Exemples simples
programme B
procédure Bonj
début
afficher 'Bonjour'
fin
!programme principal
début
Bonj
fin
programme B'
var mot1, mot2 : chaîne
procédure Bonj1 (X:chaîne)
début
afficher X
fin
début
afficher 'Entrez un mot'
saisir mot1
Bonj1(mot1)
afficher 'Entrez un 2ème mot'
saisir mot2
Bonj1(mot2)
fin
Bonjour
Entrez un mot
Bonjour
Bonjour
Entrez un 2ème mot
Au revoir
Au revoir
. On reprend l’algorithme de recherche du maximum dans un tableau non ordonné, en créant 2
procédures :
- une procédure litvecteur pour remplir le tableau
- une procédure recherchemax qui recherche puis affiche le maximum et l’indice de sa première
occurrence.
De plus, le programme principal demandera à l’utilisateur la taille du tableau sur lequel il désire travailler,
cette info sera transmise aux deux procédures.
L’utilisateur pourra relancer le programme autant de fois qu’il le désire.
*** Algo Maxbis ***
4) paramètres formels et paramètres effectifs
Les exemples montrent que les noms des objets utilisés dans la déclaration ne sont pas les mêmes que
ceux utilisés dans l’appel. En effet une procédure peut être utilisée dans plusieurs algorithmes. Il faut
donc dissocier les noms d’objet de la déclaration et les noms d’objet de l’appel.
Les paramètres utilisés lors de la déclaration de la procédure sont appelés paramètres formels, ils
indiquent le type des qui seront qui seront transmis et permettent de réserver la plage mémoire nécessaire
pour les stocker.
Les paramètres effectifs sont les noms des objets utilisés par l’algorithme, ils sont transmis à la procédure
au moment où elle est appelée.
Les paramètres effectifs doivent avoir exactement le même type et la même signification que les
paramètres formels, utilisés dans l’entête de la procédure. Par contre, ils n’ont pas nécessairement le
même nom.
Par exemple, dans le programme Maxbis, les paramètres taillevect et taillevecteur sont des paramètres
formels des procédures litvecteur et recherchemax.
L’appel à ces procédures se fait par les instructions litvecteur(L) et recherchemax(L).
L est appelé paramètre effectif.
Le mécanisme d’appel et d’exécution d’une procédure est le suivant :
-
-
le programme appelant va transmettre à la procédure les arguments effectifs
cette procédure va donc effectuer ses calculs sur ces arguments, et au moment de son
exécution (c'est-à-dire après la transmission des paramètres) tout va se passer comme si les
instructions de la procédure appelée s’étaient insérées dans le programme appelant à la place
de l’instruction d’appel.
Quand l’exécution de l’instruction d’appel est terminée, le programme appelant passe à
l’exécution de l’instruction qui suit l’instruction d’appel.
Ex : Lors de l’appel de litvecteur(L) on a L = paramètre effectif et taillevect = paramètre formel.
- Les paramètres effectifs sont transmis à la procédure, c'est-à-dire que la variable taillevect va
prendre la valeur de la variable L (ou que l’adresse de la variable taillevect va être la même
que la variable L)
- La procédure sera exécutée, comme si le mot début de l’algorithme de la procédure litvecteur
était suivi de l’instruction taillevect prend la valeur de L.
- A la fin de l’exécution de la procédure litvecteur, c’est l’instruction recherchemax(L) qui sera
exécutée.
Les paramètres ont deux rôles :
- Transmettre la procédure, au moment de l’appel, les valeurs nécessaires à son exécution
- Au moment du retour, transmettre au programme appelant le ou les résultats du traitement
effectué.
Il y a plusieurs mécanismes de passage des arguments et des programmes appelés.
5) passage des paramètres
La façon dont la valeur des paramètres sont transmises est très importante et doit absolument être pris en
compte pour éviter les effets inattendus. Tout tourne autour de la question suivante : les arguments sont
ils modifiés par l’exécution de cette procédure ? Si oui, quelles valeurs auront-ils à la fin de cette
exécution dans le programme appelant ?
On distingue deux types de transmission de paramètres :
- le passage de paramètres par valeur
- le passage de paramètres par adresse (ou par variable)
a) passage par valeur
Dans ce mode de transmission, c’est la valeur des arguments qui est transmise au sous-programme appelé.
Il y a recopie des valeurs initiales des paramètres effectifs dans une zone locale du sous-programme.
programme PARAM
var A : entier
procédure plus1(X : entier)
début
X←X+1
Afficher X
fin
!Programme principal
début
A←0
afficher A
plus1(A)
afficher A
fin
Avant l’appel de plus1, on a la situation suivante :
- L’objet A contient la valeur 0
- L’objet A est représenté en mémoire centrale par un mot mémoire dont le contenu est 0
Au moment de l’appel, il y a recopie du contenu du mot associé à A dans un objet X de la zone réservé à
la zone plus1, autrement dit la valeur de A est recopiée dans X.
Au cours de l’exécution de plus1, le traitement portera sur l’objet local X associé à la procédure, il
n’affectera pas du tout le contenu de l’objet A. Juste avant le retour au programme principal, on aura :
Ainsi les variables du programme principal ne sont pas affectées par les trait…
Avec ce mode ce mode de transmission de paramètres par valeur, l’exécution du programme PARAM
donne :
b) passage par adresse
Dans ce mode de transmission, on associe aux variables utilisées dans le sous-programme l’adresse des
variables correspondantes du programme principal.
Dans la liste des paramètres de l’entête de la procédure, les variables transmises par adresse ou variable
seront précédées par VAR.
6)…
***
B. Fonctions
1) passage des paramètres
C’est un sous-programme semblable à la procédure, mais une fonction calcule une valeur d’un type donné
et renvoie cette valeur au programme appelant à travers le nom donné à la fonction.
2) syntaxe
***
C. Applications : Manipulation d’un tableau ordonné à une dimension
*** polycopié ***
IV.
A. Généralités
***
Téléchargement