Создал небольшую программу для тестирования кода, но не могу заставить циклы работать правильно - PullRequest
0 голосов
/ 06 ноября 2010

В предыдущих вопросах я задавал вопрос о том, как получить несколько строковых входов для управления потоком программы, используя операторы if else. и все работало нормально.

код для ДА и НЕТ фантастический, и я очень рад, за исключением того, что я построил тестовую установку в форме функции, которая вызывается снова и снова, если пользователь не вводит команду exit.

Причина, по которой я это сделал, состояла в том, чтобы я мог просто попробовать все разные комбинации слов, чтобы увидеть, насколько прочен std :: string, каковы ограничения и тому подобное. единственная проблема заключается в том, что после однократного повторения кода (он возвращается к основному и снова входит в функцию YESNO), затем ввод переходит к части «да» или «нет», как и предполагалось, но вместо того, чтобы зацикливаться второй или третий раз, когда программа закрывается.

вот код:

#include <iostream>
#include <algorithm>
#include <cctype>
#include <string>

//the above headers are for the control flow code (transforms i think)

using namespace std;


int YESNO (int var);


int main()
{
    int loop=0;

    if (loop == 0)
    {
        YESNO(0);
        loop=YESNO(0);

    }
    else
    {
        cout << "\n " << endl;
    }
    return 0;
}

int YESNO (int var)
{
    cout << "This is a simple yes or no program control flow test" << endl;
    cout << "Please enter yes or no in different ways to test the code, many thanks!!!" << endl;
    cout << "\nYES or NO or exit?" << endl;
    string input ="";
    cin >> input;
    //all good, the above i know how todo

    transform (input.begin(), input.end(), input.begin(), tolower);

    if ((std::string::npos != input.find( "yes" )) || (std::string::npos != input.find( "y"))  )
    {
        cout << "You entered yes!! " << endl;
    }
    else if ((std::string::npos != input.find( "no" )) || (std::string::npos != input.find( "n"))  )
    {
        cout << "You entered no!! " << endl;
    }
    else if  (std::string::npos != input.find( "exit" ))
    {
        var=1;
    }
    else 
    {
        cout << "ERROR REPEAT..........!!!" << endl;
        var=0;
    }
        return(var);
}

Идея заключалась в том, что, как только пользователь вводит да или нет, функция автоматически повторяется, так что пользователь (я) может снова ввести да или нет, чтобы увидеть, как далеко мы можем нажать std :: string, и ввод exit приведет к программа не зацикливается, поскольку цикл больше не будет равен 0, и программа закроется.

Цикл работает, но функция не работает должным образом, и после запуска cout для правильного ответа она начинает существовать.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2010

В вашей программе нет циклических конструкций. Вместо этого вы дважды вызываете YESNO через явные вызовы.

Попробуйте выполнить любое из следующих действий:

// do...while executes the loop body once before testing the condition
int loop = 0;
do {
  loop = YESNO(0);
} while (loop == 0);

или

// while loops test the condition before executing the loop body
int loop = 0;
while (loop == 0) {
  loop = YESNO(0);
}

или

// somewhat odd use of "for" which limits the loop variable's scope
for (int loop = 0; loop == 0; loop = YESNO(0)); // empty loop body

или

// The best option is probably to omit the loop variable entirely
while (YESNO(0) == 0); // empty loop body

Некоторые примечания по стилю:

  • Не пишите return(var);, вместо этого просто return var;
  • Не используйте CAPS для имен функций или переменных, по соглашению они представляют константы; Назовите вашу функцию yesNo или yes_no
  • Не используйте имена переменных, такие как var или tmp, ваши переменные должны описывать их назначение и / или содержание
  • Кажется, что YESNO не нужно принимать аргумент, поэтому он несколько загромождает
0 голосов
/ 06 ноября 2010

Используйте оператор while в main () вместо if, таким образом:

int main()
{
    int loop = 0;

    while(loop == 0)
    {
        loop = YESNO(0);
    }
    cout << "\n " << endl;
    return 0;
}

этот оператор будет выполнять метод YESNO() непрерывно, пока переменная loop равна 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...