Advertisement
Vernon_Roche

Задание 1 С++ (Лабораторная работа 3)

Nov 4th, 2023 (edited)
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <stdlib.h>
  5.  
  6. using namespace std;
  7.  
  8. string convertToRoman(int);
  9. bool checkText(const string&);
  10. bool checkNum(char);
  11. void searchNumbers(const string&, int*&);
  12. int chooseWay(const int);
  13. void inputText(string&, const int);
  14. string inputFileName(const int);
  15. void inputFromFile(string&, string&);
  16. void inputFromConsole(string&);
  17. void outputNumbers(const int*, const int);
  18. void outputInFile(string&, const int*);
  19. void outputInConsole(const int*);
  20. bool checkColonInFileName(string&);
  21.  
  22. const int INPUT = 1,
  23.           OUTPUT = 2,
  24.           NULL_CODE = 48,
  25.           NINE_CODE = 57;
  26.  
  27. int main()
  28. {
  29.     system("chcp 1251 > nul");
  30.     string text;
  31.     int choice, *numbers;
  32.     cout << "Программа выводит содержащиеся в тексте (текст должен содержать от 1 до 4 цифровых символов, отображающих целые числа от 1 до 2000) числа в десятичной и римской системах счисления.\n";
  33.     choice = chooseWay(INPUT);
  34.     inputText(text, choice);
  35.     searchNumbers(text, numbers);
  36.     choice = chooseWay(OUTPUT);
  37.     outputNumbers(numbers, choice);
  38.     return 0;
  39. }
  40.  
  41. string convertToRoman(int number)
  42. {
  43.     const string romanNumbers[10][4] {{"", "", "", ""},
  44.                                       {"M", "C,", "X", "I"},
  45.                                       {"MM", "CC", "XX", "II"},
  46.                                       {"", "CCC", "XXX", "III"},
  47.                                       {"", "CD", "XL", "IV"},
  48.                                       {"", "D", "L", "V"},
  49.                                       {"", "DC", "LX", "VI"},
  50.                                       {"", "DCC", "LXX", "VII"},
  51.                                       {"", "DCCC", "LXXX", "VIII"},
  52.                                       {"", "CM", "XC", "IX"}};
  53.     int counter;
  54.     string convertedNum;
  55.     convertedNum = "";
  56.     counter = 3;
  57.     while (number != 0) {
  58.         convertedNum = romanNumbers[number % 10][counter] + convertedNum;
  59.         number = number / 10;
  60.         counter--;
  61.     }
  62.     return convertedNum;
  63. }
  64.  
  65. bool checkText(const string& text)
  66. {
  67.     string foundedNum;
  68.     bool isCorrect;
  69.     int quantityNumbers, position;
  70.     quantityNumbers = 0;
  71.     position = 0;
  72.     isCorrect = true;
  73.     while (isCorrect && position < text.length()) {
  74.         if (checkNum(text[position])) {
  75.             foundedNum = foundedNum + text[position];
  76.             quantityNumbers++;
  77.             position++;
  78.             while (quantityNumbers <= 4 && position < text.length() && checkNum(text[position])) {
  79.                 foundedNum = foundedNum + text[position];
  80.                 position++;
  81.                 quantityNumbers++;
  82.             }
  83.             if ((quantityNumbers > 4) || (stoi(foundedNum) == 0) || stoi(foundedNum) > 2000)
  84.                 isCorrect = false;
  85.             foundedNum = "";
  86.         }
  87.         position++;
  88.     }
  89.     if (quantityNumbers == 0)
  90.         isCorrect = false;
  91.     return isCorrect;
  92. }
  93.  
  94. bool checkNum(char verifiableNum)
  95. {
  96.     bool isNum;
  97.     int i;
  98.     isNum = false;
  99.     i = NULL_CODE;
  100.     while (!isNum && (i <= NINE_CODE)) {
  101.         isNum = verifiableNum == i;
  102.         i++;
  103.     }
  104.     return isNum;
  105. }
  106.  
  107. void searchNumbers(const string& text, int *& arrayNumbers)
  108. {
  109.     string foundedNum;
  110.     int position, length;
  111.     position = 0;
  112.     length = 0;
  113.     arrayNumbers = new int[4] {0, 0, 0, 0};
  114.     while (position < text.length()) {
  115.         if (checkNum(text[position])) {
  116.             foundedNum = foundedNum + text[position];
  117.             length++;
  118.             position++;
  119.             while (position < text.length() && checkNum(text[position])) {
  120.                 foundedNum = foundedNum + text[position];
  121.                 position++;
  122.             }
  123.             arrayNumbers[length - 1] = stoi(foundedNum);
  124.             foundedNum = "";
  125.         }
  126.         position++;
  127.     }
  128. }
  129.  
  130. int chooseWay(const int IorOput)
  131. {
  132.     int choice;
  133.     bool isNotCorrect;
  134.     switch (IorOput) {
  135.     case INPUT:
  136.         cout << "Выберите вариант ввода:\n";
  137.         cout << "1.Данные вводятся из текстового файла.\n";
  138.         cout << "2.Данные вводятся через консоль.\n";
  139.         break;
  140.     default:
  141.         cout << "Выберите вариант вывода:\n";
  142.         cout << "1.Данные выводятся в текстовый файл.\n";
  143.         cout << "2.Данные выводятся в консоль.\n";
  144.     }
  145.     do {
  146.         cin >> choice;
  147.         if (cin.fail() || cin.get() != '\n') {
  148.             isNotCorrect = true;
  149.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  150.             cin.clear();
  151.             while (cin.get() != '\n');
  152.         }
  153.         else if ((choice < 1) || (choice > 2)) {
  154.             cout << "Ошибка ввода. Выберите вариант 1 или 2." << '\n';
  155.             isNotCorrect = true;
  156.         }
  157.         else
  158.             isNotCorrect = false;
  159.     } while (isNotCorrect);
  160.     return choice;
  161. }
  162.  
  163. void inputText(string& text, const int choice)
  164. {
  165.     text = "";
  166.     switch (choice) {
  167.         case 1: {
  168.             string fileName;
  169.             bool isCorrect;
  170.             do {
  171.                 fileName = inputFileName(INPUT);
  172.                 inputFromFile(text, fileName);
  173.                 isCorrect = checkText(text);
  174.                 if (!isCorrect)
  175.                     cout << "Введенный текст не соответствует условию! Повторите ввод имени файла.\n";
  176.             } while (!isCorrect);
  177.             break;
  178.         }
  179.         default:
  180.             inputFromConsole(text);
  181.     }
  182. }
  183.  
  184. string inputFileName(const int inOrOut)
  185. {
  186.     string fileName;
  187.     switch (inOrOut) {
  188.         case INPUT: {
  189.             cout << "Введите имя файла, из которого будут вводиться данные:\n";
  190.             ifstream in;
  191.             do {
  192.                 getline(cin, fileName);
  193.                 if (fileName.ends_with(".txt")) {
  194.                     in.open(fileName);
  195.                     if (in.is_open()) {
  196.                         in.close();
  197.                         return fileName;
  198.                     }
  199.                     else
  200.                         cout << "Невозможно открыть файл с таким именем! Повторите ввод имени файла:\n";
  201.                 }
  202.                 else
  203.                     cout << "Файл должен иметь расширение .txt! Повторите ввод имени файла:\n";
  204.             } while (true);
  205.             break;
  206.         }
  207.         default: {
  208.             cout << "Введите имя файла, в который будут выводиться полученные данные (если файл вводится без расширения, то ему автоматически будет добавлено расширение .txt):\n";
  209.             ofstream out;
  210.             do {
  211.                 getline(cin, fileName);
  212.                 if (fileName.find(".") == string::npos)
  213.                     fileName = fileName + ".txt";
  214.                 out.open(fileName);
  215.                 if (out.is_open()) {
  216.                     out.close();
  217.                     return fileName;
  218.                 }
  219.                 else
  220.                     cout << "Невозможно открыть или создать файл с таким именем! Повторите ввод имени файла:\n";
  221.             } while (true);
  222.         }
  223.     }
  224. }
  225.  
  226. void inputFromFile(string& text, string& fileName)
  227. {
  228.     ifstream in;
  229.     string fileString;
  230.     text = "";
  231.     in.open(fileName);
  232.     while (!in.eof()) {
  233.         getline(in, fileString);
  234.         text = text + fileString;
  235.     }
  236. }
  237.  
  238. void inputFromConsole(string& text)
  239. {
  240.     bool isCorrect;
  241.     do {
  242.         cout << "Введите строку для обработки:\n";
  243.         getline(cin, text);
  244.         isCorrect = checkText(text);
  245.         if (!isCorrect)
  246.             cout << "Введенная строка не соответствует условию! Повторите ввод.\n";
  247.     } while (!isCorrect);
  248. }
  249.  
  250. void outputNumbers(const int* numbers, const int choice)
  251. {
  252.     switch (choice) {
  253.     case 1: {
  254.         string fileName;
  255.         fileName = inputFileName(OUTPUT);
  256.         outputInFile(fileName, numbers);
  257.         cout << "Искомые данные выведены в файл " << fileName;
  258.         break;
  259.     }
  260.     default:
  261.         outputInConsole(numbers);
  262.     }
  263. }
  264.  
  265. void outputInFile(string& fileName, const int* numbers)
  266. {
  267.     int i;
  268.     ofstream out;
  269.     out.open(fileName);
  270.     i = 0;
  271.     while ((numbers[i] != 0) && (i < 4)) {
  272.         out << numbers[i] << ' ';
  273.         i++;
  274.     }
  275.     out << '\n';
  276.     i = 0;
  277.     while ((numbers[i] != 0) && (i < 4)) {
  278.         out << convertToRoman(numbers[i]) << ' ';
  279.         i++;
  280.     }
  281.     out.close();
  282. }
  283.  
  284. void outputInConsole(const int* numbers)
  285. {
  286.     int i;
  287.     cout << "Искомые числа:\n";
  288.     i = 0;
  289.     while ((numbers[i] != 0) && (i < 4)) {
  290.         cout << numbers[i] << ' ';
  291.         i++;
  292.     }
  293.     cout << '\n';
  294.     cout << "Их представление в римской системе счисления:\n";
  295.     i = 0;
  296.     while ((numbers[i] != 0) && (i < 4)) {
  297.         cout << convertToRoman(numbers[i]) << ' ';
  298.         i++;
  299.     }
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement