Implementacja automatu.

0

Już chyba tu to najlepiej pasuję:

Mam taki opis automatu:

0 1 a
1 1 b
1 2 c
0 3 k
3 4 o
4 5 t
2
5

a taki słowny:

"automat akceptujący napis "ab*c" (b powielony dowolną liczbę razy) i "kot"
"

Rozumiem że ma być tak a, b n razy i c.Koniec. Druga możliwość kolejno k,o,t ? Jakby dwa nie zależne wejścia? Tak? Znaczy abbbbbckot, będzie odrzucany ponieważ k rozpoczyna się od stanu początkowego przechodzi na 3. A My już jesteśmy na końcowym. końcowe to 2 i 5 i dlatego są też na końcu wyróżnione.

Czy można to zaimplementować naiwnie? jeśli pierwsza to a, a druga to b, tu warunek że może być b jeśli kolejna to c to wyświetl napis YES. W każdym innym wypadku wyświetl no. Tak samo dla kot. Jeśli pierwsza to a lub k (Pasuje mi tu switch) to kolejne kroki jesli nie wyświetl NO.

Dla automatu skończenie stanowego.

2

a, b n razy (w tym zero razy) i c.
lub kolejno k,o,t
Implementuje się to najprościej za pomocą mapy.
Można zaimplementować naiwnie tylko że kodu będzie więcej niż przy implementacji sensownej na dodatek nie uniwersalnie.

1

Nie rozumiem o co ty pytasz. Przecież to jest trywialna sprawa. Zaczynasz w stanie 0 i czytasz znak z wejścia.
Jeśli wczytałaś a to korzystasz z przejścia
0->1, a
Jeśli k to
0->3, k
A jak cokolwiek innego to ERROR.
Postępujesz analogicznie aż nie dojdziesz do stanu końcowego, czyli 2 albo 5.
Zrób sobie mapę Map<Integer, Map<Character,Integer>> która dla aktualnego stanu zwraca możliwe przejścia, a dla stanu i symbolu zwraca nowy stan.
Oczywiście broń Boże nie zrób takiej mapy jak napisałem wyżej! Opakuj to w ładne klasy żeby mieć w kodzie coś w stylu Map<State, Moves> a Moves to Map<Symbol, State>

1

Bez przesady, dla mniejszego projektu nawet z mapą nie jest tak źle, np:

#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std;

typedef int state;
typedef pair<state,char> keypair;
typedef map<keypair,state> statemap;
typedef pair<statemap,set<state> > automat;

int main()
  {
   const automat a // c++ 11 dla tej inicjalizacji
     {
        {
          {{0,'a'},1},
          {{1,'b'},1},
          {{1,'c'},2},
          {{0,'k'},3},
          {{3,'o'},4},
          {{4,'t'},5},
        },
        {2,5}
     };
   for(string str;(cin>>str)&&(str.size());)
     {
      state st=0;
      for(auto ch=str.begin();(ch!=str.end())&&(st>=0);++ch) // auto = string::iterator
        {
         auto fnd=a.first.find(keypair(st,*ch)); // auto = statemap::const_iterator
         st=(fnd!=a.first.end())?fnd->second:-1;
        }
      cout<<(a.second.find(st)!=a.second.end()?"TAK":"NIE")<<endl;
     }
   return 0;
  }

http://ideone.com/m75cvx

1 użytkowników online, w tym zalogowanych: 0, gości: 1