<<< Powrót do głównej strony wykładu
<<< Powrót do modułu 7
To są zadania na pliki.
Pokaż rozwiązania __SHOWALL__
Ukryj rozwiązania __HIDEALL__
W poniższych zadaniach zakładamy, że eof(f) implikuje eoln(f).
Zadanie 1
Napisz funkcję sprawdzającą, czy dwa pliki tekstowe o podanych nazwach mają tę samą liczbę wierszy.
Wskazówka 1
{{{3}}}
Rozwiązanie 1
{{{3}}}
Wskazówka 2
{{{3}}}
Rozwiązanie 2
{{{3}}}
Zadanie 2
Napisz procedurę, która skopiuje plik tekstowy f na g, modyfikując go w następujący sposób: bezpośrednio po każdym słowie należy wstawić koniec wiersza, a nowy wiersz rozpocząć od nowego słowa (spacje i puste wiersze należy pomijać).
Słowem (w tym zadaniu) nazywamy dowolny maksymalny spójny ciąg znaków niezawierający spacji i znaków końca wiersza. Nie zakładamy niczego o długości słów.
Wskazówka 1
{{{3}}}
Rozwiązanie 1
{{{3}}}
Rozwiązanie 2
{{{3}}}
Zadanie 3 (Usuwanie komentarzy)
Napisz procedurę usuwającą komentarze z pliku tekstowego zawierającego program w Pascalu.
Komentarze oznaczone są przez { ... } lub (* ... *). Należy przy tym uważać by nie usuwać komentarzy znajdujących się wewnątrz napisów (oznaczonych przez ' ... ')
Wskazówka 1
Tak jak w Zadaniu 2, procedura powinna być sterowana stanem, oznaczającym tę część wiedzy zdobytej podczas przetwarzania dotychczasowego fragmentu pliku, od której zależy reakcja na wczytanie poszczególnych znaków: czy jesteśmy wewnątrz komentarza, napisu, po przeczytaniu nawiasu oswierającego itp.
Rozwiązanie 1
procedure Komentarze(wej,wyj:string);
type stany=(nic,kom1,naw_otw,kom2,kom2_gw,napis);
var f,g:Text;
stan:stany;
c:character;
begin
assign(f,wej);
assign(g,wyj);
reset(f);
rewrite(g);
stan:=nic;
while not eof(f) do begin
if not eoln(f) then
read(f,c);
case stan of
nic:
case c of
'(': stan:=naw_otw;
'''': begin stan:=napis; write(g,c) end;
else write(g,c);
end
naw_otw:
case c of
'*': stan:=kom2;
'''': begin stan:=napis; write(g,'('''); end;
'{': begin stan:=kom1; write(g,'({'); end
else begin stan:=nic; write(g,'(',c); end
end
kom2:
case c of
'*': stan:=kom2_gw;
end
kom2_gw:
case c of
')': stan:=nic;
'*': stan:=kom2_gw;
else stan:=kom2
end
kom1:
case c of
'}': stan:=nic
end
napis:
case c of
'''': begin stan:=nic; write(g,c); end
else write(g,c);
end
end
end
else begin // eoln(f)
readln(f);
case stan of
nic: writeln(g);
naw_otw: begin stan:=nic; writeln(g,'('); end;
kom2: // nic
kom2_gw: stan:=kom2;
kom1: // nic
napis: writeln(g)
end
end
end
close(f);
close(g);
end
Każdy obrót pętli while w powyższej procedurze przetwarza jedno zdarzenie (znak lub koniec wiersza) z pliku wejściowego. W zależności od stanu i znaku (zdarzenia) zmieniany jest odpowiednio stan i zapisywany odpowiedni napis do pliku wyjściowego.
Można sobie wyobrazić zawartość pętli while w powyższej procedurze jako dwuwymiarową tabelkę, której kolumny indeksowane są stanami, wiersze - rodzajem zdarzenia wejściowego, a w każdej komórce jest informacja jaki ma być nowy stan i co wypisać do pliku g.