Kalkulator - slajd 1/45
Kalkulator nowoczesny - strona tytułowa
Cel slajdu: zapowiedź ćwiczenia - kompletna budowa aplikacji Kalkulator krok po kroku w MIT App Inventor.

Strona tytułowa

  • Tytuł: Nowoczesny kalkulator w MIT App Inventor - od pustego ekranu do gotowej aplikacji.
  • Zakres funkcji: dodawanie, odejmowanie, mnożenie, dzielenie, procent, reszta z dzielenia, potęga, pierwiastek kwadratowy i funkcje pomocnicze.
  • Forma: instrukcja krok po kroku: najpierw interfejs w oknie Designer, potem logika w oknie Blocks, na końcu testy i pakowanie.
  • Materiały bazowe: pam1.pdf, pam2.pdf, pam3.pdf, pam4.pdf oraz oficjalna dokumentacja MIT App Inventor.
  • Idea: każdy krok ma jeden cel i daje mierzalny efekt - po przejściu wszystkich kroków aplikacja działa na telefonie.
Kalkulator - slajd 2/45
Spis treści ćwiczenia

Plan pracy nad kalkulatorem

Kalkulator - slajd 3/45
Cele uczenia się ćwiczenia

Co student będzie umiał

  • W1: zaprojektować w oknie Designer ekran kalkulatora z wyświetlaczem i siatką przycisków.
  • W2: nazwać komponenty i zmienne w sposób czytelny oraz ustawić właściwości ekranu.
  • W3: zbudować w oknie Blocks logikę działań +, -, *, /, %, ^ oraz pierwiastka kwadratowego.
  • W4: zastosować walidację danych wejściowych, obsłużyć dzielenie przez zero i komunikaty błędów.
  • W5: przetestować aplikację przez AI Companion oraz zbudować plik instalacyjny APK.
  • K1: uzasadnić wybór bloków matematycznych AI2 i wyjaśnić znaczenie zagnieżdżonych bloków.
Po ćwiczeniu student dysponuje nie tylko gotowym kalkulatorem, lecz także powtarzalnym schematem budowy aplikacji: specyfikacja, interfejs, zmienne, logika, testy, pakiet.
Kalkulator - slajd 4/45
Pomysł: czym jest kalkulator w programie

Schemat wejście - przetwarzanie - wyjście

  • Wejście: użytkownik wprowadza liczby i wybiera działanie, naciskając przyciski.
  • Przetwarzanie: program odczytuje wpisane wartości, sprawdza je i wykonuje wybrane działanie matematyczne.
  • Wyjście: wynik pojawia się na wyświetlaczu, a błędy - w komunikacie.
  • Stan: kalkulator musi pamiętać pierwszą liczbę, wybrane działanie i bieżący wpis.
  • Zdarzenia: każde naciśnięcie przycisku uruchamia blok obsługi zdarzenia Click.
Przykład: użytkownik wpisuje 12, naciska przycisk *, wpisuje 3, naciska =; program odczytuje wartości, wykonuje mnożenie i ustawia na wyświetlaczu 36.
Kalkulator - slajd 5/45
Specyfikacja: lista funkcji kalkulatora

Co dokładnie ma robić aplikacja

  • + - * / - cztery podstawowe działania na dwóch liczbach.
  • % - obliczanie procentu, na przykład 15% z 200 równa się 30.
  • mod - reszta z dzielenia, w blokach AI2 realizowana blokiem modulo.
  • ^ - potęgowanie: pierwsza liczba podniesiona do potęgi o wykładniku drugiej.
  • √ - pierwiastek kwadratowy z liczby wpisanej na wyświetlaczu.
  • Funkcje pomocnicze: wartość bezwzględna, zaokrąglenie, czyszczenie wyświetlacza.
  • Walidacja: kontrola pustego wpisu, liczb niedozwolonych i dzielenia przez zero.
Specyfikacja powstaje przed otwarciem Designer. Bez niej przyciski i bloki pojawiają się przypadkowo, a potem trzeba je przemalowywać i przepinać.
Kalkulator - slajd 6/45
Znak procentu: dwa różne znaczenia

Procent a reszta z dzielenia

  • W kalkulatorach przycisk % zwykle oznacza procent, na przykład 200 + 10% daje 220.
  • W programowaniu znak % często oznacza resztę z dzielenia, na przykład 17 reszta 5 daje 2.
  • W MIT App Inventor nie ma osobnego bloku procentu - procent liczymy z bloków dzielenia i mnożenia.
  • Resztę z dzielenia daje blok modulo z szuflady Math (razem z remainder i quotient).
  • W naszym kalkulatorze: przycisk % oblicza procent, przycisk mod pokazuje resztę z dzielenia.
Przykład procentu: ile stanowi 15% z 200? Liczymy 200 / 100 * 15 i otrzymujemy 30. Przykład modulo: 17 modulo 5 równa się 2, ponieważ 17 = 3 * 5 + 2.
Kalkulator - slajd 7/45
Wygląd nowoczesnego kalkulatora

Kolorystyka, układ i ergonomia

  • Tło ekranu: ciemny grafit, na przykład #1C1C1E, który dobrze kontrastuje z cyframi.
  • Wyświetlacz: szeroka etykieta z dużą czcionką, wyrównana do prawej strony.
  • Cyfry: jasne przyciski na ciemnym tle, ustawione w siatce czterokolumnowej.
  • Operatory: przyciski wyróżnione kolorem akcentowym, na przykład pomarańczowym.
  • Przyciski funkcyjne: C, AC i = także wyróżnione, aby rzucały się w oczy.
  • Rozmiar klawiszy: szerokość i wysokość ustawione tak, by palec trafiał pewnie.
Nowoczesny wygląd to nie tylko estetyka. Czytelny kontrast i duże klawisze realnie zmniejszają liczbę pomyłek podczas korzystania z aplikacji.
Kalkulator - slajd 8/45
Osiem etapów pracy - przegląd

Mapa całego ćwiczenia

  1. Utworzenie projektu o nazwie bez polskich znaków, na przykład kalkulator_v1, oraz ustawienie Screen1.
  2. Budowa wyświetlacza i siatki przycisków w oknie Designer.
  3. Nadanie czytelnych nazw komponentom i dodanie komponentu Notifier.
  4. Przejście do okna Blocks i utworzenie zmiennych globalnych stanu.
  5. Obsługa cyfr, przecinka, kasowania oraz zapisywania wybranego operatora.
  6. Implementacja działań +, -, *, /, %, mod, ^ i pierwiastka w bloku przycisku =.
  7. Walidacja wejścia, obsługa błędów i komunikaty dla użytkownika.
  8. Testy przez AI Companion, poprawki oraz budowanie pliku APK.
Zasada: po każdym etapie aplikacja powinna się uruchamiać - nawet jeśli nie wszystkie przyciski jeszcze działają. Lepiej mieć częste, małe sukcesy niż jeden wielki skok na końcu.
Kalkulator - slajd 9/45
Etap 1: nowy projekt

Tworzenie projektu w serwisie AI2

  • Zaloguj się do serwisu, na przykład ai2.appinventor.mit.edu.
  • W menu wybierz Projects, a potem Start new project.
  • Wpisz nazwę projektu bez spacji i polskich znaków: kalkulator_v1.
  • Potwierdź - otworzy się okno Designer z pustym ekranem Screen1.
  • Nazwa projektu może zawierać tylko litery łacińskie, cyfry i podkreślnik.
App Inventor rozróżnia wielkość liter w nazwach, dlatego od początku warto trzymać się jednej konwencji pisowni i nie mieszać wariantów.
Kalkulator - slajd 10/45
Etap 1: właściwości ekranu Screen1

Ustawienia startowe ekranu głównego

  • Title: wpisz Kalkulator - będzie widoczny na pasku tytułu telefonu.
  • AppName: nazwa widoczna po zainstalowaniu aplikacji, na przykład Kalkulator.
  • AlignHorizontal: Center, aby całość była wyśrodkowana poziomo.
  • BackgroundColor: ustaw ciemny grafit, na przykład Dark Gray lub własny kod #1C1C1E.
  • Scrollable: możesz zostawić domyślną wartość; przy prostej siatce przycisków zwykle nie jest potrzebny przewijak.
  • ScreenOrientation: Portrait, aby ekran nie obracał się w trakcie liczenia.
Wskazówka: Title i AppName można ustawić raz w Designerze i nie wracać do nich przy każdym teście.
Kalkulator - slajd 11/45
Etap 2: projekt układu na kartce

Rysunek ekranu przed przeciąganiem komponentów

  • Na górze: jeden wiersz na wyrażenie i wynik, wyrównany do prawej.
  • Pod wyświetlaczem: rząd przycisków czyszczenia, na przykład C oraz AC.
  • Dalej: cztery rzędy po cztery przyciski - standardowa siatka cyfr i operatorów.
  • Na dole lub z boku: przycisk = oraz przyciski funkcyjne √, ^, %, mod.
  • Każdy rząd to jeden HorizontalArrangement, a wszystkie razem tworzą VerticalArrangement.
Kalkulator - slajd 12/45
Etap 2: układ i wyświetlacz

