Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- #include <fstream>
- #include <string>
- using namespace std;
- const int
- MIN_NUMBER = 1,
- MAX_NUMBER = 10;
- void printCondition();
- int readNum(int min, int max);
- bool checkFile(string path);
- void readFile(string path, string& string1, string& string2, int& k);
- void inputStrFromFile(string& string1, string& string2, int& k);
- void inputStrFromConsole(string& string1, string& string2, int& k);
- void inputStr(string& string1, string& string2, int& k);
- int takeLastSymbIndex(string text);
- int takeNextSpaceIndex(string text, int spaceIndex);
- void outputAnswerToConsole(int answer);
- void outputAnswerToFile(int answer);
- void outputAnswer(int ans);
- void printCondition()
- {
- cout << "Данная программа определит номер позиции k-го вхождения строки st2 в строку st1. Если такого нет, возвратит -1.\n";
- }
- void inputStr(string& string1, string& string2, int& k)
- {
- int choice;
- string text;
- cout << "Выберите вариант ввода:\n" << "1. Ввод из консоли\n" << "2. Ввод из файла\n" << "Использовать вариант:";
- choice = readNum(1, 2);
- if (choice == 1)
- {
- inputStrFromConsole(string1, string2, k);
- }
- else
- {
- inputStrFromFile(string1, string2, k);
- }
- }
- void inputStrFromConsole(string& str1, string& str2, int& k)
- {
- cout << "Введите число K\n";
- k = readNum(MIN_NUMBER, MAX_NUMBER);
- do
- {
- cout << "Введите строку 1:\n";
- getline(cin, str1);
- } while (str1.empty());
- do
- {
- cout << "Введите строку 2:\n";
- getline(cin, str2);
- } while (str2.empty());
- }
- void inputStrFromFile(string& str1, string& str2, int& k)
- {
- string pathFile;
- bool isInputFromFileSuccessfully;
- cout << "Данные в файле должны содержать число K, строку 1 и строку 2, расположенные в 3 разных строках файла\n";
- do
- {
- cout << "Введите путь к файлу и его имя с его расширением:";
- cin >> pathFile;
- isInputFromFileSuccessfully = checkFile(pathFile);
- } while (!isInputFromFileSuccessfully);
- readFile(pathFile, str1, str2, k);
- }
- bool checkFile(string path)
- {
- ifstream fin;
- bool isFileCorrect;
- string checkText, bufText;
- int k;
- isFileCorrect = true;
- fin.open(path);
- if (!fin.is_open())
- {
- isFileCorrect = false;
- cout << "Файл не найден!\nВнесите изменения в файл и повторите попытку!" << endl;
- }
- else
- {
- fin >> k;
- if (fin.fail())
- {
- fin.clear();
- isFileCorrect = false;
- cout << "K в неправильном формате\n";
- while (fin.get() != '\n');
- }
- if (isFileCorrect && ((MIN_NUMBER > k) || (MAX_NUMBER < k)))
- {
- isFileCorrect = false;
- cout << "В файле число K выходит за возможные пределы.\n";
- }
- if (isFileCorrect)
- do
- {
- getline(fin, bufText);
- checkText += bufText;
- } while (!fin.eof());
- if ((takeLastSymbIndex(checkText) == 0) || (checkText.empty()))
- {
- isFileCorrect = false;
- cout << "Файл пустой!\nВнесите изменения в файл и повторите попытку!\n";
- }
- fin.close();
- }
- return isFileCorrect;
- }
- void readFile(string path, string& st1, string& st2, int& k)
- {
- ifstream fin;
- fin.open(path);
- fin >> k;
- fin >> st1;
- do
- {
- getline(fin, st2);
- } while (!fin.eof());
- fin.close();
- }
- int readNum(int min, int max)
- {
- bool isIncorrect;
- int num;
- do
- {
- isIncorrect = true;
- cin >> num;
- if (cin.fail() || (cin.get() != '\n'))
- {
- cout << "Некорректный ввод! Введите значение еще раз:" << endl;
- cin.clear();
- while (cin.get() != '\n');
- }
- else
- {
- if (num < min || num > max)
- {
- cout << "Недопустимое значение! Введите значение еще раз:" << endl;
- }
- else
- {
- isIncorrect = false;
- }
- }
- } while (isIncorrect);
- return num;
- }
- int takeLastSymbIndex(string text)
- {
- int i;
- char c;
- i = text.length() - 1;
- do
- {
- i--;
- c = text[i];
- } while ((c == 32) && (i != 0));
- return i;
- }
- int takeNextSpaceIndex(string text, int spaceIndex)
- {
- int i;
- char c;
- i = spaceIndex;
- do
- {
- i++;
- c = text[i];
- } while (c != 32);
- return i;
- }
- int findPosition(string st1, string st2, int k)
- {
- bool isSubstringCorrect;
- int i, j, position, quantity;
- quantity = 0;
- position = 0;
- i = 0;
- while (i + st2.length() <= st1.length() && quantity < k)
- {
- isSubstringCorrect = true;
- for (j = 0; j < st2.length(); j++)
- if (st1[i + j] != st2[j])
- isSubstringCorrect = false;
- if (isSubstringCorrect)
- {
- position = i + 1;
- quantity++;
- }
- i++;
- }
- if (quantity < k)
- position = -1;
- return position;
- }
- void outputAnswer(int ans)
- {
- int choice;
- cout << "Выберите вариант вывода:\n" << "1. Вывод в консоль\n" << "2. Вывод в файл\n" << "Использовать вариант:";
- choice = readNum(1, 2);
- if (choice == 1)
- {
- outputAnswerToConsole(ans);
- }
- else
- {
- outputAnswerToFile(ans);
- }
- }
- void outputAnswerToConsole(int answer)
- {
- cout << answer;
- }
- void outputAnswerToFile(int answer)
- {
- ofstream fout;
- string path;
- bool isFileIncorrect;
- cout << "Для вывода введите путь к файлу и его имя c расширением." << endl;
- cout << "Если файл отсутствует то он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)" << endl;
- do
- {
- cout << "Введите путь:";
- cin >> path;
- fout.open(path);
- isFileIncorrect = false;
- fout << answer;
- if (fout.fail())
- {
- cout << "Не удалось вывести в файл! ";
- isFileIncorrect = true;
- fout.clear();
- }
- } while (isFileIncorrect);
- fout.close();
- cout << "Вывод данных... успешно!";
- }
- int main()
- {
- string st1, st2;
- int k, answer;
- setlocale(LC_ALL, "Russian");
- printCondition();
- inputStr(st1, st2, k);
- answer = findPosition(st1, st2, k);
- outputAnswer(answer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement