Wątek przeniesiony 2014-06-24 10:46 z Delphi i Pascal przez ŁF.

Wytłumaczenie kodu :) Słownik Angielsko-Polski

0

Witam
mam problem ponieważ posiadam kod programu słownika Angielsko-Polskiego ale nie rozumiem dokładnie jego budowy. Wiem jak działa ale nie wiem jakie procedury wykonują określone czynności. Prosiłbym o wytłumaczenie w miarę wszystkich funkcji i procedur :) byłbym wdzięczny.

program USS;

uses crt, Windows;

type
    tablica=array[1..10] of string;


    wsk=^slownik;

    slownik=record
    koniec:boolean;
    next:array [char] of wsk;
    slowo:string;
    tlumaczenie:string;
     end;



    wska=^wyswietlacz;

    wyswietlacz=record
    pn: wska;
    slowo,tlumaczenie:string;
    wiersz:integer;
     end;
var
  enpl:array [1..2] of wsk;
  lista:wska;
  x:integer;
  slo,tlu:string;
  l,h:integer;
  f_time:double;
  freq,timestart,timeend:int64;

function nowa:wsk;                //tworzy nowy_wezelj drzewa trie
var p:wsk; c:char;
begin
  new(p);
   for c:=low(char) to high(char) do begin
       p^.next[c]:=NIL;
       p^.koniec:=false;
   end;
  nowa:=p;
end;
function w_nowy:wska;            //tworzy nowy wezel listy sluzacej do wyswietlania na ekranie
var
  nowy:wska;
begin
  new (nowy);
  nowy^.pn:=nil;
  nowy^.slowo:='';
  nowy^.tlumaczenie:='';
  nowy^.wiersz:=1;
  w_nowy:=nowy;

end;
procedure w_dodaj(root:wska;s,s1:string);  //dodaje wezel do listy wyswietlajacej
var
  nowy:wska;
begin
  while root^.pn<>nil do
        begin
              root:=root^.pn;
        end;
  if (root^.pn=nil) and (root^.slowo='') then
   begin
        root^.slowo:=s;
        root^.tlumaczenie:=s1;
   end
  else begin
   new(nowy);
   nowy^.pn:=nil;
   nowy^.slowo:=s;
   nowy^.tlumaczenie:=s1;
   nowy^.wiersz:=root^.wiersz+1;
   root^.pn:=nowy;
  end;


end;
procedure w_usun(var root:wska);           //usuwa cala liste oprocz korzenia
var
  tmp:wska;
begin

  while(root<>nil) do
        begin
           tmp:=root;
           root:=root^.pn;
           dispose(tmp);
           tmp:=nil;


        end;
  lista:=w_nowy;
end;
procedure w_wyswietl(root:wska;nr:integer);  //funkcja wyswietlajaca na ekranie liste. umozliwia przesuwanie ekranu konsoli w gore i w dol
begin
   if root<>nil then
     begin
         if (root^.wiersz>l) and (root^.wiersz<h) then
           begin
                if (nr<>root^.wiersz) then writeln(root^.wiersz,'. ',root^.slowo)
                else
                begin
                     textcolor(2);
                                  writeln(root^.wiersz,'. ',root^.slowo,' - ',root^.tlumaczenie)  ;
                     textcolor(15);
                end;

          end;
          w_wyswietl(root^.pn,nr);
     end;
end;
procedure dodaj(root:wsk;s,s1:string);         //dodaje nowy element drzewa trie
 var c:char;i:integer;p:wsk;pyt:char;
begin
     for i:=1 to length(s) do
     begin
         if (root^.next[s[i]]<>NIL) then root:=root^.next[s[i]]
         else
         begin
            p:=nowa();
            root^.next[s[i]]:=p;
            root:=p;
         end;
     end;
     if root^.koniec=true then
     begin

     end
     else
     begin
          root^.koniec:=true;
          root^.slowo:=s;
          root^.tlumaczenie:=s1;

     end;
end;
procedure time_start;                //procedura pobierajaca aktualny stan zegara procesora
begin
QueryPerformanceCounter(TimeStart);
end;
procedure time_stop();           //procedura pobierajaca aktualny stan zegara procesora i wyliczajaca roznice w ms. pomiedzy tym a poprzednim pomiarem
begin
QueryPerformanceCounter(TimeEnd);
f_time:=((timeend-timestart)/freq)*1000;
writeln('Wyszukanie skonczono w :',f_time:2:6,' ms');
end;

function szukaj(root:wsk;s:string;var przesuniecia:integer):string; // wyszukiwanie konkretnego slowa w drzewie trie
var c:char;i:integer;p:boolean;
begin
     p:=true;
     for i:=1 to length(s) do
     begin
         if root^.next[s[i]]=NIL then
            begin
              p:=false;
              break;

            end
         else
         begin
              root:=root^.next[s[i]];
              inc(przesuniecia);
         end;

     end;
     if(root^.koniec=true) and(p=true) then
        begin
        szukaj:=(root^.slowo+' ->'+root^.tlumaczenie);
        end
     else szukaj:=(' -> brak w slowniku');
end;
procedure wypisz(root:wsk;var licznik:integer;root2:wska); // funkcja przepisuje slowa z drzewa zaczynajace sie konkretna litera do listy wyswietlajacej
var c:char;i:integer;p:wsk;
begin
if root<>nil then begin
  if root^.koniec then
     begin
      licznik:=licznik+1;
      w_dodaj(root2,root^.slowo,root^.tlumaczenie);
     end;
  for c:=low(char) to high(char) do
    if root^.next[c]<>nil then wypisz(root^.next[c],licznik,root2);
    end;
end;
procedure wyswietlacz_listy(c:char;kind:integer);        //przesuwanie listy gora dol
var
    kier:char;
    liczba_el,nr:integer;
begin
  liczba_el:=1;

if (ord(c)<>13) then
   begin
        if   QueryPerformanceFrequency(Freq) then
        begin
        time_Start;
        wypisz(enpl[kind]^.next[c],liczba_el,lista);
        time_stop;

        end;

   end
   else
      begin
        if   QueryPerformanceFrequency(Freq) then
        begin
        time_Start;
        wypisz(enpl[kind],liczba_el,lista);
        time_stop;

   end   ;

      end;


readln;

 nr:=l+1;
      repeat
                  clrscr;

                         w_wyswietl(lista,nr);
                         kier:=readkey;
                                     if kier='w' then
                                        begin
                                         if (nr-1>l) then
                                            begin
                                                 dec(nr);
                                            end
                                         else if nr-1<=l then
                                            begin
                                             if (l-1>=0) then
                                                begin
                                                     l:=l-24;
                                                     h:=h-24;
                                                     dec(nr);
                                                end;
                                            end;
                                        end;
                                     if kier='s' then
                                        begin
                                          if (nr+1<h) and (nr+1<liczba_el) then
                                             begin
                                                 inc(nr);
                                             end
                                          else if(nr+1>=h) then
                                             begin
                                                       h:=h+24;
                                                       l:=l+24;
                                                       inc(nr);
                                             end;
                                        end;
                  until kier='q';
                         w_usun(lista);



end;

function waliduj(s:string):boolean;               //walidacja czy char nie jest liczba
var
    code,l:byte;
begin
waliduj:=false;
              val(s,l,code) ;
              if code<>0 then waliduj:=true;
end;

procedure wybierz();   //glowne cialo programu
var
  w,licznik,kind:integer;
  c:char;