Pierwsze komponenty w oknie Designer

  • Dodaj z palety Layout komponent VerticalArrangement1 i ustaw Width na Fill parent.
  • Wewnątrz niego dodaj HorizontalArrangement1 na wyświetlacz.
  • W tym rzędzie umieść lblWynik z pustym lub zerowym tekstem.
  • Ustaw dla etykiety FontSize na przykład 36, wyrównanie tekstu do prawej i duży Height.
  • Alternatywnie zamiast etykiety możesz użyć pola TextBox z NumbersOnly, lecz wtedy użytkownik mógłby edytować wynik ręcznie.
Wyświetlacz powinien być tylko do odczytu - wynik ustawiamy blokiem set lblWynik.Text, a nie edycją pola przez użytkownika.
Kalkulator - slajd 13/45
Etap 2: pierwszy rząd przycisków

Budowa rzędu cyfr krok po kroku

  • Dodaj HorizontalArrangement2 wewnątrz VerticalArrangement1.
  • Przeciągnij do niego cztery przyciski Button z palety User Interface.
  • Teksty przycisków: 7, 8, 9 oraz przycisk czyszczenia, na przykład C.
  • Ustaw Width i Height przycisków na taką samą wartość, na przykład 80 punktów.
  • Ustaw FontSize na przykład 24, aby cyfry były dobrze widoczne.
  • Powtórz czynność dla kolejnych rzędów: 4 5 6 -, 1 2 3 + oraz 0 . =.
Zasada: każdy rząd to osobny HorizontalArrangement; wszystkie rzędy są dziećmi jednego VerticalArrangement1.
Kalkulator - slajd 14/45
Etap 2: rząd funkcyjny i kolory

Przyciski procentu, potęgi, pierwiastka i reszty z dzielenia

  • Dodaj ostatni HorizontalArrangement z przyciskami: %, mod, √, ^.
  • Alternatywnie umieść te przyciski nad główną siatką, tuż pod wyświetlaczem.
  • Ustaw BackgroundColor cyfr na jasny, na przykład Light Gray.
  • Ustaw BackgroundColor operatorów na kolor akcentowy, na przykład Orange.
  • Przycisk = wyróżnij najmocniej - to on domyka każde działanie.
  • Sprawdź w podglądzie, czy wszystkie rzędy mieszczą się bez przewijania.
Spójna kolorystyka grupuje funkcje: użytkownik od razu widzi, które klawisze liczą, a które tylko wprowadzają cyfry.
Kalkulator - slajd 15/45
Etap 2: nazwy komponentów i Notifier

Czytelne nazwy przed programowaniem

  • Zmień nazwy przycisków z Button1 na btnC, btnAC, btnPlus, btnMinus, btnMnoz, btnDziel, btnRowna, btnProcent, btnMod, btnPotega, btnPierwiastek.
  • Cyfry możesz nazwać zbiorczo, na przykład btnCyfra7, albo obsłużyć je jedną procedurą - patrz dalsze slajdy.
  • Wyświetlacz: lblWynik; ewentualny wiersz wyrażenia: lblWyrazenie.
  • Dodaj niewidoczny komponent Notifier1 z palety User Interface - posłuży do komunikatów błędów.
  • Sprawdź drzewo Components - wszystkie nazwy powinny być jednoznaczne i bez polskich znaków.
Dlaczego teraz: zmiana nazw po napisaniu bloków wymaga ręcznej aktualizacji każdego odwołania. W Designerze trwa ona chwilę, w Blocks - znacznie dłużej.
Kalkulator - slajd 16/45
Etap 2: kontrola okna Designer

Checklist przed przejściem do Blocks

  • Wszystkie przyciski mają docelowe teksty i kolory.
  • Wymiary przycisków w rzędach są równe.
  • Wyświetlacz jest szeroki, wyrównany do prawej i ma dużą czcionkę.
  • Drzewo Components zawiera VerticalArrangement, poziome rzędy, przyciski, etykietę i Notifier1.
  • Nazwy komponentów są zmienione i nie zawierają polskich znaków.
  • Title i AppName ekranu są ustawione.
  • Nie ma zbędnych, zapomnianych komponentów w drzewie Components.
Dopiero gdy checklist jest odhaczony, klikamy przełącznik Designer / Blocks w prawym górnym rogu.
Kalkulator - slajd 17/45
Etap 3: zmienne globalne stanu

Co kalkulator musi pamiętać

  • pierwszaLiczba - wartość wpisana przed naciśnięciem operatora.
  • operator - tekst lub symbol wybranego działania, na przykład +, -, *, /.
  • nowyWpis - flaga logiczna: czy następna cyfra zaczyna nową liczbę.
  • wyrazenie - opcjonalny łańcuch pokazujący całe działanie na wyświetlaczu.
  • W sekcji Built-in, gałąź Variables, dodaj blok initialize global ... to ... i nadaj wartości startowe.
