2011.09.26.
Az előző órai nehézségek tükrében ismét egy olyan feladatot nézünk meg, amelyben a bemenet feldolgozása jelenti az igazi kihívást.
Feladat
A bemenet lexikális elemzése
Ezen az órán olyan szöveges állományt kellett beolvasni, amelyben
- 256 karakteresnél hosszabb sorok is előfordulhattak;
- a bemeneti sorokban számok és karakterláncok váltakoztak, szóközökkel elválasztva.
A fentiek következménye, hogy pascal-ban
- a sorok nem olvashatók be egy az egyben "hagyományos" string változóba;
- a szóközzel elválasztott karakterláncokat karakterenként kell beolvasnunk, hiszen a szóköz lehetne része egy karakterláncnak, így nem használható elválasztó jelként.
Mivel C-ben és Java-ban erősebb eszközöket is használhatunk az input feldolgozására, itt csak a egy pascal nyelven írt megoldást részletezünk, a többi nyelvről a feladat megoldásánál lehet tájékozódni.
Példa
Legyen a példa kedvéért a bemenet a következő alakú:
- az első sor az adatsorok számát adja meg (1<= N <= 100)
- ezután N sor következik,mindegyik az alábbi tartalommal:
- szóközökkel elválasztva
- először egy A szám (0<= A <= 20)
- majd A darab 3 karakteres szöveg, amelyben csak az angol ábécé nagybetűi szerepelhetnek
- majd egy B szám (0<= B <=20)
- majd B darab 2 karakteres szöveg, amelyben csak az angol ábécé nagybetűi szerepelhetnek
- majd egy C szám (1<= C <= 200)
- majd egy C karakterből álló karakterlánc, amelyben csak az angol ábécé nagybetűi szerepelhetnek
- végül sorvége
3
1 ADF 2 BG BH 5 ASDFG
2 QWE RTZ 0 20 AASSEEGGHHIIJJKKLLOO
10 EEE RRR TTT EEE RRR TTT FFF GGG HHH JJJ 1 XY 12 YXCVBNMLKJHG
Felülről lefelé finomítva fejtjük ki a beolvasást végző programot.
Főprogram
program elemez;
var BE : text;
N,i : byte;
{...}
begin
assign(BE,'bemenet.txt');
reset(BE);
readln(BE,N);
for i := 1 to N do
begin
sorOlvas;
end;
close(BE);
end.
sorOlvas
procedure sorOlvas;
var A, B, C, i : byte;
s2, s3, s : string;
begin
read(BE,A);
for i := 1 to A do
begin
s3 := stringOlvas (3) ;
{s3 feldolgozása}
end;
read(BE,B);
for i := 1 to B do
begin
s2 := stringOlvas(2);
{s2 feldolgozása}
end;
read(BE,C);
s := stringOlvas(C);
{s feldolgozása}
readln(BE);
end;
stringOlvas
function stringOlvas(h : byte):string;
var ch : char;
s : string;
i : byte;
begin
read(BE,ch); {átolvassuk a szóközt}
s := '';
for i := 1 to h do
begin
read(BE,ch);
s := s + c;
end;
stringOlvas := s;
end;
|
|