Program do koniungacji czasowników włoskich

Odpowiedz Nowy wątek
2019-01-11 21:12
0

Zachęcony do programowania obiektowego, zacząłem trochę dłubać i powolutku próbuje zrozumieć o co w tym wszystkim chodzi. Oczywiście wciąż mam duże problemy dlatego proszę o dozę wyrozumiałości w tłumaczeniu pewnym aspektów ;)

Postanowiłem ostatnio pobawić się trochę w Lazarusie, a jako, że studiuję filologię i pasjonuję się językami to postanowiłem zrobić prosty program, w którym mógłbym wpisać czasownik, a program sam by to słowo odmienił.
Tak wyglada program

a tutaj kod. I mam takie pytanie
Jak dodawać wyjątki od reguł? Tworzyć nowe funkcje czy tak jak teraz to robiłem czyli jedna pod drugą? Wydaje mi się to mocno ślamazarne, ale nie bardzo miałem pomysł jak to ogarnąć może poza jakimś if'em.

Z góry dziękuję za pomoc :)

/ Edit: zaznaczam, że w kodzie mogą pojawiać się zmienne nieużyte w programie. To efekt tego, że kombinuję ciągle i bawię się na różne sposoby jak to zrobić :)

unit unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, StrUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TMainForm }

  TMainForm = class(TForm)
    btnOK: TButton;
    lblFirstSingularPresentIndicative: TLabel;
    lblSecondSingularPresentIndicative: TLabel;
    lblThirdSingularPresentIndicative: TLabel;
    lblFirstPluralPresentIndicative: TLabel;
    lblSecondPluralPresentIndicative: TLabel;
    lblThirdPluralPresentIndicative: TLabel;
    VerbEdit: TEdit;
    PersonBox: TGroupBox;
    lblFirstSingular: TLabel;
    lblSecondSingular: TLabel;
    lblThirdSingular: TLabel;
    lblFirstPlural: TLabel;
    lblSecondPlural: TLabel;
    lblThirdPlural: TLabel;
    procedure btnOKClick(Sender: TObject);
    procedure PersonBoxClick(Sender: TObject);
    procedure VerbEditChange(Sender: TObject);
  private

  public

  end;

var
  MainForm: TMainForm;
  StringLenght: Integer;
  Verb: String;
    k: String;
  L: Integer;
  X : Boolean;

implementation

{$R *.lfm}

{ TMainForm }

procedure TMainForm.VerbEditChange(Sender: TObject);
begin
  Verb := Trim(LowerCase(VerbEdit.Text));
  L := Length(Verb);
end;

procedure TMainForm.btnOKClick(Sender: TObject);
begin
  X := AnsiEndsStr('are', Verb);
  if X = true then
  begin
    Delete(Verb, L-2, 3);
    lblFirstSingularPresentIndicative.Caption := LowerCase(Verb + 'o');
    lblSecondSingularPresentIndicative.Caption := LowerCase(Verb + 'i');
    lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'a');
    lblFirstPluralPresentIndicative.Caption := LowerCase(Verb + 'iamo');
    lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ate');
    lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ano');
  end;
  X := AnsiEndsStr('ere', Verb);
  if X = true then
  begin
    Delete(Verb, L-2, 3);
    lblFirstSingularPresentIndicative.Caption := LowerCase(Verb + 'o');
    lblSecondSingularPresentIndicative.Caption := LowerCase(Verb + 'i');
    lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'a');
    lblFirstPluralPresentIndicative.Caption := LowerCase(Verb + 'iamo');
    lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ete');
    lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ono');
  end;

  X := AnsiEndsStr('ire', Verb);
  if X = true then
  begin
    Delete(Verb, L-2, 3);
    lblFirstSingularPresentIndicative.Caption := LowerCase(Verb + 'o');
    lblSecondSingularPresentIndicative.Caption := LowerCase(Verb + 'i');
    lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'e');
    lblFirstPluralPresentIndicative.Caption := LowerCase(Verb + 'iamo');
    lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ite');
    lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ono');
  end;
end;

procedure TMainForm.PersonBoxClick(Sender: TObject);
begin

end;

end.
edytowany 1x, ostatnio: soob, 2019-01-11 21:14

Pozostało 580 znaków

2019-01-11 21:31
4

Ciężko coś powiedzieć, bo nie znam za bardzo reguł włoskiej deklinacji, ale zakładając, że większość czasowników jest regularna/odmienia się zgodnie z jakimś schematem/zasadami, to bym zrobił następująco:

