You are on page 1of 4

L’indentation

Algorithmique 1ère année


Initiation à la programmation - Ada (3&4/6) Dès que les programmes deviennent un peu long, on préfère
largement le style 3.

Didier Le Botlan + Le décalage des blocs s’appelle l’indentation.


+ emacs indente automatiquement une ligne si on appuie sur TAB.
INSA
contact.lebotlan@insa-toulouse.fr + Pour indenter tout le programme d’un coup, A DA → E DIT →
I NDENT LINES IN FILE
1er semestre 2009–2010

http://wwwdgeinew.insa-toulouse.fr/~lebotlan/index.html

1 / 17 2 / 17

Représentation graphique Représentation graphique


Procédure sans argument Procédure à un argument

Point : Character Rouler_Vers


Rouler_KA

Elle se déclare avec procedure Rouler_Vers (Point : Character)


Elle se déclare avec procedure Rouler_Ka
On l’invoque avec Avion_Sol.Rouler_Vers (’L’) ;
On l’invoque avec Rouler_Ka ;
(car cette procédure est définie dans l’acteur Avion_Sol)
L’invocation est un bloc : ` Rouler_Ka ∈ bloc L’invocation est aussi un bloc :
` Avion_Sol.Rouler_Vers (e) ∈ bloc
+ Règle « Invocation » (de procédure sans argument) » (page 7) à condition d’avoir ` e ∈ Character
+ Règle « Appel de procédure » (page 18)

3 / 17 4 / 17
Représentation graphique Représentation graphique
Procédure à plusieurs arguments Fonction à un argument

Message : String La fonction Carre : x 7→ x2


Afficher_Message
Taille : Integer
X : Float Carre Float

procedure Afficher_Message (Message : String ; Taille : Integer)

function Carre (X : Float) return Float


On l’invoque avec
Acteur.Afficher_Message (Message => "Miyazaki", Taille => 16) ; On l’utilise avec Acteur.Carre (18.3)
L’invocation n’est pas un bloc, elle renvoie un réel
ou plus simplement Acteur.Afficher_Message ("Miyazaki", 16) ; ` Acteur.Carre (e) ∈ Float à condition d’avoir ` e ∈ Float

C’est aussi un bloc : ` Acteur.Afficher_Message (e, e’) ∈ bloc + Règle « Appel de fonction » (page 20)
à condition d’avoir ` e ∈ String et ` e0 ∈ Integer
5 / 17 6 / 17

Représentation graphique Fonction sans argument


Fonction sans argument

En existe-t-il seulement ? En math, non (constantes) Pour invoquer une fonction sans argument, on écrit simplement
Acteur.Temperature
En programmation, on en rencontre souvent :
Quel est son type ?
` Acteur.Temperature ∈ Float (Règle « Appel de fonction »)
Temperature Float
Par exemple : if Acteur.Temperature > 65.0 then . . .
Cap Float
+ if requiert un booléen (Règle « Bloc IF » page 24)
+ ` Acteur.Temperature > 65.0 ∈ Boolean (Quelles règles ?)
Vitesse Float

7 / 17 8 / 17
Procédure, fonction Énoncé

Quelle est la différence entre une procédure et une fonction ? Écrire une fonction En_Prise qui indique si deux reines
... sont en prise. Les arguments de la fonction sont les
Procédure
coordonnées des reines.

... Fonction Integer


X1 : Integer
Y1 : Integer
` appel de procédure ∈ bloc En_Prise Boolean
X2 : Integer
` appel de fonction ∈ Integer (ou un autre type, sauf bloc) Y2 : Integer

9 / 17 10 / 17

Écriture de l’algorithme Traduction en Ada

Algorithme de la fonction En_Prise :


function En_Prise (X1, Y1, X2, Y2 : Integer ) return Boolean is
Tester si même ligne
Capture : Boolean ;
si Y1 = Y2 begin
Tester si même colonne Capture := False ;
si X1 = X2 Tester si même ligne
i f Y1 = Y2 then Capture := True ; end i f ;
Tester si même diagonale “droite”
Tester si même colonne
si X1 + Y1 = X2 + Y2 i f X1 = X2 then Capture := True ; end i f ;
Tester si même diagonale “gauche” Tester si même diagonale droite
si X1 − Y1 = X2 − Y2 i f X1 + Y1 = X2 + Y2 then Capture := True ; end i f ;
Tester si même diagonale gauche
Renvoyer Vrai si l’un des tests est vrai. i f X1 Y1 = X2 Y2 then Capture := True ; end i f ;
return Capture ;
end En_Prise ;
L’algorithme est terminé (on n’a pas écrit d’Ada).

11 / 17 12 / 17
Variante Regle des return

R ÈGLE des Return


Le premier return est suivi d’un type :
function En_Prise (X1, Y1, X2, Y2 : Integer ) return Boolean is function Foo (. . . ) return ce_type is
begin
return (Y1 = Y2) or (X1 = X2) Le second return est suivi d’une expression de ce type :
or (X1 + Y1 = X2 + Y2) return e ; avec ` e ∈ ce_type
or (X1 Y1 = X2 Y2) ;
end En_Prise ;
+ Le premier return annonce le type du résultat.
+ Le second return renvoie le résultat.
+ Le résultat doit être du type annoncé !

13 / 17 14 / 17

Test Test

package Txt renames GAda. Text_IO ;


..
.
..
procedure Tester_En_Prise(RX1, RY1, RX2, RY2 : Integer ) is .
begin
begin
Txt . Put_Line ( "Reine 1 en " & Integer ’Image(RX1) &
Tester_En_Prise (3 ,1 ,5 ,2) ;
", " & Integer ’Image(RY1) ) ; Tester_En_Prise (3 ,1 ,5 ,3) ;
Txt . Put_Line ( "Reine 2 en " & Integer ’Image(RX2) & ", " Tester_En_Prise (3 ,1 ,3 ,6) ;
& Integer ’Image(RY2) ) ; Tester_En_Prise (3 ,1 ,2 ,2) ;
i f En_Prise(RX1, RY1, RX2, RY2) then Tester_En_Prise (3 ,1 ,1 ,2) ;
Txt . Put_Line ( "Elles sont en prise." ) ; ...
else
Txt . Put_Line ( "Elles ne sont pas en prise." ) ;
end i f ;
end Tester_En_Prise ;

15 / 17 16 / 17

You might also like