Мне нужна помощь в ответе на эти два вопроса. Первый:
- Я пытаюсь написать программу, которая преобразует одно римское число в диапазоне от I (1) до IX (9) в форму Arabi c. Программа должна прочитать одну строку из стандартного ввода и вывести соответствующее значение в стандартный вывод.
Затем я хочу расширить программу, чтобы она работала правильно, когда ввод состоит из строчных или прописных латинских букв. Самый простой подход - преобразовать каждый символ входного слова в верхний регистр, прежде чем пытаться найти совпадение. Выполните l oop над символами в строке, используя оператор индекса ([]), чтобы получить доступ к каждому символу, и используйте функцию toupper (вам потребуется включить заголовочный файл cctype), чтобы получить соответствующее значение в верхнем регистре.
По второму вопросу я хочу, чтобы я сделал следующее:
Расширить программу так, чтобы она могла работать с одиночными числами di git любого значения. Единственное число di git - это число, состоящее только из тысяч, сотен, десятков или единиц. Таким образом, LXX (70) и CD (400) являются отдельными числами di git, а XIV (14) и M C (1100) - нет. Используйте тот же подход, что и для цифр единиц, но с 4 различными массивами, по одному для цифр тысяч, сотен, десятков и единиц. Попробуйте сначала найти тысячи цифр, затем сотни и так далее. Когда вы найдете совпадение в одном из массивов, выведите соответствующее значение и остановитесь. Измените программу так, чтобы она считывала и преобразовывала все входные числа до конца файла (eof) на стандартном вводе. Вы, вероятно, сможете сделать это, просто добавив соответствующее чтение l oop вокруг кода, который читает одну строку.
В настоящее время это то, что я должен начать, но я не уверен, как написать программу, подобную этой:
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
class RomanNumeral
{
public:
const static int M = 1000;
const static int D = 500;
const static int C = 100;
const static int L = 50;
const static int X = 10;
const static int V = 5;
const static int I = 1;
RomanNumeral( const int arabic ) :
m_roman( "" ),
m_arabic( ((arabic > 0) ? arabic : 0) )
{
if( arabic > 0 )
{
int i = arabic;
while( i > 0 )
{
if( ( i - M ) >= 0 )
{
m_roman += "M";
i -= M;
continue;
}
if( ( i - D ) >= 0 )
{
m_roman += "D";
i -= D;
continue;
}
if( ( i - C ) >= 0 )
{
m_roman += "C";
i -= C;
continue;
}
if( ( i - L ) >= 0 )
{
m_roman += "L";
i -= L;
continue;
}
if( ( i - X ) >= 0 )
{
m_roman += "X";
i -= X;
continue;
}
if( ( i - V ) >= 0 )
{
m_roman += "V";
i -= V;
continue;
}
if( ( i - I ) >= 0 )
{
m_roman += "I";
i -= I;
continue;
}
}
}
else
{
m_roman = "0";
}
}
RomanNumeral( const std::string& string ) :
m_roman( ((string.size() > 0 ) ? string : "0" ) ),
m_arabic( 0 )
{
int i = 0;
while( i < (int)string.size() )
{
char c = string[i++];
switch( c )
{
case 'M':
case 'm':
m_arabic += M;
break;
case 'D':
case 'd':
m_arabic += D;
break;
case 'C':
case 'c':
m_arabic += C;
break;
case 'L':
case 'l':
m_arabic += L;
break;
case 'X':
case 'x':
m_arabic += X;
break;
case 'V':
case 'v':
m_arabic += V;
break;
case 'I':
case 'i':
m_arabic += I;
break;
default:
throw new std::out_of_range( "Not a valid Roman numeral!" );
break;
}
}
}
int getArabic()
{
return m_arabic;
}
void setArabic( const int arabic );
const std::string& getRoman()
{
return m_roman;
}
protected:
std::string m_roman;
int m_arabic;
};
int main()
{
std::string roman;
cin >> roman;
try
{
RomanNumeral rn( roman );
cout << rn.getArabic() << endl;
}
catch( exception* ex )
{
cout << roman << " " << ex->what() << endl;
}
return 0;
}
Я делал некоторые уроки по ней, но сталкивался с этим вопросом на веб-сайт на днях, но я не могу найти решение этого, чтобы увидеть, как это делается. Не могли бы вы продемонстрировать, как написать такую программу, случайно?