2016-03-26 2 views
1

J'essaie donc de m'assurer qu'un utilisateur saisit une variable dans un ensemble spécifique de conditions pour l'utiliser dans un calcul ultérieur. A savoir, ils ne peuvent pas dépasser vmax, ne pas être inférieur à zéro et ne pas être une chaîne.do while condition issue

Voici ce que j'ai.

do 
    { 
     scanf("%f", &vkmh); 
     if (vkmh <= vmax) 
     { 
     }   
     else if (vkmh < 0) 
     { 
      printf("Error, speed must be positive.\n"); 
     } 
     else if (vkmh > vmax) 
     { 
      printf("Error, the max speed of this vehicle is listed as %.fkm/h.\nIt cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax); 
     } 
     else if (vkm != getchar()) 
     { 
      printf("Error in input. Please only use numbers\n"); 
     } 
    } 
    while(vkmh > vmax || vkmh < 0 || vkm != getchar()); 

valeurs théoriquement valides renvoient une réponse valide, et une valeur supérieure à Vmax renvoie une réponse non valide et demande à l'utilisateur d'entrer à nouveau. Mais un négatif ou une chaîne ne renvoie rien.

Des idées sur comment je peux faire fonctionner ça?

+0

Juste un avis. Construire 'if (vkmh <= vmax) {X} sinon si (vkmh <0) {Y}' n'exécutera jamais la branche 'Y' quand' vmax> = 0'. – Marian

+0

Alors, comment pourrais-je décrire des opérations séparées pour ces conditions? –

+0

Avez-vous entendu parler du concept de faire une chose à la fois? –

Répondre

2

Vous pouvez utiliser le code ci-dessous pour obtenir ce que vous sont en train de chercher. Notez que la réponse est très similaire à celle de cette réponse:

How to scanf only integer and repeat reading if the user enter non numeric characters?

#include<stdlib.h> 
#include<stdio.h> 

int clean_stdin() 
{ 
    while (getchar()!='\n'); 
    return 1; 
} 

int main() 
{ 
    float vkmh, vmax = 100.0; 

    setbuf(stdout, NULL); 

    vkmh = vmax + 1.0; /* value to start the loop */ 
    while (vkmh < 0 || vkmh > vmax) { 
     printf("Please enter value for the velocity in km/h: "); 
     if (scanf("%f",&vkmh) == 1) { 
      if (vkmh < 0) { 
       /* This was your 2nd if condition, but would never have executed assuming that vmax > 0. */ 
       printf("Error, speed must be positive.\n"); 
       exit(1); 
      } else if (vkmh <= vmax) { 
       /* Do something */ 
      } else { 
       /* No need for the else if, this is the only other possibility */ 
       printf("Error, the max speed of this vehicle is listed as %.fkm/h.\n" 
         "It cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax); 
      } 
     } else { 
      printf("Error in input.\n"); 
      clean_stdin(); 
     } 
    } 
    printf("\nValue read: %f km/h\n",vkmh); 
    return 0; 
} 
0

D'abord c'est C, pas C#. getchar lire à partir de l'entrée standard donc à chaque itération vous appelez (jusqu'à) 3 fois getchar() et lire 3 fois l'entrée de l'utilisateur. Vous pouvez donc supprimer ces appels. Function renvoie le nombre de conversions réussies, ce qui vous permet de l'utiliser (== 1) pour vérifier si l'utilisateur n'a pas saisi une valeur flottante correcte.

Edit: je l'ai supprimé le code que je ne peux pas compiler sur mon téléphone, désolé Utilisez fgets/atof comme dans l'exemple sur cette page http://www.cplusplus.com/reference/cstdlib/atof/

+2

Cette structure fonctionne bien pour les nombres, mais elle ne gère pas très bien les chaînes. Si vous mettez quelque chose comme "K" le message "Erreur en entrée" se répète à l'infini –

+0

Désolé, j'ai oublié une variable d'état. Remplacez le type de booléen si vous utilisez C++ –

+0

ajoutez un 'scanf ("% c ", &c);' inside 'if (scanf ("% f ", & vkmh)! = 1)' pour consommer le caractère entré! –