2.2. Ułamki zwykłe

Założenia projektu

Ze szkoły podstawowej znasz operacje na liczbach naturalnych i całkowitych oraz na ułamkach zwykłych i dziesiętnych. Teraz twoim zadaniem będzie przygotowanie aplikacji ułatwiającej zrozumienie młodszym uczniom pojęcie ułamka zwykłego. Przykładową aplikację znajdziesz w e-podręczniku do matematyki dla szkoły podstawowej. Możesz także obejrzeć działanie aplikacji w Scratchu na poniższym filmie.
Na scenie duszek losuje licznik i mianownik ułamka oraz przedstawia go graficznie – w przykładowej aplikacji w postaci figury podzielonej na zamalowane i niezamalowane kwadraty (możesz zaproponować własną reprezentację graficzną ułamka, np. w postaci kawałków pizzy). Następnie prosi o podanie licznika i mianownika ułamka, czyli informacji, jaka część figury jest zamalowana. W kolejnym kroku sprawdza poprawność odpowiedzi.

Duszek przedstawia graficznie ułamek

Rozpocznij od rozplanowania sceny. Pamiętaj, że jej rozmiar to 480 na 360 pikseli.

Zadanie 2.2.1.

Zastanów się, jaką przyjąć długość boku pojedynczego kwadratu, ile ich umieścić w jednym wierszu, ile maksymalnie wierszy zmieści się na scenie, aby zostało wolne miejsce dla duszka wyświetlającego komunikaty. Ustal na tej podstawie zakres losowania mianownika i licznika ułamka.
Przykładowe rozplanowanie sceny: długość boku kwadratu wynosi 40 pikseli, górną połowę sceny przeznaczamy na reprezentację ułamka, dolną dla duszka zadającego pytanie i podającego informację o poprawności udzielonej odpowiedzi. Pozostawiając odstępy od krawędzi sceny o szerokości 20 pikseli można maksymalnie narysować 44 kwadraty (4 rzędy po 11 kwadratów). Duszek może więc losować mianownik w zakresie od 2 do maksymalnej liczby kwadratów (czyli 44), a licznik od 1 do wylosowanej wartości mianownika minus 1.

Zadanie 2.2.2.

Zastanów się, w jaki sposób duszek narysuje (wyświetli) kwadraty na scenie. Skonsultuj swoje pomysły z kolegami i koleżankami. Spróbujcie zaproponować co najmniej dwa rozwiązania.

Wskazówka

Duszek może rysować kwadraty. Nie powinno być problemów z narysowaniem niewypełnionego kwadratu. Jak poradzić sobie z zamalowanym kwadratem? Scratch dostarcza wielu poleceń do efektów graficznych, nie ma jednak polecenia do zamalowywania figur ani rysowania zamalowanych figur. Można narysować zamalowany kwadrat z odpowiedniej liczby odcinków, ale to rozwiązanie mało wygodne i powolne. Możesz też rysować odpowiednio pogrubionym pisakiem, ale końce tak rysowanego odcinka będą zaokrąglone, a więc nie będą to wtedy kwadraty.
Rozważ przygotowanie w edytorze graficznym dwóch kostiumów duszka w postaci zamalowanego i niezamalowanego kwadratu. Duszek może się ustawić w odpowiednim miejscu sceny i odcisnąć (przystemplować) swój kostium.

Zadanie 2.2.3.

W edytorze graficznym przygotuj dwa kwadraty o długości boku np. 40, jeden zamalowany, drugi przezroczysty. Jeśli korzystasz z edytora graficznego Scratcha dodaj nowego duszka i narysuj jego dwa kostiumy. Jeśli z innego edytora, utwórz nowego duszka i wczytaj dwa kostiumy z plików graficznych. Pamiętaj, żeby sprawdzić punkt zaczepienia. Oba kostiumy powinny mieć go w tym samym punkcie, najlepiej w środku kwadratu lub w jego lewym górnym rogu.
W projekcie będą więc występowały dwa duszki:
  1. 1.
    Ukryty duszek – kwadrat, którego zadaniem będzie (np. po kliknięciu w zieloną flagę) wylosowanie mianownika i licznika oraz przygotowanie zadania na scenie, czyli przystemplowanie odpowiedniej liczby kwadratów zgodnie z wylosowanymi wartościami.
  2. 2.
    Kotek (lub inna dowolnie przez ciebie wybrana postać), którego zadaniem będzie poproszenie o podanie odpowiedzi oraz sprawdzenie jej poprawności.
