Słownik(drzewo binarne) - pascal

0

Witam.
Zgłaszam się do was o poradę po raz drugi, a za poprzednią bardzo dziękuję!

Mam do napisania tłumacz polsko-angielski, angielsko-polski. Plik słownika może być dowolnej długości i ma być w formie:

kot cat
pies dog
ryba fish

Mam wykorzystać do tego drzewo binarne. Dla jezyka polskiego zbudowane jest w ten sposób, ze wyrazy, które stoją wcześniej w porządku alfabetycznym są po lewej stronie wezła, a te, które stoja pózniej – po prawej stronie. Te same elementy, które
naleza do drzewa dla jezyka polskiego, sa takze elementami drzewa dla jezyka angielskiego zbudowanego według porzadku alfabetycznego wyrazów angielskich.
No i tu mam pierwszą wątpliwość. Koncept drzewa binarnego rozumiem jednak zastanawiam się jak porównać wyrazy alfabetycznie, żeby odpowiednio wstawić je do drzewa i czy w korzeniu ma być wyraz, który jest w 'alfabetycznym środku'? I patrząc na kolejne węzły: w prawym węźle ma być słowo, które jest następne alfabetycznie(czy po prostu, takie, które jest dalej w alfabecie, ale niekoniecznie następne?) a w lewym poprzednie(czy niekoniecznie?)? Jeżeli muszą być po kolei, czyli, że najbardziej w prawym dole jest ostatnie alfabetycznie słowo a najbardziej w lewym dole jest słowo pierwsze, to jak porównać te słowa i je odpowiednie ułożyć?

Generalnie trochę zagmatwałem pewnie więc TL/DR: Jak ułożyć wyrazy w porządku alfabetycznym i jak wprowadzić je do drzewa?

I jeszcze jedno pytanie niezwiązane z samym tłumaczem, ale nigdy czegoś takiego nie robiłem i byłbym wdzięczny za wskazówkę jak to zrobić?:
Program uruchamiany jest z linii polecen z wykorzystaniem następujących przełączników:
-s plik wejsciowy słownika
-i plik wejsciowy z tekstem do przetłumaczenia
-o plik wyjsciowy z przetłumaczonym tekstem
-k kierunek tłumaczenia

Z góry dziękuję za pomoc.

EDIT: Już wiem, że to co napisałem z drzewem binarnym jest bez sensu, po prawej nie musi być następne słowo a po lewej nie musi być po przednie, tak jest tylko w przypadku gdy lewy/prawy węzeł nie ma już dalszych synów, rozumiem. Pytanie jednak dalej zostaje, jak wprowadzać te słowa do drzewa?

EDIT2: Oh my! Rozumiem, przy dodawaniu każdego słowa, zaczynam od korzenia, czyli nie ma opcji, że jakimś cudem po prawej stronie znajdzie się coś większego od korzenia. Mój błąd, źle zrozumiałem drzewo binarne. Jak porównać jednak, które słowo jest dalej w alfabecie, a które bliżej? Z tą wiedzą spróbuję sobie z tym teraz poradzić. Z góry dzięki!

0

To z czym masz problem?

0

Przełączniki! Prosiłbym o pomoc z przełącznikami : ). Dzięki z góry.

1
for I:=1 to ParamCount() do
begin
  WriteLn(ParamStr(I));
end;
0

A jakiś mądry sposób na wczytanie do stringa pierwszego słowa w linii? Bo drugiego (angielskiego) nie ma problemu, po prostu readln po spacji, a tutaj? Trzeba wszystko do spacji wczytać z tym, że nie wiem jak. Jak traktuje mojego stringa jak tablicę charów to wywala mi błąd przy pracy programu.

0

Albo ręcznie przewertuj w pętli łańcuch w poszukiwaniu białego znaku, albo skorzystaj z ExtractStrings, albo połącz Copy/LeftStr z Pos - to jeśli chodzi o wyciągnięcie części ciągu do pierwszej spacji;

Jeśli chcesz sprawdzać po każdorazowym wciśnięciu klawisza czy to spacja to skorzystaj z pętli i wprowadzaj znak po znaku, a nie całą linię (bo zakończysz ją dopiero wciskając Enter); Proponowałbym wczytać całą linię, po jej zatwierdzeniu klawiszem Enter sprawdzić jej zawartość i odpowiednio zareagować;

0

No właśnie tak zrobiłem. Wczytałem całą linie i teraz chciałbym ją podzielić na 2 wyrazy (w każdej linii są 2 wyrazy) i nie umiem sobie poradzić z tym ExtractStrings, potrzebuje dziwnych typów zmiennych.

Mam linie wczytaną do zmiennej linia, co muszę zadeklarować i w pisać pod 'Foo' i 'Memo1.Lines'?

ExtractStrings([',', ';'], [], Foo, Memo1.Lines);

EDIT: ok, zrobiłem z leftstr i rightstr. Dzięki wielkie za pomoc : ). Code on.

0

To skorzystaj z Pos i Copy.

0

Wczytałem całą linie i teraz chciałbym ją podzielić na 2 wyrazy (w każdej linii są 2 wyrazy)

Jeśli chcesz użyć ExtractStrings to musisz mieć osobną zmienną - nie możesz wykorzystać do tego celu pola TMemo.Lines pomimo tego, że sa tego samego typu;

0

tak właśnie zrobiłem, obędzie się bez extractstrings. Dzięki wielkie za pomoc! Code on.

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