wtorek, 7 października 2014

Zabawy matematyczne w Delphi cz 3

if Dzialanie=0 then
Znak:= '+';                   //jeżeli wylosowano dodawanie to pokaz znak '+'
if Dzialanie=1 then
Znak:= '-';                    //jeżeli wylosowano odejmowanie to pokaz znak '-'
if Dzialanie=2 then
Znak:= 'x';                   //jeżeli wylosowano mnożenie to pokaz znak 'x'

     W tej sekcji realizujemy dalszą procedurę związaną ze zmienną Dzialanie opartą na instrukcji warunkowej if...then, czyli: Jeżeli dla zmiennej Dzialanie wylosowano zero, wtedy do zmiennej Znak przypisz znak „+”. W podobny sposób odczytujemy informacje dla pozostałych wylosowanych możliwości.

     Informacje powyższe potrzebne są nam do wyświetlenia odpowiedniego znaku na etykiecie Label6:

Label6.Caption:=('Ile jest: ' + IntToStr(Liczba1) + ' ' + znak + ' ' +IntToStr(Liczba2) + ' ?');

     Ponieważ etykieta Label6 musi przedstawić wiele różnych informacji, stąd też jest ona zbiorem tekstu i zmiennych. Jako, że etykieta służy do wyświetlenia krótkiego tekstu, stąd też informacje wyświetlamy z pozycji kodu, zmieniając jej właściwość Caption. To samo robiliśmy wcześniej, przygotowując projekt z pozycji Inspektora Obiektów (Caption).

     Ponieważ nazwa jest zbiorem różnych elementów, więc całość musimy ująć w nawias. W jego środku zwykły tekst umieszczamy w apostrofie, a zmienne dokładamy za pomocą znaku „+”. Gdybyśmy chcieli wyświetlić taki plus, musielibyśmy go także zawrzeć w apostrofie. Z uwagi na to, że liczby nie są typu tekstowego (string), tylko liczbowego (integer), musimy je przekonwertować do postaci string, stosując konwersję typu IntToStr. W ten sposób liczby będą mogły zostać wyświetlone, gdyż zostaną potraktowane jako znaki tekstowe. Proszę nie zapomnieć o spacji po słowie „jest”, ani przed znakiem zapytania. To samo tyczy się pustych miejsc ujętych w apostrofy przed i za zmienną „Znak”. Są one potrzebne do tego, aby porobić odstępy między słowami i liczbami.

      Na zakończenie kodu umieszczamy polecenie:

Edit1.SetFocus;       //ustaw focus w Polu do Odpowiedzi

     Ta linia nie jest konieczna, ale jest użyteczna, ponieważ po wyświetleniu działania umieszcza kursor w polu edycyjnym. Bez tego kodu, po każdorazowym naciśnięciu przycisku START i wyświetleniu działania, musielibyśmy myszką klikać w pole edycyjne, aby wpisać wynik. Rozwiązanie, które tu stosujemy, umożliwia po wyświetleniu działania od razu wpisać z klawiatury wynik bez użycia myszki. To duże udogodnienie przy zabawie.


6. Gdy naciśniesz przycisk Sprawdź


Label KONIEC;         //Etykieta do przechodzenia w inne miejsca kodu
   var 
      Odp: String;        //zmienna przechowująca naszą odpowiedź


       Zanim zadeklarujemy zmienną Odp, deklarujemy element Label. Nie jest to jednak komponent Label służący do wyświetlania napisów, co widać w innym pokolorowaniu składni w kodzie. Element ten jest częścią instrukcji goto za pomocą której możemy przenieść się w inne miejsce kodu i służy do zadeklarowania nazwy, która będzie ten punkt określała. Może być ona dowolna. Starajmy się wybierać takie nazwy, które będą nas informowały o przeznaczeniu tych instrukcji. W późniejszym czasie, gdyby zaistniała potrzeba modyfikacji kodu, odpowiednie nazwy ułatwią nam rozeznanie się w tych tysiącach linii kodu.

     Zadeklarujemy teraz zmienną, która będzie przechowywać naszą odpowiedź. Teoretycznie powinna być typu liczbowego (Integer), ponieważ w pole edycyjne Edit1 wpisujemy z klawiatury liczby. Niestety, pomimo wpisywania do komponentu Edit cyfr, są one traktowane jako znaki tekstowe, a nie liczbowe, ponieważ komponent ten służy do wyświetlania znaków tekstowych. Nie jest to problem, ponieważ w dalszej części kodu będziemy mogli przekonwertować te wartości. Posiadając tę wiedzę deklarujemy więc zmienną 'Odp' typu tekstowego (String).


