iii. instruction alternative - lsis · ü attention : vba a choisi comme représentation interne...

22
III. Instruction alternative 1. Instruction conditionnelle en algorithmique 2. Expressions logiques 3. Instruction conditionnelle sous VBA

Upload: hoangnhu

Post on 16-Sep-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

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

IV. Les boucles

1.  Les boucles en algorithmique 2.  Instructions répétitives sous VBA

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