Vous êtes sur la page 1sur 4

Bloc IF

Définition du bloc IF
Algorithmique 1ère année Syntaxe : if condition then + « condition » est une
Initiation à la programmation - Ada (6/6) B expression booléenne
else
B0 + B et B0 sont des blocs de code.
Didier Le Botlan end if ;
INSA
contact.lebotlan@insa-toulouse.fr Exécution du bloc IF :
1 – La condition est évaluée à vrai ou faux (True ou False) ;
1er semestre 2009–2010 2a – Si c’est vrai, le bloc B est exécuté (mais pas B0 )
2b – Si c’est faux, le bloc B0 est exécuté (mais pas B)
3 – Le bloc IF est terminé lorsque le bloc exécuté (B ou B0 )
est terminé.
http://wwwdgeinew.insa-toulouse.fr/~lebotlan/index.html

1 / 16 2 / 16

Exemple de bloc if No magic

Définition de procédure (à placer avant le begin du programme) Un bloc IF n’est pas magique.
Cette fonction affiche la catégorie au judo selon le poids indiqué. Voici un sous-programme (on ne montre pas la partie avec les with) :

procedure Tapis_Roulant is
procedure Categorie_Hommes (Poids : Integer ) is
begin Largeur : Float ;
i f Poids < 60 then Txt . Put_Line( "Super leger" ) ; Largeur_Max : constant Float := 100.0 ;
elsif Poids <= 66 then Txt . Put_Line( "Mi leger" ) ; begin
elsif Poids <= 73 then Txt . Put_Line( "Leger" ) ; i f Largeur > Largeur_Max then Sonner_Alarme ;
elsif Poids <= 81 then Txt . Put_Line( "Mi moyen" ) ; end i f ;
elsif Poids <= 90 then Txt . Put_Line( "Moyen" ) ;
Largeur := Outil . Mesurer_Largeur ;
elsif Poids <= 100 then Txt . Put_Line( "Mi lourd" ) ;
Tapis .Avancer ;
else Txt . Put_Line( "Lourd" ) ;
Largeur := Outil . Mesurer_Largeur ;
end i f ;
Tapis .Avancer ;
end Categorie_Hommes ;
end Tapis_Roulant ;

Il est inutile de mettre la condition Poids > 100 pour le dernier cas.
Pour que le bloc if soit utile, il faut l’exécuter après chaque mesure.

3 / 16 4 / 16
Le bloc FOR en une page Le bloc WHILE

+ Le bloc FOR est un itérateur : il répète un bloc pour tout x ∈ X.


Voici un bloc séquence :
+ Le bloc WHILE répète un bloc tant qu’une condition le permet
Fermer_Electrovanne (1) ;
Fermer_Electrovanne (2) ; La même chose avec un bloc FOR : Définition du bloc WHILE
Fermer_Electrovanne (3) ;
Fermer_Electrovanne (4) ; Syntaxe : while condition loop + « condition » est une
for No_Vanne in 1..12 loop
Fermer_Electrovanne (5) ; B expression booléenne
Fermer_Electrovanne (No_Vanne) ;
Fermer_Electrovanne (6) ; end loop ; end loop ;
Fermer_Electrovanne (7) ; + B est un bloc de code
Fermer_Electrovanne (8) ;
Fermer_Electrovanne (9) ; Exécution du bloc WHILE :
Des questions ?
Fermer_Electrovanne (10) ; 1 – La condition est évaluée à vrai ou faux (True ou False) ;
Fermer_Electrovanne (11) ; 2a – Si c’est vrai, le bloc B est exécuté, puis le bloc while est
Fermer_Electrovanne (12) ; exécuté de nouveau (retour à l’étape 1).
2b – Si c’est faux, le bloc while est terminé.

5 / 16 6 / 16

Exemple de bloc while Le Type Article

Un article (record) est un regroupement de plusieurs types.


Mesurer_Niveau_Cuve Float
Déclaration de type
À placer avant le begin
Niveau est une variable réelle déclarée avant le begin
type Une_Duree is record
et Mesurer_Niveau_Cuve une fonction sans argument
Heures : Integer ;
Mesure initiale Minutes : Integer ; Attributs
Niveau := Mesurer_Niveau_Cuve ; Secondes : Float ;
Ouvrir_Electrovanne ; end record ; o
Fo
while Niveau < Capacite loop = ...
Heures
Minutes = . . .
Niveau := Mesurer_Niveau_Cuve ; Foo : Une_Duree ;
end loop ;
Secondes = . . .
Fermer_Electrovanne ;

Que se passe-t-il si au début le niveau est ou égal à la capacité ?

7 / 16 8 / 16
Initialisation Accès aux attributs

Déclaration et initialisation
rs
Duree_du_Cours : Une_Duree := (1,15,0.0) ; C ou
u _
_d
u ree = 0
D Heures
Une manière équivalente d’initialiser la variable : Minutes = 30
Duree_du_Cours : Une_Duree := (Heures => 1, Secondes = 0.0
Minutes => 15,
Secondes => 0.0) ;
Accès aux attributs
Duree_Du_Cours.Heures := 0 ;
Les cadres sont typés avec la règle « Construction d’un article » Duree_Du_Cours.Minutes := Duree_Du_Cours.Minutes * 2 ;
` (1, 15, 0.0) ∈ Une_Duree
` (Heures => 1, Minutes => 15, Secondes => 0.0) ∈ Une_Duree L’accès se fait par notation pointée (comme pour les acteurs).

9 / 16 10 / 16

Exemple Exemple

type Un_Complexe is record Additionner deux complexes


Re : Float ;
function Add (C1, C2 : Un_Complexe) return Un_Complexe is
Im : Float ;
end record ; Resultat : Un_Complexe ;
begin
Resultat .Re := C1 .Re + C2 .Re ;
Attention, ceci n’est qu’un type (ce n’est pas une variable !)
Resultat .Im := C1 .Im + C2 .Im ;
On ne peut jamais écrire Un_Complexe.Re ni return Resultat ;
end Add ;
Un_Complexe.Im .
Où sont les nombres complexes ?
Un type sert à définir une variable ou un argument :
` Un_Complexe ∈
Z : Un_Complexe ;

11 / 16 12 / 16
Exemple Exemple

Convertir des secondes en une durée


Convertir une durée en secondes function Sec_To_Duree (Sec : Integer) return Une_Duree is
Resultat : Une_Duree ;
function Duree_To_Sec (D : Une_Duree) return Integer is
begin
begin
Resultat.Heures := Sec / 3600 ;
return Integer(D.Secondes) + D.Minutes * 60 + D.Heures * 3600 ;
Resultat.Minutes := (Sec / 60) mod 60 ;
end Duree_To_Sec ;
Resultat.Secondes:= Float(Sec mod 60) ;
return Resultat ;
end Sec_To_Duree ;

13 / 16 14 / 16

Exemple Exemple

Additionner deux durées, reloaded Multiplier une durée par 4/3


function Add_Durees (Duree1, Duree2 : Une_Duree) function Tiers_Temps (Duree : Une_Duree)
return Une_Duree is return Une_Duree is
begin begin
return Sec_To_Duree(Duree_To_Sec(Duree1) + return Sec_To_Duree(Duree_To_Sec(Duree) * (4 / 3))
Duree_To_Sec(Duree2)) ; end Tiers_Temps ;
end Add_Durees ;
Où est le bug ?

15 / 16 16 / 16