Odp:= Edit1.Text;           //odczytaj podaną odpowiedź i przypisz ją do zmiennej
   if Odp='' then               //gdy nie podano odpowiedzi monituj o wpisaniu wyniku
     begin
        ShowMessage('Wpisz najpierw wynik');   //wyświetl komunikat informujący
        Edit1.SetFocus;       //ustaw focus w Polu do Odpowiedzi
       goto KONIEC;          //pomiń poniższy kod i przejdź od razu na koniec procedury
     end:

     W pierwszej części kodu przypisujemy podaną przez nas odpowiedź (wpisaną do pola Edit) do zmiennej „Odp”. Tutaj wprowadzamy jedno z naszych wcześniejszych założeń, mianowicie chcemy, aby program informował nas o sytuacji, gdy naciśniemy przycisk „Sprawdź”, a w polu edycyjnym nie będzie wpisana żadna liczba. Jest to zadanie opcjonalne, nie wpływające na poprawną pracę samej zabawy, ale warto zaopatrzyć w nie nasz program na wszelki wypadek. W sytuacji, gdy naciśniemy przycisk „Sprawdź”, a w polu edycyjnym nie będzie wpisana żadna liczba, bez tego kodu, program uzna to za błędną odpowiedź, ponieważ puste pole nie będzie pasowało do poprawnego wyniku.

     Aby zrealizować nasze założenie, wprowadzamy instrukcję warunkową if: Jeżeli zmienna „Odp” nie zawiera żadnej wartości (if Odp='' - normalnie, pomiędzy apostrofami powinien znaleźć się jakiś znak lub tekst), wtedy (then) wykonaj następujące instrukcje (begin...end): Wyświetl komunikat informujący o tym (ShowMessage), ustaw kursor (focus) ponownie na polu edycyjnym, oraz przejdź do punktu „KONIEC:”, aby pominąć wykonywanie dalszych instrukcji (goto KONIEC). Bez tego przejścia program, po wyświetleniu komunikatu zrealizowałby kolejne linie kodu, czyli porównałby naszą odpowiedź z poprawnym wynikiem i uznał ją za błędną.

     W przypadku jakiejkolwiek instrukcji warunkowej, jeżeli chcemy, aby program wykonał kilka różnych operacji, musimy je wszystkie zawrzeć w bloku „begin...end”. Podobnie, jak w poprzednim przypadku, ustawiamy kursor na polu edycyjnym dla naszej wygody, aby nie trzeba było klikać na nie myszką.


if Odp=(IntToStr(WYNIK)) then             //jeżeli odpowiedź jest poprawna to ...
    begin
        ShowMessage('Bardzo dobrze!'); //wyświetl komunikat o poprawnej odpowiedzi
        Label11.Caption:= 'Ile jest: ';          //wyczyść działanie
        Poprawne:=Poprawne + 1;           //dodaj punkt do poprawnych odpowiedzi
    end                                                    //bez średnika

else                                                      //w przeciwnym wypadku ...

begin
    ShowMessage('Niestety źle');         //wyświetl komunikat o złej odpowiedzi
     Niepoprawne:=Niepoprawne + 1;   //dodaj punkt do niepoprawnych odpowiedzi