Wartości startowe: pierwszaLiczba = 0, operator = "", nowyWpis = true, wyrazenie = "".
Kalkulator - slajd 18/45
Etap 3: obsługa cyfr na wyświetlaczu

Zdarzenie Click przycisku z cyfrą

  • Otwórz okno Blocks i wybierz przycisk, na przykład btnCyfra7.
  • Przeciągnij brązowy blok when btnCyfra7.Click do.
  • Jeśli nowyWpis jest prawdą: ustaw lblWynik.Text na 7 i nowyWpis na false.
  • W przeciwnym razie: ustaw lblWynik.Text na połączenie dotychczasowego tekstu i cyfry blokiem join z sekcji Text.
  • Powtórz schemat dla pozostałych cyfr - możesz skopiować blok prawym przyciskiem i zmienić tylko cyfrę oraz nazwę zdarzenia.
Blok join skleja teksty; wynik jest nadal tekstem, dlatego przy obliczaniu AI2 przekonwertuje go na liczbę automatycznie, o ile tekst rzeczywiście przedstawia liczbę.
Kalkulator - slajd 19/45
Etap 3: przecinek, znak minus i kasowanie

Przyciski dopełniające wprowadzanie

  • btnKropka: doklej kropkę dziesiętną, jeśli nie ma jej jeszcze w bieżącym wpisie.
  • Warunek: jeśli lblWynik.Text nie zawiera kropki, dołącz ją blokiem join.
  • btnMinusUjemna: możesz go pominąć, jeśli wprowadzanie liczb ujemnych obsługujesz inaczej.
  • btnC: kasuje bieżący wpis - ustaw lblWynik.Text na 0 i nowyWpis na true.
  • btnAC: kasuje wszystko - dodatkowo zeruje pierwszaLiczba i operator.
Uwaga: właściwość NumbersOnly pola tekstowego nie gwarantuje znaku minus ani separatora dziesiętnego - zależy to od urządzenia i systemu.
Kalkulator - slajd 20/45
Etap 4: zapis wybranego operatora

Przyciski +, -, * i / na etapie wyboru

  • W zdarzeniu Click przycisku btnPlus: ustaw pierwszaLiczba na lblWynik.Text (jako liczbę).
  • Ustaw operator na tekst + i nowyWpis na true, aby następna cyfra rozpoczęła nową liczbę.
  • Powtórz schemat dla btnMinus z operatorem -, btnMnoz z *, btnDziel z /.
  • Opcjonalnie wyświetl na lblWyrazenie podgląd typu 12 +, żeby użytkownik widział stan.
  • Na tym etapie jeszcze nie licz - tylko zapamiętaj kontekst działania.
Kolejność ma znaczenie: najpierw odczytaj bieżącą liczbę do pierwszaLiczba, dopiero potem ustaw nowyWpis na true. W przeciwnym wypadku zdążysz już zmienić flagę i zapiszesz złą wartość.
Kalkulator - slajd 21/45
Etap 4: przycisk równości - szkielet

Główne zdarzenie when btnRowna.Click

  • Przeciągnij zdarzenie when btnRowna.Click do.
  • Wstaw w nie instrukcję warunkową if...then...else z gałęzi Control.
  • Sprawdź najpierw, czy wpis jest poprawny - patrz slajd o walidacji.
  • Potem zagnieżdżonymi warunkami sprawdź wartość zmiennej operator.
  • W każdej gałęzi ustaw lblWynik.Text na wynik odpowiedniego działania.
  • Na końcu ustaw nowyWpis na true, aby nowa liczba zaczynała się od zera.
Zagnieżdżone bloki działają jak nawiasy w matematyce - to od ich ułożenia zależy kolejność wykonywania obliczeń, a nie od priorytetu symboli wpisanych w jeden wiersz.
Kalkulator - slajd 22/45
Etap 4: dodawanie i odejmowanie

Gałęzie operatora + oraz -

  • Warunek: if operator = "+" - porównanie z sekcji Math lub Logic.
  • W gałęzi then ustaw lblWynik.Text na pierwszaLiczba + lblWynik.Text.
  • Blok dodawania znajdziesz w szufladzie Math; może przyjmować więcej niż dwa składniki po rozwinięciu koła zębatego.
  • Drugą gałąź zbuduj analogicznie: if operator = "-" i blok odejmowania.
  • Obie wartości możesz najpierw zapisać do zmiennej wynik, a potem wyświetlić - łatwiej wtedy testować blokiem Do it.
Przykład: pierwszaLiczba = 12, na wyświetlaczu 5, operator = +; po = wyświetlamy 17.
Kalkulator - slajd 23/45
Etap 4: mnożenie i dzielenie

Gałęzie operatora * oraz /

  • Warunek if operator = "*" - blok mnożenia z sekcji Math.
  • Blok mnożenia też można rozbudować kołem zębatym o kolejne czynniki.
  • Warunek if operator = "/" - przed samym dzieleniem sprawdź mianownik.
  • Jeśli druga liczba równa się zero, wyświetl komunikat i przerwij obliczenie.
  • W przeciwnym razie ustaw lblWynik.Text na wynik dzielenia pierwszaLiczba / lblWynik.Text.
Dzielenie przez zero nie ma wyniku w matematyce. W AI2 próba takiego dzielenia może zwrócić wartość Infinity lub NaN, która potem psuje dalsze obliczenia - dlatego zawsze sprawdzaj dzielnik przed działaniem.
Kalkulator - slajd 24/45
Etap 4: kolejność wykonywania operacji

Zagnieżdżone bloki zamiast priorytetu symboli

  • W App Inventor nie wpisujemy wyrażeń jednowierszowych - układamy bloki.
  • Blok wewnętrzny wykonuje się najpierw i dostarcza wartość blokowi zewnętrznemu.
  • Chcąc policzyć (2 + 3) * 3, umieszczasz blok + wewnątrz bloku *.
  • Chcąc policzyć 7 / (2 * 3), umieszczasz blok * w drugim slocie bloku /.
  • Priorytet operatorów ze szkoły przestaje mieć znaczenie, bo to Ty decydujesz o zagnieżdżeniu.
Za materiałami pam4: ułożenie bloków działa jak nawiasy - w przykładzie (2+3)*3 najpierw liczy się suma, potem iloczyn.
Kalkulator - slajd 25/45
Etap 4: pełne przetestowanie czterech działań

Minimalny zestaw prób dla + - * /

  • 2 + 3 = 5; 9 - 4 = 5; 6 * 7 = 42; 8 / 2 = 4.
  • 8 / 3 = 2,666... - sprawdź, czy wynik nie psuje układu wyświetlacza.
  • 0 + 0 = 0 - sprawdź zachowanie pustego startu.
  • 5 / 0 - powinien pojawić się komunikat, a nie Infinity.
  • Po każdym wyniku wpisz nową liczbę - sprawdź, czy nowyWpis resetuje się poprawnie.
Testy ręczne nie zastępują myślenia o przypadkach brzegowych - wręcz przeciwnie, je porządkują i ujawniają braki.
Kalkulator - slajd 26/45
Etap 5: przycisk procentu

Obliczanie procentu bez bloku percent

  • W MIT App Inventor nie ma gotowego bloku procentu - składa się go z dzielenia i mnożenia.
  • Wzór: ile stanowi P% z liczby A, to A / 100 * P.
  • W zdarzeniu btnProcent.Click odczytaj bieżącą liczbę z wyświetlacza.
  • Oblicz wynik: lblWynik.Text / 100 * drugaLiczba (lub wartość zapisana wcześniej).
  • Wyświetl wynik i ustaw nowyWpis na true.
Przykład: 200, potem 15% - jeśli interpretujemy to jako 15% z 200, liczymy 200 / 100 * 15 = 30.
Kalkulator - slajd 27/45
Etap 5: reszta z dzielenia - blok modulo

Przycisk mod w szufladzie Math

  • Otwórz szufladę Math i znajdź blok rozwijany z grupy: modulo / remainder / quotient.
  • Wybierz modulo of - oblicza resztę z dzielenia w sensie matematycznym.
  • Podłącz do niego pierwszą liczbę (pierwszaLiczba) i drugą (lblWynik.Text).
  • Wynik ustaw na wyświetlaczu po naciśnięciu btnMod lub btnRowna z operatorem mod.
  • Pamiętaj: dla liczb ujemnych modulo i remainder dają inne znaki wyniku.
Przykład: 17 modulo 5 = 2; 11 modulo 5 = 1; modulo(-11, 5) = 4, bo wynik modulo zawsze ma znak drugiego argumentu.
Kalkulator - slajd 28/45
Etap 5: potęgowanie blokiem ^

Operator potęgi w MIT App Inventor

  • W szufladzie Math znajdź blok oznaczony symbolem ^.
  • Blok zwraca wynik podniesienia pierwszej liczby do potęgi o wykładniku drugiej.
  • Pierwszy slot: podstawa, na przykład pierwszaLiczba; drugi slot: wykładnik, na przykład lblWynik.Text.
  • W gałęzi operatora = ustaw lblWynik.Text na wynik potęgowania.
  • Przetestuj: 2 ^ 3 = 8; 5 ^ 2 = 25; 10 ^ 0 = 1.
Nazwa bloku w dokumentacji to exponent; w interfejsie widzisz sam symbol ^. Kolejność slotów ma znaczenie: 2 ^ 3 to 8, ale 3 ^ 2 to 9.
Kalkulator - slajd 29/45
Etap 5: pierwiastek kwadratowy

Blok square root w grupie funkcji Math

  • W szufladzie Math rozwijana grupa zawiera: square root, abs, neg, log, e^, round, ceiling, floor.
  • Wybierz square root - zwraca pierwiastek kwadratowy z podanej liczby.
  • Podłącz do niego liczbę, na przykład lblWynik.Text albo pierwszaLiczba.
  • Przed obliczeniem sprawdź, czy liczba nie jest ujemna - w liczbach rzeczywistych pierwiastek z liczby ujemnej nie istnieje.
  • W razie liczby ujemnej wyświetl komunikat zamiast wyniku.
Przykłady: square root(9) = 3; square root(2) jest około 1,41421356; square root(0) = 0.
Kalkulator - slajd 30/45
Etap 5: pozostałe funkcje Math

Funkcje warte dodania do kalkulatora

  • abs - wartość bezwzględna, przydatna przy liczbach ujemnych.
  • round - zaokrąglenie do najbliższej liczby całkowitej.
  • ceiling i floor - zaokrąglenia w górę i w dół.
  • min i max - najmniejsza i największa z podanych liczb.
  • format as a decimal - formatowanie wyniku z określoną liczbą miejsc po przecinku.
  • is a number? - sprawdzenie, czy obiekt jest liczbą; zwraca prawdę lub fałsz.
Te bloki nie są obowiązkowe w wersji podstawowej, ale znacząco podnoszą użyteczność i czytelność wyników.
Kalkulator - slajd 31/45
Etap 5: formatowanie wyniku

Porządek na wyświetlaczu

  • Blok format as a decimal wymaga liczby oraz nieujemnej liczby miejsc po przecinku.
  • Na przykład format as a decimal(2,666..., 2) da wynik 2,67.
  • Możesz opakować wynik działania tym blokiem przed ustawieniem na wyświetlaczu.
  • Alternatywnie użyj round, gdy nie potrzebujesz części dziesiętnych.
  • Formatowanie stosuj na końcu, już po walidacji i po obliczeniu.
Uwaga: format as a decimal zaokrągla lub dopełnia zerami z prawej strony - liczba miejsc musi być całkowita i nieujemna.
Kalkulator - slajd 32/45
Etap 6: walidacja danych wejściowych

Czy użytkownik podał liczbę

  • Sprawdź, czy lblWynik.Text nie jest puste: porównanie z tekstem "".
  • Sprawdź blokiem is a number?, czy odczytana treść jest liczbą.
  • Jeśli któryś test się nie powiedzie, wyświetl komunikat i nie licz.
  • Własność NumbersOnly pola tekstowego pomaga przy klawiaturze, ale nie zastępuje tych testów - nie gwarantuje minusa ani przecinka.
  • Walidację wykonuj na początku zdarzenia btnRowna.Click, przed wyborem operatora.
Przykład warunku: if pusty tekst ORAZ is a number?(wyrazenie) = false, then komunikat, else dalej obliczamy.
Kalkulator - slajd 33/45
Etap 6: dzielenie przez zero i pierwiastek z ujemnej

Przypadki brzegowe arytmetyki

  • Przed dzieleniem sprawdź, czy druga liczba różni się od zera.
  • Przed pierwiastkiem sprawdź, czy liczba jest większa lub równa zero.
  • W razie naruszenia warunku wyświetl komunikat i nie uruchamiaj działania.
  • Zapamiętaj: AI2 przy dzieleniu przez zero może zwrócić Infinity lub NaN - dalsze użycie takiej wartości psuje program.
  • Te same zasady stosuj dla potęgowania, jeśli chcesz unikać bardzo dużych wyników.
Przypadków brzegowych nie widać na pierwszy rzut oka - trzeba je zaplanować. Spis sytuacji wyjątkowych przed testami oszczędza godzin zgadywania, czemu aplikacja się zawiesiła.
Kalkulator - slajd 34/45
Etap 6: komunikaty przez Notifier

