Advertisement
anticlown

Laba.3.1(C++)

Nov 6th, 2022 (edited)
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. const int MIN_VALUE = 1;
  6. const int MAX_VALUE = 2000;
  7.  
  8. void outputOfTaskInfo() {
  9.   std::cout << "Данная программа переводит число из десятичной системы счисления в римскую. \n"
  10.             << "Диапазон для ввода переводимого числа: " << MIN_VALUE << "..." << MAX_VALUE << ". \n";
  11. }
  12.  
  13. int getVerificationOfChoice() {
  14.   int choice;
  15.   bool isIncorrect;
  16.  
  17.   do {
  18.     isIncorrect = false;
  19.     std::cin >> choice;
  20.  
  21.     if (std::cin.fail())
  22.     {
  23.       std::cin.clear();
  24.       while (std::cin.get() != '\n');
  25.       isIncorrect = true;
  26.       std::cout << "Проверьте корректность ввода данных! \n";
  27.     }
  28.  
  29.     if (!isIncorrect && std::cin.get() != '\n')
  30.     {
  31.       std::cin.clear();
  32.       while (std::cin.get() != '\n');
  33.  
  34.       std::cout << "Проверьте корректность ввода данных! \n";
  35.       isIncorrect = true;
  36.     }
  37.  
  38.     if (isIncorrect || (choice != 0 && choice != 1))
  39.     {
  40.       isIncorrect = true;
  41.       std::cout << "Для выбора введите 0 или 1! \n";
  42.     }
  43.   } while (isIncorrect);
  44.  
  45.   return choice;
  46. }
  47.  
  48. std::string inputPathToFile() {
  49.   std::string path;
  50.   bool isIncorrect;
  51.  
  52.   std::cout << "Укажите путь к файлу: ";
  53.  
  54.   do
  55.   {
  56.     isIncorrect = false;
  57.     std::cin >> path;
  58.     std::ifstream file(path);
  59.  
  60.     if (!file.is_open())
  61.     {
  62.       std::cout << "По указанному пути файл не найден! Укажите правильный путь: ";
  63.       isIncorrect = true;
  64.     }
  65.   } while (isIncorrect);
  66.  
  67.   return path;
  68. }
  69.  
  70. std::string readNumberFromConsole() {
  71.   std::string strNumber;
  72.   int number;
  73.   bool isIncorrect;
  74.  
  75.   std::cout << "Введите переводимое число: ";
  76.  
  77.   do
  78.   {
  79.     isIncorrect = false;
  80.     std::cin >> strNumber;
  81.  
  82.     if (std::cin.fail())
  83.     {
  84.       isIncorrect = true;
  85.       std::cout << "Проверьте корректность ввода данных! \n";
  86.       std::cin.clear();
  87.       while (std::cin.get() != '\n');
  88.     }
  89.  
  90.     try
  91.     {
  92.       number = atoi(strNumber.c_str());
  93.     }
  94.     catch (...)
  95.     {
  96.       isIncorrect = true;
  97.       std::cout << "Ошибка при вводе числа! \n";
  98.     }
  99.  
  100.     if (!isIncorrect && (number < MIN_VALUE || number > MAX_VALUE))
  101.     {
  102.       isIncorrect = true;
  103.       std::cout << "Введите число от " << MIN_VALUE << " до " << MAX_VALUE << "! \n";
  104.     }
  105.  
  106.   } while (isIncorrect);
  107.  
  108.   return strNumber;
  109. }
  110.  
  111. std::string readNumberFromFile(const std::string path) {
  112.   int number;
  113.   std::string strNumber;
  114.   bool isIncorrect = false;
  115.   std::ifstream fin(path);
  116.  
  117.   std::cout << "Происходит чтение переводимого числа... \n";
  118.   fin >> strNumber;
  119.  
  120.   try
  121.   {
  122.     number = atoi(strNumber.c_str());
  123.   }
  124.   catch (...)
  125.   {
  126.     isIncorrect = true;
  127.     std::cout << "Ошибка при чтении данных! Введите число с консоли! \n";
  128.     strNumber = readNumberFromConsole();
  129.   }
  130.  
  131.   if (!isIncorrect && (number < MIN_VALUE || number > MAX_VALUE))
  132.   {
  133.     std::cout << "В файле введено некорректное число! Введите число с консоли! \n";
  134.     strNumber = readNumberFromConsole();
  135.   }
  136.  
  137.   fin.close();
  138.  
  139.   return strNumber;
  140. }
  141.  
  142. std::string readNumber(const int choice, const std::string path) {
  143.   std::string strNumber;
  144.  
  145.   if (choice == 0)
  146.     strNumber = readNumberFromConsole();
  147.   if (choice == 1)
  148.     strNumber = readNumberFromFile(path);
  149.  
  150.   return strNumber;
  151. }
  152.  
  153. void outputNumber(const int choice, std::string path, const std::string strNumber) {
  154.   std::ofstream fout(path);
  155.   bool isIncorrect;
  156.  
  157.   if (choice == 0)
  158.     std::cout << "Введенное число: " << strNumber << ". \n";
  159.  
  160.   if (choice == 1)
  161.   {
  162.     std::cout << "Вывод введенного числа в файл... \n";
  163.  
  164.     do
  165.     {
  166.       isIncorrect = false;
  167.  
  168.       try
  169.       {
  170.         fout << "Введенное число: " << strNumber << ". \n";
  171.       }
  172.       catch (...)
  173.       {
  174.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  175.         isIncorrect = true;
  176.         path = inputPathToFile();
  177.       }
  178.  
  179.       fout.close();
  180.     } while (isIncorrect);
  181.  
  182.     std::cout << "Данные успешно записаны в файл! \n";
  183.   }
  184. }
  185.  
  186. std::string convertNumber(const std::string strNumber) {
  187.   const int decimalSystem[14] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 2000 };
  188.   const std::string romanSystem[14] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M", "Z"};
  189.   std::string romanNumber = "";
  190.   int i = sizeof(decimalSystem) / sizeof(decimalSystem[0]) - 1;
  191.   int number = atoi(strNumber.c_str());
  192.  
  193.   while (number > 0)
  194.   {
  195.     while (decimalSystem[i] > number)
  196.       i--;
  197.  
  198.     romanNumber += romanSystem[i];
  199.     number -= decimalSystem[i];
  200.   }
  201.  
  202.   return romanNumber;
  203. }
  204.  
  205. void outputRomanNumber(const int choice, std::string path, const std::string romanNumber) {
  206.   std::ofstream fout;
  207.   bool isIncorrect;
  208.  
  209.   if (choice == 0)
  210.     std::cout << "Введенное число в римской системе будет равно " << romanNumber << ". \n";
  211.  
  212.   if (choice == 1)
  213.   {
  214.     std::cout << "Вывод переведенного числа в файл... \n";
  215.  
  216.     fout.open(path, std::ios::app);
  217.  
  218.     do
  219.     {
  220.       isIncorrect = false;
  221.  
  222.       try
  223.       {
  224.         fout << "Введенное число в римской системе будет равно: " << romanNumber << ". \n";
  225.       }
  226.       catch (...)
  227.       {
  228.         std::cout << "Ошибка! Измените параметры файла или укажите новую ссылку! \n";
  229.         isIncorrect = true;
  230.         path = inputPathToFile();
  231.       }
  232.     } while (isIncorrect);
  233.  
  234.     fout.close();
  235.     std::cout << "Данные успешно записаны в файл! \n";
  236.   }
  237. }
  238.  
  239. void processUserInput(int& choiceForInput, std::string& strNumber, std::string& pathToIn) {
  240.   std::cout << "Вы желаете ввести данные с консоли(0) или взять данные из файла(1)? \n";
  241.   choiceForInput = getVerificationOfChoice();
  242.   if (choiceForInput == 1)
  243.     pathToIn = inputPathToFile();
  244.  
  245.   strNumber = readNumber(choiceForInput, pathToIn);
  246. }
  247.  
  248. void processUserOutput(int& choiceForOutput, std::string& pathToOut, std::string& strNumber, std::string& romanNumber) {
  249.   std::cout << "Вы желаете получить результат в консоли(0) или в файле(1)? \n";
  250.   choiceForOutput = getVerificationOfChoice();
  251.   if (choiceForOutput == 1)
  252.     pathToOut = inputPathToFile();
  253.  
  254.   outputNumber(choiceForOutput, pathToOut, strNumber);
  255.   outputRomanNumber(choiceForOutput, pathToOut, romanNumber);
  256. }
  257.  
  258. int main() {
  259.   setlocale(LC_ALL, "Rus");
  260.   int choiceForInput, choiceForOutput;
  261.   std::string pathToIn, pathToOut, strNumber, romanNumber;
  262.  
  263.   outputOfTaskInfo();
  264.   processUserInput(choiceForInput, strNumber, pathToIn);
  265.  
  266.   romanNumber = convertNumber(strNumber);
  267.  
  268.   processUserOutput(choiceForOutput, pathToOut, strNumber, romanNumber);
  269.  
  270.   return 0;
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement