Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.97 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include <map>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. vector<char> toVector(char *arr, int size){
  9.      vector<char> vect;
  10.      for (int i = 0; i < size; ++i)
  11.      {
  12.           if(arr[i] != ' ' && arr[i] != '\n' && arr[i] != '\0'){
  13.                vect.insert(vect.end(), arr[i]);
  14.           }
  15.      }
  16.      return vect;
  17. }
  18. void printVector(vector<char> vect){
  19.   for(int i = 0; i < vect.size(); i++)
  20.     printf("%c", vect[i]);
  21.   cout << endl;
  22. }
  23. bool existValue(map < char, vector <char> > m, vector<char> v){
  24.   bool fl = false;
  25.   for(map < char, vector <char> >::iterator it = m.begin(); it != m.end(); it++){
  26.     if(it->second.size() == v.size()){
  27.       sort(it->second.begin(), it->second.end());
  28.       sort(v.begin(), v.end());
  29.       if(it->second == v)
  30.         fl = true;
  31.     }
  32.   }
  33.   return fl;
  34. }
  35. char getKey(map < char, vector <char> > m, vector<char> v){
  36.   char key = ' ';
  37.   for(map < char, vector <char> >::iterator it = m.begin(); it != m.end(); it++){
  38.     if(it->second == v)
  39.       key = it->first;
  40.   }
  41.   return key;
  42. }
  43.  
  44. struct Rule
  45. {
  46.      char name[6];
  47. };
  48. int main()
  49. {
  50.      int numStates, numFinals, numAlphabet, numRules;
  51.      //input n,m,k,l;
  52.      printf("Enter the number of states: ");
  53.      scanf("%d",&numStates);
  54.      printf("Enter the number of final states: ");
  55.      scanf("%d",&numFinals);
  56.      printf("Enter the number alphabet symbols: ");
  57.      scanf("%d",&numAlphabet);
  58.      printf("Enter the number of rules: ");
  59.      scanf("%d",&numRules);
  60.      printf("\n-----------------------------------\n");
  61.      //declare
  62.      char *tmp;
  63.      char start;
  64.      vector<char> alphabet;
  65.      vector<char> finals;
  66.      vector<char> states;
  67.      Rule rules[numRules];
  68.      //input states
  69.      tmp = new char[2*numStates];
  70.      printf("Enter states (%d states): ", numStates);
  71.      cin.ignore(10000, '\n');
  72.      cin.get(tmp, 2*numStates);
  73.      states = toVector(tmp, 2*numStates);
  74.      delete []tmp;
  75.      //input final states
  76.      tmp = new char[2*numFinals];
  77.      printf("Enter final states (%d states): ", numFinals);
  78.      cin.ignore(10000, '\n');
  79.      cin.get(tmp, 2*numFinals);
  80.      finals = toVector(tmp, 2*numFinals);
  81.      delete []tmp;
  82.      //input start symbol
  83.      printf("Enter start symbol (1 symbol): ");
  84.      cin.ignore(10000, '\n');
  85.      start = getchar();
  86.      //input alphabet
  87.      tmp = new char[2*numAlphabet];
  88.      printf("Alphabet (%d symbols) : ", numAlphabet);
  89.      cin.ignore(10000, '\n');
  90.      cin.get(tmp, 2*numAlphabet);
  91.      alphabet = toVector(tmp, 2*numAlphabet);
  92.      delete []tmp;
  93.      //input rules
  94.      printf("Rules (%d rules):\n", numRules);
  95.      for(int i = 0; i < numRules; i++)
  96.      {
  97.           cin.ignore(10000, '\n');
  98.           cin.get(rules[i].name, 6);
  99.      }
  100.      printf("\n-----------------------------------\n");
  101.  
  102.  
  103.      map < char, vector <char> > table;//tmp table
  104.      map < char, vector <char> > detTable;// determ table
  105.      vector<char> detFinals;//det final states
  106.      //start new symbol
  107.      char newSymb = 'A';
  108.      //vector for groups of states
  109.      vector<char> tmpVect;
  110.      table[newSymb].push_back(start);
  111.      detTable = table;
  112.      //create table (new states -> old tates)
  113.      do{
  114.        table = detTable;
  115.        for(map < char, vector <char> >::iterator iter = table.begin(); iter != table.end(); iter++){
  116.          for(int i = 0; i < alphabet.size(); i++){
  117.            for(int j = 0; j < iter->second.size(); j++){
  118.              for(int k = 0; k < numRules; k++){  
  119.                //search rules: iter->second[j]_?_alphabet[i]
  120.                if(rules[k].name[0] == iter->second[j] && rules[k].name[4] == alphabet[i]){
  121.                  //add ? to vector
  122.                  tmpVect.push_back(rules[k].name[2]);
  123.                }
  124.              }
  125.            }
  126.            //delete duplicated states from tmpVect
  127.            sort(tmpVect.begin(), tmpVect.end());
  128.            tmpVect.erase(unique(tmpVect.begin(), tmpVect.end()), tmpVect.end());
  129.            //add new state to detTable if it doesn't exist
  130.            if(!existValue(detTable, tmpVect) && tmpVect.size() != 0){
  131.              newSymb ++;
  132.              for(int k = 0; k < tmpVect.size(); k++){
  133.                detTable[newSymb].push_back(tmpVect[k]);
  134.              }
  135.            }
  136.            //clear vector
  137.            tmpVect.clear();
  138.          }
  139.        }
  140.      } while(detTable.size() != table.size());
  141.      //print det table (new state -> old states)
  142.      for(map < char, vector <char> >::iterator iter = detTable.begin(); iter != detTable.end(); iter++){
  143.        cout << iter->first << " -> ";
  144.        printVector(iter->second);
  145.      }
  146.      //print new rules
  147.      cout << "New rules: " << endl;
  148.      for(map < char, vector <char> >::iterator iter = detTable.begin(); iter != detTable.end(); iter++){
  149.        for(int i = 0; i < alphabet.size(); i++){
  150.          for(int j = 0; j < iter->second.size(); j++){
  151.            for(int k = 0; k < numRules; k++){  
  152.              if(rules[k].name[0] == iter->second[j] && rules[k].name[4] == alphabet[i]){
  153.                tmpVect.push_back(rules[k].name[2]);
  154.              }  
  155.            }
  156.          }
  157.          sort(tmpVect.begin(), tmpVect.end());
  158.          tmpVect.erase(unique(tmpVect.begin(), tmpVect.end()), tmpVect.end());
  159.          cout << "(" << iter->first  << ", " << alphabet[i]<< ") -> " << getKey(detTable, tmpVect) << endl;
  160.          tmpVect.clear();
  161.        }  
  162.      }
  163.      //print det finals
  164.      for(map < char, vector <char> >::iterator iter = detTable.begin(); iter != detTable.end(); iter++){
  165.        for(int i = 0; i < iter->second.size(); i++){
  166.          for(int j = 0; j < finals.size(); j++){
  167.            if(iter->second[i] == finals[j])
  168.              detFinals.push_back(iter->first);
  169.          }
  170.        }
  171.      }
  172.      sort(detFinals.begin(), detFinals.end());
  173.      detFinals.erase(unique(detFinals.begin(), detFinals.end()), detFinals.end());
  174.      cout << "New final states: ";
  175.      printVector(detFinals);
  176.      return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement