Хелпикс

Главная

Контакты

Случайная статья





Цель работы. Постановка задачи. Листингпрограммы



 

ГУАП

КАФЕДРА № 43

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

д. т. н, проф.       М. Ю. Охтилев
должность, уч. степень, звание   подпись, дата   инициалы, фамилия

 

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3
Алгоритмическая система Поста
по дисциплине: ТЕОРИЯ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
   
 

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР.       Р. В. Яровой
      подпись, дата   инициалы, фамилия

 

Санкт-Петербург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;

}

Содержимое входного файла

Результаты

Вывод

В ходе выполнения лабораторной работы была изучена формальная система Поста, и на основе этих знаний была написана программа, эмулирующая вычисления на основе выводимости в формальной системе Поста.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.