Advertisement
anticlown

Lab #1(var 4, string check)

Nov 27th, 2023 (edited)
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.80 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <string>
  5.  
  6. /*      task type start     */
  7. enum TcharType { ctUnknown, ctDiskName, ctColon, ctBackslash, ctCorrectSymbol, ctEndOfString };
  8. typedef int Tstate;
  9.  
  10. const Tstate transitions[5][6] = {
  11.     {0, 0, 0, 0, 0, 0},  // Состояние «Ошибка»
  12.     {0, 2, 0, 0, 0, 0},  // Состояние «Прочитано: Ничего. Ожидается: Имя диска»
  13.     {0, 0, 3, 0, 0, 0},  // Состояние «Прочитано: Имя диска. Ожидается: Двоеточие»
  14.     {0, 0, 0, 4, 3, 0},  // Состояние «Прочитано: Двоеточие/Корректный символ. Ожидается: Обратный слэш»
  15.     {0, 0, 0, 4, 4, 0}   // Состояние «Прочитано: Обратный слэш/Корректный символ. Ожидается: Корректный символ или конец строки»
  16. };
  17.  
  18. const bool isFinalState[5] = { false, false, false, false, true };
  19. /*      task type end     */
  20.  
  21. /*      task type methods start     */
  22. TcharType getCharType(char charToCheck, int counter) {
  23.     if (counter == 0 && charToCheck >= 'A' && charToCheck <= 'Z') return ctDiskName;
  24.     //else
  25.     //    switch (charToCheck)
  26.     //    {
  27.     //        case ':': return ctColon;
  28.     //        case '\\': return ctBackslash;
  29.     //        case '!'...')':
  30.     //        case '+'...'.':
  31.     //        case '0'...'9':
  32.     //        case '?'...'[': //включает A-Z
  33.     //        case ']'...'{': //включает a-z
  34.     //        case '}'...'~': return ctColon; //включает a-z
  35.     //        default:
  36.     //            std::cout << "Символ " << charToCheck << " не является корректным!\n";
  37.     //            return ctUnknown;
  38.     //    }
  39.     if (charToCheck == ':') return ctColon;
  40.     if (charToCheck == '\\') return ctBackslash;
  41.     if ((charToCheck >= 'a' && charToCheck <= 'z') || charToCheck == '-' || charToCheck == '+' || charToCheck == '@' || charToCheck == '#' || charToCheck == '$' || charToCheck == '%' || charToCheck == '^' || charToCheck == '_' || charToCheck == '(' || charToCheck == ')' || charToCheck == '{' || charToCheck == '}' || charToCheck == '"' || charToCheck == '.' || charToCheck == ',') return ctCorrectSymbol;
  42.  
  43.     return ctUnknown;
  44. }
  45.  
  46. bool checkString(const std::string& inputString) {
  47.     Tstate state = 1;
  48.     for (int i = 0; i < inputString.length(); ++i) {
  49.         state = transitions[state][getCharType(inputString[i], i)];
  50.     }
  51.     return isFinalState[state];
  52. }
  53.  
  54. void findSubstring(const std::string& inputString) {
  55.     Tstate state = 1;
  56.     Tstate previousState = 1;
  57.     int counter = 0;
  58.     int j = -1;
  59.  
  60.     for (int i = 0; i < inputString.length(); ++i) {
  61.         previousState = state;
  62.         ++j;
  63.         state = transitions[state][getCharType(inputString[i], j)];
  64.         if (state == 0 && previousState == 4) {
  65.             ++counter;
  66.             state = 1;
  67.             j = -1;
  68.             continue;
  69.         }
  70.         else
  71.             if (state == 0)
  72.             {
  73.                 state = 1;
  74.                 j = -1;
  75.                 continue;
  76.             }
  77.     }
  78.     if (previousState == 4)
  79.         ++counter;
  80.     std::cout << "Найдено подстрок: " << counter << std::endl;
  81. }
  82. /*      task type methods end     */
  83.  
  84. /*      print methods start     */
  85. void printTaskInfo() {
  86.     std::cout << "\tДанная программа проверяет введенную строку на соответствие классическую абсолютному пути к файлу в Windows.\n";
  87.     std::cout << "\t\tДля взаимодействия с программой используйте пукнты меню.\n";
  88. }
  89.  
  90. void printMenuOptions() {
  91.     std::cout << "\n\t\t\tМеню\n0. Выйти из программы\n1. Проверить строку на соответствие шаблону\n2. Найти в исходной строке все подстроки, удовлетворяющие шаблону\n";
  92. }
  93. /*      print methods end     */
  94.  
  95. int main() {
  96.     setlocale(LC_ALL, "Rus");
  97.     std::string Path;
  98.     bool IsCorrect;
  99.  
  100.     printTaskInfo();
  101.     printMenuOptions();
  102.  
  103.     int choice = 1;
  104.     while (choice) {
  105.         std::cout << "\nВыберите один из пунктов меню: ";
  106.         std::cin >> choice;
  107.         switch (choice) {
  108.             case 0:
  109.                 std::cout << "\n\t\tРабота с программой успешно завершена.\n";
  110.                 break;
  111.             case 1:
  112.                 std::cout << "\n\t\tВы выбрали: проверить соответствие строки шаблону пути.\n\n";
  113.                 std::cout << "Введите путь к файлу(формат пути: D:\\<каталог>\\<названиие файла с расширением или без>):\n";
  114.                 std::cin >> Path;
  115.                 IsCorrect = checkString(Path);
  116.                 std::cout << ((IsCorrect == true) ? "Введенный путь - корректный" : "Введенный путь - некорректный") << std::endl;
  117.                 break;
  118.             case 2:
  119.                 std::cout << "\n\t\tВы выбрали: найти все подстроки в произвольной строке, соответствующие шаблону.\n\n";
  120.                 std::cout << "\nВведите строку для анализа: ";
  121.                 std::getline(std::cin, Path);
  122.                 std::getline(std::cin, Path);
  123.                 findSubstring(Path);
  124.                 break;
  125.             default:
  126.                 std::cout << "Неверный ввод!\n";
  127.                 break;
  128.         }
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement