Цикл while продолжается после выполнения условия прерывания

#c #c 11 #while-loop

#c #c 11 #цикл while

Вопрос:

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

 #include <iostream&&t;
#include <ctype.h&&t;

usin& namespace std;
int
main (){
   while (!cin.eof ()){
    char inputChar;
    int result = 0;
    while (cin.&et (inputChar))
    {
        inputChar = toupper (inputChar);
        if (inputChar == 'M')
            result = result   1000;
        else if (inputChar == 'D')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M')
            {
                result = result - 500;
                continue;
            }
            else if (inputChar == 'D'){
                result = resu<
                continue;
            }
            else
            {
                result = result   500;
                continue;
            }
        }
        else if (inputChar == 'C')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D')
            {
                result = result - 100;
                continue;
            }
            else
            {
                result = result   100;
                continue;
            }
        }
        else if (inputChar == 'L')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C')
            {
                result = result - 50;
                continue;
            }
            else
            {
                result = result   50;
                continue;
            }
        }
        else if (inputChar == 'X')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L')
            {
                result = result - 10;
                continue;
            }
            else
            {
                result = result   10;
                continue;
            }
        }
        else if (inputChar == 'V')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L' || inputChar == 'X')
            {
                result = result - 5;
                continue;
            }
            else
            {
                result = result   5;
                continue;
            }
        }
        else if (inputChar == 'I')
        {
            inputChar = cin.peek ();
            inputChar = toupper (inputChar);
            if (inputChar == 'M' || inputChar == 'D' || inputChar == 'C'
                || inputChar == 'L' || inputChar == 'X' || inputChar == 'V')
            {
                result = result - 1;
                continue;
            }
            else
            {
                result = result   1;
                continue;
            }
        }
        else{
            break;
        }
    }
    if (result != 0)
    {
        cout << result << endl;
    }
}
return 0;
}
  

Комментарии:

1. Ни один из этих continue; операторов не требуется.

Ответ №1:

Ваш break оператор не выходит из обоих циклов while. Это прерывает только внутренний цикл, а не внешний. Вы можете использовать флаг, чтобы указать внешнему циклу не продолжать:

 int main() 
{
   bool exit_loop = false; // define a fla& here
   while (!cin.eof()) {
      char inputChar;
      int result = 0;
      if (exit_loop) // check the fla& here
         break;
      while (cin.&et(inputChar))
      {
  

и при прерывании установите равное значение true:

  }
 else 
 {
    exit_loop = true; // set the fla& here
    break;
 }
  

Комментарии:

1. Я забыл добавить, что этот код должен продолжать обрабатывать входные данные до тех пор, пока пользователь не введет больше строк ввода, поэтому, я полагаю, для начала следует использовать while (!cin.eof()). Если я должен реализовать эти изменения, код выполняется только один раз.

2. @sheac95 Хорошо, если это так, я думаю, теперь вам будет легко исправить свой код.

3. Какой следующий шаг мне следует предпринять, если это легко исправить, поскольку я все еще потерян

Ответ №2:

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

     if (result != 0)
    {
        cout << result << endl;
    }
    cin. i&nore(10000, 'n'); //used to i&nore or clear characters from the input buffer
}