Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- const int MIN_VALUE = 1;
- const int MAX_VALUE = 2000;
- void outputOfTaskInfo() {
- std::cout << "Данная программа переводит число из десятичной системы счисления в римскую. \n"
- << "Диапазон для ввода переводимого числа: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
- }
- int getVerificationOfChoice() {
- int choice;
- bool isIncorrect;
- do {
- isIncorrect = false;
- std::cin >> choice;
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- }
- if (!isIncorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cout << "Проверьте корректность ввода данных! \n";
- isIncorrect = true;
- }
- if (isIncorrect || (choice != 0 && choice != 1))
- {
- isIncorrect = true;
- std::cout << "Для выбора введите 0 или 1! \n";
- }
- } while (isIncorrect);
- return choice;
- }
- std::string inputPathToFile() {
- std::string path;
- bool isIncorrect;
- std::cout << "Укажите путь к файлу: ";
- do
- {
- isIncorrect = false;
- std::cin >> path;
- std::ifstream file(path);
- if (!file.is_open())
- {
- std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- return path;
- }
- std::string readNumberFromConsole() {
- std::string strNumber;
- int number;
- bool isIncorrect;
- std::cout << "Введите переводимое число: ";
- do
- {
- isIncorrect = false;
- std::cin >> strNumber;
- if (std::cin.fail())
- {
- isIncorrect = true;
- std::cout << "Проверьте корректность ввода данных! \n";
- std::cin.clear();
- while (std::cin.get() != '\n');
- }
- try
- {
- number = atoi(strNumber.c_str());
- }
- catch (...)
- {
- isIncorrect = true;
- std::cout << "Ошибка при вводе числа! \n";
- }
- if (!isIncorrect && (number < MIN_VALUE || number > MAX_VALUE))
- {
- isIncorrect = true;
- std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
- }
- } while (isIncorrect);
- return strNumber;
- }
- std::string readNumberFromFile(const std::string path) {
- int number;
- std::string strNumber;
- bool isIncorrect = false;
- std::ifstream fin(path);
- std::cout << "Происходит чтение переводимого числа... \n";
- fin >> strNumber;
- try
- {
- number = atoi(strNumber.c_str());
- }
- catch (...)
- {
- isIncorrect = true;
- std::cout << "Ошибка при чтении данных! Введите число с консоли! \n";
- strNumber = readNumberFromConsole();
- }
- if (!isIncorrect && (number < MIN_VALUE || number > MAX_VALUE))
- {
- std::cout << "В файле введено некорректное число! Введите число с консоли! \n";
- strNumber = readNumberFromConsole();
- }
- fin.close();
- return strNumber;
- }
- std::string readNumber(const int choice, const std::string path) {
- std::string strNumber;
- if (choice == 0)
- strNumber = readNumberFromConsole();
- if (choice == 1)
- strNumber = readNumberFromFile(path);
- return strNumber;
- }
- void outputNumber(const int choice, std::string path, const std::string strNumber) {
- std::ofstream fout(path);
- bool isIncorrect;
- if (choice == 0)
- std::cout << "Введенное число: " << strNumber << ". \n";
- if (choice == 1)
- {
- std::cout << "Вывод введенного числа в файл... \n";
- do
- {
- isIncorrect = false;
- try
- {
- fout << "Введенное число: " << strNumber << ". \n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- fout.close();
- } while (isIncorrect);
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- std::string convertNumber(const std::string strNumber) {
- const int decimalSystem[14] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 2000 };
- const std::string romanSystem[14] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M", "Z"};
- std::string romanNumber = "";
- int i = sizeof(decimalSystem) / sizeof(decimalSystem[0]) - 1;
- int number = atoi(strNumber.c_str());
- while (number > 0)
- {
- while (decimalSystem[i] > number)
- i--;
- romanNumber += romanSystem[i];
- number -= decimalSystem[i];
- }
- return romanNumber;
- }
- void outputRomanNumber(const int choice, std::string path, const std::string romanNumber) {
- std::ofstream fout;
- bool isIncorrect;
- if (choice == 0)
- std::cout << "Введенное число в римской системе будет равно " << romanNumber << ". \n";
- if (choice == 1)
- {
- std::cout << "Вывод переведенного числа в файл... \n";
- fout.open(path, std::ios::app);
- do
- {
- isIncorrect = false;
- try
- {
- fout << "Введенное число в римской системе будет равно: " << romanNumber << ". \n";
- }
- catch (...)
- {
- std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
- isIncorrect = true;
- path = inputPathToFile();
- }
- } while (isIncorrect);
- fout.close();
- std::cout << "Данные успешно записаны в файл! \n";
- }
- }
- void processUserInput(int& choiceForInput, std::string& strNumber, std::string& pathToIn) {
- std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
- choiceForInput = getVerificationOfChoice();
- if (choiceForInput == 1)
- pathToIn = inputPathToFile();
- strNumber = readNumber(choiceForInput, pathToIn);
- }
- void processUserOutput(int& choiceForOutput, std::string& pathToOut, std::string& strNumber, std::string& romanNumber) {
- std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
- choiceForOutput = getVerificationOfChoice();
- if (choiceForOutput == 1)
- pathToOut = inputPathToFile();
- outputNumber(choiceForOutput, pathToOut, strNumber);
- outputRomanNumber(choiceForOutput, pathToOut, romanNumber);
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- int choiceForInput, choiceForOutput;
- std::string pathToIn, pathToOut, strNumber, romanNumber;
- outputOfTaskInfo();
- processUserInput(choiceForInput, strNumber, pathToIn);
- romanNumber = convertNumber(strNumber);
- processUserOutput(choiceForOutput, pathToOut, strNumber, romanNumber);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement