Римские цифры на арабский c С ++ - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть эта программа, которая предназначена для преобразования римских цифр в арабский c, однако у меня есть кое-как, как сделать это oop, и у меня возникла проблема с тем, чтобы она не стала непрерывной l oop. Я просто хочу, чтобы пользователь запускал римские цифры, а затем выводил число Араби c. Например, я ввожу V, он показывает 5, а затем программа заканчивается. Как я могу это сделать. Я попытался удалить часть while из int main () {внизу, но, похоже, это не очень помогает. Какой способ сделать это не go в oop?

#include <algorithm>
#include <cmath>
#include <vector>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;

void error(const string& a) {
    throw runtime_error(a);
}

class Roman {
public:
    string roman = "";
    int number;
    int as_int() { return number; }
    string int_to_roman(int number);
    void think(const char& a, const char& b, const char& c, int& divided, const int & dividee); //meant to ensure the roman permissible
    void roman_to_int(Roman a);
};

void Roman::think(const char& a, const char& b, const char& c, int& divided, const int & dividee) {
    string name = "";
    int number = divided;
    number /= dividee;
    if (number < 1) return;
    if (number == 1)
        name += a;
    if (number == 2)
        name = name+a+a;
    if (number == 3)
        name = name+a+a+a;
    if (number == 4)
        name = name + a+b;
    if (number == 5)
        name = b;
    if (number == 6)
        name = name + b+a;
    if(number==7)
        name = name + b+a+a;
    if(number==8)
        name = name + b+a+a+a;
    if(number==9)
        name = name + a+c;
    if(number== 10)
        name += c;
    int z = divided;
    divided = (z - (number * dividee));
    roman += name;
}

string Roman::int_to_roman(int number) {
    if (number > 4999) error("Doesn't support numbers higher than 5000");
    think('C', 'D', 'M', number, 100);
    think('X', 'L', 'C', number, 10);
    think('I', 'V', 'X', number, 1);
    return roman;
}

void Roman::roman_to_int(Roman a){
}

ostream& operator << (ostream& os, Roman a) {
    return os << a.roman;
}

int test(char ch, int how_much) {
    if (cin.get() == ch) return how_much;
    cin.unget();
    return 0;
}

void dis(char const& a, char const& b, int& sum, int times, string& numeral) {
    sum += (1*times);
    int number = sum;
    sum += test(a, (3*times));
    if (number != sum) {
        numeral += a;
        return;
    }
    sum += test(b, (8*times));
    if (number != sum) numeral += b;
}

int get_number(Roman &a) {
    int sum = 0;
    string numeral = "";
    while (cin.get()!='\n') {
        cin.unget();
        char ch = cin.get();
        numeral += ch;
        switch (ch) {
            case'I':
                dis('V', 'X', sum, 1, numeral);
                break;
            case'V': 
                sum += 5;
                break;
            case'X': dis('L', 'C', sum, 10, numeral);
                break;
            case'L': sum += 50;
                break;
            case'C': dis('D', 'M', sum, 100, numeral);
                break;
            case'D': sum += 500;
                break;
            case'M': sum += 1000;
                break;
        }
    }
    if (numeral != a.int_to_roman(sum)) error("Impermissible roman, try again.\n");
    return sum;
}

int main() {
    while (true) {
        try {
            while (true) {
                Roman a;
                a.number = get_number(a);
                cout << a.number << endl;
            }

        }
        catch (exception& e) {
            cerr << "error: \n" << e.what() << '\n ';
            //return 1; // 1 - indicates failure
        }
    }
}
...