Algorithmique et Programmation I
Séance 5
Ça continue…
Année universitaire 2020/2021 – Semestre 1
1
Ça, on sait déjà
Calculer la moyenne d’un étudiant.
#include<stdio.h> void main() {
float Note1, Note2, Moyenne;
printf ("Donner la note 1: "); scanf ("%f", &Note1); printf ("Donner la note 2: "); scanf ("%f", &Note2);
Moyenne = (Note1 * 0.8) + (Note2 * 0.2);
printf (“Moyenne de l’étudiant: %f", Moyenne);
}
2
Ça aussi on sait
Calculer la moyenne de 50 étudiants.
#include <stdio.h> void main () {
float Note1, Note2, Moyenne; int i;
for (i = 1; i<=50; i++) {
printf ("Donner la note 1: "); scanf ("%f", &Note1); printf ("Donner la note 2: "); scanf ("%f", &Note2);
Moyenne = (Note1 * 0.8) + (Note2 * 0.2);
printf (“Moyenne de l’étudiant: %f", Moyenne);
} }
3
Et ça ?
Comment calculer la moyenne de plusieurs étudiants sachant qu’on n’en connaît pas le nombre ?
4
La structure while (tant que)
Tant qu’une condition est vérifiée, répéter un bloc d’instructions.
Expression logique (booléenne) simple ou combinée. Cette expression est testée avant chaque itération.
while (expression) {
… suite d'instructions …
}
bloc d’instructions exécuté à chaque itération si l’expression est vraie.
Si la boucle ne comporte qu’une instruction, les accolades sont superflues.
5
La structure while
Tant que l'expression fournit une valeur différente de zéro (vrai), le bloc d'instructions est exécuté.
Si l'expression fournit la valeur zéro (faux), l'exécution continue avec l'instruction qui suit le bloc d'instructions.
Pour que le traitement itératif se termine, l’une des instructions doit contribuer à rendre la condition (expression) fausse (sa valeur devient zéro).
Le bloc d'instructions est exécuté zéro ou plusieurs fois.
6
Exemple
Calculer la moyenne de plusieurs étudiants.
#include <stdio.h> void main() {
float Note1, Note2, Moyenne; char Continuer = 'O';
while (Continuer == 'O') {
printf ("Donner la note 1: "); scanf ("%f", &Note1); printf ("Donner la note 2: "); scanf ("%f", &Note2); Moyenne = (Note1 * 0.8) + (Note2 * 0.2); printf (“Moyenne de l’étudiant: %f", Moyenne);
printf ("Voulez-vous calculer la moyenne d’un autre étudiant (O/N)"); scanf ("%c", &Continuer);
}
}
7
Que fait ce programme ?
#include <stdio.h> void main () {
Publicité
int n = 2; while ( (n%2) == 0) && (n != 0) ) {
printf (“Donner un entier : “); scanf (“%d”, &n);
}
}
On ne veut accepter que les entiers pairs et non nuls. On sort de la boucle quand l’utilisateur saisit un entier impair ou nul.
8
On préfèrera . . .
#include <stdio.h> void main () {
int n, stop = 0; while (stop == 0) {
printf (“Donner un entier: “); scanf (“%d”, &n); if ((n%2) != 0) || (n == 0))
stop = 1;
}
}
9
Usage général
Si on ne connaît pas à l’avance le nombre de fois que le traitement sera répété
Si on connaît à l’avance le nombre de fois que le traitement sera répété
Boucle while
Boucle for
En fait, la boucle while peut également être utilisée alors qu’on connaît à l’avance le nombre d’itérations !
10
Exemple
(1)
Affichage du mot “Bonjour” 5 fois.
#include<stdio.h> void main() {
int i = 0; while (i < 5) {
#include<stdio.h> void main() {
int i = 1; while (i <= 5) {
printf (“Bonjour \n”); i++;
printf(“Bonjour \n”); i++;
}
}
}
}
11
Exemple
(2)
Affichage des nombres entiers de 1 à 10.
#include <stdio.h> void main() {
int i = 1; while (i <= 10) {
printf (“%d \n”, i); i++;
}
}
12
for / while
En C, les structures for et while sont équivalentes.
for (initialisation; condition; compteur) {
Bloc d’instructions
}
initialisation; while (condition) {
Bloc d’instructions compteur;
}
Le mieux est de choisir le type de boucle en fonction de chaque cas concret.
13
Publicité
Exemple
Affichage du mot “Bonjour” 5 fois.
#include<stdio.h> void main() {
int i = 0; while (i < 5) {
printf(“Bonjour \n”); i++;
}
}
}
#include<stdio.h> void main() {
int i; for (i=0 ; i < 5; i++)
printf(“Bonjour \n”);
14
Devinons …
int i = 1; while (i == 1)
Boucle infinie
printf (“Que pensez vous de ma boucle ?”);
Boucle infinie
for ( ; ;)
printf (“Et là, que pensez vous de ma boucle ?”);
for ( ; 8 ;)
printf (“Et celle-ci ?”);
Boucle infinie
15
Attention !
i = 1; while (i < 3) {
;
i++;
}
Attention aux points virgules excessifs
Le programme suivant est syntaxiquement correct, mais n’en finira pas de boucler !
16
Qu’en pensez-vous ?
#include<stdio.h> void main() {
int i = 1; while (i < 5) printf(“%d \n”, i); i++;
}
Boucle infinie
Ce programme n’affiche que la valeur 1, sans jamais s’arrêter.
17
Comment le corriger?
#include<stdio.h> void main() {
int i = 1;
while (i < 5) {
printf (“%d \n”, i); i++;
}
}
Attention aux Accolades !!
Il affiche maintenant les valeurs 1, 2, 3, 4
18
La structure do..while (répéter…tant que)
do {
}
bloc d'instructions
while (expression) ;
Attention c’est différent de répéter..jusqu’à
Publicité
La structure do..while ressemble à la structure while, sauf que…
La structure while évalue la condition avant d’exécuter le bloc d’instructions, alors que la structure do..while évalue la condition après avoir exécuté le bloc d’instructions (à la fin de l’itération).
Avec la structure do..while le bloc d’instructions est exécutéau moins une fois. 19
Exemple
#include<stdio.h> void main() {
int x = 5; do {
printf(“La valeur de x est %d”, x ); x--;
} while (x > 0);
}
20
L’équivalent en while
#include<stdio.h> void main() {
int x = 5; while (x > 0) {
printf(“La valeur de x est %d”, x ); x--;
}
}
21
while ou do..while ?
(1)
int i; printf(“Combien il vous reste de séances de cours aujourd’hui?” ); scanf(“%d”, &i); do {
printf(“Il reste %d séances ”, i ); i--;
} while (i > 0);
while
int i; printf(“Combien il vous reste de séances de cours aujourd’hui?” ); scanf(“%d”, &i); while (i > 0) {
printf(“Il reste %d séances ”, i ); i--;
}
22
while ou do..while
(2)
char c; do {
printf(“Entrer un caractère (s pour stop)” ); scanf(“%c”, &c);
} while (c !=‘s’);
printf(“Entrer un caractère (s pour stop)” ); scanf(“%c”, &c); while (c !=‘s’) {
printf(“Entrer un caractère (s pour stop)” ); scanf(“%c”, &c);
}
do..while
23
while ou do..while int n, i=0; printf(“Donner un entier: “); scanf(“%d”, &n); while ( (n%2) != 0 ) {
printf(“L’entier impair est %d: “, n); printf(“Donner un entier: “); scanf(“%d”, &n); i++;
} printf(“Le nombre d’entiers impairs saisis est %d”, i); }
int n, i=0; do {
printf(“Donner un entier: “); scanf(“%d”, &n); printf(“L’entier impair est %d: “, n); i++;
(3)
while
} while ( (n%2) != 0); printf(“Le nombre d’entiers impairs saisis est %d”, i); }
24
Nos outils de travail
Les instructions simples (saisie, affichage, affectation,…).
Les structures conditionnelles (if, switch).
Les structures itératives (for, while, do..while).
Bienvenue au monde de la programmation
25