pascal: pomoc w sprawie programu

0

witam

mam do napisania taki program:

Pomoc dla studentów medycyny: uzytkownik podaje ciag liter, program wyszukuje w pliku
tekstowym (słowniku) słowa, które zawieraja w sobie te litery i wypisuje dziesiec najlepiej
pasujacych. Kryterium oceny pasujacego słowa moze byc na przykład jego długosc (im dłuzsze
słowo tym nizsza ocena). Uwaga: program powinien uwzgledniac powtórzenia liter podanych
przez uzytkownika (chodzi o sytuacje, gdy uzytkownik podaje literki na przykład ’tta’ - wówczas
słowo ’tata’ pasuje, a ’auto’ juz moze nie pasowac).

mam problem z napisaniem dwoch procedu.
a mianowicie jak wczytac litery zeby byly one w tablicy i zebym mogl pozniej z nimi jakos pracowac,
i drugie, jak napisac procedure, która bedzie sprawdzala czy dana litera jest w wyrazie i jak ewentualnie jest to gdy bedzie sprawdzana kolejna litera to nie bedzie uwzgledniona ta, co już zostala znaleziona.

bardzo prosze o jakakolwiek pomoc, bo nie moge sobie z tym poradzic

0
type TCHRARRAY = array of char;

function StringToTable(tekst:string):TCHRARRAY;
var
 i : integer;
begin
 setLength(result,length(tekst));
 for i:= 0 to length(tekst) -1 do
  begin
    result[i] := tekst[i+1];
  end;
end;

To jedno rozwiązanie, ale generalnie możesz po prostu ze stringa wyciągać poszczególne znaki odwołując się jak do tablicy czyli:

var
 znak : char;
begin
 znak := tekst[numerznaku];
end;

powtarzając to w pętli...

a jeśli chodzi o drugą procedurę to możesz to zrobić korzystając z tej powyższej w taki sposób:

function SprawdzZgodnosc(ZnakiWpisane, Slowo : string):TCHRARRAY;
var
 tablicaWpisane, tablicaSlowo,tablicaWynik : TCHARARRAY;
 i,j : integer;
begin
 tablicaWpisane := StringToTable(ZnakiWpisane);
 tablicaSlowo := StringToTable(Slowo);
 for i:= low(tablicaWpisane) to high(tablicaWpisane) do
  begin
    if tablicaWpisane[i] = '@' then break;
    for j:= low(tablicaSlowo) to high(tablicaSlowo) do
      begin
        if tablicaSlowo[j] = '@' then break;
        if tablicaWpisane[i] = tablicaSlowo[j] then
          begin
            setLength(tablicaWynik,high(tablicaWynik)+2);
            tablicaWynik[high(tablicaWynik)] := tablicaWpisane[i];
            tablicaWpisane[i] := '@';
            tablicaSlowo[j] := '@';
          end;
      end;
  end;
  result := tablicaWynik;
end;

Pisałem z palca więc może się coś wywrócić, ale idea jest taka:
Przechodzisz przez wszystkie elementy drugiej tablicy dla 1-go elementu pierwszej, i gdy znajdziesz odpowiadające znaki to dopisujesz znak do tablicy wynikowej i zamieniasz w wejściowych na jakiś znak (w tym wypadku @). Przy natępnych iteracjach, algorytm nie bierze pod uwagę znaków @ więc nie będzie powtórzeń. W wyniku dostajesz tablicę pasujących znaków, a odczytując jej długość i znając długość ciągów wejściowych możesz sobie sprawdzić stopień dopasowania.

Powtarzam że nie sprawdzałem tego algorytmu, więc możliwe że trzeba będzie coś poprawić.

Pozdrówka

0

http://en.wikipedia.org/wiki/Category:Pattern_matching
Istotny jest język, np. soundex jest odpowiedni dla języka angielskiego (może też dla łaciny).

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