1) stworzyć listę czasowników nieregularnych, do których trzeba będzie ręcznie wpisać ich poszczególne formy. To aż się prosi o umieszczenie w jakiejś tablicy
2) po otrzymaniu od użytkownika wyrazu, który chcesz odmienić (czy co tam konkretnie chcesz z nim robić) sprawdzasz w tablicy z pkt. 1, czy ten wyraz się w nim znajduje. Jeśli jest, to wypisujesz to, co jest do niego przypisane w tablicy
3) jeśli jednak danego wyrazu nie ma w tablicy, to znaczy, że się powinien odmieniać regularnie, w związku z czym przepuszczasz go przez algorytm, który dopisuje odpowiednie końcówki (lub robi cokolwiek innego).
4) nie wiem, na ile to dla Ciebie jest zabawa/ćwiczenie, a na ile ten program ma się do czegoś przydać. Jeśli ma być wykorzystywany, to chyba koniecznością jest jakieś zapisywanie wprowadzonych wcześniej wyników do bazy, żeby potem można było je załadować. W związku z tym proponuję się zainteresować SQLite - niby baza SQL, ale mega prosta w obsłudze.

To, co napisałeś - może i działa, ale moim zdaniem nadaje się do poprawki. Zobacz - praktycznie większość kodu to jest powtarzanie tego samego. Dla trzech wariantów (ORE, ARE, IRE) masz praktycznie do samo, takie kopiuj-wklej. Zastanów się, jakie operacje tam wykonujesz i wyodrębnij je do osobnej funkcji, która będzie wywoływana z odpowiednim parametrem.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-01-12 23:07

Pozostało 580 znaków

2019-01-11 21:38
0

Hej, dzięki za odpowiedź!
Wiesz co. Na razie bawię się. Jako, że uczę się włoskiego to fajnie byłoby go używać tylko do sprawdzenia formy, oczywiście jakby się udało to może kiedyś go rozbuduję do większej ilości czasów, trybów itd. W tej chwili mam czas teraźniejszy z końcówkami -are, -ere i -ire i działa. Oczywiście nie uwzględnia b. wielu czynników, z którymi będzie problem jak np. akcent wyrazowy, ale o tym pomyślę później. Pomysł z bazą nie jest głupi i z pewnością o tym pomyślę, tyle, że obecnie ja dopiero próbuję zrozumieć programowanie obiektowe więc chcę małymi krokami :)

Obecnie zrobiłem tak, że funkcja AnsiEndsStr sprawdza zmienna Verb posiada na końcu jeden z trzech ciągów (mianowicie -are, -ere i -ire) i jeżeli tak to uruchamia if'a który dodaje odpowiednie końcówki.

Co myślisz o takim pomyśle by część czasowników nieregularnych czytał z pliku jakiegoś? Tzn. w pliku znajdowałaby się lista czasowników i jeżeli by znalazł to wykonywał by konkretną funkcję. Tyle, że zdaje sobie sprawę, że przy pewnych czasownikach to może nie zdać egzaminu, ale co sądzisz samym pomyśle?

Pozostało 580 znaków

2019-01-11 21:45
1

Po pierwsze - nie chcę zniszczyć Twojego światopoglądu, ale to co napisałeś nie ma za wiele wspólnego z projektowaniem obiektowym. Owszem, TForm1 jest obiektem posiadającym elementy - przyciski, edity itp, ale na tym obiektowość się kończy :P

Co do bazy - wbrew pozorom. SQL (a zwłaszcza SQLIte) to prosty temat. Oczywiście - stworzenie skomplikowanych aplikacji z tysiącami użytkowników i bazami rosnącymi w TB to zupełnie inna liga, ale zrobienie prostej bazy, do której się zapisze/z której się odczyta listę słówek to zadanie proste. W mojej ocenie nawet prostsze, niż samodzielne walczenie z jakimś plikiem trzymającym listę słów, jego odczytywaniem, zapisywaniem, modyfikacjami itp. W przypadku SQL zasadniczo wszystko się ogranicza do wydania jednego polecenia - INSERT dopisuje dane, UPDATE poprawia itp.

A co do wykrywania słów i ich automatycznego przerabiania - jak pisałem wcześniej, totalnie nie znam tego języka, więc może nie mam racji, ale moim zdaniem możliwa jest taka sytuacja, w której danego słowa nie ma na liście wyjątków, więc program potraktuje je jako przypadek regularnej odmiany, w związku z czym wypisze jakieś głupoty. Czy jest taka możliwość?


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-11 21:55
0

Jasne, że jest. Jak każdy język, włoski rządzi się swoimi prawami i taki przypadek pewnie by się znalazł chociaż tak na szybko nic nie przychodzi mi do głowy :)
Co do programowania obiektowego to nie obrażam się ani nic, bo tak jak mówiłem, nie zawsze wiem jak go użyć i kiedy. Tutaj bawiłem się w formach więc założyłem, że to raczej już obiektowość. Nie bardzo mam pomysł jak zrobić to w jakiejś klasie czy coś dlatego na razie tak karkołomnie to wygląda. :)

Co do tej bazy to skoro mówisz, że tak to wygląda to może faktycznie spróbuje sił w tym :)

Pozostało 580 znaków

2019-01-11 21:58
2

