C ++ cin只有正整数

时间:2011-09-08 20:22:17

标签: c++

这是我第一次使用Stackoverflow。 我正在制作一个程序来找出一辆汽车的MPG。我想知道如何才能使cin语句只接受正整数?而且,如果输入的输入无效,可以重置吗?我不确定这是否合理。我没必要上课。我只是好奇如何做到这一点。这是代码。

#include <iostream>
using namespace std;

int main()
{
double tank, miles, mpg;

cout << "Hello. This is a program that calculates the MPG ( Miles Per Gallon) for      your\n" ;
cout << "vehicle\n" << endl;
cout << "Please enter how many gallons your vehicle can hold\n" << endl;
cin >> tank;
cout << endl;
cout << "Please enter how many miles that have been driven on a full tank\n" <<endl;
cin >> miles;
cout << endl;

mpg = (miles)/(tank);
cout << "Your vehicle recieves " << mpg << " miles per gallon\n" << endl;
system ("pause");
return 0;
}

5 个答案:

答案 0 :(得分:4)

iostreams不是构建复杂UI的工具包。除非你想编写自己的相当复杂的流来包装通常的流,否则你无法获得它(a)只接受正整数或(b)礼貌地与输入其他东西的用户互动。

你应该只是阅读cin中的行,并在你看到你得到的内容后打印你自己的错误提示等。

答案 1 :(得分:1)

cout << "Hello. This is a program that calculates the MPG ( Miles Per Gallon) for      your\n" ;
cout << "vehicle\n" << endl;
do
{
     cout << "Please enter how many gallons your vehicle can hold\n" << endl;
     cin >> tank;
     cout << endl;
} while (tank <= 0 && ((int)tank != tank));
do
{
     cout << "Please enter how many miles that have been driven on a full tank\n" <<endl;
     cin >> miles;
     cout << endl;
} while (miles <= 0 && ((int)miles != miles));

如果在运行语句后执行此操作,如果答案为0或更低或不是整数,它将重新运行它们。如果您使用变量ints而不是double,那么您可以删除while语句中的“&amp;&amp;((int)miles == miles)”部分。

答案 2 :(得分:0)

但是,在命令行环境中有几种标准方法可以做到这一点。

您可以将cin语句捕获到一个循环中,该循环在输入有效输入之前不会释放。这是验证CLI输入的“标准”方式,而不仅仅是签名号码。

do
{
    cout << "\nPlease enter...";
    cin >> tank;
}
while (tank < 0)

while语句中的条件是验证数据的位置。您还可以创建一个if语句来解释输入无效的原因。

另一种方法是简单地强制值为正,只需转到tank = fabs(tank);,它取tank变量的绝对值(即正数)。

答案 3 :(得分:0)

    So this is my code for an infinite loop
    1: So main will call the "Get_number()" function
    2: Get number will accept an int from the user
    3(A): If int is greater than 0, go into loop
    3(B): Else, display to user "Invalid Input" and then call the function
          "Get_number()" again creating an infinite loop until the user
           enters a value greater than 0



    #include <iostream>  // Access the input output stream library
    #include <fstream>   // Access to the fstream library (used to read and write to files)
    #include <chrono> // Needed to access "std::chrono_literals"
    #include <thread> // Needed to access "namespace std::this_thread"

    using std::fstream; // this will allow us to use the fstream (we'll be able to read and write to files)
    using std::ios;     // needed for iostream (used to be able to tell fstream to read and/or write to a file and that it's reading/writing a binary file)
    using std::cout;    // need this statment to access cout (to display info to user)
    using std::cin;     // need this statment to access cin (to gather info from user)
    using std::endl;    // need this statment to access endl (will end the line)
    using namespace std::this_thread; // This will allow me to use "Sleep_For" or "Sleep_Until"
    using namespace std::chrono_literals; // This will allow the use of measurements of time such as ns, us, s, h, etc.

    //Prototypes***************************************************************************************************
    void shellSort(int read[], int readLength); //Making Prototype (Declaring our function) so that compiler knows not to worry about it
    void Get_number();
    void Write_to_file(int user_input_of_how_many_random_numbers_to_generate); //Making Prototype (Declaring our function) so that compiler knows not to worry about it
    void Read_from_file(int user_input_of_how_many_random_numbers_to_generate);//Making Prototype (Declaring our function) so that compiler knows not to worry about it
    //*************************************************************************************************************

    void main()
    {
        Get_number();

        system("pause>>void"); // will let the console pause untill user presses any button to continue

    }

    /**************************************************************************************************************
    * Purpose: This function will gather a positive integer from the user and use it to generate that many
    *          random numbers!
    *
    * Precondition: None
    *
    *
    * Postcondition:
    *           Would've gathered the number of random numbers the user wanted to generate and then gone into the 
    *           Write_to_file and Read_from_file function
    *
    **************************************************************************************************************/

    void Get_number()
    {
        int user_input_of_how_many_random_numbers_to_generate = 0; //make variable that will accept the int value the user wants to generate random numbers
        cout << "Please Enter A Number Greater Than Zero:" << endl; // displays to user to enter a number greater than zero
        cin >> user_input_of_how_many_random_numbers_to_generate; // will accept the value the user inputted and place it in the "user_input_of_how_many_random_numbers_to_generate" variable
        system("cls"); // Will clear the screen
        if (user_input_of_how_many_random_numbers_to_generate > 0) // if user input is greater than zero, enter this
        {

            Write_to_file(user_input_of_how_many_random_numbers_to_generate); // will bring up the "Write_to_file" function
            Read_from_file(user_input_of_how_many_random_numbers_to_generate); // will bring up the "Read_from_file" function
        }
        else // else enter this
        {
            cout << "invalid input!" << endl; // display to user "invalid input"
            sleep_for(2s); // system will pause for 2 seconds allowing the user to read the message of "invalid input"
            system("cls"); // console will be cleared
            Get_number(); // Get_number function will be entered creating an infinate loop untill the user's input is valid!
        }
    }

答案 4 :(得分:-3)

而不是

cin >> miles;

尝试

while ( (cin >> miles) < 0 )
 cout << "Please enter how many gallons your vehicle can hold\n" << endl;

这将重复这个问题,直到输入为正。你也可以为其他问题做到这一点。

请注意,输入流不适用于输入过滤。你必须为此提供自己的逻辑。