Dze je subor www.TrSek.com/cover/mojzis/ab_slova.pas{ ============== }
{ KSP 15. rocnik z1043: AB slova Copyright (c) Jan Mojzis }
{ ============== }
{ Zadanie: }
{ AB-slovo je slovo zlozene vylucne z pismen A a B, napriklad AA, ABB, BBB. }
{ Napiste program, kt. na uvod precita zo vstupu postupnost roznych AB-slov, }
{ oddelenych jednou medzerou. Potom bude v cykle zo vstupu prijmat AB-slovo, na}
{ kt. zareaguje jednym z nasledujucich sposobov: }
{ a) ak prijal prazdne slovo, ukonci svoju cinnost, }
{ b) ak prijal slovo, kt. nebolo v uvodnej postupnosti, vypise retazec}
{ nepoznam a pokracuje, }
{ c) ak prijal slovo, kt. bolo v uvodnej postupnosti, vypise jeho }
{ poradie v tejto postupnosti a pokracuje. }
{ PRIKLAD: }
{ pre uvodnu postupnost AAA, ABAB mame }
{ VSTUP: VYSTUP: }
{ AAA nepoznam }
{ ABAB 2 }
{ AAAA 1 }
{ --------------------------------------------------------------------------- }
{ Pouzitie binarneho stromu s 2 vetvami A a B }
{ slova su v subore }
{ }
{ Author: (c) 2007 Jan Mojzis }
{ Date : 06.07.2008 http://www.trsek.com }
program ab_slova;
type
atom=^uzol; { stromova struktura }
uzol = record
A,B : atom; { 2 vetvy z kazdeho uzla }
cislo : integer; { 1 cislo }
end;
var f : text; { text subor na citanie }
line : string;
ii : integer;
GULA : atom; { instancia stromu }
poradc : integer;
function jeprazdny : boolean;
begin
jeprazdny:=GULA^.A=NIL;
end;
function PreverSlovo(bs : atom; s : string) : boolean;
var i : integer;
p : atom;
result: boolean;
begin
p:=bs;
result:=true;
for i := 1 to length(s) do begin
{A} if (s[i] = 'A') or (s[i] = 'a') then begin
if p^.A = NIL then begin
{ p:=p^.A; IDE PO VETVACH }
{ if p = NIL then begin } {+ A a B a zisti, ci }
{ writeln('nepoznam'); } {| tam nieco je, alebo }
result:=false; {| nie. }
break; {| }
end
else p:=p^.A;
{| A ak je nulovy smernik, }
end
{B} else { | }
if (s[i] = 'B') or (s[i] = 'b') then begin { | }
if p^.B = NIL then begin
{ p:=p^.B; } { | }
{ if p = NIL then begin } { +-NEEXISTUJUCA VETVA }
{ writeln('nepoznam'); }
result:=false;
break;
end
else p:=p^.B;
end;
end;
if (p^.cislo = 0) and (result = true) { Na konci zisti porad c. }
then result:=false { ak je nula, tak nieje }
else if result = true then
poradc:=p^.cislo; { inak vrat porad.c }
end;
procedure VlozZnakDoStromu(var bs:atom; s:string);
var p:atom;
i:byte;
begin
p:=bs;
for i:=1 to length(s) do begin
if (s[i]='A') or (s[i] = 'a')then begin
if p^.A=nil then begin { natavime cislo na nulu }
new(p^.A); p^.A^.A:=nil; p^.A^.B:=nil; p^.A^.cislo:=0;
end;
p:=p^.A;
end;
if (s[i]='B') or (s[i] = 'b')then begin
if p^.B=nil then begin { tu tiez }
new(p^.B); p^.B^.A:=nil; p^.B^.B:=nil; p^.B^.cislo:=0;
end;
p:=p^.B;
end;
end;
inc(poradc);
p^.cislo:=poradc;
end;
begin
assign(f, 'slova.txt');
reset(f);
poradc := 0;
inicializuj(GULA);
while not eof(f) do begin
readln(f,line);
VlozZnakDoStromu(GULA, line);
end;
close(f);
writeln('Zadaj slovo:');
poradc := 0;
repeat
readln(line);
if line <> '' then
if not PreverSlovo(GULA,line) then writeln('nepoznam')
else writeln(poradc);
until line = '';
end.