Advertisement
Ewerlost

Lab3_1C++

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