Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <string>
- /* task type start */
- enum TcharType { ctUnknown, ctDiskName, ctColon, ctBackslash, ctCorrectSymbol, ctEndOfString };
- typedef int Tstate;
- const Tstate transitions[5][6] = {
- {0, 0, 0, 0, 0, 0}, // Состояние «Ошибка»
- {0, 2, 0, 0, 0, 0}, // Состояние «Прочитано: Ничего. Ожидается: Имя диска»
- {0, 0, 3, 0, 0, 0}, // Состояние «Прочитано: Имя диска. Ожидается: Двоеточие»
- {0, 0, 0, 4, 3, 0}, // Состояние «Прочитано: Двоеточие/Корректный символ. Ожидается: Обратный слэш»
- {0, 0, 0, 4, 4, 0} // Состояние «Прочитано: Обратный слэш/Корректный символ. Ожидается: Корректный символ или конец строки»
- };
- const bool isFinalState[5] = { false, false, false, false, true };
- /* task type end */
- /* task type methods start */
- TcharType getCharType(char charToCheck, int counter) {
- if (counter == 0 && charToCheck >= 'A' && charToCheck <= 'Z') return ctDiskName;
- //else
- // switch (charToCheck)
- // {
- // case ':': return ctColon;
- // case '\\': return ctBackslash;
- // case '!'...')':
- // case '+'...'.':
- // case '0'...'9':
- // case '?'...'[': //включает A-Z
- // case ']'...'{': //включает a-z
- // case '}'...'~': return ctColon; //включает a-z
- // default:
- // std::cout << "Символ " << charToCheck << " не является корректным!\n";
- // return ctUnknown;
- // }
- if (charToCheck == ':') return ctColon;
- if (charToCheck == '\\') return ctBackslash;
- if ((charToCheck >= 'a' && charToCheck <= 'z') || charToCheck == '-' || charToCheck == '+' || charToCheck == '@' || charToCheck == '#' || charToCheck == '$' || charToCheck == '%' || charToCheck == '^' || charToCheck == '_' || charToCheck == '(' || charToCheck == ')' || charToCheck == '{' || charToCheck == '}' || charToCheck == '"' || charToCheck == '.' || charToCheck == ',') return ctCorrectSymbol;
- return ctUnknown;
- }
- bool checkString(const std::string& inputString) {
- Tstate state = 1;
- for (int i = 0; i < inputString.length(); ++i) {
- state = transitions[state][getCharType(inputString[i], i)];
- }
- return isFinalState[state];
- }
- void findSubstring(const std::string& inputString) {
- Tstate state = 1;
- Tstate previousState = 1;
- int counter = 0;
- int j = -1;
- for (int i = 0; i < inputString.length(); ++i) {
- previousState = state;
- ++j;
- state = transitions[state][getCharType(inputString[i], j)];
- if (state == 0 && previousState == 4) {
- ++counter;
- state = 1;
- j = -1;
- continue;
- }
- else
- if (state == 0)
- {
- state = 1;
- j = -1;
- continue;
- }
- }
- if (previousState == 4)
- ++counter;
- std::cout << "Найдено подстрок: " << counter << std::endl;
- }
- /* task type methods end */
- /* print methods start */
- void printTaskInfo() {
- std::cout << "\tДанная программа проверяет введенную строку на соответствие классическую абсолютному пути к файлу в Windows.\n";
- std::cout << "\t\tДля взаимодействия с программой используйте пукнты меню.\n";
- }
- void printMenuOptions() {
- std::cout << "\n\t\t\tМеню\n0. Выйти из программы\n1. Проверить строку на соответствие шаблону\n2. Найти в исходной строке все подстроки, удовлетворяющие шаблону\n";
- }
- /* print methods end */
- int main() {
- setlocale(LC_ALL, "Rus");
- std::string Path;
- bool IsCorrect;
- printTaskInfo();
- printMenuOptions();
- int choice = 1;
- while (choice) {
- std::cout << "\nВыберите один из пунктов меню: ";
- std::cin >> choice;
- switch (choice) {
- case 0:
- std::cout << "\n\t\tРабота с программой успешно завершена.\n";
- break;
- case 1:
- std::cout << "\n\t\tВы выбрали: проверить соответствие строки шаблону пути.\n\n";
- std::cout << "Введите путь к файлу(формат пути: D:\\<каталог>\\<названиие файла с расширением или без>):\n";
- std::cin >> Path;
- IsCorrect = checkString(Path);
- std::cout << ((IsCorrect == true) ? "Введенный путь - корректный" : "Введенный путь - некорректный") << std::endl;
- break;
- case 2:
- std::cout << "\n\t\tВы выбрали: найти все подстроки в произвольной строке, соответствующие шаблону.\n\n";
- std::cout << "\nВведите строку для анализа: ";
- std::getline(std::cin, Path);
- std::getline(std::cin, Path);
- findSubstring(Path);
- break;
- default:
- std::cout << "Неверный ввод!\n";
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement