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:
- Az állapotgépekről szóló előadás átismétlése.
- A fájlkezelésről tanultak átolvasása.
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!
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.)
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!
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: printf
→fprintf
,
scanf
→fscanf
, é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!
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.
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!
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?