1
votes

Comment faire une boucle si le nombre d'entrée est négatif

Validation d'entrée:

Le programme devrait afficher une erreur et laisser l'utilisateur réessayer s'il y en a si les nombres sont négatifs. Une seule itération est requise (c'est-à-dire que votre programme n'a pas besoin de demander trois autres nombres, il peut quitter après avoir imprimé le résultat).

J'ai donc les devoirs terminés et la seule chose qui me manque est cette entrée validation comme indiqué ci-dessus. En d'autres termes (d'après ma compréhension), je devrais implémenter une boucle dans mon code où l'utilisateur doit entrer 3 autres ensembles de nombres s'il a déjà entré un nombre négatif.

#include <iostream>
#include <iomanip>
using namespace std;

double getAverage (double num1, double num2, double num3){

    double averageAmount;

    averageAmount = (num1 + num2 + num3)/ 3;

    return averageAmount;
}
double getMedian (int num1, int num2, int num3){

       int x = num1-num2;
       int y = num2-num3;
       int z = num1-num3;
       if(x*y > 0) return num2;
       if(x*z > 0) return num3;
       return num1;
}
double countDigits( int num1){

    int digits = 0;

    while (num1){

        num1 = num1/10;
        digits++;
    }

    return (digits);
}

int main() {

    double num1 = 0;
    double num2 = 0;
    double num3 = 0;

    cout << "Enter 3 integers" << endl;
    cin >> num1;
    cin >> num2;
    cin >> num3;

    cout << "The average is " << fixed << setprecision(2) << getAverage(num1, num2, num3) << endl;
    cout << "The median is " << fixed << setprecision(2) << getMedian(num1, num2, num3) << endl;
    cout << "There are " << countDigits(num1) << " digits in the number " << num1 << endl;

    return 0;
}

Si l'utilisateur entre un nombre négatif, je m'attends à ce que la sortie soit "Entrez 3 entiers" // puisque nous ne voulons que des nombres positifs


7 commentaires

Si vous souhaitez que l'utilisateur entre des valeurs entières non signées, commencez par utiliser des types entiers non signés pour l'entrée. Et effectuez une vérification des erreurs (par exemple, unsigned int num1, num2, num3; if (! (Std :: cin >> num1 >> num2 >> num3)) {/ * error in input * /} )


Copie possible de la validation de l'entrée entière, comment?


@Someprogrammerdude Cependant, analyser -1 comme un entier non signé peut étonnamment produire une valeur positive énorme au lieu d'une erreur.


@Someprogrammerdude Voilà ce que je pense aussi, mais il semble y avoir des bugs avec gcc et clang sur tio puis.


@moooeeeep Ah je sais pourquoi cela se produit ... C'est parce que les entrées sont analysées comme par std :: strtoull (voir this ). Et si la valeur est hors de portée (comme par exemple un nombre négatif), elle renvoie ULLONG_MAX (et errno est défini sur ERANGE ). Cela doit être pris en compte lors de la lecture et de la validation.


Mais ne devrions-nous pas nous attendre à ce que la surcharge de operator >> (unsigned int) fasse cela toute seule? :]


@Someprogrammerdude Vous avez déjà trouvé une question à ce sujet: stackoverflow.com/questions/7677158/...


3 Réponses :


-1
votes

Vous pouvez utiliser la boucle for pour saisir les nombres.

Lorsque l'utilisateur entre un nombre négatif, vous pouvez afficher un message d'erreur et quitter la fonction principale.

Par exemple:

double num[3];

cout << "Enter 3 positive integers" << endl;
for(int i=0; i<3; i++) {
    cin >> num[i];
    if (num[i] < 0 ) {
        cout << "Only 3 positive integers are allowed";
        return 0;
    }
}


0 commentaires

1
votes

vous pouvez écrire le code en utilisant une boucle do-while:

while (true) {
   cout << "Enter 3 integers" << endl;
   cin >> num1;
   // if any number is -ve, continue the whole loop
   if (num1 < 0) continue;
   cin >> num2;
   if (num2 < 0) continue;
   cin >> num3;
   if (num3 < 0) continue;
   // if every number is positive, just break out of the loop
   break; 
}

sinon avec juste une boucle while comme:

do {
   cout << "Enter 3 integers" << endl;
   cin >> num1;
   cin >> num2;
   cin >> num3;
} while ((num1 < 0) || (num2 < 0) || (num3 < 0));

Hope cela aide, merci - Rajkumar


0 commentaires

0
votes
cout << "Enter 3 integers" << endl;
        cin >> num1;
        cin >> num2;
        cin >> num3;

            while(num1 < 0 || num2 < 0 || num3 < 0)
            {
                if (num1 < 0)
                {
                    cout << "Your first number [" << num1 << "] is negetiv. Please enter a positive number!";
                    cin >> num1;
                }
                if (num2 < 0)
                {
                    cout << "Your second number [" << num2 << "] is negetiv. Please enter a positive number!";
                    cin >> num2;
                }
               if (num3 < 0)
                {
                    cout << "Your third number [" << num3 << "] is negetiv. Please enter apositive number!";
                    cin >> num3;
                }
            }
Don't forget to wait for a keypress by the user after printing the numbers by using:cin;orsystem("pause");

0 commentaires