Untitled

mail@pastecode.io avatar
unknown
c_cpp
a month ago
4.4 kB
2
Indexable
Never
//ЮФУ, ИКТИБ, МОП ЭВМ
//Программирование и основы теории алгоритмов часть 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