Wylosowany licznik i mianownik oraz podane wartości jako odpowiedzi będziesz musiał zapamiętać. Utwórz więc w projekcie cztery zmienne liczbowe (dostępne dla obu duszków) do przechowywania tych wartości.

Zadanie 2.2.4.

Zapisz w punktach przypis postępowania (algorytm) dla duszka - kwadratu.
Przykładowy przepis postępowania. Zakładamy, że punkt zaczepienia znajduje się w lewym górnym rogu kwadratu, oraz że długość boku kwadratu wynosi 40.

Po kliknięciu zielonej flagi:
  1. 1.
    Wyczyść scenę.
  2. 2.
    Wylosuj mianownik ułamka i zapamiętaj w zmiennej mianownik (zakres losowania od 2 do 44).
  3. 3.
    Wylosuj licznik ułamka i zapamiętaj w zmiennej licznik (zakres losowania od 1 do mianownik -1).
  4. 4.
    Ustal jako bieżący kostium zamalowany kwadrat.
  5. 5.
    Idź do punktu o współrzędnych (-220,160).
  6. 6.
    Powtórz licznik razy:
    1. 6.1.
      Przystempluj swój kostium.
    2. 6.2.
      Powiększ współrzędną x-ową o 40.
    3. 6.3.
      Jeżeli współrzędna x-owa duszka jest równa 220 (trzeba zmienić rząd):
      1. 6.3.1.
        Ustal współrzędną x-ową na -220.
      2. 6.3.2.
        Pomniejsz współrzędną y-ową o 40.
  7. 7.
    Ustal jako bieżący kostium przezroczysty kwadrat.
  8. 8.
    Powtórz mianownik-licznik razy:
    1. 8.1.
      Przystempluj swój kostium.
    2. 8.2.
      Powiększ współrzędną x-ową o 40.
    3. 8.3.
      Jeżeli współrzędna x-owa duszka jest równa 220:
      1. 8.3.1.
        Ustal współrzędną x-ową na -220.
      2. 8.3.2.
        Pomniejsz współrzędną y-ową o 40.
  9. 9.
    Zakończ skrypt.

Zadanie 2.2.5.

Zapisz skrypt realizujący algorytm z poprzedniego zadania. Następnie przetestuj działanie skryptu. Uruchom go kilkukrotnie, sprawdź, czy losują się różne ułamki.
Przykładowy skrypt realizujący wylosowanie oraz przedstawienie w postaci graficznej ułamka:

Duszek sprawdza odpowiedź

Zadania dla drugiego duszka są dużo prostsze. Powinien on poprosić o podanie odpowiedzi (licznik i mianownik ułamka określającego, jaka część figury jest zamalowana) oraz sprawdzić jej poprawność. Podane wartości wygodnie będzie zapamiętać w zmiennych, np. o nazwach odp_licznik i odp_mianownik.

Zadanie 2.2.6.

Zastanów się, jak sprawdzić poprawność odpowiedzi. Czy porównanie wylosowanych wartości licznika i mianownika ułamka z wczytanymi wartościami wystarczy?
Łatwo pewnie zauważysz, że na postawione pytanie w poleceniu odpowiedź jest negatywna. Np. jeśli wylosowana figura będzie taka, jak na poniższym rysunku, a wczytana odpowiedź jedna druga, to wynikiem porównania będzie fałsz.

Zadanie 2.2.7.

Spróbuj sformułować warunek logiczny, którego wynikiem będzie prawda także dla ułamka po redukcji (czyli po skróceniu).

Zadanie 2.2.8.

Zapisz w punktach przypis postępowania (algorytm) dla duszka sprawdzającego odpowiedź.
Przykładowy przepis postępowania zapisany w punktach.

Po kliknięciu w zieloną flagę:
  1. 1.
    Wyświetl przez np. 3 sekundy w dymku komiksowym pytanie: „Jaka część figury jest zamalowana?”.
  2. 2.
    Zapytaj o licznik ułamka i zapamiętaj go w zmiennej odp_licznik.
  3. 3.
    Zapytaj o mianownik ułamka i zapamiętaj go w zmiennej odp_mianownik.
  4. 4.
    Jeżeli licznik / mianownik = odp_licznik / odp_mianownik, to wyświetl komunikat „Brawo!”.
  5. 5.
    w przeciwnym przypadku wyświetl komunikat „Hm... niestety źle.”.
  6. 6.
    Zakończ skrypt.

Zadanie 2.2.9.

Zapisz skrypt realizujący algorytm z poprzedniego zadania.
Przykładowy skrypt:
Przetestuj działanie projektu. Zastanów się, czy i jak można jeszcze poprawić sprawdzanie odpowiedzi. Czy uzasadnione jest wyświetlanie komunikatu „Brawo!”, kiedy grający poda prawidłowo wartość ułamka, ale go nie skróci? Może lepiej w takiej sytuacji wyświetlić komunikat np. „Dobrze, ale można skrócić ułamek...”. Czy potrafisz rozpoznać taki stan i poprawić skrypty?

Na kłopoty algorytmy – Euklides przychodzi z pomocą

Łatwo odpowiesz na pytanie, co trzeba zrobić, aby skrócić ułamek. Wystarczy znaleźć największą liczbę naturalną taką, która dzieli bez reszty zarówno licznik jak i mianownik ułamka, następnie podzielić licznik i mianownik przez ten dzielnik. Taką liczbę nazywamy największym wspólnym dzielnikiem i oznaczamy NWD.

Zadanie 2.2.10.

Zastanów się i spróbuj zapisać algorytm znajdowania największego wspólnego dzielnika dwóch liczb. Twoje dane stanowią dwie liczby całkowite dodatnie, oznaczmy je przez a i b, natomiast wynikiem jest liczba całkowita dodatnia: NWD(a,b).
Wskazówka:
Do badania podzielności możesz wykorzystać operację arytmetyczną modulo, czyli resztę z dzielenia dwóch liczb całkowitych.

Wskazówka

Jeśli nie masz innych pomysłów, zauważ, że największy wspólny dzielnik nie może być większy od mniejszej z liczb a i b. Możesz więc rozpocząć od tej liczby i odejmować jedynkę tak długo, dopóki nie otrzymasz liczby, która dzieli bez reszty zarówno a, jak i b.
Zapis w punktach algorytmu podanego we wskazówce powyżej:

Dane: a i b – liczby całkowite dodatnie.
Wynik: nwd – największy wspólny dzielnik liczb a i b.
  1. 1.
    Jeżeli a >b, to przypisz nwd wartość b, w przeciwnym przypadku przypisz nwd wartość a.
  2. 2.
    Powtarzaj, aż a modulo nwd =0 i b modulo nwd =0.
    1. 2.1.
      Zmniejsz nwd o 1.

Zadanie 2.2.11.

Wyszukaj informacje w internecie dotyczące Euklidesa, matematyka pochodzącego ze starożytnej Grecji, jego dzieła Elementy oraz algorytmu Euklidesa. Przygotuj krótką prezentację na ten temat.
Algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb całkowitych dodatnich opiera się na następującej własności NWD:
NWD(a,b)=NWD(a-b,b) przy założeniu, że a>b,
czyli, jeżeli większą liczbę zastąpimy różnicą większej i mniejszej, to wartość NWD się nie zmieni. Istotnie, jeśli k=NWD(a,b), to a=n*k i b=m*k, gdzie n i m to liczby całkowite dodatnie.
Wówczas a-b=n*k-m*k=(n-m)*k, czyli k jest dzielnikiem różnicy a-b.
Zastępując cyklicznie większą liczbę przez różnicę większej i mniejszej dojdziemy wcześniej lub później do sytuacji, że obydwie liczby są równe, w najgorszym przypadku obydwie będą równe 1. A dla dwóch takich samych liczb największy wspólny dzielnik jest im równy.
Przykład obliczenia NWD dla liczb 76 i 48, algorytmem Euklidesa na odejmowanie.

Zadanie 2.2.12.

Zapisz w postaci listy kroków algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb całkowitych dodatnich (z wykorzystaniem odejmowania).
Dane: a i b – liczby całkowite dodatnie.
Wynik: nwd – największy wspólny dzielnik liczb a i b.
  1. 1.
    Powtarzaj aż a=b.
    1. 1.1.
      Jeżeli a >b, to przypisz a wartość różnicy a-b, w przeciwnym przypadku przypisz b wartość różnicy b-a.
  2. 2.
    Przypisz nwd wartość a.
