|
|||||||||||||||||||||||||||||
Цель работы. Постановка задачи. Листингпрограммы
ГУАП КАФЕДРА № 43 ОТЧЕТ ПРЕПОДАВАТЕЛЬ
РАБОТУ ВЫПОЛНИЛ
Санкт-Петербург2017 Цель работы Ознакомиться с понятием формальной системой, изучить принцип работы формальной системы Поста. Постановка задачи · Построить формальную систему Поста FSp, реализующую вычисление заданной арифметической функции – x*у. · Написать программу на языке высокого уровня имитирующую (эмулирующую) вычисления на основе выводимости в формальной системе Поста. · Программа должна работать на любых входных данных из заданного множества. Листингпрограммы #include< iostream> #include< fstream> #include< vector> #include< sstream> #include< map> usingnamespace std; structRule { string input; string output; }; int main() { string str; string alphabet; string variables; string axiom; string inputString; vector< Rule> rules; ifstream file(" file. txt" ); int i = 0; while (getline(file, str)) { if (i == 0) { for (int j = 0; j < str. length(); j++) { char c = str[j]; if (c! = ', ') { alphabet += c; } } } if (i == 1) { for (int j = 0; j < str. length(); j++) { char c = str[j]; if (c! = ', ') { variables += c; } } } if (i == 2) { for (int j = 0; j < str. length(); j++) { char c = str[j]; if (c! = ', ') { axiom += c; } } } if (i == 3) { inputString = str; for (int j = 0; j < str. length(); j++) { bool error = true; for (int z = 0; z < alphabet. length(); z++) { if (alphabet[z] == str[j]) { error = false; break; } } if (error) { cout < < " Wrong character in input expression. "; return 1; } } } if (i > 3) { Rule rule; stringstream ss(str); int n = 0; while (ss. good()) { string substr; getline(ss, substr, ', '); for (int j = 0; j < substr. length(); j++) { bool error = true; string checkStr = alphabet + variables; for (int z = 0; z < checkStr. length(); z++) { if (checkStr[z] == substr[j]) { error = false; break; } } if (error) { cout < < " Wrong character in rule " < < i - 3 < < ". "; return 1; } } if (n == 0) { rule. input = substr; } if (n == 1) { rule. output = substr; } n++; } rules. push_back(rule); } i++; } file. close(); bool end = false; while (! end) { for (autoconst& rule: rules) { map< char, string> var; for (int z = 0; z < variables. length(); z++) { var[variables[z]]=" "; } int lastVarIndex = -1; for (int i = rule. input. length() - 1; i > = 0; i--) { char c = rule. input[i]; bool isVariable = false; for (int j = 0; j < variables. length(); j++) { if (c == variables[j]) { isVariable = true; break; } } if (isVariable) { if (var[c]! =" " ) { break; } bool wasAxiom = false; int index = 0; if (lastVarIndex == -1) { index = inputString. length() - 1; } else { index = lastVarIndex; } for (int x = index; x > = 0; x--) { char inpStrChar = inputString[x]; bool isAxiom = false; for (autoconst& a: axiom) { if (a == inpStrChar) { isAxiom = true; } } if (isAxiom) { var[c]+= inpStrChar; wasAxiom = true; } else { if (wasAxiom) { lastVarIndex = x; break; } } } } else { for (int x = inputString. length() - 1; x > = 0; x--) { if (inputString[x] == c) { lastVarIndex = x; } } } } string findStr = " "; for (autoconst& c: rule. input) { bool isVariable = false; for (int j = 0; j < variables. length(); j++) { if (c == variables[j]) { isVariable = true; break; } } if (isVariable) { findStr += var[c]; } else { findStr += c; } } string out = rule. output; for (autoconst& c: rule. output) { bool isVariable = false; for (int j = 0; j < variables. length(); j++) { if (c == variables[j]) { isVariable = true; break; } } string s(1, c); if (isVariable) { out. replace(out. find(s), s. size(), var[c]); } } int pos = inputString. find(findStr); if (pos! = string:: npos) { inputString. replace(pos, findStr. size(), out); if (rules. back(). input == rule. input) end = true; } else { continue; } cout < < inputString < < endl; break; } } return 0; } Содержимое входного файла
Результаты Вывод В ходе выполнения лабораторной работы была изучена формальная система Поста, и на основе этих знаний была написана программа, эмулирующая вычисления на основе выводимости в формальной системе Поста.
|
|||||||||||||||||||||||||||||
|