простой C ++ для цикла неожиданный вывод - PullRequest
2 голосов
/ 14 января 2012

Я писал программу, которая просит вас ввести два целых числа, которые затем перечисляют все целые числа от меньшего из двух введенных целых чисел до большего из двух введенных целых чисел (включительно).Я хочу, чтобы программа поместила точку после последнего целого числа в выводе, и я нашел способы сделать это без использования цикла for, но я хочу понять, почему этот код не работает (он просто выводит большее целое число сточка после него).

#include <iostream>

int main()
{
std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl;
int num1, num2, lower, upper;
std::cin >> num1 >> num2;
if (num1 > num2)
{
    upper = num1;
    lower = num2;
}
else
    if (num1 < num2)
    {
    upper = num2;
    lower = num1;
    }
    else
        if (num1 = num2)
        {
            upper = num1;
            lower = num1;
        }
std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl;
for (int val = lower; val <= upper; ++val)
{
    if (val = upper)
    {
        std::cout << val << "." << std::endl;
        ++val;
    }
    else
    {
        std::cout << val << std::endl;
        ++val;
    }
}
return 0;

}

Если введены два целых числа 1 и 5, почему это выдает 5. вместо 1 2 3 4 5.?

Ответы [ 8 ]

3 голосов
/ 14 января 2012

Сначала вы используете оператор присваивания =, где вы должны использовать оператор сравнения ==. Во-вторых, цикл for уже увеличивает val из-за третьего оператора цикла for (for (...; ...; ++val)). Таким образом, нет необходимости увеличивать val изнутри тела цикла.

Кроме того, учитывая, что вы хотите напечатать все результаты в одной строке, вы должны выводить пробел после каждой итерации, а не std::endl. Обратите внимание, что последняя итерация является исключением, поскольку вы хотите вывести точку, а не пробел. В фиксированной версии ниже я использовал троичный оператор в теле цикла, чтобы выполнить это.

std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl;
int num1, num2, lower, upper;
std::cin >> num1 >> num2;
if (num1 >= num2)
{
    upper = num1;
    lower = num2;
}
else if (num1 < num2)
{
    upper = num2;
    lower = num1;
}

std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl;
for (int val = lower; val <= upper; ++val)
{
    std::cout << val << ((val == upper) ? "." : " ");
}
2 голосов
/ 14 января 2012

Проблема

if (val = upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}

val = upper означает, что вы влияете на val верхнего значения. Поставьте 2 '=', чтобы оно сравнивалось, а не влияло. Как это

if (val == upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}
1 голос
/ 14 января 2012

Потому что

if(Val = upper)

Переназначает значение Val как верхнее. То, что вы имели в виду, было

if(Val == upper)

В любом случае, это может быть.

0 голосов
/ 14 января 2012

"=" используется для присвоения значения "upper" значению "val".при сравнении значений «val» и «upper» оператор должен быть «==» вместо «=».Следовательно, следующий код должен быть:

if (val == upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}
0 голосов
/ 14 января 2012

Другие уже прокомментировали ряд проблем с этим кодом.Вот моя любимая мозоль: Вы должны проверить, что ввод на самом деле был правильным!То есть после прочтения с std::cin необходимо проверить, что это прошло успешно.Ввод непустого и нечислового символа в противном случае оставил бы случайный мусор, который хранится в ваших переменных как есть.Канонический способ чтения из std::istream выглядит следующим образом:

if (std::cin >> num1 >> num2) {
    ...
}
else {
    possibly an report error here
}
0 голосов
/ 14 января 2012

Более простой способ сделать то, что вы сделали, это заменить это:

for (int val = lower; val <= upper; ++val)
{
    if (val = upper)
    {
        std::cout << val << "." << std::endl;
        ++val;
    }
    else
    {
        std::cout << val << std::endl;
        ++val;
    }
}

на это:

for (int val = lower; val <= upper; ++val)
{
     std::cout << val;

}
cout<<"."<<std::endl;
0 голосов
/ 14 января 2012

В вашей программе есть две ошибки, упомянутые delannoyk и Gillaume07. = - оператор присваивания в c ++, а == - оператор сравнения. Таким образом, почти всегда, если операторы будут иметь оператор сравнения. Во-вторых, иметь операцию увеличения как в операторе цикла, так и в случае if / else после каждой итерации добавляется 2 к переменной счетчика.

0 голосов
/ 14 января 2012

++ val должен присутствовать только на уровне объявления цикла, а не внутри if и else

for (int val = lower; val <= upper; ++val)
   std::cout << val << (val==upper ?  "." : " ") << std::endl; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...