Basi c программа для преобразования римского числа в арабскую c форму? - PullRequest
0 голосов
/ 31 марта 2020

Мне нужна помощь в ответе на эти два вопроса. Первый:

  1. Я пытаюсь написать программу, которая преобразует одно римское число в диапазоне от 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;
}

Я делал некоторые уроки по ней, но сталкивался с этим вопросом на веб-сайт на днях, но я не могу найти решение этого, чтобы увидеть, как это делается. Не могли бы вы продемонстрировать, как написать такую ​​программу, случайно?

1 Ответ

0 голосов
/ 31 марта 2020

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

На первом этапе читается одно слово:

std::string word;
std::cin >> word;

На втором этапе выполняется преобразование слова в число:

int convert_to_number(const std::string& w) {
  if (w == "I") return 1;
  if (w == "II") return 2;
  // and so on.
}

На третьем этапе выполняется преобразование и печать. результат:

std::cout << convert_to_number(word) << std::endl;

Вместо написания большого количества операторов if вы можете попробовать использовать std::map<std::string, int> или std::unordered_hash<std::string, int> для поиска в постоянном времени.

...