Commit c01e2352 by Szeberényi Imre

typo

parent b9082263
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
A állapotgépek (véges automaták) kézenfekvő megvalósítása a táblázatos megvalósítás, melynek lényege, hogy a pillanatnyi állapottól és az aktuális inputtól függően elővesszük egy táblázatból az új állapotot és az állapotátmenethez tartozó tevékenységet megvalósító függvény címét, amit végrehajtunk. Ezzel állapotgépünk algoritmusa így nézhet ki: A állapotgépek (véges automaták) kézenfekvő megvalósítása a táblázatos megvalósítás, melynek lényege, hogy a pillanatnyi állapottól és az aktuális inputtól függően elővesszük egy táblázatból az új állapotot és az állapotátmenethez tartozó tevékenységet megvalósító függvény címét, amit végrehajtunk. Ezzel állapotgépünk algoritmusa így nézhet ki:
``` ```
while (van_input) { while (van_input) {
új_állapot = állapot_tábla[akt_állapot][input] új_állapot = állapot_tábla[akt_állapot][input]
tevékenység = [akt_állapot][input] tevékenység = [akt_állapot][input]
tevélenység_vegrehajtása tevélenység_vegrehajtása
akt_állapot = új_allapot akt_állapot = új_allapot
} }
``` ```
Így egy konkrét feladat (pl. ly számláló) implementálása csak a két táblázat megfelelő kitöltéséből áll, feltételezve, hogy mind az állapotokat, mind az inputot olyan módon kódoljuk, hogy azzal az adott nyelven lehet táblázatot (tárolót) indexelni. C nyelven az integrál típussal lehet indexelni. C++-ban már más a helyzet (ld. asszociatív tárolók). Így egy konkrét feladat (pl. ly számláló) implementálása csak a két táblázat megfelelő kitöltéséből áll, feltételezve, hogy mind az állapotokat, mind az inputot olyan módon kódoljuk, hogy azzal az adott nyelven lehet táblázatot (tárolót) indexelni. C nyelven az integrál típussal lehet indexelni. C++-ban már más a helyzet (ld. asszociatív tárolók).
A táblázatok (lehet összevont táblázat is) kitöltését segítheti valamilyen generátor, ekkor annak mérete nem nagyon érdekes, de lehet, hogy kézzel töltjük ki, ekkor érdemes a táblázat méretét csökkenteni. A legkézenfekvőbb csökkentési lehetőség, az állapotok összevonása és az inputot csoportokra bontása (ld. ly számláló példa). A táblázatok (lehet összevont táblázat is) kitöltését segítheti valamilyen generátor, ekkor annak mérete nem nagyon érdekes, de lehet, hogy kézzel töltjük ki, ekkor érdemes a táblázat méretét csökkenteni. A legkézenfekvőbb csökkentési lehetőség, az állapotok összevonása és az inputot csoportokra bontása (ld. ly számláló példa).
...@@ -29,6 +29,7 @@ class Allapotgep { ...@@ -29,6 +29,7 @@ class Allapotgep {
``` ```
Az állapotgép a genetika szorgalmihoz viszonyítva a template paraméterezés mellett az alábbiakban tér el: Az állapotgép a genetika szorgalmihoz viszonyítva a template paraméterezés mellett az alábbiakban tér el:
* minden állapotátmenetkor végrehajt egy akciót; * minden állapotátmenetkor végrehajt egy akciót;
* tárolja a bevezetőben említett 2D táblázatban a következő állapotot és az akciót. * tárolja a bevezetőben említett 2D táblázatban a következő állapotot és az akciót.
...@@ -39,7 +40,6 @@ struct Nop { ...@@ -39,7 +40,6 @@ struct Nop {
/// következő állapot /// következő állapot
All kov_allapot; All kov_allapot;
Nop(All kov_all) :kov_allapot(kov_all) {} Nop(All kov_all) :kov_allapot(kov_all) {}
/// ha az állapotgép ebbe az állapotba ér, meghívja ezt a függvényt /// ha az állapotgép ebbe az állapotba ér, meghívja ezt a függvényt
/// @param ch - erre az input értékre léptünk ide /// @param ch - erre az input értékre léptünk ide
virtual void akcio(T ch) { } virtual void akcio(T ch) { }
...@@ -50,7 +50,7 @@ struct Nop { ...@@ -50,7 +50,7 @@ struct Nop {
A 2D táblázathoz egy olyan osztályt definiáltunk, ami az All és Imp sablonparaméterként megadott típusokkal indexelhető, és törli a tárol elemeket, ha elérkezett az idő. A 2D táblázathoz egy olyan osztályt definiáltunk, ami az All és Imp sablonparaméterként megadott típusokkal indexelhető, és törli a tárol elemeket, ha elérkezett az idő.
```c++ ```c++
struct AllTabla : public std::map<All, std::map<Inp, Nop*> > { struct AllTabla : public std::map<All, std::map<Inp, Nop*> > {
~AllTabla() { ~AllTabla() { // bejárjuk a tárolót és töröljük a dinamikusan létrehozott elemeket
typename AllTabla::iterator i1 = this->begin(); typename AllTabla::iterator i1 = this->begin();
while (i1 != this->end()) { while (i1 != this->end()) {
typename std::map<Inp, Nop*>::iterator i2 = i1->second.begin(); typename std::map<Inp, Nop*>::iterator i2 = i1->second.begin();
...@@ -96,7 +96,7 @@ class Lyszaml : public Allapotgep<LyAllapot, LyInput, char> { ...@@ -96,7 +96,7 @@ class Lyszaml : public Allapotgep<LyAllapot, LyInput, char> {
//... //...
}; //lyszamlalo.hpp }; //lyszamlalo.hpp
``` ```
_Megjegyzés: a template paraméterek miatt nyugodtan használhattunk volna az enum-ok vagy akár a char helyett egy szimpla osztályt is. Így akár komplikáltabb logika is beépíthető. _ _Megjegyzés: a template paraméterek miatt nyugodtan használhattunk volna az enum-ok vagy akár a char helyett egy szimpla osztályt is. Így akár komplikáltabb logika is beépíthető._
Az egyes állapotokhoz kapcsolódó akciókat a következő módon definiáljuk: Az egyes állapotokhoz kapcsolódó akciókat a következő módon definiáljuk:
...@@ -133,7 +133,7 @@ Lyszaml::Lyszaml() : Allapotgep(LyAllapot::alap, tab), sz(0) { ...@@ -133,7 +133,7 @@ Lyszaml::Lyszaml() : Allapotgep(LyAllapot::alap, tab), sz(0) {
} //lyszamlalo.cpp } //lyszamlalo.cpp
``` ```
A bemenetet input csoportokká alakító függvény `Lyszamlalo` esetén magyarázatra nem szorul: A bemenetet input csoportokká alakító függvény `Lyszamlalo` esetén. Magyarázatra nem szorul:
```c++ ```c++
LyInput input(char ch) const { LyInput input(char ch) const {
if (ch == 'l') return LyInput::l; if (ch == 'l') return LyInput::l;
...@@ -148,7 +148,7 @@ Az `Lyszamlalo` **get()** függvénye visszaadja a megtalált _ly_-ok számát. ...@@ -148,7 +148,7 @@ Az `Lyszamlalo` **get()** függvénye visszaadja a megtalált _ly_-ok számát.
## Feladatok ## Feladatok
### Kommentezés ### Kommentezés
A mintapélda lapján hozz létre egy `Komment` osztályt, ami a bemenetére érkező szabályos C programból kiszűri a /* ... */ alakú kommenteket! Feltételezzük, hogy szövegkonstansban nem szerepel "/\*", ill. "\*/" karaktersorozat. A megszűrt, komment nélküli programot az osztály **std::string get()** tagfüggvényével lehet lekérdezni. A mintapélda alapján hozz létre egy `Komment` osztályt, ami a bemenetére érkező szabályos C programból kiszűri a /* ... */ alakú kommenteket! Feltételezzük, hogy szövegkonstansban nem szerepel "/\*", ill. "\*/" karaktersorozat. A megszűrt, komment nélküli programot az osztály **std::string get()** tagfüggvényével lehet lekérdezni.
Nézd meg a _main.cpp_-ben lévő teszteket, állítsd az _ELKESZULT_ makrót 1-re és próbáld megoldani a feladatot. A megoldás során a *komment.hpp* és *komment.cpp* fájlokban dolgozz! Nézd meg a _main.cpp_-ben lévő teszteket, állítsd az _ELKESZULT_ makrót 1-re és próbáld megoldani a feladatot. A megoldás során a *komment.hpp* és *komment.cpp* fájlokban dolgozz!
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment