Untitled

mail@pastecode.io avatar
unknown
c_cpp
7 months ago
6.1 kB
3
Indexable
Never
//ЮФУ, ИКТИБ, МОП ЭВМ
//Программирование и основы теории алгоритмов часть 2
//Домашнее задание №1 -  ДКА
//КТбо1-6, Домбрина Алёна Игоревна
//Вариант 1.3
//24.03.24

#include <iostream>
#include <map>
#include <string>

using namespace std;

//Входные данные: введенная последовательность
//Функция valid_input проверяет вводимую последовательность на соответветствие входному алфавиту
//Если все элементы из алфавита {a, b} - функция возвращает true, если нет - false
bool valid_input(string);

//Входные данные: введенная последовательность и таблица переходов, переданные функцией recogniser
//Функция output_of_transitions из исходного состояния q0 проходит по введенной последовательности и выводит состояния, 
//по которым проходит автомат.
//Если автомат останавливается в допускающем состоянии - функция возвращает true, в недопускающем - false
bool output_of_transitions(string, map<string, map<char, string>>&);

//Входные данные: введенная последовательность
//Функция recognizer содержит в себе структуру данных, хранящую состояния и переходы по ним
//Структура данных основана на контейнере map, в которой ключ - состояние, элемент - map, 
//в котором ключ - символ, по которому мы переходим, элемент - состояние, в которое переходим.
//Возвращает работу функции output_of_transitions, в которую передаются вводимая последовательность и таблицу переходов 
bool recognizer(string);


int main()
{
	setlocale(LC_ALL, "Russian");
	string sequence;

	do {
		cout << "Введите последовательность: ";
		choice:
		getline(cin, sequence);
		if (sequence == "exit")
		{
			cout << endl<<"Вы завершили работу! Спасибо за внимание!" << endl;
			break;

		}
		if (sequence.empty())
		{
			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>> table =
	{
	{"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, table);
}


bool output_of_transitions(string sequence, map<string, map<char, string>>& transition_table)
{
	string q_cur = "q0", q_follow;
	for (auto it = sequence.begin(); it != sequence.end(); it++)
	{
		q_follow = transition_table[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