Trzy metody komponentu Notifier

  • ShowAlert - krótki, chwilowy komunikat na dole ekranu; najlepszy do ostrzeżeń.
  • ShowMessageDialog - okno z informacją i jednym przyciskiem.
  • ShowChooseDialog - pytanie z kilkoma przyciskami wyboru.
  • W kalkulatorze wystarczy ShowAlert, na przykład: Wpisz liczbę, Dzielenie przez zero, Pierwiastek z liczby ujemnej.
  • Wołanie metody wygląda tak: call Notifier1.ShowAlert z tekstem w slocie.
Przykład: call Notifier1.ShowAlert("Nie można dzielić przez zero").
Kalkulator - slajd 35/45
Etap 6: procedury zamiast duplikacji

Porządek w blokach dzięki procedurom

  • W gałęzi Procedures znajdziesz blok procedury zwykłej oraz procedury zwracającej rezultat.
  • Możesz utworzyć procedurę pokazBlad(wiadomosc) wywołującą ShowAlert.
  • Procedurę z rezultatem warto użyć na przykład do obliczProcent(a, p).
  • Do procedur możesz przekazywać parametry - dodaje się je kołem zębatym w lewym górnym rogu bloku.
  • Wywołanie wygląda jak blok call, podobnie jak getter - zwraca wartość do miejsca, w którym zostało użyte.
W AI2 procedura i funkcja to jedna koncepcja: zwykła procedura tylko wykonuje czynność, a procedura z elementem result dodatkowo zwraca wartość.
Kalkulator - slajd 36/45
Etap 6: gotowy układ logiki - podsumowanie

Co powinno znaleźć się w oknie Blocks

  • Inicjalizacje zmiennych globalnych na górze przestrzeni roboczej.
  • Zdarzenia przycisków cyfr, kropki, C i AC.
  • Zdarzenia przycisków operatorów zapisujących stan.
  • Jedno duże zdarzenie btnRowna.Click z walidacją i gałęziami działań.
  • Zdarzenia przycisków funkcyjnych: %, mod, ^, √, abs, round.
  • Opcjonalnie procedury: pokazBlad oraz obliczProcent.
Uporządkuj bloki w grupy i dodaj komentarze - czytelna przestrzeń robocza jest warta tyle samo co czytelny interfejs.
Kalkulator - slajd 37/45
Etap 7: połączenie z telefonem - AI Companion

Testowanie w czasie rzeczywistym

  • Zainstaluj na telefonie aplikację MIT AI2 Companion.
  • W serwisie wybierz menu Connect, a potem AI Companion.
  • Zeskanuj kod QR lub wpisz kod tekstowy wyświetlony w oknie.
  • Upewnij się, że telefon i komputer są w tej samej sieci bezprzewodowej.
  • Zmiany w blokach powinny pojawiać się na telefonie podczas pracy.
Gdy połączenie nie działa, sprawdź sieć, kod parowania i to, czy projekt nie jest otwarty w drugiej karcie przeglądarki.
Kalkulator - slajd 38/45
Etap 7: tablica testów funkcjonalnych

Przypadki do odhaczenia

PróbaOczekiwany wynik
2 + 3 =5
9 - 4 =5
6 * 7 =42
8 / 2 =4
8 / 0 =komunikat o dzieleniu przez zero
200, potem 15%30 (15% z 200)
17 mod 52
2 ^ 3 =8
pierwiastek z 93
pierwiastek z -4komunikat o liczbie ujemnej
pusty wpis + =komunikat o pustym polu
Kalkulator - slajd 39/45
Etap 7: typowe błędy i debugowanie

Czego szukać, gdy coś nie działa

  • Zła wartość po = - sprawdź kolejność zapisu pierwszaLiczba i ustawienia flagi nowyWpis.
  • Nic się nie dzieje po kliknięciu - sprawdź, czy zdarzenie Click jest podpięte do właściwego przycisku.
  • Błąd wykonania - prawdopodobnie pusty tekst trafił do działania; dodaj walidację.
  • Infinity lub NaN na wyświetlaczu - doszło do dzielenia przez zero albo niepoprawnej operacji.
  • Pomyłka w nazwach - App Inventor rozróżnia wielkość liter w nazwach zmiennych i komponentów.
  • Narzędzia: Do it na blokach, komentarze, chwilowe wyłączanie bloków Disable block.
Kalkulator - slajd 40/45
Etap 7: dopracowanie wyglądu po testach

Ostatnie szlify interfejsu

  • Popraw odstępy między rzędami, jeśli na małym ekranie wszystko jest ściśnięte.
  • Dostosuj FontSize wyniku - powinien być czytelny, ale nie przykrywać innych elementów.
  • Ujednolic kolory przycisków w grupach: cyfry, operatory, funkcje, zerowanie.
  • Sprawdź, czy po długim wyniku układ ekranu się nie rozjeżdża.
  • Dodaj ewentualny wiersz wyrażenia, jeśli jeszcze go nie ma.
  • Zrób zrzut ekranu gotowego wyglądu - przyda się do dokumentacji projektu.
