INSA Toulouse 1A Algorithme ADA Cours 1-3

Preview:

Citation preview

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

Didier Le Botlan

INSAcontact.lebotlan@insa-toulouse.fr

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