У меня есть эта программа, которая предназначена для преобразования римских цифр в арабский 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
}
}
}