Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <set>
- const char SYM[7] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' };
- const int NUM[7] = { 1, 5, 10, 50, 100, 500, 1000 };
- const int USE_CONSOLE = 1;
- const int USE_FILE = 2;
- using namespace std;
- string getUserInputFromConsole();
- string getUserInputFromFile(string path);
- bool checkPath(string path);
- string getUserInputPath();
- int inputMethod();
- void printInConsole(int value, string s);
- string getUserOutputPath();
- void printInFile(string path, int value, string s);
- int outputMethod();
- void start();
- void printTask();
- string userInput();
- void resultPrint(int value, string s);
- string getUserInputFromConsole() {
- string s;
- cout << "Введите строку, содержащую до 4х цифровых символов" << endl;
- cin >> s;
- return s;
- }
- string getUserInputFromFile(string path) {
- string s;
- ifstream file(path);
- file.open(path);
- file.clear();
- file >> s;
- file.close();
- return s;
- }
- bool checkPath(string path) {
- ifstream file(path);
- if (file.is_open()) {
- cout << path << " найден" << endl;
- return true;
- }
- else {
- cout << path << " не найден" << endl;
- return false;
- }
- }
- string getUserInputPath() {
- string path;
- bool isNotValid = false;
- do {
- cout << "Введите абсолютный путь к файлу с входными данными" << endl;
- cin >> path;
- } while (!checkPath(path));
- return path;
- }
- int inputMethod() {
- int method;
- cout << "Каким способом хотите ввести данные?" << endl;
- cout << "1 - с помощью консоли" << endl;
- cout << "2 - с помощью файла" << endl;
- do {
- cin >> method;
- if (method != 1 && method != 2)
- cout << "Введите 1 или 2";
- } while (method != 2 && method != 1);
- return method;
- }
- void printInConsole(int value, string s) {
- cout << "Введённое число: " << value << endl;
- cout << "Данное число в римской системе счисления: " << s;
- }
- string getUserOutputPath() {
- string path;
- cout << "Введите абсолютный путь к файлу для вывода результата" << endl;
- cin >> path;
- cout << "Результат работа помещён в файл";
- return path;
- }
- void printInFile(string path, int value, string s) {
- ofstream file(path);
- file << "Введённое число: " << value << endl;
- file << "Данное число в римской системе счисления: " << s;
- }
- int outputMethod() {
- int method;
- cout << "Куда хотите вывести результат?" << endl;
- cout << "1 - в консоль" << endl;
- cout << "2 - в файл" << endl;
- do {
- cin >> method;
- if (method != 1 && method != 2)
- cout << "Введите 1 или 2";
- } while (method != 2 && method != 1);
- return method;
- }
- string deleteNotSym(string s) {
- const set<char> SYM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
- int i = 0;
- while (i < s.length()) {
- if (s[i] < '0' || s[i] > '9')
- s.erase(i, 1);
- else
- i++;
- }
- return s;
- }
- string convertToRim(int a) {
- string s;
- int i = 6;
- while (a > 0) {
- while (a / NUM[i] > 0) {
- a -= NUM[i];
- s += SYM[i];
- }
- i--;
- }
- return s;
- }
- string check4Same(string s) {
- int i = 0;
- int temp;
- while (i < s.length() - 2) {
- if (s[i] == s[i + 1] && s[i + 1] == s[i + 2] && s[i + 2] == s[i + 3]) {
- for (int j = 0; j < 7; j++)
- if (SYM[j] == s[i])
- temp = j;
- s.erase(i + 1, 3);
- s.insert(i + 1, 1, SYM[temp + 1]);
- }
- i++;
- }
- return s;
- }
- string fixNotValid(string s) {
- int i = 0;
- int temp, temp1;
- while (i < s.length() - 1) {
- if (s[i] == s[i + 2]) {
- for (int j = 0; j < 7; j++)
- if (SYM[j] == s[i])
- temp = j;
- for (int j = 0; j < 7; j++)
- if (SYM[j] == s[i + 1])
- temp1 = j;
- if (temp == temp1 + 1) {
- s.erase(i, 3);
- s.insert(i, 1, SYM[temp1]);
- s.insert(i + 1, 1, SYM[temp + 1]);
- }
- }
- i++;
- }
- return s;
- }
- string getUserInput() {
- string s;
- short method = inputMethod();
- if (method == USE_CONSOLE)
- s = getUserInputFromConsole();
- else {
- string path = getUserInputPath();
- s = getUserInputFromFile(path);
- }
- return s;
- }
- void resultPrint(int value, string s) {
- short method = outputMethod();
- if (method == 1)
- printInConsole(value, s);
- else {
- string path = getUserOutputPath();
- printInFile(path, value, s);
- }
- }
- void printTask() {
- cout << "Данная программа переводит введёное число в римскую систему счисления" << endl;
- }
- void start() {
- string s;
- set<int> a;
- int value;
- printTask();
- s = getUserInput();
- s = deleteNotSym(s);
- value = stoi(s);
- s = convertToRim(value);
- s = check4Same(s);
- s = fixNotValid(s);
- resultPrint(value, s);
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- start();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement