Szakkörök‎ > ‎Algoritmus szakkör‎ > ‎2011-2012‎ > ‎

2. óra

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;