Programowanie komputerów Kalkulator Kalkulator Kalkulator
Transkrypt
Programowanie komputerów Kalkulator Kalkulator Kalkulator
Programowanie komputerów Kalkulator •Relatywnie prosty interfejs użytkownika •Złożony algorytm Kalkulator. Kalkulator Kalkulator – możliwe udoskonalenia •Elementy obowiązkowe (2,0) •Kalkulator "biurowy" –Klawisze: numeryczne 0..9, znak dziesiętny (","), operacje arytmetyczne +, -, *, /, wynik (=) oraz kasowanie AC, –W pełni poprawne działanie (tj. nie tylko 2+3=C4-1=) –Obsługa klawiatury –(2,0) pamięć - klawisze M+, M-, MR, MC (M+ i M- z obl. wyniku) –(1,5) wydruk historii operacji –(1,0) tryby pracy wyświetlacza (norm. / 1 / 2 / 3 miejsca po przecinku) –(1,0) blokada wielokrotnych zer i przecinków –(1,0) obsługa błędu dzielenia przez 0 –(0,5) klawisz % –(0,5) klawisz zmiany znaku +/–(0,5) klawisze C i AC Kalkulator – możliwe udoskonalenia Kalkulator •Kalkulator "naukowy" •Zasady oceniania kalkulatora –(1,5) funkcje matematyczne - sin, cos, ln, exp –(1,5) "inteligentne" powtarzanie operacji –(1,0) argument funkcji trygonometr. (stopnie / radiany) –(0,5) powtarzanie operacji po wielokrotnym = –(0,5) klawisz zmiany znaku +/–(0,5) klawisze C i AC –Ocena = suma uzyskanych punktów (w tym 2pkt. za elementy obowiązkowe) ale –Na ocenę 4 przynajmniej jedno rozszerzenie za minimum 1 pkt. –Na 5 przynajmniej jedno rozszerzenie za minimum 1,5 pkt. –Nie można mieszać rozszerzeń kalkulatora biurowego i naukowego 1 Kalkulator jako automat skończony Kalkulator jako automat skończony •Oznaczenia: –W – wyświetlacz –L1, L2 – zmienne przechowujące wartości arg. –O – wybrana operacja arytmetyczna (np. +) –K – wciśnięty klawisz –[1] klawisze numeryczne –[+] klawisze operacji arytm. –[=] wiadomo –[C] klawisz kasowania 0 4 C W Å "0" = L2 Å W WÅ L1 O L2 L1 Å W 1 WÅk 1 1 W Å W+k + L1 Å W OÅk 2 + OÅk 1 WÅk 3 1 W Å W+k Typowe działanie użytkownika – wersja podstawowa Kalkulator jako automat skończony = 0 1 WÅk Komponenty kalkulatora = 1 C W Å "0" = 4 = = L2 Å W WÅ L1 O L2 L1 Å W + + + 1 1 W Å W+k + L1 Å W OÅk 2 + OÅk 1 WÅk 3 1 W Å W+k Komplet przejść między stanami dla wersji podstawowej Komponenty kalkulatora –Wyświetlacz: można użyć Memo lub Label (etykieta); komponent Edit (pole edycyjne) nie nadaje się, ponieważ nie ma możliwości wyrównania tekstu do prawej strony. –Przyciski należy użyć komponentu SpeedButton; zwykły Button (przycisk) nie nadaje się, ponieważ zatrzymuje fokus (przerywana linia wokół opisu przycisku, który został ostatnio kliknięty) Memo –Memo jest komponentem służącym do edycji większych fragmentów tekstu. W przeciwieństwie do Edit (pole edycyjne), może wyświetlać wiele linii tekstu –Memo posiada wiele właściwości oraz metod ułatwiających zarządzanie edytowanym tekstem (m.in. zapis/odczyt pliku, operacje schowka systemowego kopiuj/wytnij/wklej itd.); –Może być podstawą prostego edytora tekstu, klasy notatnika systemowego 2 Memo –Właściwości: Lines – kolekcja obiektów AnsiString, zawierających tekst poszczególnych akapitów Text – obiekt AnsiString, zawierający cały tekst MaxLenght – maksymalna długość tekstu Font – właściwości czcionki Alignment – wyrównanie tekstu (do lewej/prawej) Enabled (bool) – dostępność, tj. możliwość edycji ReadOnly (bool) – tylko do odczytu SpeedButton –Właściwości: Caption – opis przycisku Font – właściwości czcionki Glyph – obrazek (obrazki) na przycisku Layout – położenie obrazka względem opisu NumGlyphs – liczba obrazków zawartych w Glyph Funkcje obsługi zdarzeń kalkulatora –Najwygodniej jest utworzyć wspólną funkcję obsługi zdarzeń dla przycisków jednej grupy: – Zaznaczyć wszystkie komponenty grupy – W inspektorze obiektów wybrać zakładkę Events (tj. zdarzenia) i kliknąć w polu obok nazwy zdarzenia, np. OnClick – Wpisać własną nazwę, np. "CyfryKlik", nacisnąć <Enter> SpeedButton –SpeedButton jest przyciskiem przeznaczonym głównie dla okien narzędziowych i pasków narzędzi; od standardowego Button (przycisku) różni się głównie dwiema cechami: nie zatrzymuje fokusu oraz potrafi wyświetlać tzw. glyph –SpeedButton można dostosować do różnych zadań i wykorzystać na wiele sposobów – np. grupa takich przycisków może zachowywać się jak przyciski radiowe albo jak pola wyboru Zmienne globalne kalkulatora –Zmienne, które muszą zachować wartość między kolejnymi zdarzeniami (i wyłącznie takie) należy deklarować jako globalne; –W kalkulatorze będą to: numer stanu, liczby L1 oraz L2, operacja arytm. Funkcje obsługi zdarzeń kalkulatora –Aby komponenty mające wspólną funkcję obsługi zdarzeń można było rozróżnić, należy wykorzystać właściwość Tag: – W inspektorze obiektów wpisujemy każdemu komponentowi inną wartość Tag – W funkcji obsługi zdarzenia odczytujemy Tag: 3 Typowy sposób obsługi zdarzeń 0 Typowy sposób obsługi zdarzeń = = 1 C 4 = 1 0 1 WÅk = + + = L2 Å W WÅ L1 O L2 L1 Å W 1 WÅk 3 1 4 WÅk W Å "0" + 1 + L1 Å W OÅk 1 W Å W+k 2 1 WÅk + OÅk 1 W Å W+k Czynności, jakie należy wykonać po wciśnięciu cyfry Typowy sposób obsługi zdarzeń Key = dynamic_cast<TComponent*>(Sender)->Tag; switch (State) { case 0: W->Text = Key; State = 1; break; case 1: W->Text = W->Text + Key; break; // itd. } Instrukcja wyboru (decyzyjna) –Alternatywnie: switch (wyrażenie) { Case Case ... Case } gdzie fraza Case ma postać: case stała: case stała: ... instrukcja instrukcja ... break; 2 1 WÅk 1 W Å W+k 3 1 W Å W+k Czynności, jakie należy wykonać po wciśnięciu cyfry Instrukcja wyboru (decyzyjna) –Uogólniona instrukcja warunkowa. –Składnia: switch (wyrażenie) { case stała : [ instrukcja ] [ break; ] ... default: instrukcja } wyrażenie - dowolne wyrażenie o rezultacie całkowitym (często po prostu zmienna) –Działanie: wykonywane są instrukcje począwszy od stałej równej wyrażeniu aż do instrukcji break Instrukcja wyboru (decyzyjna) switch (State) { case 1: W->Text = key; State = 2; break; case 2: W->Text = W->Text + key; break; } –instrukcje odrębne dla każdego przypadku (case’u) jedno "case stała:" może zastąpić "default:" 4 Instrukcja wyboru (decyzyjna) switch (State) { case 3: W->Text = key; case 4: W->Text = 0; State = 2; break; } –instrukcje częściowo wspólne – brak break Instrukcja wyboru (decyzyjna) switch (val) { case 7: case 9: W->Text = key; break; default: W->Text = 0; break; } –Fraza default jest wykonywana, gdy wartość wyrażenia nie pasuje do żadnego z case-ów Instrukcja wyboru (decyzyjna) switch (State) { case 1: case 3: W->Text = W->Text + key; break; } –instrukcje wspólne dla obu przypadków Obsługa klawiatury –Informacja o wpisaniu znaku z klawiatury jest przekazywana do elementów aktywnych (pulpit – aktywna aplikacja – aktywne okno aktywnej aplikacji – aktywny komponent aktywnego okna); dzięki temu mogą działać różne skróty klawiaturowe –W kalkulatorze najlepszym miejscem do przechwycenia zdarzeń klawiatury jest formularz, a ściślej jego zdarzenie OnKeyPress –Dodatkowo należy we właściwościach formularza ustawić KeyPreview na true Obsługa klawiatury void TForm1::FormKeyPress(..., char &Key) { switch (Key) { case '0': b0->Click(); break; case '1': b1->Click(); break; case '+': bAdd->Click(); break; case '=': case 13: bEqs->Click(); break; case 'c': case 'C': case 8: bClr->Click(); break; } Key = 0; } 5