iii. instruction alternative
TRANSCRIPT
III. Instruction alternative
1. Instruction conditionnelle en algorithmique2. Expressions logiques3. Instruction conditionnelle sous VBA
1
1. Instruction conditionnelle en algorithmique
Lorsque une ou deux actions sont liées à une condition :si (condition)
action1
sinonaction2
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 de 2 ou 3 espaces
pour visualiser la hiérarchie
faux condition
action2
vrai
action1
facultatif
2
2. Expressions logiquesa) En algorithmiqueLe résultat a deux valeurs possibles : vrai ou fauxOn 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 : je voudrais une voiture verte ou rouge et blanche ...ü 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
3
b) Expressions logiques Sous VBA
ü Le résultat est True ou False (valeurs « booléennes »)ü Opérateurs :
• les parenthèses ( )• opérateurs de comparaison : < <= > >= = <>• des opérateurs logiques : AND OR NOT
ü Exemple : vérifier que n Î [0, 1] 0 <= n AND n <= 1
ü Représentation interne : VBA a choisi• 0 pour False• -1 pour True
Attention : l’expression 0 < n < 1 a un sens en VBA et est toujours vrai !!!
ü Stockage : variable de type BooleanDim positif As Boolean, n As Integern = InputBox("donnez un entier")positif = (0 <= n) ' En algo on écrirait : positif <- (0 ≤ n)MsgBox positif
4
Ordre de priorités des opérateurs sous VBA :1. opérateurs arithmétiques2. opérateurs de comparaison3. opérateurs logiques
• Les opérateurs arithmétiques respectent les priorités admises en mathématiques• Les opérateurs de comparaison sont de priorités identiques
→ priorité gauche-droite• Les opérateurs logiques sont prioritaires dans l’ordre : NOT AND OR
5
3. Instruction conditionnelle sous VBA
• SyntaxeIf expression logique Then
[instruction]
Else
[instruction]
End If
• les deux suites d’instructions (éventuellement vides) sont délimitées parThen , 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
6
facultatif
• Complément sur la syntaxe : ajout de blocs ElseIf
If condition1 Then
[instruction]
[ElseIf condition2 Then
[instruction]
]
Else ‘les cas restants
[instruction]
End If
7
Exercice : Ecrire le programme qui calcule le prix de gros d'une quantité d'articles à partir du prix unitaire suivant la règle :
Faire une remise Ø de 10% à partir de 10 articles vendus, Ø ou de 5% à partir de 5 articles vendus.
Algorithme à développer- Déclarer et commenter les variables qui seront utilisées- lire le prix unitaire et le nombre d'articles- calculer le total- appliquer la réduction- afficher le prix final
Exercice : Le barème de l’impôt 2020 pour une personne ayant une seule part dépend de ses revenus 2020 R arrondis à l'euro inférieur :• Si R <= 5 852 €, on ne paie pas d’impôt• Si 5 853 € <= R <= 11 673 €, le montant de l’impôt est 0,055×R −321,86• Si 11 674 € <= R , le montant de l’impôt est 0,14×R − 1 314,07
Ecrire le programme qui lit un revenu annuel et calcule le montant de l'impôt
8
• 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 dulendemain. On rappelle qu'une année est bissextile si elle est divisible par 400,sinon, si elle divisible par 4 et pas par 100
9
Programme
Sub equation2emeDegre()Dim a As Single, b As Single, Dim c As Single, delta As SingleDim x1 As Single, x2 As Singlea = InputBox("a :")b = InputBox("b :")c = InputBox("c :")delta = b*b-4*a*cIf delta<0 ThenMsgBox "pas de solution dans R"
ElseIf delta=0 Thenx1 = -b/(2*a)MsgBox "x=" & x1
Else ‘delta est positifx1 = (-b + Sqr(delta))/(2*a)x2 = (-b - Sqr(delta))/(2*a)MsgBox "x1=" & x1 & " x2=" & x2
End IfEnd IfEnd 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-sifin-si
10
1. Les boucles en algorithmique
ü De nombreux problèmes nécessitent de répéter une actionpour trouver ou converger vers une solution
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 ». Les variables dans cette condition doivent évoluer dans l’action.
condition
faux
vrai
action
12
• Exemple : calcul de xn
soient i, n entiers naturels
soient x, xi réels
lire(x)
lire(n)
‘ on initialise xi avec x0
xi <- 1
i <- 0
xi <- xi*x
i <- i+1 xi vaut x1
xi <- xi*x
i <- i+1 xi vaut x2
xi <- xi*x
i <- i+1 xi vaut x3
... Jusqu’à i=n
Ecrire(xi)
n : nbre de multiplications à fairei : nbre de multiplications faitesxi : xi
13
• Exemple : calcul de xn
soient i, n entiers naturelssoient x, xi réelslire(x)lire(n)xi <- 1 i <- 0 tant-que (i < n)
xi <- xi*xi <- i+1
fin tant-que
ecrire(xi)
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 en quittant la boucle,
n : nbre de multiplications à fairei : nbre de multiplications faitesxi : xi
14
• L’algorithme mystérieuxsoient 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)
15
a 5
b 7
r 0
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
16
Exo : Lire une suite de notes terminée par une valeur négative et faire la moyenne
Algorithme :soient une note, un compteur et un cumulaccumuler chaque note de la suitecalculer la moyenne à partir du cumul et du nombre de notes lues
Sub moyenne( )Dim note As Single, cumul As Single, moy As SingleDim cpt As Integercumul = 0note = InputBox ("note ?") ' lecture de la 1ère note de la suiteDo While note >= 0cumul = cumul + notecpt = cpt +1note = InputBox ("note ?") ' lecture de la note suivante
Loopmoy = cumul / cptMsgBox moy
End Sub 17
Exo : Lire une suite de notes terminée par une valeur négative et faire la moyenne
Algorithme :soient une note, un compteur et un cumulaccumuler chaque note de la suitecalculer la moyenne à partir du cumul et du nombre de notes lues
Sub moyenne( )Dim note As Single, cumul As Single, moy As SingleDim cpt As Integercumul = 0note = InputBox ("note ?") ' lecture de la 1ère note de la suiteDo While note >= 0cumul = cumul + notecpt = cpt +1note = InputBox ("note ?") ' lecture de la note suivante
Loopmoy = cumul / cptMsgBox moy
End Sub 18
Algorithme de la moyenne
• lire toute la suite de notes
- en les cumulant
- et en les comptant
• diviser le cumul par le nombrede 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)
19
Programme de la moyenne
Sub moyenneDesNotes()
Dim x As Single, 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 unenote:")
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 nombrede 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)
20
L’instruction For :
• variante de la boucle Do While
• lorsque l’on connaît à l’avance le nombre d’itérationsFor compteur = expression To expression
[instruction]
Next compteur
Exemple : calcul de !nSub factoriel()
Dim n As Integer, i As Integer, fact As Integer
n = InputBox("donnez n :")
fact = 1
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
21
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
22
3. Interruption de boucleIl peut être commode dans certains cas de quitter une boucle en cours d’exécution.
• Exit For (pour la boucle For uniquement)• Exit Do (pour les boucles Do While et Do Until uniquement)
Ils auront pour effet de :1. quitter immédiatement la boucle en cours2. poursuivre le programme à la suite de la boucle
Remarque : cette instruction sera toujours soumise à conditionDo While …
…If condition Then
Exit DoEnd If
…Loop
Poursuite du programme
23
4. Exercices• Minimum d’une suite : Reprendre le calcul de la moyenne et modifier le
programme pour trouver aussi la note la plus grande
Sub moyenne( )Dim note As Single, cpt As IntegerDim cumul As Single, moy As Single, maxNote As Singlecumul = 0note = InputBox ("note ?") 'Lecture de la 1ère notemaxNote = noteDo While note >= 0If maxNote < note ThenmaxNote = note
End Ifcumul = cumul + notecpt = cpt +1note = InputBox ("note ?") 'Lecture de la note suivante
Loopmoy = cumul / cptMsgBox moy & " meilleur note vaut " & maxNote
End Sub
24
• 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)
25
• 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) < 0.001 , 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
26
Résumé des instructions VBA
Sub maProcedure() Début de procédure
Dim x As Single, y As Double Déclarations de réels
Dim n As integer, m As Long Déclarations d'entiers
n = expression Affectation
...
x = InputBox("donnez une valeur :") Lecture
...
Do While condition Bouclesuite d’instructions
Loop
...
If condition Then Instruction alternativesuite d’instructions
Elsesuite d’instructions
End If
...
MsgBox "resultat = " & y Ecriture
...
End Sub Fin de procédure
27