Преобразование арабских чисел C++ в римские цифры и наоборот

Я пишу программу на C++, которая преобразует арабскую и римскую системы нумерации. Я написал одну программу, которая преобразует арабский в римский, и другую программу, которая преобразует римский в арабский. Проблема в том, что я не могу понять, как объединить их в одну программу, чтобы пользователь мог ввести арабское или римское число, и в результате программа преобразовала бы указанное число в другое.

У меня вопрос: КАК я могу объединить эти две программы в одну?

Код для перевода с римского на арабский

#include <iostream>
using namespace std;
int main()
{
    char roman_Numeral;
    int arabic_Numeral = 0;

    cout << "Enter the Roman Numeral in Capital letters (e.g. CCXIX) : ";
    while (cin.get(roman_Numeral))
    {

        if (arabic_Numeral > 100)
        {
            cout << "\nInvalid Value. Number must be  between I and C" << endl;
            return 0;
        }

        else if (roman_Numeral == 'C')
        {
            roman_Numeral = cin.peek();
            if (roman_Numeral == 'M' || roman_Numeral == 'D')
            {
                arabic_Numeral = arabic_Numeral - 100;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 100;
            }

        }

        else if (roman_Numeral == 'L')
        {
            roman_Numeral = cin.peek();
            if (roman_Numeral == 'M' || roman_Numeral == 'D'
                    || roman_Numeral == 'C')
            {
                arabic_Numeral = arabic_Numeral - 50;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 50;
                continue;
            }
        }

        else if (roman_Numeral == 'X')
        {
            roman_Numeral = cin.peek();
            if (roman_Numeral == 'M' || roman_Numeral == 'D'
                    || roman_Numeral == 'C' || roman_Numeral == 'L')
            {
                arabic_Numeral = arabic_Numeral - 10;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 10;
                continue;
            }
        }

        else if (roman_Numeral == 'V')
        {
            roman_Numeral = cin.peek();
            if (roman_Numeral == 'M' || roman_Numeral == 'D'
                    || roman_Numeral == 'C' || roman_Numeral == 'L'
                    || roman_Numeral == 'X')
            {
                arabic_Numeral = arabic_Numeral - 5;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 5;
                continue;
            }
        }

        else if (roman_Numeral == 'I')
        {
            roman_Numeral = cin.peek();
            if (roman_Numeral == 'M' || roman_Numeral == 'D'
                    || roman_Numeral == 'C' || roman_Numeral == 'L'
                    || roman_Numeral == 'X' || roman_Numeral == 'V')
            {
                arabic_Numeral = arabic_Numeral - 1;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 1;
                continue;
            }
        }

        else
            break;
    }
    cout << arabic_Numeral << endl;
    return 0;
}

Код для перевода с арабского на римский

#include <iostream>
#include <string>

#include <iomanip>
using namespace std;

#define MAX_INPUT 100 // These constants hold high and low integer numbers,
#define MIN_INPUT 1
#define ARRAY_SIZE 4   // and the array size declarator.

string convert(int digit, string low, string mid, string high);

