default:
printf("Not a valid option\n");
break;
}
}
printf("Your total cost is %f\n",total);
return 0;
}
3 Réponses :
Vous ne mettez jamais à jour la variable type à 3, donc la boucle while ne se termine jamais. Bien que vous ayez une instruction break , elle affecte le commutateur et non la boucle while qui l'entoure.
Pouvez-vous élaborer un peu? Comme vous parlez d'un cas 3?
Bien sûr - vous entrez dans la boucle while lorsque type! = 3 , puis chaque fois que vous terminez le flux de votre instruction switch, l'instruction type! = 3 est toujours vraie, ainsi la boucle while exécute à nouveau tout le code qu'elle contient. Il continue à faire cela jusqu'à ce que l'instruction type! = 3 soit fausse. Comme vous ne mettez jamais à jour la variable type en quoi que ce soit, la boucle while ne se termine jamais.
Chaque case dans une instruction switch nécessite une break . Par conséquent, ces break dans chaque cas cassent l'instruction switch PAS votre boucle while . Comme @Tillson l'a mentionné, si vous voulez aussi sortir de votre boucle, le type devrait être changé quelque part dans vos cas.
J'ai travaillé. Merci beaucoup. J'ai ajouté une pause à la fin de la boucle while et cela a parfaitement fonctionné.
Je ferai également remarquer que cela peut être un cas où vous n'avez pas besoin d'une boucle while en premier lieu–– il suffit de vérifier si (type! = 3) suffirait puisque votre code sera toujours sortir de la boucle while après sa première itération.
@SamBh Je recommanderais d'utiliser la réponse de chqrlie si vous souhaitez que les utilisateurs réexaminent les options pour effectuer une nouvelle transaction après avoir terminé une transaction. Cela aurait plus de sens pour un programme imitant un marché. :)
Votre logique de boucle est défectueuse:
total pour chaque réponse. scanf () réussit à convertir l'entrée utilisateur. Voici une version modifiée:
#include <stdio.h>
#define NEWGEAR 15.0
#define USEDGEAR 5.0
int main() {
int type;
int num_items;
double total = 0;
printf("Welcome to the market\n");
for (;;) {
printf("What would you like to do\n");
printf("\t1-Buy New Gear\n");
printf("\t2-Buy used gear\n");
printf("\t3-Quit\n");
if (scanf("%d", &type) != 1 || type == 3)
break;
switch (type) {
case 1:
printf("How many new items would you like?\n");
if (scanf("%d", &num_items) == 1)
total += num_items * 15.0;
break;
case 2:
printf("How many old items would you like?\n");
if (scanf("%d", &num_items) == 1)
total += num_items * USEDGEAR;
break;
default:
printf("Not a valid option\n");
break;
}
}
printf("Your total cost is %f\n", total);
return 0;
}
Je pense que cela devrait être && et non || . Sinon, à chaque fois que 1 n'est pas entré, il sortira déjà de la boucle puisque votre condition if sera valide pour rompre la boucle.
@Whooper: non, || est correct. scanf () renvoie 1 si et seulement si la conversion est réussie. La boucle doit se terminer si la conversion échoue ou si le type saisi est 3 .
Ahh je comprends maintenant! Je ne savais pas que scanf pouvait être utilisé de cette façon comme condition. Je pensais que cela fonctionnait de la même manière que d'attribuer la valeur lue de scanf au type avant de vérifier si vous devriez casser la boucle. Merci d'avoir clarifié cela!
@Whooper: scanf renvoie le nombre de conversions réussies. Il est important de vérifier que scanf () a bien réussi à gérer correctement les entrées inattendues.
Je pense que cela gérera ce que vous voulez réaliser.
#include <stdio.h>
#include <stdlib.h>
#define NEWGEAR 15.0
#define USEDGEAR 5.0
int main() {
int type = 0;
int num_items;
float total;
printf("Welcome to the market\n");
printf("What would you like to do\n");
printf("\t1-Buy New Gear\n");
printf("\t2-Buy used gear\n");
printf("\t3-Quit\n");
while (type != 3) {
printf("Enter an option: ");
scanf("%d", &type);
if(type == 3)
break;
switch (type) {
case 1:
printf("How many new items would you like?\n");
scanf("%d", &num_items);
total = num_items * 15.0;
break;
case 2:
printf("How many old items would you like?\n");
scanf("%d", &num_items);
total = num_items * USEDGEAR;
break;
default:
printf("Not a valid option\n");
break;
}
}
printf("Your total cost is %f\n",total);
return 0;
}
En gros, une fois que votre utilisateur a terminé de faire les cas 1 à 2 ou par défaut, votre programme demandera à nouveau à votre utilisateur une option si il souhaite quitter ou effectuer une autre opération de cas 1 ou 2.
Notez cependant que cela ne gère que votre problème de boucle. Comme chqrlie l'a mentionné dans sa réponse, il y a aussi des problèmes logiques avec votre code, mais je pense que vous pouvez le comprendre ou poser une autre question sur les problèmes que vous pourriez rencontrer.
@chqrlie ah ouais bien car il entrera toujours dans le scénario du cas de commutation. Merci d'avoir fait remarquer cela!
Où incrémentez-vous le
typepour qu'il ait jamais la valeur3? Ce serait un bon moment pour apprendre à utiliser un débogueur pour parcourir le code, afin que vous puissiez résoudre vous-même des problèmes comme celui-ci.@SamBh: vous pouvez accepter l'une des réponses en cliquant sur la coche grise sous son score et voter pour celles qui vous ont aidé.