end;

      Czas najwyższy ocenić naszą odpowiedź. W tym celu stosujemy instrukcję warunkową if...then: Jeżeli udzielona przez nas odpowiedź (Odp) jest taka sama (=) jak wynik działania (WYNIK), wtedy (then) wykonaj następujące instrukcje (begin...end): Wyświetl komunikat (ShowMessage) informujący o poprawnej odpowiedzi, pozostaw tylko napis „Ile jest:” (Label6.Caption), oraz zwiększ zmienną przechwującą ilość poprawnych odpowiedzi o 1 (Poprawne:=Poprawne+1), w przeciwnym wypadku (else) (czyli, gdy nasza odpowiedź będzie się różniła od poprawnego wyniku), wykonaj następujące instrukcje (begin...end): wyświetl komunikat o błędnej odpowiedzi (ShowMessage), oraz zwiększ zmienną przechowującą ilość niepoprawnych odpowiedzi o 1.

     Konstrukcja typu Zmienna:=Zmienna+1 pozwala nam zapamiętywać wynik i powiększać go lub pomniejszać w trakcie działania programu. W ten sposób program „pamięta” nasz wynik.

     Aby dopasować typy danych, wynik ze zmiennej WYNIK (typu Integer) konwertujemy do typu String za pomocą konwersji IntToStr.


Edit1.Clear;               //wyczyść pole do podawania Odpowiedzi
Edit1.SetFocus;        //ustaw focus w Polu do Odpowiedzi

Label9.Caption:= IntToStr(Poprawne);         //wyświetl ilość poprawnych odpowiedzi
Label10.Caption:= IntToStr(Niepoprawne);   //wyświetl ilość niepoprawnych odpowiedzi

KONIEC


     Bez względu na udzieloną przez nas odpowiedź, po jej ocenie, wymazujemy ją z pola edycyjnego (Edit1.Clear) i ustawiamy na nim kursor (focus), przygotowując program na przyjęcie kolejnej odpowiedzi.

     Na koniec wyświetlamy podsumowanie naszych wyników. W tym celu w komponencie Label4 wyświetlamy ilość poprawnych odpowiedzi, zmieniając jego nazwę (Caption) na wartość odpowiadającą zmiennej Poprawne. Ponieważ zmienna ta jest typu Integer, więc musimy zastosować konwersję, aby dostosować ją do charakteru tekstowego, jakim jest nazwa komponentu Label.

     Powyższe zadanie powtarzamy dla komponentu Label5 wyświetlającego ilość niepoprawnych odpowiedzi, wiążąc jego nazwę (Caption) z wartością zmiennej Niepoprawne. Na samym końcu umieszczamy etykietę KONIEC, czyli miejsce do którego przechodzi instrukcja goto. Jest ona na samym końcu, więc cały kod pomiędzy instrukcjami „goto KONIEC” a „KONIEC” jest przez nią pomijany.


       Zaprezentowany przez nas przykład prostej zabawy matematycznej możemy traktować jako punkt wyjścia dla bardziej rozbudowanych rozwiązań. Aby dać tego przykład, w dwóch kolejnych propozycjach rozwiniemy tę zabawę w dwóch różnych obszarach: w jednym, utrudnimy sobie liczenie dokładając kolejne dwie liczby, a w drugim, zamiast wyświetlać komunikaty, program będzie je wypowiadał. Po zastosowaniu dodatkowych rozwiązań z tej książki, możemy nawet sprawić , aby całkiem wyłączyć monitor i bawić się z komputerem tak, jak z żywym człowiekiem. To naprawdę zależy tylko od naszej inwencji.



                                < Wstecz    3/3

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

Wspomóż mnie lub zostań moim patronem już od 5 zł - sprawdź szczegóły

Moje e-booki

Kliknij w okładkę, aby przejść do strony książki

Przejdź do strony książki Przejdź do strony książki