Advertisement
THOMAS_SHELBY_18

Lab3_2(C++)

Nov 19th, 2023 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.09 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <set>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. void printCondition()
  8. {
  9.     cout << "Данная программа напечатает множество всех встречающихся в строке знаков арифметических операций и цифр" << endl;
  10. }
  11. int readNum(int min, int max)
  12. {
  13.     bool isIncorrect;
  14.     int num;
  15.  
  16.     do
  17.     {
  18.         isIncorrect = true;
  19.         cin >> num;
  20.         if (cin.fail() || (cin.get() != '\n'))
  21.         {
  22.             cout << "Некорректный ввод! Введите значение еще раз:" << endl;
  23.             cin.clear();
  24.             while (cin.get() != '\n');
  25.         }
  26.         else
  27.         {
  28.             if (num < min || num > max)
  29.             {
  30.                 cout << "Недопустимое значение! Введите значение еще раз:" << endl;
  31.             }
  32.             else
  33.             {
  34.                 isIncorrect = false;
  35.             }
  36.         }
  37.     }
  38.     while (isIncorrect);
  39.  
  40.     return num;
  41. }
  42. int getLastNotSpaceIndex(string text)
  43. {
  44.     int i;
  45.     char c;
  46.     i = text.length() - 1;
  47.     do
  48.     {
  49.         i--;
  50.         c = text[i];
  51.     }
  52.     while((c == 32) && (i != 0));
  53.  
  54.     return i;
  55. }
  56. string inputStrFromConsole()
  57. {
  58.     string text;
  59.     do
  60.     {
  61.         cout << "Введите текст:" << endl;
  62.         getline(cin, text);
  63.     }
  64.     while ((getLastNotSpaceIndex(text) == 0) || (text.empty()));
  65.  
  66.     return text;
  67. }
  68. string readFile(string path)
  69. {
  70.     ifstream fin;
  71.     string text, bufText;
  72.  
  73.     fin.open(path);
  74.     do
  75.     {
  76.         getline(fin, bufText);
  77.         text += bufText;
  78.     }
  79.     while (!fin.eof());
  80.     fin.close();
  81.  
  82.     return text;
  83. }
  84. bool checkFile(string path)
  85. {
  86.     ifstream fin;
  87.     bool isFileCorrect;
  88.     string checkText, bufText;
  89.  
  90.     isFileCorrect = true;
  91.  
  92.     fin.open(path);
  93.     if (!fin.is_open())
  94.     {
  95.         isFileCorrect = false;
  96.         cout << "Файл не найден!\nВнесите изменения в файл и повторите попытку!" << endl;
  97.     }
  98.     else
  99.     {
  100.         do
  101.         {
  102.             getline(fin, bufText);
  103.             checkText += bufText;
  104.         }
  105.         while (!fin.eof());
  106.  
  107.         if ((getLastNotSpaceIndex(checkText) == 0) || (checkText.empty()))
  108.         {
  109.             isFileCorrect = false;
  110.             cout << "Файл пустой!\nВнесите изменения в файл и повторите попытку!" << endl;
  111.         }
  112.         fin.close();
  113.     }
  114.  
  115.     return isFileCorrect;
  116. }
  117. string inputStrFromFile()
  118. {
  119.     string pathFile, text;
  120.     bool isInputFromFileSuccessfully;
  121.  
  122.     cout << "Данные в файле должны содержать текст" << endl;
  123.     do
  124.     {
  125.         cout << "Введите путь к файлу и его имя с его расширением:";
  126.         cin >> pathFile;
  127.         isInputFromFileSuccessfully = checkFile(pathFile);
  128.     } while(!isInputFromFileSuccessfully);
  129.     text = readFile(pathFile);
  130.  
  131.     return text;
  132. }
  133. string inputStr()
  134. {
  135.     int choice;
  136.     string text;
  137.  
  138.     cout << "Выберите вариант ввода:" << endl << "1. Ввод из консоли" << endl << "2. Ввод из файла" << endl << "Использовать вариант:";
  139.     choice = readNum(1, 2);
  140.  
  141.     if (choice == 1)
  142.     {
  143.         text = inputStrFromConsole();
  144.     }
  145.     else
  146.     {
  147.         text = inputStrFromFile();
  148.     }
  149.  
  150.     return text;
  151. }
  152. set<char> findSymbols(string str)
  153. {
  154.     int i;
  155.     set<char> searchCharacters{'0', '1', '2', '3', '4', '5', '6',
  156.                                '7', '8', '9', '+', '-', '=', '*', '/' };
  157.     set<char> answerSet{};
  158.     for (i = 0; i < str.length(); i++)
  159.     {
  160.         if (searchCharacters.count(str[i]))
  161.         {
  162.             answerSet.insert(str[i]);
  163.         }
  164.     }
  165.     return answerSet;
  166. }
  167.  
  168. void outputAnswerToConsole(set<char> &answer)
  169. {
  170.     if (!answer.empty())
  171.     {
  172.         for (auto it = answer.begin(); it != answer.end(); it++)
  173.         {
  174.             cout << *it << " ";
  175.         }
  176.     }
  177.     else
  178.     {
  179.         cout << "В строке нет нужных символов\n";
  180.     }
  181. }
  182. void outputAnswerToFile(set<char> &answer)
  183. {
  184.     ofstream fout;
  185.     string path;
  186.     bool isFileIncorrect;
  187.  
  188.     cout << "Для вывода введите путь к файлу и его имя c расширением." << endl;
  189.     cout << "Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)" << endl;
  190.     do
  191.     {
  192.         cout << "Введите путь:";
  193.         cin >> path;
  194.         fout.open(path);
  195.         isFileIncorrect = false;
  196.  
  197.         if (!answer.empty())
  198.         {
  199.             for (auto it = answer.begin(); it != answer.end(); it++)
  200.             {
  201.                 fout << *it << " ";
  202.             }
  203.         }
  204.         else
  205.         {
  206.             fout << "В строке нет нужных символов\n";
  207.         }
  208.  
  209.         if (fout.fail())
  210.         {
  211.             cout << "Не удалось вывести в файл! ";
  212.             isFileIncorrect = true;
  213.             fout.clear();
  214.         }
  215.     }
  216.     while (isFileIncorrect);
  217.  
  218.     fout.close();
  219.     cout << "Вывод данных... успешно!";
  220. }
  221. void outputAnswer(set<char> &answer)
  222. {
  223.     int  choice;
  224.  
  225.     cout << "Выберите вариант вывода:" << endl << "1. Вывод в консоль" << endl << "2. Вывод в файл" << endl << "Использовать вариант:";
  226.     choice = readNum(1, 2);
  227.  
  228.     if (choice == 1)
  229.     {
  230.         outputAnswerToConsole(answer);
  231.     }
  232.     else
  233.     {
  234.         outputAnswerToFile(answer);
  235.     }
  236. }
  237.  
  238. int main() {
  239.     string str;
  240.     set<char> answerSet;
  241.  
  242.     SetConsoleOutputCP(CP_UTF8);
  243.  
  244.     printCondition();
  245.     str = inputStr();
  246.     answerSet = findSymbols(str);
  247.     outputAnswer(answerSet);
  248.     return 0;
  249. }
  250.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement