Labor, 12-13. hét: állapotgépek

Czirkos Zoltán, Pohl László · 2024.11.16.

Állapotgépek. Szabványos bemenet és kimenet átirányítása. Fájlkezelés beépítése. Parancssori argumentumok.

Felkészülés a laborra:

1. NZH jelentkezés

Ha még nem jelentkeztél NZH2-re, tedd meg!

2. Ly számláló

Alább az előadás állapotgépes példakódját látod, az ly-számlálót.

#include <stdio.h>

int main(void) {
    typedef enum LyAllapot {
        alap, l_volt, ll_volt
    } LyAllapot;
    LyAllapot all;
    int szaml, c;

    szaml = 0;
    all = alap;
    while ((c = getchar()) != EOF) {
        switch (all) {
          case alap:
            if (c == 'l') all = l_volt;
            break;

          case l_volt:
            switch (c) {
                case 'l': all = ll_volt; break;
                case 'y': szaml += 1; all = alap; break;
                default: all = alap; break;
            }
            break;

          case ll_volt:
            switch (c) {
              case 'l': break;
              case 'y': szaml += 2; all = alap; break;
              default: all = alap; break;
            }
            break;
        }
    }

    printf("%d darab volt.\n", szaml);

    return 0;
}

Ha esetleg nem tetszik a forráskód tördelése, bátran alakítsd át!

Rajzold meg a forráskód alapján állapotátmeneti és tevékenységeket tartalmazó táblázatát, vagy választásod szerint az állapotátmeneti gráfot!

3. „Hejesírásreform”

Indulj ki az előző feladat kódjából!

Rajzolj egy új táblázatot, amelyben teljes egészében módosítod a tevékenységeket. Az új program feladata nem az ly-ok számlálása, hanem egy „hejesírásreform” végrehajtása. Ennek a beolvasott szöveget majdnem változatlanul kell kiírnia a kimenetre – azzal a különbséggel, hogy az ly-ok helyett j-t, a dupla lly-ok helyett jj-t kell kiírnia. Pl. lyuk→juk, gally→gajj, viszont majom→majom marad, és a kulcs, illetve a hallgat szavak is változatlanok maradnak. (Ezek a példák fontos állapotátmeneteket és tevékenységeket tesztelnek.)

4. Parancssor és átirányítás

Parancssor ablakban navigálj el a félév elején tanult módon a Hejesírásreform programodhoz, a hejesiras.exe-hez!

  • Indítsd el. Gépelj be neki egy szöveget! Próbáld ki, hogy itt is fájl vége jelet adsz a programnak.
  • Irányítsd a kimenetet egy fájlba a > operátor segítségével. Ellenőrizd az eredményt a jegyzettömbbel!
  • Hozz létre egy szövegfájlt, ments el bele valamilyen szöveget. Írd ki a képernyőre a fájlt, megreformált „hejesírással”, tehát irányítsd át a bemenetet a < operátorral.
  • Próbáld ki a bemenet és a kimenet egyidejű átirányítását is!

5. Fájlkezelés

Elevenítsd fel az előadáson a fájlkezelésről tanultakat! Emlékezz vissza, a fájlok a szabványos bemenethez és kimenethez nagyon hasonlóan kezelhetőek: printffprintf, scanffscanf, és a többi függvénynek is megvan a párja.

Alakítsd át úgy a Hejesírásreform programodat, hogy a szabványos adatfolyamok helyett a bemenetét az eredeti.txt fájlból olvassa, a kimenetét pedig a megreformalt.txt nevű fájlba írja!

Teszteld a programod a jegyzettömbbel létrehozott fájllal! Ellenőrizd a létrehozott fájlt is! Ügyelj arra, hogy a fájlműveleteket – de legalább a megnyitás sikerességét – ellenőrizni kell. Próbáld ki úgy a programod, hogy nem létezik a bemeneti fájl, vagy nem írható a kimeneti fájl! Jelenítsen meg ilyenkor a program hibaüzenetet!

6. Parancssori argumentumok

Elevenítsd föl a parancssori argumentumokról tanultakat is!

A feladatod, hogy az előző fájlkezelős megoldást átalakítsd úgy, hogy paraméterként vegye át a bemeneti és a kimeneti fájlnevet! Ha nem kap két fájlnevet a program, akkor természetesen hibajelzést kell adnia.

C:\Users\111111> hejesiras

Hejesírásreform
Használat: hejesiras <bemenet> <kimenet>

C:\Users\111111> hejesiras bemenet.txt kimenet.txt

C:\Users\111111> type bemenet.txt
Helyesírás!

C:\Users\111111> type kimenet.txt
Hejesírás!

C:\Users\111111> hejesiras nincsilyen.txt kimenet.txt

Hiba: nem nyitható meg a bemeneti fájl.
Parancssori argumentumok megadása a Code::Blocksban

A parancssori argumentumok megadására két lehetőséged van:

  • Egyik, hogy parancssorból indítod a programod. Így egy kicsit nehézkesebb tesztelni.
  • Másik – teszteléshez ez javasolt –, hogy a Code::Blocksban állítod be, hogy milyen paraméterekkel induljon a program. Ezt a „Project / Set programs' arguments” menüpont alatt lehet megtenni, az argumentumokat a „Program arguments” feliratú dobozba beírva.

Próbáld ki mindkettőt! Teszteld a programodat parancssorból használva is, ellenőrizve a hibajelzéseket és a létrehozott fájlt!

7. Lyuk

Fejleszd tovább a programot! „Tanítsd meg” az állapotgépednek, hogy kezelje helyesen a mondatot kezdő, nagybetűs L karaktert! Rajzold meg az új állapotátmeneti táblázatot!

Hány új állapot kell ehhez? Működik helyesen a programod, ha azt írod bemenetként, Levél? Vajon kell-e számolnod azzal, hogy mondat elejére két j-t kell írnod?

8. További feladatok

Ha elkészültél, folytasd a feladatgyűjtemény kapcsolódó feladataival!