Do while avec une instruction differente à la 1ère iteration

Résolu/Fermé
Aissata - 27 nov. 2022 à 01:54
 Aissata - 28 nov. 2022 à 21:49

Bonjour.

Je suis entrain de faire un petit programme en c++, qui va faire la validation de la saisie d'un utilisateur. On demandera à l'utilisateur de saisir une valeur, et un message d'erreur s'affichera tant que l'utilisateur ne rentre pas une valeur valide.

J'utilise le while actuellement, puisque le message du depart sera different des messages d'erreur. Mais je me demandais si avec le do while on pouvait faire en sorte d'afficher un message different pour la premiere iteration et un autre message pour les autres iterations.

Est-ce que cela est possible ? Ou je dois coûte que coûte utiliser un while dans mon cas.

3 réponses

Il y a plus d'une façon de le faire avec une boucle while ou do...while
L'idée est en général d'avoir une variable booléenne qui change de valeur après la lecture ou la validation.
bool bad = false;
do {
    ...
    bad = valeur < 1 || valeur > 5;
} while(bad);

1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 27 nov. 2022 à 10:41

Bonjour

le plus simple et le plus optimisé est d'afficher le premier message avant le while

int nombre = 0;
printf("Veuillez saisir un nombre entre 1 et 100"); //premier message

while(true)// la boucle est infinie => instruction 1
{
   nombre = scanf("%d"); // saisie du nombre => instruction 2
   if (nombre > 1 && nombre < 101) // test de la valeur => instruction 3
        break; // plus d'itération ne compte pas dans les instructions qui sont répétées
   printf("Le nombre doit etre compris entre 1 et 100"); //message d'erreur => instruction 4
} 

On voit qu'il y a quatre instructions pour chaque boucle avec saisie incorrecte.

Mais on peut faire comme tu le demandes de plusieurs façons, par exemple

int nombre = 0;
char* message = "Veuillez saisir un nombre entre 1 et 100"; //premier message

do// la boucle  => instruction 1
{
   printf(message); //affichage du message 2
   nombre = scanf("%d"); // saisie du nombre => instruction 3
   message = "Le nombre doit etre compris entre 1 et 100"; //nouveau message => instruction 4

}while(nombre > 1 && nombre < 101) //test de la valeur => instruction 5

Là, il y a 5 instructions répétées à chaque itération, dont une affectation de variable (ce qui implique une allocation de mémoire, donc du temps et des ressources)

On peut éviter l'allocation de mémoire à chaque fois, comme ça par exemple

int nombre = 0;
char* message = "Veuillez saisir un nombre entre 1 et 100"; //premier message

do// la boucle  => instruction 1
{
   printf(message); //affichage du message 2
   nombre = scanf("%d"); // saisie du nombre => instruction 3
   if(message == "Veuillez saisir un nombre entre 1 et 100") => instruction 4
       message = "Le nombre doit etre compris entre 1 et 100"; //nouveau message => n'est fait qu'une fois, donc ne compte pas dans les instructions répétées à chaque itération

}while(nombre > 1 && nombre < 101) //test de la valeur => instruction 5

C'est mieux, mais il y a quand même 5 instructions.

On pourrait aussi utiliser un tableau dont chaque item est un message et basculer une variable indice de 0 à 1 pour afficher le bon, mais on aurait encore 5 instructions.


1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
27 nov. 2022 à 12:59

J'ai percuté après coup, qu'en C++ on ne peut pas comparer 2 chaines avec ==, il faut utiliser la fonction strcmp.

1

Merci à tous pour vos réponse ! 

Oui. En effet je travaillais avec le while, en affichant d'abord le premier message hors de la boucle.

Et oui, vos réponses répondent bien à mon questionnement.

Merci encore !

0