{ ============== } { 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; procedure inicializuj(var nejaky : atom); begin new(nejaky); nejaky^.A:=NIL; nejaky^.B:=NIL; nejaky^.cislo:=0; end; 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.