Upload
purplera1n
View
201
Download
0
Embed Size (px)
Citation preview
Algorithmique 1ère annéeInitiation à la programmation - Ada (3&4/6)
Didier Le Botlan
1er semestre 2009–2010
http://wwwdgeinew.insa-toulouse.fr/~lebotlan/index.html
1 / 17
L’indentation
Dès que les programmes deviennent un peu long, on préfèrelargement le style 3.
+ Le décalage des blocs s’appelle l’indentation.
+ emacs indente automatiquement une ligne si on appuie sur TAB.
+ Pour indenter tout le programme d’un coup, ADA → EDIT →INDENT LINES IN FILE
2 / 17
Représentation graphiqueProcédure sans argument
Rouler_KA
Elle se déclare avec procedure Rouler_Ka
On l’invoque avec Rouler_Ka ;
L’invocation est un bloc : ` Rouler_Ka ∈ bloc
+ Règle « Invocation » (de procédure sans argument) » (page 7)
3 / 17
Représentation graphiqueProcédure à un argument
Rouler_VersPoint : Character
Elle se déclare avec procedure Rouler_Vers (Point : Character)
On l’invoque avec Avion_Sol.Rouler_Vers (’L’) ;
(car cette procédure est définie dans l’acteur Avion_Sol)
L’invocation est aussi un bloc :` Avion_Sol.Rouler_Vers (e) ∈ bloc
à condition d’avoir ` e ∈ Character
+ Règle « Appel de procédure » (page 18)
4 / 17
Représentation graphiqueProcédure à plusieurs arguments
Afficher_MessageMessage : StringTaille : Integer
procedure Afficher_Message (Message : String ; Taille : Integer)
On l’invoque avec
Acteur.Afficher_Message (Message => "Miyazaki", Taille => 16) ;
ou plus simplement Acteur.Afficher_Message ("Miyazaki", 16) ;
C’est aussi un bloc : ` Acteur.Afficher_Message (e, e’) ∈ bloc
à condition d’avoir ` e ∈ String et ` e′ ∈ Integer
5 / 17
Représentation graphiqueFonction à un argument
La fonction Carre : x 7→ x2
CarreX : Float Float
function Carre (X : Float) return Float
On l’utilise avec Acteur.Carre (18.3)
L’invocation n’est pas un bloc, elle renvoie un réel` Acteur.Carre (e) ∈ Float à condition d’avoir ` e ∈ Float
+ Règle « Appel de fonction » (page 20)
6 / 17
Représentation graphiqueFonction sans argument
En existe-t-il seulement ? En math, non (constantes)
En programmation, on en rencontre souvent :
Temperature Float
Cap Float
Vitesse Float
7 / 17
Fonction sans argument
Pour invoquer une fonction sans argument, on écrit simplementActeur.Temperature
Quel est son type ?
` Acteur.Temperature ∈ Float (Règle « Appel de fonction »)
Par exemple : if Acteur.Temperature > 65.0 then . . .
+ if requiert un booléen (Règle « Bloc IF » page 24)
+ ` Acteur.Temperature > 65.0 ∈ Boolean (Quelles règles ?)
8 / 17
Procédure, fonction
Quelle est la différence entre une procédure et une fonction ?
Procédure...
Fonction... Integer
` appel de procédure ∈ bloc
` appel de fonction ∈ Integer (ou un autre type, sauf bloc)
9 / 17
Énoncé
Écrire une fonction En_Prise qui indique si deux reinessont en prise. Les arguments de la fonction sont lescoordonnées des reines.
En_Prise
X1 : IntegerY1 : IntegerX2 : IntegerY2 : Integer
Boolean
10 / 17
Écriture de l’algorithme
Algorithme de la fonction En_Prise :
Tester si même lignesi Y1 = Y2
Tester si même colonnesi X1 = X2
Tester si même diagonale “droite”si X1 + Y1 = X2 + Y2
Tester si même diagonale “gauche”si X1 − Y1 = X2 − Y2
Renvoyer Vrai si l’un des tests est vrai.
L’algorithme est terminé (on n’a pas écrit d’Ada).
11 / 17
Traduction en Ada
function En_Prise (X1, Y1, X2, Y2 : Integer ) return Boolean isCapture : Boolean ;
beginCapture := False ;
Tester si même lignei f Y1 = Y2 then Capture := True ; end i f ;
Tester si même colonnei f X1 = X2 then Capture := True ; end i f ;
Tester si même diagonale droitei f X1 + Y1 = X2 + Y2 then Capture := True ; end i f ;
Tester si même diagonale gauchei f X1 Y1 = X2 Y2 then Capture := True ; end i f ;return Capture ;
end En_Prise ;
12 / 17
Variante
function En_Prise (X1, Y1, X2, Y2 : Integer ) return Boolean isbegin
return (Y1 = Y2) or (X1 = X2)or (X1 + Y1 = X2 + Y2)or (X1 Y1 = X2 Y2) ;
end En_Prise ;
13 / 17
Regle des return
RÈGLE des Return
Le premier return est suivi d’un type :function Foo (. . . ) return ce_type is
Le second return est suivi d’une expression de ce type :return e ; avec ` e ∈ ce_type
+ Le premier return annonce le type du résultat.
+ Le second return renvoie le résultat.
+ Le résultat doit être du type annoncé !
14 / 17
Test
package Txt renames GAda.Text_IO ;
...
procedure Tester_En_Prise(RX1, RY1, RX2, RY2 : Integer ) isbegin
Txt .Put_Line ("Reine 1 en " & Integer ’ Image(RX1) &", " & Integer ’ Image(RY1)) ;
Txt .Put_Line ("Reine 2 en " & Integer ’ Image(RX2) & ", "& Integer ’ Image(RY2)) ;
i f En_Prise(RX1, RY1, RX2, RY2) thenTxt .Put_Line ("Elles sont en prise.") ;
elseTxt .Put_Line ("Elles ne sont pas en prise.") ;
end i f ;end Tester_En_Prise ;
15 / 17
Test
...
beginTester_En_Prise (3 ,1 ,5 ,2) ;Tester_En_Prise (3 ,1 ,5 ,3) ;Tester_En_Prise (3 ,1 ,3 ,6) ;Tester_En_Prise (3 ,1 ,2 ,2) ;Tester_En_Prise (3 ,1 ,1 ,2) ;. . .
16 / 17