Я не могу пройти несколько циклов, хотя их условия не были выполнены - PullRequest
0 голосов
/ 18 февраля 2020

Я просто делаю упражнение, в котором я должен найти все четные числа между двумя определенными целыми числами. Тем не менее, каждый раз, когда я ввожу какие-либо числа, меня задерживают на одном из первых двух циклов do-while. Я предполагаю, что делаю простую ошибку. Кто-нибудь видит, что я делаю не так? Спасибо!

Входные данные должны быть x и y, выходные данные должны быть b. х должен быть меньше, чем у, и они оба должны быть между 1-99 (я исправлю это, это должно быть 0-100.)

#include <iostream>

int main()
{
    int x, y, b;

    std::cout << "This program will show all even numbers between a certain range.\n\nEnter two integers >0 and <100. The first integer must be smaller than the second integer.\n ";
    std::cin >> x >> y;

    do
    {
        std::cout << "The first integer must be smaller than the second integer. Please enter two integers.\n ";
        std::cin >> x >> y;

    } while (x > y);

    do
    {
        std::cout << "The first smaller integer must be greater than 0, the second larger integer must be less than 100.\n ";
        std::cin >> x >> y;

    } while (((x < 0 || y > 100 || x > y)));

    b = x;

    if ((b % 2) == 0)
    {
        do
        {
            std::cout << b;
            b++;
        } while (b < y);
    }
}

Ответы [ 4 ]

1 голос
/ 19 февраля 2020

Это довольно типичная ситуация "l oop с половиной".

То есть вам нужно запросить ввод у пользователя, прочитать ввод, а затем, если ввод был неверным, сообщить ему это было плохо, и повторяю.

Если честно, большинство способов справиться с подобными ситуациями в конечном итоге оказываются немного неуклюжими. Тем не менее, одна возможность, которая позволяет избежать большей неуклюжести, выглядит следующим образом:

bool CheckInput(int a, int b) { 
     if (b < a) {
         std::cout << "The first item must be less than the second.\n");
         return false;
     }

     // add range checks here....

     return true;
}

int main() {
    int x, y;

    do { 
        std::cout << "Please enter two integers (in sorted order): ";
        std::cin >> x >> y;
    } while (!CheckInput(x, y));
}
0 голосов
/ 19 февраля 2020

Ну, так как это домашняя работа, мы могли бы просто опубликовать код и двигаться дальше, но я постараюсь объяснить, что происходит:

#include <iostream>

int main() {
    int x,y;

    std::cout << "This program will show all even numbers between a certain "
    "range.\n\nEnter two integers >0 and <100. The first integer must be smaller "
    "than the second integer.\n";

    do {
        std::cin>>x>>y;
    } while(x >= y || x <= 0 || y >= 100);

    x+=1; // we update the value with 1, to make sure we don't print the start value, and we start with the first even value

    do {
        if(x % 2 == 0) {
            std::cout << x << std::endl;
        }
        x++;
    } while(x < y);

}

Что не так в вашем коде? Первое, что пошло не так, это то, что вы несколько раз просили ввод для разных условий. Нам нужно только один раз спросить пользователя о вводе, и мы проверим, соответствует ли этот ввод нашим условиям, в противном случае мы снова запросим у пользователя новый ввод.

Кроме того, эта часть также была неправильной:

if ((b % 2) == 0)
{
    do
    {
        std::cout << b;
        b++;
    } while (b < y);
}

Почему?

Хорошо, потому что в этом случае вы только запускаете do-while l oop, если вход число четное Так, например, при вводе 40 он запускает do-while l oop, а с 41 - нет.

Также в do-while l oop вы продолжаете печатать все числа, даже если они даже не Это потому, что оператор if не проверяется в do-while l oop

0 голосов
/ 19 февраля 2020

Инвертировать второе логическое значение как do { } while ( !(x >= 0 && y <=100 && x < y) ). Это просто легче читать и понимать. Напишите свое логическое значение в форме того, чего вы хотите достичь, и переверните его. Что касается модуля, он должен быть помещен в do-l oop if(b % 2 == 0) std::cout << b++

0 голосов
/ 19 февраля 2020

Вы говорите пользователю, что он ввел неправильный ввод, и снова запрашиваете у него ввод до . Вы проверяете условие:

do
{
    std::cout<<"The first integer must be smaller than the second integer. Please enter two integers.\n";
    std::cin>>x>>y;

} while (x>y);

Лучше было бы использовать while l oop:

int x = 0;   // important !! initialize your variables !! always !!
int y = 0;   // important !! initialize your variables !! always !!
while ( x > y) 
{
    std::cout<<"The first integer must be smaller than the second integer. Please enter two integers.\n";
    std::cin>>x>>y;

}

. Пользователь будет запрашивать повторный ввод цифр только в том случае, если введенные числа не соответствуют условию.

Если требуется использовать do-while, вам нужно немного реструктурировать свой код. Что-то вроде:

// do not read any input from user before this loop
do {
   std::cout << "please enter two numbers x,y such that 0<x<y<100";
   std::cin >> x >> y;
} while ( x > y || x < 0 || y > 100);

Обратите внимание, что я не добавил больше проверки, чем то, что есть в вашем коде. Как правило, вы должны проверить, вводил ли пользователь число, а не что-то еще.

После того, как вы получили это прямо, я надеюсь, что вы также можете зафиксировать окончательный l oop для вычисления (Спойлер: Вы получили if и l oop наизнанку. Вы проверяете, является ли x хотя бы один раз.)

...