Strony

poniedziałek, 6 października 2014

Zabawy matematyczne w Delphi cz 2

Komentarz:


1. Zmienne globalne


     Zazwyczaj w programach używamy zmiennych lokalnych, powiązanych tylko z daną procedurą. W ten sposób unikamy konfliktu logicznego, gdy w tym samym czasie jedną zmienną chcą wykorzystać dwie lub więcej procedur.

     Czasami jednak zachodzi potrzeba dostępu do parametru z poziomu różnych procedur tak, jak w naszym programie: procedura dla przycisku START generuje wynik działania, który jest umieszczony w zmiennej globalnej WYNIK, a inna procedura, powiązana z obsługą przycisku Sprawdź, korzysta z tej zmiennej, aby porównać, czy udzielona odpowiedź jest poprawna. Gdyby zmienna WYNIK była zmienną lokalną , zamkniętą w jednej procedurze, nie udałoby się tego dokonać. Stąd też w naszym projekcie umieszczamy trzy zmienne globalne:

WYNIK- do przechowywania wyniku działania,
Poprawne- do przechowywania ilości poprawnych odpowiedzi,
Niepoprawne- do przechowywania ilości niepoprawnych odpowiedzi.

     Umieszczamy je w sekcji między var a Implementation, po deklaracji zmiennej Form1: Tform1.

var
Form1: TForm1;
WYNIK: Integer;           //zmienna przechowująca wynik działania
Poprawne: Integer;      //zmienna przechowująca ilość poprawnych odpowiedzi
Niepoprawne: Integer; //zmienna przechowująca ilość niepoprawnych odpowiedzi

implementation

{$R *.dfm}


     Wszystkie trzy zmienne będą przechowywać liczby, więc muszą być typu Integer.


2. Form Create


Poprawne:=0;                //wyzeruj ilość poprawnych odpowiedzi
Niepoprawne:=0;           //wyzeruj ilość niepoprawnych odpowiedzi
Label9.Caption:= '0';     //wyświetl '0' poprawnych odpowiedzi
Label10.Caption:= '0';   //wyświetl '0' niepoprawnych odpowiedzi

     Procedura Form Create wykonuje napisany przez nas kod w chwili uruchomienia programu, więc w miejscu tym wyzerujemy tabelę wyników i wyświetlimy oba wyniki jako zerowe.

     Aby utworzyć procedurę Form Create klikamy na puste miejsce naszej formy, a następnie w Inspektorze Obiektów przechodzimy do zakładki Events i obok zdarzenia OnCreate klikamy dwa razy. Zostaniemy automatycznie przeniesieni do kodu z nowo utworzoną procedurą.


3. Form Close


if (Poprawne<Niepoprawne) or (Poprawne=Niepoprawne) then
begin
ShowMessage('Musisz jeszcze trochę potrenować');
end
else
ShowMessage('Gratuluję! Uzyskałeś dobry wynik');


     Procedura Form Close realizowana jest w momencie zamykania programu i tworzymy ją tak samo, jak poprzednią, wybierając jednak zdarzenie OnClose. W sekcji tej umieściliśmy możliwość oceny naszych wyników w zabawie.

     Na początku mamy instrukcję warunkową if...then (jeżeli..., to...), oraz warunek do spełnienia. Cały kod możemy przetłumaczyć następująco: Jeżeli (if) Ilość poprawnych odpowiedzi (Poprawne) jest mniejsza (<) od Ilości niepoprawnych odpowiedzi (Niepoprawne) lub (or) Ilość poprawnych (Poprawne) jest taka sama (=) jak Ilość niepoprawnych odpowiedzi (Niepoprawne) to wtedy (then) Wyświetl komunikat (ShowMessage) o treści: „Musisz jeszcze trochę potrenować”, w przeciwnym razie (else) (czyli, gdy ilość poprawnych odpowiedzi jest większa od niepoprawnych) wyświetl komunikat: „Gratuluję! Uzyskałeś dobry wynik”.

      W tego typu konstrukcji, gdzie używamy operatora else pamiętajmy o tym, że przed nim polecenie występuje bez zwyczajowo wymaganego średnika (w tym przypadku słowo end). To częsty błąd początkujących programistów.

     Kolejne niedopatrzenia, które często staje się udziałem początkujących programistów, jest podawanie warunku. W prostym przypadku instrukcji warunkowej, wystarczy napisać tak:

if Poprawne<Niepoprawne then
(kod do wykonania)

      Jeżeli jednak chcemy, aby zostało spełnionych kilka warunków, wtedy każdy z nich musimy ująć w nawias, na przykład tak:

if ( Poprawne<Niepoprawne) and (Liczba1=5) then
(kod do wykonania)


4. Procedura Edit1KeyPress


