Выход из цикла с использованием while или do while - PullRequest
0 голосов
/ 28 сентября 2018

Это для школы

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

Вот моя программа


int main() {
  std::string input;
  std::string terminate = "end";
  std::transform(terminate.begin(), terminate.end(), terminate.begin(),::toupper); //Extra stuff makes it not case sensitive

  std::cout << "This program checks for a balanced expression" << std::endl << "Enter 'end' to end the program" << std::endl;

  while(input != terminate){
    std::cout << "Enter Expression: ";
    std::cin >> input;

    if(checkBalance(input))
      std::cout << input << " " << "is balanced" << std::endl;
    else
      std::cout << input << " " << "is not balanced" << std::endl;


    }

  return 0;
}

1 Ответ

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

Есть две вещи, которые прерывают работу вашего кода

std::transform(terminate.begin(), terminate.end(), terminate.begin(),::toupper); //Extra stuff makes it not case sensitive

Прежде всего логическая проблема.Вы выполняете операцию над предопределенной строкой , завершаете , но не изменяете строку ввода пользователя input .Фактически вы можете заменить ваш

std::string terminate = "end";
std::transform(terminate.begin(), terminate.end(), terminate.begin(),::toupper); //Extra stuff makes it not case sensitive

на одну строку

std::string terminate = "END";

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

int main() {
  std::string input;
  // Replace two initial rows by one with the same result
  std::string terminate = "END";

  std::cout << "This program checks for a balanced expression" << std::endl << "Enter 'end' to end the program" << std::endl;

  while(input != terminate){
    std::cout << "Enter Expression: ";
    std::cin >> input;

    if(checkBalance(input))
      std::cout << input << " " << "is balanced" << std::endl;
    else
      std::cout << input << " " << "is not balanced" << std::endl;

    // Modify user input to upper case for possibility of successful check on next while loop 
    std::transform(input.begin(), input.end(), input.begin(),::toupper); //Extra stuff makes it not case sensitive

    }

  return 0;
}

Я обнаружил вход модификацию после checkBalance (вход) , так как я не уверен, какие модификации он может сделать для входа .На самом деле наиболее логичная позиция преобразования регистра input - непосредственно после чтения строки, т.е. после

std::cin >> input;

Еще одна нота.Ваш исходный код должен выйти для END ввода (т. Е. Верхнего регистра).

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