Estetyka jest częścią jakości programu. Ekran, na którym łatwo się połapać, zwiększa prawdopodobieństwo, że użytkownik wróci do aplikacji.
Kalkulator - slajd 41/45
Rozszerzenia: historia i tryb naukowy

Jak rozwinąć kalkulator dalej

  • Historia obliczeń: zapis pary pytań i odpowiedzi w komponencie TinyDB.
  • Tryb naukowy: dodatkowe funkcje sin, cos, tan oraz logarytm naturalny.
  • Przewijanie historii: lista w komponencie ListViewer albo etykieta wielowierszowa.
  • Klawiatura ekranowa: obsługa wprowadzania z fizycznej klawiatury urządzenia.
  • Własne motywy kolorystyczne: zmiana BackgroundColor blokami po wyborze użytkownika.
  • Każde rozszerzenie wymaga powrotu do testów - to naturalna cykliczność pracy.
Kalkulator - slajd 42/45
Etap 8: budowanie pliku APK

Pakowanie gotowej aplikacji

  • W menu serwisu wybierz Build, a następnie Android App (.apk).
  • Poczekaj, aż serwis zbuduje pakiet - proces może chwilę potrwać.
  • Po zakończeniu zobaczysz kod QR oraz odnośnik do pobrania pliku.
  • Pobierz plik o rozszerzeniu .apk i skopiuj go na telefon albo prześlij linkiem.
  • Na telefonie zezwól na instalację z nieznanych źródeł i uruchom aplikację.
  • Opcjonalnie zbuduj też plik projektu .aia jako kopię zapasową.
Plik .aia to cały projekt do ponownego otwarcia w serwisie, a .apk to gotowa aplikacja instalacyjna na Androida. Warto mieć oba.
Kalkulator - slajd 43/45
Podsumowanie kroków budowy

Całość w ośmiu zdaniach

  1. Spisać specyfikację funkcji i przypadki brzegowe.
  2. Zaprojektować wygląd: wyświetlacz, siatkę przycisków, kolory i nazwy.
  3. Utworzyć zmienne globalne przechowujące stan kalkulatora.
  4. Obsłużyć cyfrę, kropkę i kasowanie wraz z flagą nowego wpisu.
  5. Zapisywać wybór operatora przy naciśnięciu przycisku +, -, * lub /.
  6. W przycisku = zbudować walidację i gałęzie działań, w tym %, mod, ^ oraz pierwiastek.
  7. Przetestować wszystkie wiersze tabeli testów na telefonie.
  8. Zbudować plik APK oraz zapisać kopię projektu w formacie .aia.
Schemat ten przenosisz 1:1 na każdy kolejny projekt - zmienia się tylko lista funkcji i komponentów.
Kalkulator - slajd 44/45
Zadania i pytania kontrolne

Sprawdź swoją wiedzę

  1. Opisz schemat wejście - przetwarzanie - wyjście na przykładzie kalkulatora.
  2. Jakie zmienne globalne są potrzebne i dlaczego każda z nich istnieje?
  3. Wyjaśnij różnicę między przyciskiem % a przyciskiem mod w naszym projekcie.
  4. Gdzie w szufladzie Math znajdują się bloki ^ i square root?
  5. Dlaczego przed dzieleniem sprawdzamy mianownik?
  6. Co robi blok is a number? i kiedy go używasz?
  7. Na czym polega różnica między plikiem .aia a plikiem .apk?
Zadanie praktyczne: dodaj do kalkulatora przycisk zaokrąglający wynik do dwóch miejsc po przecinku i dopisz odpowiedni wiersz do tabeli testów.
Kalkulator - slajd 45/45
Zakończenie ćwiczenia

Dziękuję za uwagę

  • Zbudowaliśmy kalkulator od specyfikacji do pliku APK.
  • Poznaliśmy bloki Math: +, -, *, /, ^, square root, modulo, format as a decimal, is a number?.
  • Ćwiczyliśmy walidację wejścia i obsługę przypadków brzegowych.
  • Mamy gotowy schemat pracy przenośny na kolejne projekty.
  • W dalszej części kursu ten sam schemat zastosujemy w większych aplikacjach.

Literatura i materiały: pam1.pdf, pam2.pdf, pam3.pdf, pam4.pdf; dokumentacja MIT App Inventor pod adresem ai2.appinventor.mit.edu; serwis appinventor.org.