SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
1
Les procéduresLes procédures
Chapitre 7
2
IntIntéérrêêtt
Créer une instruction nouvelle qui deviendra une primitive pour
le programmeur
Structurer le texte source du programme et améliorer sa lisibilité
Factoriser l'écriture lorsque la suite d'actions nommée par la
procédure intervient plusieurs fois
3
DiffDifféérence entre fonction et procrence entre fonction et procééduredure
(1/2)(1/2)
Une fonction peut être vue comme un opérateur produisant une valeur.
Une fonction n'a pas pour rôle de modifier l'état courant du programme en
exécution.
Une bonne programmation interdit aux fonctions de réaliser des effets de bords.
On appelle effet de bord toute modification de la mémoire (affectation d'une
variable, opération de lecture en mémoire) ou toute modification d'un support
externe (disque, écran, disquette, etc ).
Une fonction n'est pas une instruction, elle n'est donc pas en mesure de modifier
l'état du programme. Une fonction réalise une simple opération dont le
résultat peut être, par la suite, utilisé par une instruction.
4
DiffDifféérence entre fonction et procrence entre fonction et procééduredure
(2/2)(2/2)
Une procédure est une instruction composée qui peut
prendre des paramètres et dont le rôle est de modifier
l'état courant.
Les procédures ne retournent pas de résultat.
Les 3 aspects d'une procédure :
– Déclaration
– Déclaration du corps
– Appel
5
DDééclaration de procclaration de procééduredure
Le but de la déclaration d'une procédure est d'introduire dans
l'environnement courant :
– son identificateur
– son type
– son mode de communication
6
DDééclaration de procclaration de procéédure : syntaxedure : syntaxe
<déclaration_proc>::=<en-tete_proc>;
<en-tete_proc>::=procedure <ident_proc> <liste_paramètres>
<liste_paramètres>::=vide|(<déclar_paramètres>)
<déclar_paramètres>::=
<ident_param>:<mode> <type_param>{;<déclar_paramètres>}
où
<ident_param>::= identificateurs des paramètres formels
<mode> : := vide|in|out|in out
<type> ::= type des paramètres formels
7
Exemple 1Exemple 1
procedure permuter(a:in out Character;b:in out Integer);
Remarques
La déclaration d'une procédure n'est pas obligatoire, la déclaration de
son corps peut en tenir lieu.
Une valeur par défaut peut être associée à chaque paramètre formel
8
Exemple 2Exemple 2
procedure accumuler
(accu:in out Integer:=0;
x:in Tableau;
n:in Positive);
9
Type d'une procType d'une procééduredure
Une procédure ne renvoie pas de valeur.
Son type est de la forme :
t1*t2*...*tn->vide
Le type de la procédure permuter est :
Character*Integer->vide
Le type de la procédure accumuler est :
Integer*Tableau*Positive->vide
10
DDééclaration de procclaration de procéédure : sdure : séémantiquemantique
procedure permuter(a:in out Character;b:in out Integer);
Mécanisme d'évaluation de cette déclaration de procédure dans l'environnement
Env :
– Création de la liaison : (permuter,??)
– Extension de Env avec cette liaison : on obtient le nouvel environnement
Env1
– Détermination du type des paramètres et du type du résultat. Le type de la
fonction est :
Character*Integer-->vide
(permuter,??) Env
Env1
11
Déclaration du corps de la procédureDéclaration du corps de la procédure
permuterpermuter
procedure permuter(a:in out Character; b:in out Integer) is
z:Integer;
begin
z:=Character'pos(a);
a:=Character'val(b);
b:=z;
end permuter;
Le code exécutable de cette procédure associé au contexte de sa
déclaration tient lieu de valeur liée à l'identificateur permuter.
12
DDééclaration du corps d'une procclaration du corps d'une procéédure :dure :
sséémantiquemantique
Mécanisme d'évaluation de cette déclaration dans Env1:
Détermination de la fermeture F de permuter, dans un
environnement Env1, à partir du corps de la procédure
F= <<a,b-->Corps de permuter,Env1>>
Modification de la liaison de l'environnement Env1
....(permuter,??) Env
Env1
.... (permuter,<<a,b-->Corps de permuter,Env1) Env
Env1
13
Appel de procAppel de procééduredure
L'application d'une procédure à des paramètres effectifs constitue l'appel de
cette procédure.
Syntaxe
<appel_procédure>::=
<id_proc>(<liste_params_effectifs>)|<id_proc>;
<liste_params_effectifs>::=<param>{,<param>}
<param>::=<valeur>|<id_param>
Le type des paramètres effectifs doit être le même que celui des paramètres
formels correspondants.
Si le paramètre formel est déclaré en mode in, toute expression peut être
utilisée en tant que paramètre effectif correspondant.
Si le paramètre formel est déclaré en mode out ou in out, le paramètre
effectif doit être une variable.
14
Association paramAssociation paramèètretre
effectif/parameffectif/paramèètre formeltre formel
Liaison d'après l'ordre d'écriture
ident_proc(a1,a2,,an);
Liaison en nommant le paramètre formel
ident_proc(pi=>ai,pj=>aj,,p2=>a2);
Panachage
ident_proc(a1,a2,...,pj=>aj,,pi=>ai);
15
Passage de paramètre en modePassage de paramètre en mode inin
(1/3)(1/3)
Soit le bloc,
declare
y,z:Integer;
procedure doubler(x:in Integer;t:out Integer) is
begin
t:=2*x;
end doubler;
begin
y:=3;
doubler(y,z);
put( "z=" );put(z,width=>3);
end;
16
Passage de paramètre en modePassage de paramètre en mode inin
(2/3)(2/3)
Le contrôle de type a été effectué. Les paramètres formels et
effectifs correspondants ont donc le même type.
Transmission du paramètre passé en mode in :
– Etablissement d'un canal de communication entre le paramètre
effectif et le paramètre formel
– Et d'un sens de la communication
– Copie de la valeur du paramètre effectif y et affectation de
cette valeur au paramètre formel correspondant x
– Le paramètre formel x est une constante pendant toute
l'exécution de la procédure
17
Passage de paramètre en modePassage de paramètre en mode inin
(3/3)(3/3)
– Exécution de l'appelé
– Retour vers l'appelant :
Le contrôle est passé à l'appelant derrière
l'appel.
Aucune valeur n'est transmise
18
Passage de paramètre en modePassage de paramètre en mode outout
(1/2)(1/2)
Le contrôle de type a été effectué. Les paramètres formels et
effectifs correspondants ont donc le même type.
Transmission du paramètre passé en mode out :
– Etablissement d'un canal de communication entre le paramètre
effectif et le paramètre formel
– Et d'un sens de la communication
– Le paramètre formel t est une variable dont la valeur initiale
est indéfinie
19
Passage de paramètre en modePassage de paramètre en mode outout
(2/2)(2/2)
– Exécution de l'appelé
– Retour vers l'appelant
– Copie de la valeur du paramètre formel t et affectation de
cette valeur au paramètre effectif z (qui doit être une
variable).
– Le contrôle est passé à l'appelant derrière l'appel.
20
Passage de paramètre en modePassage de paramètre en mode inin
outout (1/3)(1/3)
Soit le bloc,
declare
x:Integer:=56; y:Integer:=57;
procedure echange(u,v:in out Integer) is
z:Integer;
begin
z:=u;u:=v;v:=z;
end echange;
begin
echange(x,y);
end;
21
Passage de paramètre en modePassage de paramètre en mode inin
outout (2/3)(2/3)
Le contrôle de type a été effectué. Les paramètres formels et
effectifs correspondants ont donc le même type.
Transmission du paramètre passé en mode in out :
– Etablissement d'un canal de communication entre le paramètre
effectif et le paramètre formel
– Et d'un sens de la communication
– Les paramètres formels u et v sont des variables dont les
valeurs initiales sont les copies des valeurs des paramètres
effectifs x et y
22
Passage de paramètre en modePassage de paramètre en mode inin
outout (3/3)(3/3)
– Exécution de l'appelé
– Retour vers l'appelant
– Copie des valeurs des paramètres formels u et v et
affectation de ces valeurs aux paramètres effectifs x et y
(qui doivent être des variables).
– Le contrôle est passé à l'appelant derrière l'appel.
23
Passage de paramPassage de paramèètres : par rtres : par rééfféérencerence
Les passages en mode in, out et in out imposent une
recopie de valeur.
Cette recopie peut être pénalisante lorsque les valeurs sont de
taille importante (grande matrice).
Les compilateurs Ada ont la possibilité d'utiliser un autre mode de
transmission de paramètres : le passage par référence pour
pallier cet inconvénient.
Ce choix est transparent à l'utilisateur.
24
Exemple (1/2)Exemple (1/2)
Soit le bloc,
declare
type Vecteur is array(Positive range<>) of Float;
y:Float;z:Vecteur(1..100000):=(1.12,3.21,6.71,....,2.45);
procedure doubler(x:in Float;t:in out Vecteur) is
begin
for i in t'range loop
t(i):=t(i)*x;
end loop;
end doubler;
begin
y:=3.0;
doubler(y,z);
put( "z=" );put(z);
end;
25
Exemple (2/2)Exemple (2/2)
Après transmission des paramètres, le vecteur de dimension
100000 possède 2 synonymes :
– z dans l'environnement de l'appelant
– t dans l'environnement de l'appelé qui lui est lié
Conséquence, toute modification apportée à t dans l'appelé
modifie aussi z.
26
Passage de paramPassage de paramèètres : par valeurtres : par valeur
Ce mode de passage n'existe pas en Ada.
On le trouve dans des langages impératifs comme C, C++, Pascal.
Comme dans le mode in, une valeur est transmise de l'appelant vers
l'appelé via un paramètre.
La différence est que, dans l'appelé, ce paramètre n'est pas considéré
comme une constante mais comme une variable.
De même que pour le mode in, après retour vers l'appelant, ce type de
passage garantit que le paramètre effectif conserve sa valeur d'appel.
27
ExempleExemple
declare
type Tableau is array(Positive range<>) of Integer;
procedure init(x:in Positive;T:out Tableau) is
begin
for i in T'range loop
T(i):=x;
x:=x+1;
-- affectation illicite en Ada car x est une constante
-- mais affectation licite en Pascal ou C
end loop;
end init;
Tab:Tableau(1..20);
begin
init(1,Tab);
end;
28
Profil des paramètres d'une procédureProfil des paramètres d'une procédure
Deux procédures ont le même profil de paramètres si :
– elles ont le même nombre de paramètres
– à chaque position, les paramètres ont le même type
procedure P(a:in Character:='A';b:out Integer);
procedure Q(x:in Character;y:in out Integer);
Les procédures P et Q ont le même profil de paramètres
Les noms, mode de transmission et expression par défaut ne sont pas pris
en compte
29
Masquage de procMasquage de procééduresdures
Si deux procédures ont même profil et même identificateur, la
dernière déclarée masque la précédente.
Une déclaration de procédure ne peut pas masquer une
déclaration de fonction et vice versa.
30
MasquageMasquage
with Ada.Text_io;
use Ada.Text_io;
procedure masquage is
a,b:Character;
procedure permuter(x,y:in out Character) is
z:Character;
begin
z:=x;x:=y;y:=z;
end permuter;
function permuter(x,y:Character) return Character is
begin
return x;
end permuter;
begin
put( "a=" );get(a);put( "b=" );get(b);
permuter(a,b);put( "a=" );put(permuter(a,b));
end masquage;
31
Surcharge de procSurcharge de procééduresdures
Un identificateur de procédure est surchargé si :
– il identifie plusieurs procédures
– si ces procédures n'ont pas le même profil de paramètres
Un tel identificateur possède plusieurs sémantiques
procedure permuter(a:in out Character; b:in out Character);
procedure permuter(x:in out Integer; y:in out Float);
Le code de ces deux procédures sera différent puisque leur type est différent.
Ces deux déclarations sont dites surchargées.
32
with Ada.Text_io;use Ada.Text_io;
procedure surcharge2 is
x:Integer:=1;
y:Integer:=0;
z:Integer;
begin
z:=x+y;
put("z externe=");put(Integer'image(z));new_line;
declare
subtype bool is Natural range 0..1;
function "+"(a,b:bool) return bool is
begin
if a=1 and b=1 then return 1; else return 0;end if;
end "+";
z:Integer;
begin
z:=x+y;
-- + sur les Integer est masqué
put("z interne=");put(Integer'image(z));
end;
end surcharge2;
z externe = 1
z interne = 0
33
Sémantique de l'appel de la procédureSémantique de l'appel de la procédure
permuterpermuter
with Ada.Text_io, Ada.Integer_Text_io;
use Ada.Text_io, Ada.Integer_Text_io;
procedure car_int is
procedure permuter(a:in out Character; b:in out Integer) is
z:Integer;
begin
z:=Character'pos(a);a:=Character'val(b);b:=z;
end permuter;
m:Character:='*';n:Integer:=65;
begin
put( " m=" );put(m);put( "n=" );put(n,width=>2);new_line;
permuter(m,n);
-- ou permuter(b=>n,a=>m);
put( "permuter(m,n);" );new_line;
put( " m=" );put(m);
put( "n=" );put(n,width=>2);new_line;
end car_int;
34
Etat avant l'appelEtat avant l'appel
Env1
(n,@n)(m,@m)(permuter,<<a,b->corps de permuter,Env1>> Env
EnvAppel
@m '*'
@n 65
Mem
Etat avant l'appel permuter(m,n) : (EnvAppel,Mem)
35
Etat après transmission desEtat après transmission des
paramètresparamètres
permuter(b=>n,a=>m);
@b 65
@m '*'
@n 65
@a '*'
(a,@a)(b,@b) Env1
EnvExe
Mem1
Etat initial de l'appelé (après transmission des paramètres) : (EnvExe,Mem1)
36
Etat à la fin de l'exécution de laEtat à la fin de l'exécution de la
procédureprocédure
Exécution du corps de la procédure
z:=Character'pos(a);
a:=Character'val(b);
b:=z;
(z,@z)(a,@a)(b,@b) Env'
@b 42
@m 'A'
@n 42
@z 42
@a 'A'
Mem2
EnvExe'
Etat final de la procédure appelée : (EnvExe',Mem2)
37
Etat après retour vers l'appelantEtat après retour vers l'appelant
(n,@n)(m,@m)(permuter,<<a,b->corps de permuter,Env1>> Env
@m 'A'
@n 42
Mem3
EnvAppel
Etat après retour vers l'appelant de la procédure : (EnvAppel',Mem3)
38
ProcProcéédures rdures réécursivescursives
Comme les fonctions, les procédures Ada sont naturellement récursives.
Exemple : Les tours de Hanoï
3 pieux A,B,C sont plantés en terre. Initialement, sur le pieu A sont empilés des
disques de taille décroissante. Les pieux B et C sont alors vides.
A l'état final tous les disques sont empilés sur le pieu C.
Les règles sont les suivantes :
– on ne peut déplacer qu'un disque à la fois et bien sûr, il ne peut être
placé qu'en haut d'une pile (au sommet d'un pieu).
– il est possible d'utiliser le pieu B
– on peut toujours empiler un disque sur un autre à la condition que sa
taille soit inférieure
39
La procédureLa procédure hanoihanoi (1/3)(1/3)
La procédure hanoi construit et affiche la suite des
déplacements de disques de manière récursive.
Les 3 pieux sont représentés par les caractères 'A, 'B', 'C'.
Les disques sont représentés par un entier qui simule leur taille.
40
La procédureLa procédure hanoihanoi (2/3)(2/3)
procedure hanoi(n:in Natural;X,Y,Z:in Character) is
begin
if n/=0
then
hanoi(n-1,X,Z,Y);
put( "disque : " );put(n,WIDTH=>2);put( " : " );
put(X);put( " --> " );put(Y);new_line;
hanoi(n-1,Z,Y,X);
end if;
end hanoi;
41
La procédureLa procédure hanoihanoi (3/3)(3/3)
with Ada.Text_io;use Ada.Text_io;
with Ada.Integer_Text_io;use Ada.Integer_Text_io;
procedure tours_hanoi is
procedure hanoi(n:in Natural;X,Y,Z:in Character) is
-- voir transparent précédent
end hanoi;
A:Character:='A';
B:Character:='B';
C:Character:='C';
begin
hanoi(3,A,C,B);
end tours_hanoi;
42
43
La procédureLa procédure hanoihanoi : résultats: résultats
Le résultat pour un pieu A où sont empilés 3 disques est :
disque : 1 : A --> C
disque : 2 : A --> B
disque : 1 : C --> B
disque : 3 : A --> C
disque : 1 : B --> A
disque : 2 : B --> C
disque : 1 : A --> C
44
La procédureLa procédure hanoihanoi : résultats: résultats
L'idée est, ici de dire :
Si aucun disque n'est empilé sur A, alors il n'y a rien à faire
Supposons que je sache déplacer les n-1 disques les plus petits de
A vers C en utilisant B
Alors il suffit de placer le plus gros disque de A sur le pieu libre B et
de recommencer ce que j'ai supposé savoir faire, c'est à dire
déplacer les n-1 disques (cette fois de C vers B en utilisant A).

Weitere ähnliche Inhalte

Was ist angesagt?

La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en PythonABDESSELAM ARROU
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesECAM Brussels Engineering School
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieLoic Yon
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Aziz Darouichi
 
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de trirécursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de triYassine Anddam
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage Ccoursuniv
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmiqueAbdoulaye Dieng
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivitéSana Aroussi
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++Abdoulaye Dieng
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerSana Aroussi
 

Was ist angesagt? (20)

La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en Python
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partie
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de trirécursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage C
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivité
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++cpp1 : Quelques elements de base du C++
cpp1 : Quelques elements de base du C++
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régner
 

Andere mochten auch

C.Martin. Monumentos de Burgos
C.Martin. Monumentos de Burgos C.Martin. Monumentos de Burgos
C.Martin. Monumentos de Burgos BEGOÑA
 
Amplificateuroprationnel 150310093109-conversion-gate01
Amplificateuroprationnel 150310093109-conversion-gate01Amplificateuroprationnel 150310093109-conversion-gate01
Amplificateuroprationnel 150310093109-conversion-gate01yeksdech
 
Propuestas Pedagógicas Innovadoras - Comunicación
Propuestas Pedagógicas Innovadoras - ComunicaciónPropuestas Pedagógicas Innovadoras - Comunicación
Propuestas Pedagógicas Innovadoras - ComunicaciónYohnny Carrasco
 
Volta ao nosso mundo
Volta ao nosso mundoVolta ao nosso mundo
Volta ao nosso mundoBiaEsteves
 
Reputació digital acestic2013 v3
Reputació digital acestic2013 v3Reputació digital acestic2013 v3
Reputació digital acestic2013 v3Rafael Pardo
 
Lettre aux camarades Un Monde d'Avance 17.04.14
Lettre aux camarades Un Monde d'Avance 17.04.14Lettre aux camarades Un Monde d'Avance 17.04.14
Lettre aux camarades Un Monde d'Avance 17.04.14UnMondedAvance
 
La moral kantiana.
La moral kantiana.La moral kantiana.
La moral kantiana.paulateruel5
 
LOS COMUNEROS DE CASTILLA. ANNA
LOS COMUNEROS DE CASTILLA. ANNALOS COMUNEROS DE CASTILLA. ANNA
LOS COMUNEROS DE CASTILLA. ANNABEGOÑA
 
What does a marketing plan include?
What does a marketing plan include?What does a marketing plan include?
What does a marketing plan include?Sameer Mathur
 
Alphabets 10 letters
Alphabets   10 lettersAlphabets   10 letters
Alphabets 10 lettersSalamSchoolKG
 
Digital : Web & Mobilité
Digital : Web & MobilitéDigital : Web & Mobilité
Digital : Web & MobilitéCatalyse IT
 

Andere mochten auch (20)

Masterthesis Rink Weijs
Masterthesis Rink WeijsMasterthesis Rink Weijs
Masterthesis Rink Weijs
 
C.Martin. Monumentos de Burgos
C.Martin. Monumentos de Burgos C.Martin. Monumentos de Burgos
C.Martin. Monumentos de Burgos
 
Amplificateuroprationnel 150310093109-conversion-gate01
Amplificateuroprationnel 150310093109-conversion-gate01Amplificateuroprationnel 150310093109-conversion-gate01
Amplificateuroprationnel 150310093109-conversion-gate01
 
Propuestas Pedagógicas Innovadoras - Comunicación
Propuestas Pedagógicas Innovadoras - ComunicaciónPropuestas Pedagógicas Innovadoras - Comunicación
Propuestas Pedagógicas Innovadoras - Comunicación
 
Sonico
SonicoSonico
Sonico
 
Volta ao nosso mundo
Volta ao nosso mundoVolta ao nosso mundo
Volta ao nosso mundo
 
Reputació digital acestic2013 v3
Reputació digital acestic2013 v3Reputació digital acestic2013 v3
Reputació digital acestic2013 v3
 
Lettre aux camarades Un Monde d'Avance 17.04.14
Lettre aux camarades Un Monde d'Avance 17.04.14Lettre aux camarades Un Monde d'Avance 17.04.14
Lettre aux camarades Un Monde d'Avance 17.04.14
 
Panodic m3601 e
Panodic m3601 ePanodic m3601 e
Panodic m3601 e
 
La moral kantiana.
La moral kantiana.La moral kantiana.
La moral kantiana.
 
Modulo3 ok
Modulo3 okModulo3 ok
Modulo3 ok
 
Panodic mico
Panodic micoPanodic mico
Panodic mico
 
LOS COMUNEROS DE CASTILLA. ANNA
LOS COMUNEROS DE CASTILLA. ANNALOS COMUNEROS DE CASTILLA. ANNA
LOS COMUNEROS DE CASTILLA. ANNA
 
Deutchland
DeutchlandDeutchland
Deutchland
 
Azbox me
Azbox meAzbox me
Azbox me
 
What does a marketing plan include?
What does a marketing plan include?What does a marketing plan include?
What does a marketing plan include?
 
Papierprototyp
PapierprototypPapierprototyp
Papierprototyp
 
manuscrit these Ophelie Philipot
manuscrit these Ophelie Philipotmanuscrit these Ophelie Philipot
manuscrit these Ophelie Philipot
 
Alphabets 10 letters
Alphabets   10 lettersAlphabets   10 letters
Alphabets 10 letters
 
Digital : Web & Mobilité
Digital : Web & MobilitéDigital : Web & Mobilité
Digital : Web & Mobilité
 

Ähnlich wie Chapitre 7procédure et fonction

Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
ALGORITHMIQUE fonction et procedure.pptx
ALGORITHMIQUE fonction et procedure.pptxALGORITHMIQUE fonction et procedure.pptx
ALGORITHMIQUE fonction et procedure.pptxHathat10
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
3 vb reference
3 vb reference3 vb reference
3 vb referencekkatia31
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfFadouaBouafifSamoud
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Fahad Golra
 
Programmation Language Python Chapitre 2.pptx
Programmation Language Python Chapitre 2.pptxProgrammation Language Python Chapitre 2.pptx
Programmation Language Python Chapitre 2.pptxAhmathBambaMBACKE
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage cEbrima NJIE
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R SumAmy Isleb
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSiratiSoufiane
 
FiltrageNumérique.pptx
FiltrageNumérique.pptxFiltrageNumérique.pptx
FiltrageNumérique.pptxAyoubELJAFRY1
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Conception de base_de_l_algorithme
Conception de base_de_l_algorithmeConception de base_de_l_algorithme
Conception de base_de_l_algorithmemustapha4
 

Ähnlich wie Chapitre 7procédure et fonction (20)

les sous programmes.pptx
les sous programmes.pptxles sous programmes.pptx
les sous programmes.pptx
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
ALGORITHMIQUE fonction et procedure.pptx
ALGORITHMIQUE fonction et procedure.pptxALGORITHMIQUE fonction et procedure.pptx
ALGORITHMIQUE fonction et procedure.pptx
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
3 vb reference
3 vb reference3 vb reference
3 vb reference
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdf
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Turbo1
Turbo1Turbo1
Turbo1
 
Programmation Language Python Chapitre 2.pptx
Programmation Language Python Chapitre 2.pptxProgrammation Language Python Chapitre 2.pptx
Programmation Language Python Chapitre 2.pptx
 
Theme 7
Theme 7Theme 7
Theme 7
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage c
 
Récursivité
RécursivitéRécursivité
Récursivité
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R Sum
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 
FiltrageNumérique.pptx
FiltrageNumérique.pptxFiltrageNumérique.pptx
FiltrageNumérique.pptx
 
langage C++
langage C++langage C++
langage C++
 
Language-C.ppt
Language-C.pptLanguage-C.ppt
Language-C.ppt
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Conception de base_de_l_algorithme
Conception de base_de_l_algorithmeConception de base_de_l_algorithme
Conception de base_de_l_algorithme
 

Chapitre 7procédure et fonction

  • 2. 2 IntIntéérrêêtt Créer une instruction nouvelle qui deviendra une primitive pour le programmeur Structurer le texte source du programme et améliorer sa lisibilité Factoriser l'écriture lorsque la suite d'actions nommée par la procédure intervient plusieurs fois
  • 3. 3 DiffDifféérence entre fonction et procrence entre fonction et procééduredure (1/2)(1/2) Une fonction peut être vue comme un opérateur produisant une valeur. Une fonction n'a pas pour rôle de modifier l'état courant du programme en exécution. Une bonne programmation interdit aux fonctions de réaliser des effets de bords. On appelle effet de bord toute modification de la mémoire (affectation d'une variable, opération de lecture en mémoire) ou toute modification d'un support externe (disque, écran, disquette, etc ). Une fonction n'est pas une instruction, elle n'est donc pas en mesure de modifier l'état du programme. Une fonction réalise une simple opération dont le résultat peut être, par la suite, utilisé par une instruction.
  • 4. 4 DiffDifféérence entre fonction et procrence entre fonction et procééduredure (2/2)(2/2) Une procédure est une instruction composée qui peut prendre des paramètres et dont le rôle est de modifier l'état courant. Les procédures ne retournent pas de résultat. Les 3 aspects d'une procédure : – Déclaration – Déclaration du corps – Appel
  • 5. 5 DDééclaration de procclaration de procééduredure Le but de la déclaration d'une procédure est d'introduire dans l'environnement courant : – son identificateur – son type – son mode de communication
  • 6. 6 DDééclaration de procclaration de procéédure : syntaxedure : syntaxe <déclaration_proc>::=<en-tete_proc>; <en-tete_proc>::=procedure <ident_proc> <liste_paramètres> <liste_paramètres>::=vide|(<déclar_paramètres>) <déclar_paramètres>::= <ident_param>:<mode> <type_param>{;<déclar_paramètres>} où <ident_param>::= identificateurs des paramètres formels <mode> : := vide|in|out|in out <type> ::= type des paramètres formels
  • 7. 7 Exemple 1Exemple 1 procedure permuter(a:in out Character;b:in out Integer); Remarques La déclaration d'une procédure n'est pas obligatoire, la déclaration de son corps peut en tenir lieu. Une valeur par défaut peut être associée à chaque paramètre formel
  • 8. 8 Exemple 2Exemple 2 procedure accumuler (accu:in out Integer:=0; x:in Tableau; n:in Positive);
  • 9. 9 Type d'une procType d'une procééduredure Une procédure ne renvoie pas de valeur. Son type est de la forme : t1*t2*...*tn->vide Le type de la procédure permuter est : Character*Integer->vide Le type de la procédure accumuler est : Integer*Tableau*Positive->vide
  • 10. 10 DDééclaration de procclaration de procéédure : sdure : séémantiquemantique procedure permuter(a:in out Character;b:in out Integer); Mécanisme d'évaluation de cette déclaration de procédure dans l'environnement Env : – Création de la liaison : (permuter,??) – Extension de Env avec cette liaison : on obtient le nouvel environnement Env1 – Détermination du type des paramètres et du type du résultat. Le type de la fonction est : Character*Integer-->vide (permuter,??) Env Env1
  • 11. 11 Déclaration du corps de la procédureDéclaration du corps de la procédure permuterpermuter procedure permuter(a:in out Character; b:in out Integer) is z:Integer; begin z:=Character'pos(a); a:=Character'val(b); b:=z; end permuter; Le code exécutable de cette procédure associé au contexte de sa déclaration tient lieu de valeur liée à l'identificateur permuter.
  • 12. 12 DDééclaration du corps d'une procclaration du corps d'une procéédure :dure : sséémantiquemantique Mécanisme d'évaluation de cette déclaration dans Env1: Détermination de la fermeture F de permuter, dans un environnement Env1, à partir du corps de la procédure F= <<a,b-->Corps de permuter,Env1>> Modification de la liaison de l'environnement Env1 ....(permuter,??) Env Env1 .... (permuter,<<a,b-->Corps de permuter,Env1) Env Env1
  • 13. 13 Appel de procAppel de procééduredure L'application d'une procédure à des paramètres effectifs constitue l'appel de cette procédure. Syntaxe <appel_procédure>::= <id_proc>(<liste_params_effectifs>)|<id_proc>; <liste_params_effectifs>::=<param>{,<param>} <param>::=<valeur>|<id_param> Le type des paramètres effectifs doit être le même que celui des paramètres formels correspondants. Si le paramètre formel est déclaré en mode in, toute expression peut être utilisée en tant que paramètre effectif correspondant. Si le paramètre formel est déclaré en mode out ou in out, le paramètre effectif doit être une variable.
  • 14. 14 Association paramAssociation paramèètretre effectif/parameffectif/paramèètre formeltre formel Liaison d'après l'ordre d'écriture ident_proc(a1,a2,,an); Liaison en nommant le paramètre formel ident_proc(pi=>ai,pj=>aj,,p2=>a2); Panachage ident_proc(a1,a2,...,pj=>aj,,pi=>ai);
  • 15. 15 Passage de paramètre en modePassage de paramètre en mode inin (1/3)(1/3) Soit le bloc, declare y,z:Integer; procedure doubler(x:in Integer;t:out Integer) is begin t:=2*x; end doubler; begin y:=3; doubler(y,z); put( "z=" );put(z,width=>3); end;
  • 16. 16 Passage de paramètre en modePassage de paramètre en mode inin (2/3)(2/3) Le contrôle de type a été effectué. Les paramètres formels et effectifs correspondants ont donc le même type. Transmission du paramètre passé en mode in : – Etablissement d'un canal de communication entre le paramètre effectif et le paramètre formel – Et d'un sens de la communication – Copie de la valeur du paramètre effectif y et affectation de cette valeur au paramètre formel correspondant x – Le paramètre formel x est une constante pendant toute l'exécution de la procédure
  • 17. 17 Passage de paramètre en modePassage de paramètre en mode inin (3/3)(3/3) – Exécution de l'appelé – Retour vers l'appelant : Le contrôle est passé à l'appelant derrière l'appel. Aucune valeur n'est transmise
  • 18. 18 Passage de paramètre en modePassage de paramètre en mode outout (1/2)(1/2) Le contrôle de type a été effectué. Les paramètres formels et effectifs correspondants ont donc le même type. Transmission du paramètre passé en mode out : – Etablissement d'un canal de communication entre le paramètre effectif et le paramètre formel – Et d'un sens de la communication – Le paramètre formel t est une variable dont la valeur initiale est indéfinie
  • 19. 19 Passage de paramètre en modePassage de paramètre en mode outout (2/2)(2/2) – Exécution de l'appelé – Retour vers l'appelant – Copie de la valeur du paramètre formel t et affectation de cette valeur au paramètre effectif z (qui doit être une variable). – Le contrôle est passé à l'appelant derrière l'appel.
  • 20. 20 Passage de paramètre en modePassage de paramètre en mode inin outout (1/3)(1/3) Soit le bloc, declare x:Integer:=56; y:Integer:=57; procedure echange(u,v:in out Integer) is z:Integer; begin z:=u;u:=v;v:=z; end echange; begin echange(x,y); end;
  • 21. 21 Passage de paramètre en modePassage de paramètre en mode inin outout (2/3)(2/3) Le contrôle de type a été effectué. Les paramètres formels et effectifs correspondants ont donc le même type. Transmission du paramètre passé en mode in out : – Etablissement d'un canal de communication entre le paramètre effectif et le paramètre formel – Et d'un sens de la communication – Les paramètres formels u et v sont des variables dont les valeurs initiales sont les copies des valeurs des paramètres effectifs x et y
  • 22. 22 Passage de paramètre en modePassage de paramètre en mode inin outout (3/3)(3/3) – Exécution de l'appelé – Retour vers l'appelant – Copie des valeurs des paramètres formels u et v et affectation de ces valeurs aux paramètres effectifs x et y (qui doivent être des variables). – Le contrôle est passé à l'appelant derrière l'appel.
  • 23. 23 Passage de paramPassage de paramèètres : par rtres : par rééfféérencerence Les passages en mode in, out et in out imposent une recopie de valeur. Cette recopie peut être pénalisante lorsque les valeurs sont de taille importante (grande matrice). Les compilateurs Ada ont la possibilité d'utiliser un autre mode de transmission de paramètres : le passage par référence pour pallier cet inconvénient. Ce choix est transparent à l'utilisateur.
  • 24. 24 Exemple (1/2)Exemple (1/2) Soit le bloc, declare type Vecteur is array(Positive range<>) of Float; y:Float;z:Vecteur(1..100000):=(1.12,3.21,6.71,....,2.45); procedure doubler(x:in Float;t:in out Vecteur) is begin for i in t'range loop t(i):=t(i)*x; end loop; end doubler; begin y:=3.0; doubler(y,z); put( "z=" );put(z); end;
  • 25. 25 Exemple (2/2)Exemple (2/2) Après transmission des paramètres, le vecteur de dimension 100000 possède 2 synonymes : – z dans l'environnement de l'appelant – t dans l'environnement de l'appelé qui lui est lié Conséquence, toute modification apportée à t dans l'appelé modifie aussi z.
  • 26. 26 Passage de paramPassage de paramèètres : par valeurtres : par valeur Ce mode de passage n'existe pas en Ada. On le trouve dans des langages impératifs comme C, C++, Pascal. Comme dans le mode in, une valeur est transmise de l'appelant vers l'appelé via un paramètre. La différence est que, dans l'appelé, ce paramètre n'est pas considéré comme une constante mais comme une variable. De même que pour le mode in, après retour vers l'appelant, ce type de passage garantit que le paramètre effectif conserve sa valeur d'appel.
  • 27. 27 ExempleExemple declare type Tableau is array(Positive range<>) of Integer; procedure init(x:in Positive;T:out Tableau) is begin for i in T'range loop T(i):=x; x:=x+1; -- affectation illicite en Ada car x est une constante -- mais affectation licite en Pascal ou C end loop; end init; Tab:Tableau(1..20); begin init(1,Tab); end;
  • 28. 28 Profil des paramètres d'une procédureProfil des paramètres d'une procédure Deux procédures ont le même profil de paramètres si : – elles ont le même nombre de paramètres – à chaque position, les paramètres ont le même type procedure P(a:in Character:='A';b:out Integer); procedure Q(x:in Character;y:in out Integer); Les procédures P et Q ont le même profil de paramètres Les noms, mode de transmission et expression par défaut ne sont pas pris en compte
  • 29. 29 Masquage de procMasquage de procééduresdures Si deux procédures ont même profil et même identificateur, la dernière déclarée masque la précédente. Une déclaration de procédure ne peut pas masquer une déclaration de fonction et vice versa.
  • 30. 30 MasquageMasquage with Ada.Text_io; use Ada.Text_io; procedure masquage is a,b:Character; procedure permuter(x,y:in out Character) is z:Character; begin z:=x;x:=y;y:=z; end permuter; function permuter(x,y:Character) return Character is begin return x; end permuter; begin put( "a=" );get(a);put( "b=" );get(b); permuter(a,b);put( "a=" );put(permuter(a,b)); end masquage;
  • 31. 31 Surcharge de procSurcharge de procééduresdures Un identificateur de procédure est surchargé si : – il identifie plusieurs procédures – si ces procédures n'ont pas le même profil de paramètres Un tel identificateur possède plusieurs sémantiques procedure permuter(a:in out Character; b:in out Character); procedure permuter(x:in out Integer; y:in out Float); Le code de ces deux procédures sera différent puisque leur type est différent. Ces deux déclarations sont dites surchargées.
  • 32. 32 with Ada.Text_io;use Ada.Text_io; procedure surcharge2 is x:Integer:=1; y:Integer:=0; z:Integer; begin z:=x+y; put("z externe=");put(Integer'image(z));new_line; declare subtype bool is Natural range 0..1; function "+"(a,b:bool) return bool is begin if a=1 and b=1 then return 1; else return 0;end if; end "+"; z:Integer; begin z:=x+y; -- + sur les Integer est masqué put("z interne=");put(Integer'image(z)); end; end surcharge2; z externe = 1 z interne = 0
  • 33. 33 Sémantique de l'appel de la procédureSémantique de l'appel de la procédure permuterpermuter with Ada.Text_io, Ada.Integer_Text_io; use Ada.Text_io, Ada.Integer_Text_io; procedure car_int is procedure permuter(a:in out Character; b:in out Integer) is z:Integer; begin z:=Character'pos(a);a:=Character'val(b);b:=z; end permuter; m:Character:='*';n:Integer:=65; begin put( " m=" );put(m);put( "n=" );put(n,width=>2);new_line; permuter(m,n); -- ou permuter(b=>n,a=>m); put( "permuter(m,n);" );new_line; put( " m=" );put(m); put( "n=" );put(n,width=>2);new_line; end car_int;
  • 34. 34 Etat avant l'appelEtat avant l'appel Env1 (n,@n)(m,@m)(permuter,<<a,b->corps de permuter,Env1>> Env EnvAppel @m '*' @n 65 Mem Etat avant l'appel permuter(m,n) : (EnvAppel,Mem)
  • 35. 35 Etat après transmission desEtat après transmission des paramètresparamètres permuter(b=>n,a=>m); @b 65 @m '*' @n 65 @a '*' (a,@a)(b,@b) Env1 EnvExe Mem1 Etat initial de l'appelé (après transmission des paramètres) : (EnvExe,Mem1)
  • 36. 36 Etat à la fin de l'exécution de laEtat à la fin de l'exécution de la procédureprocédure Exécution du corps de la procédure z:=Character'pos(a); a:=Character'val(b); b:=z; (z,@z)(a,@a)(b,@b) Env' @b 42 @m 'A' @n 42 @z 42 @a 'A' Mem2 EnvExe' Etat final de la procédure appelée : (EnvExe',Mem2)
  • 37. 37 Etat après retour vers l'appelantEtat après retour vers l'appelant (n,@n)(m,@m)(permuter,<<a,b->corps de permuter,Env1>> Env @m 'A' @n 42 Mem3 EnvAppel Etat après retour vers l'appelant de la procédure : (EnvAppel',Mem3)
  • 38. 38 ProcProcéédures rdures réécursivescursives Comme les fonctions, les procédures Ada sont naturellement récursives. Exemple : Les tours de Hanoï 3 pieux A,B,C sont plantés en terre. Initialement, sur le pieu A sont empilés des disques de taille décroissante. Les pieux B et C sont alors vides. A l'état final tous les disques sont empilés sur le pieu C. Les règles sont les suivantes : – on ne peut déplacer qu'un disque à la fois et bien sûr, il ne peut être placé qu'en haut d'une pile (au sommet d'un pieu). – il est possible d'utiliser le pieu B – on peut toujours empiler un disque sur un autre à la condition que sa taille soit inférieure
  • 39. 39 La procédureLa procédure hanoihanoi (1/3)(1/3) La procédure hanoi construit et affiche la suite des déplacements de disques de manière récursive. Les 3 pieux sont représentés par les caractères 'A, 'B', 'C'. Les disques sont représentés par un entier qui simule leur taille.
  • 40. 40 La procédureLa procédure hanoihanoi (2/3)(2/3) procedure hanoi(n:in Natural;X,Y,Z:in Character) is begin if n/=0 then hanoi(n-1,X,Z,Y); put( "disque : " );put(n,WIDTH=>2);put( " : " ); put(X);put( " --> " );put(Y);new_line; hanoi(n-1,Z,Y,X); end if; end hanoi;
  • 41. 41 La procédureLa procédure hanoihanoi (3/3)(3/3) with Ada.Text_io;use Ada.Text_io; with Ada.Integer_Text_io;use Ada.Integer_Text_io; procedure tours_hanoi is procedure hanoi(n:in Natural;X,Y,Z:in Character) is -- voir transparent précédent end hanoi; A:Character:='A'; B:Character:='B'; C:Character:='C'; begin hanoi(3,A,C,B); end tours_hanoi;
  • 42. 42
  • 43. 43 La procédureLa procédure hanoihanoi : résultats: résultats Le résultat pour un pieu A où sont empilés 3 disques est : disque : 1 : A --> C disque : 2 : A --> B disque : 1 : C --> B disque : 3 : A --> C disque : 1 : B --> A disque : 2 : B --> C disque : 1 : A --> C
  • 44. 44 La procédureLa procédure hanoihanoi : résultats: résultats L'idée est, ici de dire : Si aucun disque n'est empilé sur A, alors il n'y a rien à faire Supposons que je sache déplacer les n-1 disques les plus petits de A vers C en utilisant B Alors il suffit de placer le plus gros disque de A sur le pieu libre B et de recommencer ce que j'ai supposé savoir faire, c'est à dire déplacer les n-1 disques (cette fois de C vers B en utilisant A).