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-19 23:49
0

Ze spokojem, jak coś chcesz wiedzieć to pytaj.

Odnośnie ostatniej kwestii - przecież sam możesz sprawdzić, co się stanie z bazą, jak odpalisz CREATE TABLE na istniejącej tabeli :P

Porada 1: https://www.sqlite.org/lang_createtable.html: "It is usually an error to attempt to create a new table in a database that already contains a table, index or view of the same name" (czyli mówiąc prościej - wywali jakiś błąd, ale tabeli nie wyczyści).

Porada 2: można zrobić lekką modyfikację i zapisać to w postaci create table if not exists :) http://www.sqlitetutorial.net/sqlite-create-table/


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-19 23:54

Pozostało 580 znaków

2019-01-20 12:34
0

Siedzę już długo nad tym i przejrzałem z milion stron, ale nie jestem wstanie dojść jak mam wyszukać zmiennej Verb w tej bazie. Próbowałem jakimiś metodami typu 'SELECT verb_name FROM ireverbs WHERE verb_name LIKE @Verb', ale nic nie działa. Nie wiem jak porównać wartości zmiennej w Delphi i to co szuka w SQLite. W ogóle nie mogę zrozumieć, kiedy coś się wykonuje w tym SQLu, a kiedy nie, bo na razie całkowicie z tym stanąłem w miejscu.

Dobra, mały update: Udało mi się zrobić żeby program szukał w bazie :D Ależ jestem szczęśliwy!

SQLiteTabela := SQLiteBaza.GetTable('SELECT * FROM ireverbs');
  if Verb = SQLiteTabela.FieldByName['verb_name'] then
  Result := true;
  SQLiteTabela.Free;

Mały problem jest tylko taki, że nie wiem jak zrobić żeby program przeleciał przez całą bazę, bo na razie szuka tylko pierwszego rekordu w bazie:P

Próbowałem coś takiego, ale wywala mi błąd

  while not SQLiteTabela.EOF do
  begin
    SQLiteTabela := SQLiteBaza.GetTable('SELECT * FROM ireverbs');
    if Verb = SQLiteTabela.FieldByName['verb_name'] then
    begin
        SQLiteTabela.Next;
      Result := true;
    end;
        SQLiteTabela.Free;
  end;
end;  
edytowany 1x, ostatnio: soob, 2019-01-20 13:42

Pozostało 580 znaków

2019-01-20 14:05
0

Udało się! Po 100 próbach napisałem coś takiego i wychodzi na to, że działa :D

SQLiteTabela := SQLiteBaza.GetTable('SELECT * FROM ireverbs');
 for i := 1 to SQLiteTabela.RowCount do
 begin
   if Verb = SQLiteTabela.FieldByName['verb_name'] then
   Result := true
   else SQLiteTabela.Next;
 end;
 SQLiteTabela.Free;

Nie wiem czy to optymalne rozwiązanie, ale na razie nic nie wymyślę ponad to, a i tak z tego jestem dumny :D

Pozostało 580 znaków

2019-01-20 15:09
1

w załączniku masz prosty przykład obsługi sqlite w lazarusie.


pozdrawiam
paweld

Pozostało 580 znaków

2019-01-20 15:16
0

Dzięki! Tutaj widzę jest obsługa z komponentami, a na razie z tego co widzę nie potrzebuję tego, ale dziękuję, bo może przyda się na przyszłość :)

Pozostało 580 znaków

2019-01-20 17:58

SQLiteTabela := SQLiteBaza.GetTable('SELECT * FROM ireverbs'); for i := 1 to SQLiteTabela.RowCount do

Nie wiem czy to optymalne rozwiązanie

To rozwiązanie ma jeden plus - działa. Ale tu jego plusy się kończą :P

To co zrobiłeś praktycznie nie różni się zanadto od działania z plikiem tekstowym. I tu i tam wczytuje się wszystkie dane, a potem w nich grzebie i stara się znaleźć potrzebny element. SQL totalnie nie tak ma działać. W przypadku SQL masz tak zaprojektować zapytanie, żeby silnik SQL sam przeszukał dane i zwrócił Ci to, co jest potrzebne, bez konieczności dalszego przesiewania uzyskanych danych.

Widzę, że 2 posty wyżej @Paweł Dmitruk dał Ci gotowy przykład. Przejrzyj go, postaraj się zrozumieć, jak jego program działa, a potem daj znać, czy wiesz już jak porządnie wysłać zapytanie do SQL'a, czy potrzebna jest pomoc.

Podpowiedź 1 : SELECT * FROM xxx WHERE yyy.
Gwiazdka oznacza że ma pobrać wszystkie kolumny. Jeśli potrzebujesz tylko jedną albo kilka, zamiast gwiazdki możesz wstawić nazwy tych kolumn, na których Ci zależy
Po WHERE dajemy warunek - coś w stylu WHERE rok_urodzenia > 1980. https://www.w3schools.com/sql/sql_where.asp

Podpowiedź 2: skoro odpytujesz bazę ze słówkami nieregularnymi, to niekoniecznie musisz coś z niej pobrać (to dotyczy "drugiego sposobu odmiany"). Wystarczy informacja, że rowCount jest większy od zera - oznacza to, że dane słowo jest w bazie. Nie musimy go pobierać, wystarczy że wiemy, że słowo tam się pojawia. Co innego w przypadku totalnie nieregularnych - w takim przypadku musimy pobrać wartość wszystkich kolumn/wszystkich form danego słowa, żeby je wyświetlić użytkownikowi (bo ponieważ są to słowa totalnie nieregularne, nie da się ich poszczególnych form wytworzyć automatycznie, więc trzeba je wczytać skądś, w naszym przypadku z bazy).


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-20 21:23
0