int main()
{
    string answers[ARRAY_SIZE] = { "", "", "", "" }; //An  array of string to hold the output from the convert function.
    int accumulator = 0; // Variable to hold number of arabic numbers converted.
    int userNum = 0;
    string strUserNum;

    do
    {
        cout << "";
        cout << "Enter an arabic number between 1 and 100: ";
        cin >> strUserNum;

        userNum = std::stoi(strUserNum);

        if (userNum == 0 || userNum > MAX_INPUT)
        {
            cout << "\nInvalid Value. Number must be between 1 and 100" << endl;
            return 0;
        }
        else if (userNum == 'end')
        {
            cout << "Exiting program:";
            break;
        }

        int thous = userNum / 1000;

        int hund = userNum % 1000 / 100;

        int tens = userNum % 100 / 10;

        int ones = userNum % 10 / 1;

        answers[0] = convert(thous, "M", "M", "M");
        answers[1] = convert(hund, "C", "D", "M");

        answers[2] = convert(tens, "X", "L", "C");
        answers[3] = convert(ones, "I", "V", "X");

        cout << answers[0] << answers[1] << answers[2];
        cout << answers[3] << endl;
        cout << endl;
        break;

    } while (userNum != 'end');

    system("PAUSE");
    return 0;

}
string convert(int digit, string low, string mid, string high)
{

    if (digit == 1)
    {
        return low;
    }
    if (digit == 2)
    {
        return low + low;
    }
    if (digit == 3)
    {
        return low + low + low;
    }
    if (digit == 4)
    {
        return low + mid;
    }
    if (digit == 5)
    {
        return mid;
    }
    if (digit == 6)
    {
        return mid + low;
    }
    if (digit == 7)
    {
        return mid + low + low;
    }
    if (digit == 8)
    {
        return mid + low + low + low;
    }
    if (digit == 9)
    {
        return low + high;
    }
    if (digit == 0)
    {
        return "";
    }
}

Какой у Вас вопрос?

Drew Dormann 09.05.2018 21:33

Покажите нам свой код и задайте конкретный вопрос.

Jesper Juhl 09.05.2018 21:34

@DrewDormann Мой вопрос: как объединить эти две программы в одну рабочую программу?

cardib 09.05.2018 21:44

@JesperJuhl Я включил код

cardib 09.05.2018 21:45

Объедините их, создав две функции. Один для выполнения arabic_to_roman (), а другой для выполнения roman_to_arabic (), а затем вызов любой из функций из main по мере необходимости.

Jesper Juhl 09.05.2018 21:49

Эти программы работают? Меня беспокоит while (userNum != 'end'), учитывая, что userNum - это int.

Drew Dormann 09.05.2018 22:30

@DrewDormann да обе программы работают

cardib 09.05.2018 22:35

Попробуйте следующую тактику: 1. Определите, какое преобразование хочет пользователь: с римского на арабский или с арабского на римский. 2. Запустите желаемое преобразование. Было бы естественно и просто выразить каждое преобразование как отдельную функцию. Желательно иметь функции преобразования, которые могут обнаруживать недопустимый ввод и сообщать об ошибке, в этом случае тактика может быть немного иной: 1. Считайте ввод. 2. попробуйте преобразование один. в случае успеха вывести результат; в противном случае попробуйте преобразование два и распечатайте результат (или сообщение об ошибке).

n. 1.8e9-where's-my-share m. 10.05.2018 08:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
3 700
1

Ответы 1

Поместите код (который находится внутри основного блока) для перевода с римского на арабский в void procedureRomanToArabic() То же самое с римским на арабский. Поместите в void procedureArabicToRoman(). Удалите команду remove ArabicToRoman do-while и переместите ее в main.

void procedureRomanToArabic(){
    char roman_Numeral;
    int arabic_Numeral = 0;

    //...

    cout << arabic_Numeral << endl;
}




void procedureArabicToRoman()
{
    string answers[ARRAY_SIZE] = { "", "", "", "" }; //An  array of string to hold the output from the convert function.
    int accumulator = 0; // Variable to hold number of arabic numbers converted.
    int userNum = 0;
    string strUserNum;

    //remove do while here
    cout << "";
    cout << "Enter an arabic number between 1 and 100: ";
    cin >> strUserNum;

    //...

    answers[2] = convert(tens, "X", "L", "C");
    answers[3] = convert(ones, "I", "V", "X");

    cout << answers[0] << answers[1] << answers[2];
    cout << answers[3] << endl;
    cout << endl;
}


int main(){
  char type;
  do{

    cout<<"2 for Arabic to Roman, 1 for Roman to Arabic, or anything else for exit";
    cin>>type;
    if (type=='1')
        procedureArabicToRoman();
    else if (type =='2')
        procedureRomanToArabic();
    else break; //end program
  } while(true);     

}

Другие вопросы по теме