#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
}