III. Instruction alternative - LSIS · ü Attention : VBA a choisi comme représentation interne...
Transcript of III. Instruction alternative - LSIS · ü Attention : VBA a choisi comme représentation interne...
III. Instruction alternative
1. Instruction conditionnelle en algorithmique 2. Expressions logiques 3. Instruction conditionnelle sous VBA
1. Instruction conditionnelle en algorithmique Lorsque une ou deux actions sont liées à une condition
si (condition)
action1
sinon
action2
fin-si
suite de l’algorithme Remarques : • Les actions sont des suites d’instructions • délimitées par si, sinon et fin-si • sinon action2 est facultatif • Indentation : l’écriture des actions 1 et 2 est décalée à droite pour visualiser la
hiérarchie
faux condition
action2 vrai
action1
2. Expressions logiques a) En algorithmiqueLe résultat a deux valeurs possibles : vrai ou faux On dispose : • des parenthèses ( ) • des opérateurs de comparaison : < ≤ = ≠ > ≥• des opérateurs logiques : et ou non
ü Exemple : 0 ≤ n et n ≤ 10ü Attention aux priorités. Ex : un nbre divisible par 5 ou par 2 et pas par 4 (?!?!?!)ü Les parenthèses permettent de lever les ambiguïtés
et vrai faux
vrai vrai faux
Faux faux faux
ou vrai faux
vrai vrai vrai
faux vrai faux
b) Expressions logiques Sous VBA
ü Le résultat est True ou False ü Opérateurs :
• les parenthèses ( ) • opérateurs de comparaison : < <= = <> > >=• des opérateurs logiques : AND OR NOT
ü Exemple : vérifier que n ∈ [0, 1] 0<=nANDn<=1!
ü Stockage de valeurs booléennes : variable de type Boolean Dimposi,fAsBoolean,nAsIntegern=InputBox("donnezunen,er")posi,f=0<=n
ü Attention : VBA a choisi comme représentation interne • 0 pour False • -1 pour True L’expression 0<n<1 a un sens sous VBA (mais pas le "bon") et est toujours vrai ! La bonne écriture : 0<n AND n<1
Ordre de priorités des opérateurs sous VBA : 1. opérateurs arithmétiques 2. opérateurs de comparaison 3. opérateurs logiques
• Les opérateurs arithmétiques respectent les priorités admises en mathématiques • Les opérateurs de comparaison sont de priorité identique
=> priorité gauche-droite • Les opérateurs logiques sont prioritaires dans l’ordre : NOT AND OR
3. Instruction conditionnelle sous VBA
• Syntaxe If expression logique Then
[instruction]
Else
[instruction]
End If
• les deux suites d’instructions (éventuellement vides) sont délimitées par
Then , Else et End If • la partie Else [instruction] est facultative • on respectera l’indentation pour visualiser les 2 actions soumises à condition
faux condition
action2 vrai
action1
• Complément sur la syntaxe : ajout de blocs ElseIf
If expression logique Then
[instruction]
[ ElseIf expression logique Then [instruction]
] Else
[instruction]
End If
• Exercice : Ecrire le programme qui résout l’équation ax2+bx+c=0
• Exercice : Ecrire le programme qui saisit une date (3 entiers) et calcule la date du lendemain. On rappelle qu'une année est bissextile si elle est divisible par 400, sinon, si elle divisible par 4 et pas par 100
Programme Sub equation2emeDegre() Dim a As Single, b As Single, Dim c As Single, delta As Single Dim x1 As Single, x2 As Single a = InputBox("a :") b = InputBox("b :") c = InputBox("c :") delta = b*b-4*a*c If delta<0 Then MsgBox "pas de solution dans R" Else If delta=0 Then x1 = -b/(2*a) MsgBox "x=" & x1 Else ‘delta est positif x1 = (-b + Sqr(delta))/(2*a) x2 = (-b - Sqr(delta))/(2*a) MsgBox "x1=" & x1 & " x2=" & x2 End If End If End Sub
Algorithme
soient a, b, c, delta, x1, x2 réels
lire(a, b, c)
delta <- b2-4ac
si (delta<0)
ecrire("pas de solution dans R")
Sinon
si (delta=0)
x1 <- -b/2a
ecrire(x1)
sinon
x1 <- (-b + √delta)/2a
x2 <- (-b - √delta)/2a
ecrire(x1, x2)
fin-si
fin-si
1. Les boucles en algorithmique ü De nombreux problèmes nécessitent de répéter une action
pour trouver ou converger vers une solution approchée tant-que (condition)
action
fin tant-que
suite de l’algorithme
ü Remarque : le résultat de la condition doit pouvoir changer dans le temps si on veut
éviter la boucle « éternelle »
condition
faux
vrai
action
• Exemple : calcul de xn soient i, n entiers naturels
soient x, xn réels
lire(x)
lire(n)
xn <- 1
i <- 1
xn <- xn*x
i <- i+1
xn <- xn*x
i <- i+1
xn <- xn*x
i <- i+1
... Jusqu’à i>n
Ecrire(xn)
• Exemple : calcul de xn soient i, n entiers naturels
soient x, xn réels
lire(x)
lire(n)
xn <- 1
i <- 1
tant-que (i ≤ n)
xn <- xn*x
i <- i+1
fin tant-que
Ecrire(xn)
Remarque : vérifiez la fin de boucle et les cas particuliers.
Par exemple, pour n=0, on ne rentre pas dans la boucle mais le résultat est juste.
initialisation de la boucle
modification d’un acteur de la condition
i vaut n+1 en quittant la boucle
• L’algorithme mystérieux
soient a, b, r entiers
lire(a)
lire(b)
r <- 0
tant-que (b ≠ 0)
si (b est pair)
b <- b/2
a <- 2*a
sinon
b <- b-1
r <- r+a
fin-si
fin tant-que
ecrire(r)
2. Instructions répétitives sous VBA
Il en existe plusieurs formes… toutes équivalentes ! Les deux principales : Do While et For L’instruction Do While :
Do While expression logique
[instruction]
Loop
suite du programme
Exercice : Avec l’instruction Do While, écrire l’algorithme puis le programme qui :
• lit une suite de notes d’un élève • fait la moyenne de ces notes et l’affiche
On ne connaît pas la longueur de la suite et, par convention, elle se terminera par une valeur négative.
condition
faux
vrai
action
Algorithme de la moyenne
• lire toute la suite de notes - en les cumulant - et en les comptant
• diviser le cumul par le nombre de notes
En développant : soit x réel
lire(x)
tant-que (x ≥ 0)
accumuler x
comptabiliser
lire (x)
fin tant-que
ecrire (cumul/nbre de notes)
Programme de la moyenne
Sub moyenneDesNotes()
Dim x, cumul As Single
Dim cpt As Integer
cumul = 0
cpt = 0
x = InputBox("donnez une note:")
Do While x >= 0
cumul = cumul+x
cpt = cpt+1
x = InputBox("donnez une note:")
Loop
MsgBox "moyenne = " & cumul/cpt
End Sub
Algorithme de la moyenne
• lire toute la suite de notes - en les cumulant - et en les comptant
• diviser le cumul par le nombre de notes
En développant : soient x et cumul réels
soit cpt un entier
cumul <- 0
cpt <- 0
lire(x)
tant-que (x ≥ 0)
cumul <- cumul+x
cpt <- cpt+1
lire (x)
fin tant-que
ecrire (cumul/cpt)
L’instruction For :
• variante de la boucle Do While
• lorsque l’on connaît à l’avance le nombre d’itérations
For compteur = expression To expression
[instruction]
Next compteur
Exemple : Sub factoriel()
Dim n As Integer, i As Integer, fact As Integer
fact = 1
n = InputBox("donnez n :")
For i=2 To n
fact = fact*i
Next i
MsgBox n & "! = " & fact
End Sub
i=2
Do While i <= n
fact = fact*i
i = i+1
Loop
équivalent
Une variante de la boucle while: ü Faire jusqu’à ce que l’expression soit vraie
Do Until expression logique condition d’arrêt ! [instruction]
Loop
Suite du programme
3. Interruption de boucle Il peut être commode dans certains cas de quitter prématurément une boucle en cours
d’exécution. • ExitFor(pour la boucle Foruniquement) • ExitDo(pour les boucles DoWhileet DoUn?luniquement)
Ils auront pour effet de : 1. quitter immédiatement la boucle en cours 2. poursuivre le programme à la suite de la boucle
Remarque : cette instruction sera toujours soumise à condition For……Ifcondi&onThenExitFor
EndIf…NextPoursuite du programme
4. Exercices • Minimum d’une suite
Reprendre le calcul de la moyenne et modifier le programme pour trouver aussi la note la plus petite
• Trouver le « zéro » d’une fonction croissante.
Ecrire le programme qui approche à epsilon près la racine carrée d’un réel positif x . On fera les constatations suivantes : o √x est compris entre 0 et max(1, x) o supposons √x ∈ [a, b] et soit m le milieu de [a, b]
- si (b-a) < epsilon, alors m est une solution approchée. - sinon, si x-m2 < 0 alors √x ∈ [a, m], sinon √x ∈ [m, b]
o si on réitère plusieurs fois cette opération, (b-a) converge vers 0 et a et b encadrent la solution
• Calcul du PGCD de 2 entiers : algorithme d'Euclide.
Soit A et B entiers non nuls positifs. Le PGCD vérifie les propriétés suivantes : - PGCD(A, A) = A - Si A<B, alors PGCD(A, B) = PGCD(A, B-A) - Sinon PGCD(A, B) = PGCD(A-B, B)
Résumé des instructions VBA
Sub maProcedure() Début de procédure
Dim x As Double, y As Single, n As Integer Déclarations
...
n = expression Affectation
...
x = InputBox("donnez une valeur :") Lecture
...
Do While condition Boucle suite d’instructions Loop
...
If condition Then Instruction alternative suite d’instructions Else suite d’instructions End If
...
MsgBox "resultat = " & y Ecriture
...
End Sub Fin de procédure