AB-slovo je slovo zlozene vylucne z pismen A a B, napriklad AA, ABB, BBB

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategória: KMP (Klub mladých programátorov)

Autor: Ján Mojžiš
Program: Ab_slova.pas
Súbor exe: Ab_slova.exe
Potrebné: Slova.txt

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 ktore 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
{  ==============                                                              }
{  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.