Почему cin >> не работает в моем цикле do while? - PullRequest
0 голосов
/ 28 сентября 2019

Я делаю программу, которая определяет, является ли число простым числом или нет.Когда пользователь вводит слово, он должен вывести «Только положительные числа!»а затем получить еще один вклад от пользователя.Моя проблема в том, что cin не работает в цикле do..while.

char answer;
int num, i, count = 0;

do{
    system("cls");

    cout<<"Enter number:"<<endl;
    cin>>num;

    if(num>0)
    {
        for(i=2; i<num; i++){
            if(num%i==0)
                count++;
        }
        if(count>1)
            cout<<num<<" is not a prime number"<<endl;
        else
            cout<<num<<" is a prime number"<<endl;
    }

    else if(num<0)
        cout<<"Positive numbers only!"<<endl;


    do
    {
        cout<<"Try again? [Y/N]";
        answer=toupper(answer);
        cin>>answer;


        if(answer=='Y')
            break;
        if(answer=='N')
            return 0;
        break;      
    }while(answer!='Y' || answer!='N');

}while(answer=='Y' || answer=='y');

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

do {system ("cls");

    cout << "Enter number:" << endl;
    cin >> num;

    if (num > 0)
    { 
        count = 0;
        for (i = 2; i < num; i++) {
            if (num%i == 0)
                count++;
        }
        if (count >= 1)
            cout << num << " is not a prime number" << endl;
        else
            cout << num << " is a prime number" << endl;
    }

    else if (num < 0)
        cout << "Positive numbers only!" << endl;


    do
    {
        cout << "Try again? [Y/N]";

        cin >> answer;
        answer = toupper(answer);

        if (answer == 'Y')
            break;
        if (answer == 'N')
            return 0;
        break;
    } while (answer != 'Y' && answer != 'N');

} while (answer == 'Y' || answer == 'y');

}

Это работает абсолютно нормально.Я надеюсь, что это помогает.Но если cin все еще не работает в do while ... Пожалуйста, скажите мне, какой компилятор вы используете?

0 голосов
/ 28 сентября 2019

В вашем коде есть некоторые ошибки, я исправил их в приведенном ниже коде и объяснил в виде комментариев:

char answer;
int num, i, count;

do{
    cout<<"Enter number:"<<endl;
    cin>>num;

    if(num>0)
    {
        count=0;
        for(i=2; i<num; i++){
            if(num%i==0)
                count++;
        }
        if(count>1)
            cout<<num<<" is not a prime number"<<endl;
        else
            cout<<num<<" is a prime number"<<endl;
    }

    else if(num<=0)
        cout<<"Positive numbers only!"<<endl;


    do
    {
        cout<<"Try again? [Y/N]";
        cin.get(answer);
        answer=toupper(answer);             //Shifted toupper to after taking input


        if(answer=='Y')
            break;
        if(answer=='N')
            return 0;
        // break; not needed here, invalidates the purpose of this do-while loop     
    }while(answer!='Y' && answer!='N');     // Changed logical operator from OR to AND

}while(answer=='Y' || answer=='y');

Но если вы хотите повысить эффективность своего кода, я бы предложилвзглянем на следующий фрагмент кода:

bool again=true;
while(again){
    int num;
    cout<<"Enter number:"<<endl;
    cin>>num;

    if(num>0)
    {
        bool prime=true;
        for(int i=2; i<=sqrt(num); i++){    //checking upto square root is sufficient
            if(num%i==0){
                prime=false;
                break;
            }
        }

        if(!prime) cout<<num<<" is not a prime number"<<endl;
        else cout<<num<<" is a prime number"<<endl;
    }

    else cout<<"Positive integers only!"<<endl;

    char answer='?';
    while(answer!='Y' && answer!='N'){
        cout<<"Try again? [Y/N]";
        cin.get(answer);
        answer=toupper(answer);
        if(answer=='Y') again=true;
        else if(answer=='N') again=false;
    }
}
...