if not (Key in ['0'..'9',#45,#8]) then
begin
Key:=#0;
ShowMessage('To nie jest liczba');    //wyświetl komunikat o błędzie
end;

     Aby utworzyć tę procedurę klikamy na komponent Edit1 a następnie w Inspektorze Obiektów, w zakładce Events wybieramy zdarzenie OnKeyPress i otwieramy je podwójnym kliknięciem.

     Jak sama nazwa wskazuje, procedurę tę wykorzystamy do kontroli wpisywania znaków w polu edycyjnym. Zgodnie z naszymi założeniami chcemy, aby była możliwość wpisywania tylko liczb, minusa i, aby aktywny był klawisz Backpace do kasowania źle wpisanych liczb.

     Cały kod odczytamy tak: Jeżeli (if) naciśnięty klawisz (Key) nie jest (not) klawiszem liczb ('0'..'9'), minusem (#45- kod klawisza „minus”), ani Backpace (#8- kod klawisza Backpace), wtedy (then) nie reaguj (Key:#0) tylko wyświetl komunikat (ShowMessage) „To nie jest liczba”.
 
     Z punktu widzenia programu, procedura ta nie jest konieczna. Jest to tylko udogodnienie dla nas eliminujące pomyłki.


5. Gdy naciśniesz przycisk START

var
Liczba1: Integer;        //zmienna przechowująca pierwszą liczbę
Liczba2: Integer;        //zmienna przechowująca drugą liczbę
Dzialanie: Integer;      //zmienna pomocnicza do losowania znaku działania
Znak: String;               //zmienna przechowująca znak działania

     Na początku procedury definiujemy zmienne lokalne, które będą nam potrzebne. Przede wszystkim musimy przygotować dwie zmienne na dwie liczby, które zostaną użyte w działaniu. Za każdym razem program będzie sobie jakieś dwie liczby losowo wybierał, musi więc mieć gdzie je zapisać. Stąd umieszczone zmienne Liczba1 i Liczba2 są typu Integer,a więc typu liczbowego.

     Poza liczbami, program będzie losował także znak działania (dodawanie, odejmowanie, mnożenie), który następnie będzie mógł wyświetlić w pytaniu. To implikuje użycie zmiennej typu String, a więc typu tekstowego. Zmiennej tej nadaliśmy nazwę „Znak”.

     Ostatnia zmienna, czyli „Dzialanie” (nie możemy nadać nazwy „Działanie”, ponieważ Delphi nie używa polskich znaków dialektycznych) służy do wylosowania rodzaju działania (dodawanie, odejmowanie, mnożenie). Jest ona typu liczbowego, ponieważ za jej pomocą będziemy losowali liczbę do której przypiszemy jedno z tych trzech działań:

Edit1.Clear;      //wyczyść pole edycyjne (do podawania Odpowiedzi)
Randomize;                                //uruchom maszynę losującą
Liczba1:=Random(21);              //losuj pierwszą liczbę
Liczba2:=Random(21);              //losuj drugą liczbę
Dzialanie:=Random(3);              //losuj znak działania matematycznego
case Dzialanie of                        //gdy zostanie wylosowana dana liczba to...
0: WYNIK:= Liczba1+Liczba2;   //...wykonaj dodawanie
1: WYNIK:= Liczba1-Liczba2;    //...wykonaj odejmowanie
2: WYNIK:= Liczba1*Liczba2;    //...wykonaj mnożenie

      Przechodząc do kodu wykonywalnego, po naciśnięciu przycisku START, następuje wyczyszczenie pola edycyjnego (Edit1.Clear), a następnie uruchomienie maszyny losującej (Randomize). Po jej uruchomieniu, losujemy potrzebne nam elementy, a więc obie liczby z zakresu od 0 do 20 (Liczba:=Random(21)), oraz rodzaj działania (Dzialanie:=Random(3)). Delphi liczy liczby od zera, stąd też przy Random(21) mamy liczbę 21, a nie 20, tak samo, jak w przypadku zmiennej Dzialanie mamy trzy liczby, ale liczone od zera, a więc: 0, 1, 2. 
 
     Dalsza część kodu informuje program co ma zrobić, gdy zostanie wylosowana odpowiednia liczba dla zmiennej Dzialanie: Jeżeli zostało wylosowane zero, wtedy do zmiennej globalnej WYNIK ma zapisać wynik dodawania obu wcześniej wylosowanych liczb (Liczba1 i Liczba2). Gdy wylosowano 1 lub 2 to, odpowiednio, ma zapisać w zmiennej WYNIK wynik odejmowania lub mnożenia tychże liczb. W ten oto prosty sposób uzyskujemy dużą nieprzewidywalność kolejnego działania, jaki program wygeneruje.

     Przypominamy, że przy mnożeniu wykorzystujemy klawisz „gwiazdka”, a przy dzieleniu „ukośnik”.



< Wstecz    2/3    Dalej >

Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.

poradnik programowania Delphi

Brak komentarzy:

Prześlij komentarz