Untitled
//ЮФУ, ИКТИБ, МОП ЭВМ //Программирование и основы теории алгоритмов часть 2 //Домашнее задание №1 - ДКА //КТбо1-6, Домбрина Алёна Игоревна //Вариант 1.3 //24.03.24 #include <iostream> #include <map> #include <string> using namespace std; bool valid_input(string& sequence); bool recognizer(string sequence); bool output_of_transitions(string sequence, map<string, map<char, string>>& TransitionTable); int main() { string sequence; setlocale(LC_ALL, "Russian"); do { cout << "Введите последовательность: "; choice: getline(cin, sequence); if (sequence == "exit") { cout << endl<<"Вы завершили работу! Спасибо за внимание!" << endl; break; } if (sequence == " ") { cout <<"Вы ввели пустую последовательность!" << endl; cout << endl << "Хотите продолжить работу?" << endl << "Если да - введите последовательность заново, если нет - введите exit: "; goto choice; } else if (!valid_input(sequence)) { cout << "Вы использовали недопустимые символы!"<<endl; cout <<endl<< "Хотите продолжить работу?" << endl << "Если да - введите последовательность заново, если нет - введите exit: "; goto choice; } else if (sequence.size() < 2) { cout << "Вы ввели слишком короткую последовательность!"<<endl; cout << endl << "Хотите продолжить работу?" << endl << "Если да - введите последовательность заново, если нет - введите exit: "; goto choice; } else { if (recognizer(sequence)) { cout << "Yes" << endl; cout << "Введена допускающая последовательность!" << endl; cout << endl << "Хотите продолжить работу?" << endl << "Если да - введите последовательность заново, если нет - введите exit: "; goto choice; } else { cout << "No" << endl; cout << "Введена недопускающая последовательность!" << endl; cout << endl << "Хотите продолжить работу?" << endl << "Если да - введите последовательность заново, если нет - введите exit: "; goto choice; } } cout << endl; } while (true); return 0; } bool valid_input(string& sequence) { for (char c : sequence) { if (!strchr("ab", c)) { return false; } } return true; } bool recognizer(string sequence) { map<string, map<char, string>> TransitionTable = { {"q0" , { {'a', "q1" }, {'b', "q10"} } }, {"q1" , { {'a', "q2" }, {'b', "q6"} } }, {"q2" , { {'a', "q2" }, {'b', "q3"} } }, {"q3" , { {'a', "q4" }, {'b', "q3"} } }, {"q4" , { {'a', "q5" }, {'b', "q3"} } }, {"q5" , { {'a', "q5" }, {'b', "q3"} } }, {"q6" , { {'a', "q7" }, {'b', "q8"} } }, {"q7" , { {'a', "q7" }, {'b', "q9"} } }, {"q8" , { {'a', "q7" }, {'b', "q8"} } }, {"q9" , { {'a', "q7" }, {'b', "q8"} } }, {"q10" , { {'a', "q15" }, {'b', "q11"} } }, {"q11" , { {'a', "q12" }, {'b', "q11"} } }, {"q12" , { {'a', "q12" }, {'b', "q13"} } }, {"q13" , { {'a', "q12" }, {'b', "q14"} } }, {"q14" , { {'a', "q12" }, {'b', "q14"} } }, {"q15" , { {'a', "q17" }, {'b', "q16"} } }, {"q16" , { {'a', "q18" }, {'b', "q16"} } }, {"q17" , { {'a', "q17" }, {'b', "q16"} } }, {"q18" , { {'a', "q17" }, {'b', "q16"} } } }; return output_of_transitions(sequence, TransitionTable); } bool output_of_transitions(string sequence, map<string, map<char, string>>& TransitionTable) { string q_cur = "q0"; string q_follow; for (auto it = sequence.begin(); it != sequence.end(); it++) { q_follow = TransitionTable[q_cur][*it]; cout << *it << ": " << q_cur << " -> " << q_follow << endl; q_cur = q_follow; } if (q_follow == "q2" || q_follow == "q5" || q_follow == "q6" || q_follow == "q9" || q_follow == "q11" || q_follow == "q14" || q_follow == "q15" || q_follow == "q18") { return true; } else { return false; } }
Leave a Comment