Zwróć uwagę, że jeżeli jedna liczba jest dużo większa od drugiej, to wielokrotnie będzie następowało odejmowanie od niej tej samej mniejszej liczby. Takie wielokrotne odejmowanie można zastąpić dzieleniem, a dokładniej resztą z dzielenia większej liczby przez mniejszą. Na przykład dla a=256 i b=48 otrzymujemy:
Zwróć uwagę, że zastępując odejmowanie braniem reszty z dzielenia inny jest warunek końca powtarzania: jedna z wartości osiągnie wartość 0.

Zadanie 2.2.13.

Zapisz w postaci listy kroków algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb całkowitych dodatnich (z wykorzystaniem reszty z dzielenia).
Dane: a i b – liczby całkowite dodatnie.
Wynik: nwd – największy wspólny dzielnik liczb a i b.
  1. 1.
    Powtarzaj, aż a=0 lub b=0:
    1. 1.1.
      Jeżeli a>b, to przypisz a wartość a mod b, w przeciwnym przypadku przypisz b wartość b mod a.
  2. 2.
    Przypisz nwd wartość a+b.

Wprowadzając pomocniczą zmienną można zapisać algorytm trochę prościej, bez użycia instrukcji warunkowej.
  1. 1.
    Powtarzaj aż b=0.
    1. 1.1.
      Przypisz zmiennej reszta wartość a mod b.
    2. 1.2.
      Przypisz a wartość b.
    3. 1.3.
      Przypisz b wartość reszta.
  2. 2.
    Przypisz nwd wartość a.

Zadanie 2.2.14.

Znasz już kilka algorytmów znajdowania największego wspólnego dzielnika. Zastanów się, przedyskutuj ewentualnie z kolegami i koleżankami, który z nich wykona najmniej operacji, a więc będzie najbardziej efektywny.

Zadanie 2.2.15.

Stwórz własny blok z dwoma parametrami liczbowymi realizujący któryś z tych algorytmów. Jeśli nie wiesz, jak tworzyć własne bloki, kliknij tutaj.

Wskazówka

Scratch chroni wartość parametrów, czyli nie można zmieniać ich wartości. Należy więc utworzyć dwie pomocnicze zmienne (dostępne tylko dla danego duszka), które będą miały na początku takie same wartości jak parametry i na których skrypt będzie dokonywał obliczeń. Podobnie, trzeba utworzyć zmienną, w której zapamiętasz wynik obliczeń.
Skrypty obliczające NWD algorytmem Euklidesa z odejmowaniem i dzieleniem.

Modyfikujemy projekt

Modyfikacja projektu będzie polegała na tym, aby rozpoznawać trzy stany:
  1. 1.
    Grający udzielił poprawnej odpowiedzi i skrócił ułamek, jeśli to możliwe.
  2. 2.
    Grający udzielił poprawnej odpowiedzi co do wartości ułamka, ale go nie skrócił.
  3. 3.
    Grający udzielił błędnej odpowiedzi.

Czy grający udzielił prawidłowej odpowiedzi sprawdzisz używając tego samego warunku, co dotychczas.
Jeśli przyjmuje on wartość prawda, należy korzystając z bloku obliczającego NWD rozstrzygnąć, czy wyświetlić „Brawo!” (stan 1), czy „Dobrze, ale można skrócić ułamek...” (stan 2).

Zadanie 2.2.16.

Sformułuj warunek logiczny sprawdzający, czy grający podał jako odpowiedź skrócony ułamek.
Należy obliczyć NWD dla wylosowanych wartości licznika i mianownika, a następnie wykorzystać wynik w warunku logicznym do sprawdzenia, czy podane jako odpowiedzi wartości są równe skróconemu ułamkowi.

Zadanie 2.2.17.

Popraw skrypt sprawdzający odpowiedź.
Fragment poprawionego skryptu:

Zadania uzupełniające

Zadanie 2.2.18.

Dane: Prostokąt o szerokości s i wysokości w.
Wynik: Minimalna liczba takich samych kwadratów, którymi można wypełnić prostokąt.
Na przykład dla s=250 i w=150 minimalna liczba kwadratów wynosi 15 (długość boku kwadratu wynosi 50).
Zapisz w postaci listy kroków algorytm obliczenia minimalnej liczby kwadratów.

Zadanie 2.2.19.

Przygotuj projekt, w którym duszek prosi o podanie szerokości i wysokości prostokąta oraz rysuje prostokąt wypełniony minimalną liczbą kwadratów.