begin
kind:=1;
     repeat
     l:=0;
     h:=24;
     w:=0;
     licznik:=0;
    clrscr;
    if kind=1 then writeln('Slownik Angielsko-Polski')
    else if kind=2 then writeln('Slownik Polsko-Angielski');
    writeln('                1)Dodaj slowo                  ');
    writeln('                2)Wyszukaj tlumaczenie         ');
    writeln('                3)EN-PL / PL-EN                ');
    writeln('                4)Wyswietl slownik             ');
    writeln('                5)Zakoncz                      ');
    write('wybor :');
    readln(x);
              if (x=1) then
                 begin
                  write('slowo: ');
                  readln(slo);
                  writeln();
                  write('tlumaczenie: ');
                  readln(tlu);
                  writeln;
                  dodaj(enpl[kind],slo,tlu);
                 end;
              if (x=2) then
                 begin
                  write('slowo: ');
                  readln(slo);
                  writeln();

                   if QueryPerformanceFrequency(Freq) then
                    begin
                         time_start;
                         slo:=szukaj(enpl[kind],slo,licznik);
                         time_stop;

                    end;
                  writeln(slo);
                  writeln('wykonano ',licznik,' przesuniec w galezi drzewa');
                  readln;
                 end ;
              if (x=4) then
                 begin
                  write('Slowa zaczynajace sie na litere [enter=cala baza]: ');
                  readln(c);
                  if waliduj(c)=true then
                  wyswietlacz_listy(c,kind);


                 end;
              if (x=3) then
              begin
                   if kind=1 then kind:=2
                   else kind:=1;
              end;

  until x=5;
end;
function trim(s:string):string;                     //funkcja obcina spacje na poczatku i koncu stringa
var i:integer;
    p:integer;
begin
  for i:=1 to length(s) do
  begin
      if s[i]<>' ' then
         begin
          p:=i;
          break;
          end;
  end;
  s:=copy(s,p,length(s));
    for i:=length(s) downto 1 do
    begin
    if(s[i]<>' ') then
       begin
        p:=i;
        break;
       end;
    end;
    trim:=copy(s,1,p);
end;
function podziel_slowa(s,s2:string):tablica;        //dzieli stringa na mniejsze, wyznacznikiem podzialu jest przecinek
var
  p,i,n:integer;
  tab:tablica;
begin
  p:= pos(',',s);
  i:=1;
  while(p<>0) do
     begin
     tab[i]:=trim(copy(s,1,p-1)) ;
     delete(s,1,p);
     p:= pos(',',s);
     inc(i);
     end;
  tab[i]:=trim(s);
  for  n:=1 to i do
       dodaj(enpl[2],tab[n],s2);
end;
procedure stri(st:string);      //funkcja dzieli stringa pobrane z pliku na dwa mniejsze, enpl od 1 znaku do 16 a drugi od 16 do konca
var                             //nastepnie wywoluje funkcje podziel_slowa dla stringa przechowujacego polskie tlumaczenie
  s1:string;
  s2:string;
begin
  trim(st);
  st:=lowercase(st);
  if (length(st)>0) then
     begin
          s1:=trim(copy(st,1,16));
          delete(st,1,16);
          s2:=trim(st);
          dodaj(enpl[1],s1,s2);

     end;
  podziel_slowa(s2,s1);
end;
procedure wczytaj_plik();         //wczytywanie pliku
var
  F:text;
  s:string;
begin

  Assign(f,'slownik.txt');
  reset(f);
           while not eof(f) do
              begin
                 readln(f,s);
                 stri(s);
              end;
  close(f);
end;

begin
  textcolor(15);   //zmiana koloru czcionki
  l:=0;            //zmienna odpowiadajaca za najnizszy nr. wyswietlanego slowa przez funkcje wyswietlacz
  h:=25;           //podobnie jak zmienna l, ale odpowiada za najwyzszy.
  enpl[1]:=nowa;
  enpl[2]:=nowa;//enpl to root dla drzewa trie
  lista:=w_nowy;     //lista to root dla listy
  wczytaj_plik();         //wczytanie pliku
  wybierz;
end.


 
1

Przecież ten kod masz wytłumaczony, opisy są zaraz po takich dwóch kreseczkach ukośnych, przykład:

procedure (blablabla);  //funkcja wyswietlajaca na ekranie liste. umozliwia przesuwanie ekranu konsoli w gore i w dol

:)

0

tak ale potrzebuje bardziej dokładnego tłumaczenia :( nie ogarniam za bardzo USS dlatego proszę o wytłumaczenie tego kodu :(

usunięcie cytowania całego poprzedniego posta - furious programming

0

Bardziej się nie da. Ale jak przeczytasz byle kurs paskala, zaczniesz rozumieć to co masz w komentarzach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1