And you've burst my bubble aż wypada powiedzieć zostając w nomenklaturze obcojęzycznej :P

A więc tak - w tej bazie jest jedna kolumna to nie wiem czy to jakaś różnica czy dam * czy verb_name, ale powiedzmy, że napiszę SELECT verb_name FROM ireverbs to problem zaczyna się w miejscu, gdzie muszę napisać warunek do WHERE, bo nie mogę znaleźć jak porównać to co wpisałem do zmiennej Verb z tym co jest w bazie. Jedyny sposób jaki zadziałał to ten co widać w poście wyżej :)

Ten program @Paweł Dmitruk trudny do zrozumienia się wydaje, bo masa funkcji, których nie widziałem nigdy i trochę ciężko się połapać.
Próbowałem trochę kombinacji w stylu SELECT verb_name FROM ireverbs WHERE verb_name =' +Verb+, no ale nic z tego. Nie wiem jak mam się odnieść do tej zmiennej.

Co do tej podpowiedzi drugiej to w ogóle nie rozumiem co masz na myśli, że nie musi nic pobierać z bazy. Ta funkcja teraz nic nie pobiera tylko sprawdza czy słowo występuje w bazie dlatego mam for i := 1 to SQLiteTabela.RowCount do

Edit: // Zrobiłem coś takiego teraz
Powiedz czy mniej więcej oto chodziło, czy pudruję trupa? :P
SQLiteTabela := SQLiteBaza.GetTable('SELECT verb_name FROM ireverbs WHERE verb_name = ' + QuotedStr(Verb));

edytowany 2x, ostatnio: soob, 2019-01-20 21:52
Nie wiem, czy powinienem się doszukiwać jakichś podtekstów erotycznych w wyznaniu o szarpaniu bąbelka, ale co mi tam ;) Czuję się lekko zmolestowany :D - cerrato 2019-01-20 21:57
burst my bubble znaczy mniej więcej tyle co "ostudzić czyjeś zapały" i przynajmniej w tym wypadku nie ma żądnych podtekstów :) - soob 2019-01-20 21:58
wiem co to znaczy, ale ja wszędzie widzę podteksty ;) - cerrato 2019-01-20 22:02

Pozostało 580 znaków

2019-01-20 22:02
0

No to metodą małych kroczków/drobnych podpowiedzi :D

Zrób jakąś zmienną, nazwijmy ją WordToCheck. Wykonaj na niej serię operacji - czyli wczytanie z jakiegoś pola wypełnionego przez użytkownika, zamiana na małe/wielkie litery, ewentualnie obcięcie końcówek albo dodanie czegoś. W ten sposób będziesz miał w tej zmiennej słowo, które chcesz uzyskać. A następnie dajesz zapytanie SQL w postaci 'SELECT verb_name FROM ireverbs WHERE verb_name = ' + WordToCheck.

W celach testowych zawsze możesz skorzystać z tzw. dupa debuging - w tym przypadku możesz zrobić showmessage pokazujący wartość zapytania SQL. Zobaczysz, czy się ono poprawnie tworzy.


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-20 22:07
0

No, ale ja właśnie mam taką zmienną i ona się nazywa Verb
Verb := Trim(LowerCase(VerbEdit.Text))

a potem na tej zmiennej mam to
SQLiteTabela := SQLiteBaza.GetTable( 'SELECT verb_name FROM ireverbs WHERE verb_name = ' + QuotedStr(Verb));

Chyba, że znowu nie rozumiem tego co chciałeś mi przekazać :P Nie do końca rozumiem te zapytania itd. Muszę poczytać o tych bazach danych, ale dziś już nie dam rady. Najwcześniej we wtorek dopiero a jest szansa, że ruszę dopiero w czwartek to :(

Pozostało 580 znaków

2019-01-20 22:24
0

To mam propozycję - wrzuć tu jako załącznik plik z bazą słówek, a ja zrobię kod, który sprawdzi, czy podane przez użytkownika słowo występuje w tej bazie. A Ty będziesz miał możliwość pokombinowania samodzielnie, a jeśli nie dasz rady/będziesz potrzebował podpórki - rzucisz okiem na mój kod. Wydaje mi się, że brzmi uczciwie ;)


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
https://ufile.io/rs03e - dziękuję bardzo. Mam nadzieję, że uda mi się jak najwięcej wyciągnąć z tego co napiszesz. - soob 2019-01-20 22:28
W tej bazie widzę ok. 170 wpisów, a coś mi świta, że wcześniej pisałeś o ok. 700 słowach. Źle pamiętam, czy baza jest niekompletna? - cerrato 2019-01-20 22:32
Tak. Dlatego, że znalazłem inną bazę. Ta baza z Wikipedii zauważyłem potem posiadała niektóre słowa archaiczne i słowa, które mają już regularną odmianę, a że nie chciało mi się przeglądać wszystkich siedmiuset żeby sprawdzić każdy z osobna to zrobiłem bazę z książki, która jest pewna :) na początek powinno wystarczyć :) - soob 2019-01-20 22:34
Pytałem tylko z ciekawości - bo tak naprawdę w bazie może być tylko 1 słowo, zasada działania będzie dokładnie taka sama. - cerrato 2019-01-20 22:52

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