4
Algorithmique 1ère année Initiation à la programmation - Ada (3&4/6) Didier Le Botlan INSA [email protected] 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ère largement 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 I NDENT LINES IN FILE 2 / 17 Représentation graphique Procé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 graphique Procédure à un argument Rouler_Vers Point : 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

INSA Toulouse 1A Algorithme ADA Cours 1-3

Embed Size (px)

Citation preview

Page 1: INSA Toulouse 1A Algorithme ADA Cours 1-3

Algorithmique 1ère annéeInitiation à la programmation - Ada (3&4/6)

Didier Le Botlan

[email protected]

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

Page 2: INSA Toulouse 1A Algorithme ADA Cours 1-3

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

Page 3: INSA Toulouse 1A Algorithme ADA Cours 1-3

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

Page 4: INSA Toulouse 1A Algorithme ADA Cours 1-3

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