Zasadniczo fakt, że w kodzie się skorzysta z obiektów nie czyni od razu kodu obiektowym. Tak samo, jak Polonez na torze rajdowym nagle nie stanie się wyścigówką ;)
Aczkolwiek rozumiem, że się uczysz, więc ze spokojem, wszystko w swoim czasie. I żeby nie było niedomówień - nie krytykowałem Cię ani tego co napisałeś, tylko chciałem, żebyś miał świadomość, że to nie jest OOP.

Na razie, zamiast skupiać się na obiektowości, na Twoim miejscu zająłbym się raczej uzyskaniem takiej ogólnej biegłości w Pascalu. Pierwszym zadaniem które powinieneś wykonać (o którym zresztą pisałem we wcześniejszych postach) jest usunięcie tych powtarzających się elementów i zrobienie z tego jakiejś funkcji/procedury.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-11 21:59
0

Okej
Tak spróbuję zrobić :) Dziękuję bardzo jeszcze raz za merytoryczną pomoc!

robim co możem ;) - cerrato 2019-01-11 22:00

Pozostało 580 znaków

2019-01-12 21:45
1

I jak - czy udało Ci się coś pchnąć do przodu, czy nie miałeś czasu, żeby do tematu przysiąść?


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-01-12 22:24
0

Wiesz co - za dużo czasu nie miałem, ale próbowałem trochę. Niestety sposób na jaki wpadłem też pewnie jest mało dobry, ale tak

Stworzyłem procedurę Conjugation, która w jakiś sposób usprawnia to, ale to chyba jeszcze nie to co można by pochwalić

procedure TMainForm.Conjugation;
begin
  CheckedVerb := AnsiRightStr(Verb, 3);
  if (CheckedVerb = 'are') or (CheckedVerb = 'ere')
  or (CheckedVerb = 'ire') then
  begin
        Delete(Verb, L-2, 3);
    lblFirstSingularPresentIndicative.Caption := LowerCase(Verb + 'o');
    lblSecondSingularPresentIndicative.Caption := LowerCase(Verb + 'i');
    lblFirstPluralPresentIndicative.Caption := LowerCase(Verb + 'iamo');
  end;
    if CheckedVerb = 'are' then
    begin
      lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'a');
      lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ate');
      lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ano');
    end;
    if CheckedVerb = 'ere' then
    begin
        lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'e');
        lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ete');
        lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ono');
    end;
    if CheckedVerb = 'ire' then
    begin
        lblThirdSingularPresentIndicative.Caption := LowerCase(Verb + 'e');
        lblSecondPluralPresentIndicative.Caption := LowerCase(Verb + 'ite');
        lblThirdPluralPresentIndicative.Caption := LowerCase(Verb + 'ono');
    end;
end; 

Próbowałem tez stworzyć tablice znaków i ładować do niej słowo i potem dodawać końcówki itd, ale jest wiele innych problemów, których w ten sposób nie ogarnę.

Myślę nad jakimś usprawnieniem tego, ale nie wiem czy wymyślę szybko coś lepszego :) Ale na bank będę próbował

edytowany 4x, ostatnio: soob, 2019-01-12 22:47

Pozostało 580 znaków

2019-01-12 22:48
2

Szczerze mówiąc to myślałem o trochę innym rozwiązaniu.

Po pierwsze - w Twoim pierwszym poście masz 3 razy powtórzone to samo - po każdym z trzechIF masz delete a potem 6 razy zmieniasz wartości różnych caption. Lepiej by było te captiony dać do osobnej procedury, która potem zostanie wywołana z parametrami. Coś w stylu ChangeCaptions('o', 'i', 'a', 'io'....). Nie jest to rozwiązanie idealne, ale na razie nie ma co wchodzić na wyższe poziomy skomplikowania ;)

Taka uwaga techniczna - jeszcze trochę się doczepię do tych IF'ów. Obecnie masz zapisane to w postaci X := AnsiEndsStr('are', Verb); if X = true then. Po pierwsze - sprawdzając warunek przy IF nie musisz robić porównania. IF potrzebuje do działania wartości TRUE albo FALSE, ale przecież tą wartość masz już zapisaną w zmiennej X, więc równie dobrze możesz napisać if X then. Ale tak właściwie to po co wprowadzać zmienną X? Z tego co widzę, to nie robi ona niczego, poza zapisaniem wyniku zwróconego przez funkcję, w związk z czym zmienną X można całkowicie wyeliminować, a podanego kilka linii wyżej IF'a zapisać w postaci if AnsiEndsStr('are', Verb) then.....

A co do fragmentu "jest wiele innych problemów, których w ten sposób nie ogarnę" - napisz konkretnie co chcesz zrobić i z czym masz problem, a pewnie coś wyczarujemy :)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-01-12 22:50

Pozostało 580 znaków

2019-01-12 22:55
0

W tym nowym kodzie, który wrzuciłem (chodzi o tę procedurę Conjugation) całkowicie zrezygnowałem z tego AnsiEndsStr.
Użyłem procedury AnsiRightStr, która sprawdza 3 ostatnie znaki zmiennej Verb i potem w If'ie sprawdza czy było 'ere', 'are' czy 'ire'.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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