Zdefiniuj procedurę GRAFKOD :liczba, której daną może być dowolna liczba całkowita dodatnia. Procedura przedstawia liczbę w postaci graficznej, zgodnie z następującymi zasadami:
Rysunek powinien mieścić się na ekranie i być możliwie duży, kodowana liczba może mieć maksymalnie 100 cyfr.
Rysunki poniżej przedstawiają efekty wywołań: GRAFKOD 4236, GRAFKOD 11001 oraz GRAFKOD 912345678909876543219.
W przypadku tego zadania warto na początek ustalić maksymalny rozmiar rysunku. Za rozmiar roboczy można przyjąć obszar o wielkości 700x460. Wiedząc, że największa cyfra to 9 to maksymalnie w kolumnie musi się zmieścić 18 odcinków, dlatego można bezpiecznie przyjąć, że odległość pomiędzy pionowymi kreskami nie może przekroczyć 25. Oczywiście należy pamiętać, aby tę szerokość ewentualnie zmniejszyć jeśli wpisana liczba jest bardzo długa.
(2.) Ustal maksymalną odległość pomiędzy pionowymi kreskami oraz (3.) szerokość obszaru roboczego. (4.) Zapamiętaj ile jest cyfr w wprowadzonej liczbie i na podstawie tej wartości (5.) oblicz szerokość jednej kolumny. (6.) Jeśli odległość jest większa niż maksymalna wartość to (7.) zmień ją na maksymalną. Następnie przejdź (9. - 12.) w lewy koniec rysunku w celu rozpoczęcia rysowania.
(13.) Dla każdej z cyfr: (14.) pobierz cyfrę i (15.) w zależności od tego czy kolumna być rysowana w dół czy w górę wybierz odpowiedni fragment kodu. W przypadku rysowania kolumny do dołu (16. - 20.) skręty będą wyoknywane w lewo, a w przypadku rysowania kolumny do góry (22. - 26.) w prawo.
Zdefiniuj funkcję POWIEL :słowo :liczba, której danymi są dowolne słowo i dowolna liczba całkowita nieujemna. Wynikiem funkcji jest słowo z powielonymi literami. Każda litera jest powielona tyle razy, jaka jest wartość cyfry na tej samej pozycji w liczbie. Jeśli liczba jest krótsza (tzn. ma mniej cyfr, niż słowo liter), to dla kolejnych liter na pozycjach dalszych niż długość liczby - brane są ponownie cyfry od początku liczby.
POWIEL "krokodyl 123 | jest "krroookoodddyll |
---|---|
POWIEL "lis 2005 | jest "ll |
Całe zadania się do pobierania kolejnych liter z słowa i kolejnych cyfr z liczby. W tym drugim przypadku należy zastosować funkcję reszta, aby wybierać cyfry z liczby cyklicznie.
(2.) Ustal zmienną przechowującą wynik na puste słowo. (3.) Pobierz ile cyfr ma :liczba i (4.) dla każdej litery: (5.) zapamiętaj literę, (6.) wybierz odpowiednią cyfrę. Następnie (7.) w zależności od wybranej cyfry (8.) dodaj tyle razy zapamiętaną literę do tekstu wynikowego. Na koniec (11.) zwróć zmienną :w.
Zdefiniuj procedurę POSADZKA :s :w, która dla całkowitych, dodatnich danych :s i :w rysuje na środku ekranu posadzkę o szerokości :s i wysokości :w. Posadzka składa się z możliwie najmniejszej liczby kwadratowych kafelków o całkowitoliczbowych długościach boków. Kafelki nie różnią się rozmiarem i występują w jednym z dwóch kolorów, dowolnie wybranych, ale różnych od koloru tła. Kafelki mające wspólny bok mają różne kolory.
Rysunek poniżej przedstawiają efekty wywołania POSADZKA 700 80 i POSADZKA 700 70, POSADZKA 150 250.
W zadaniu jest mowa, aby kafelków było jak najmniej, a ich boki miały długość całkowitoliczbową. Oznacza to, że zarówno szerokość jak i wysokość rysunku powinny być wielokrotnościami rozmiaru. Jednym z najprostszych sposobów na rozwiązanie tego problemu jest znalezienione Najmniejszego Wspólnego Dzielnika dla podanych wartości :s i :w. Poniżej znajduje się algorytm realizujący Algorytm Euklidesa, który pozwala znaleźć NWD dla dowolnych dwóch liczb całkowitych dodatnich.
Jego dokładnie wyjaśnienie można znaleźć tutaj. Warto oczywiście zauważyć, że jeśli liczby są względnie pierwsze to rozmiar kafelków wyniesie 1.
Procedura rozpoczyna działanie od wyznaczenia potrzebnych wartości:
(2.) Oblicz rozmiar kafelka, a następnie ile (3.) będzie kafelków wzwyż i (4.) wszerz. Następnie (5. - 7.) przejdź w lewy dolny róg rysunku. (8.) Ustal jakie kolory będą miały kafelki. Są one zgodnie z zadaniem dowolne, dlatego mogą być jak w przykładowym rozwiązaniu: w odcieniu zielonego koloru.
(9.) Narysuj :hn wierszy. (10.) Każdy kolejny wiersz zaczyna się innym kolorem, dlatego wybieramy odpowiedni indeks koloru biorąc resztę z dzielenia numeru wiersza przez 2. (11.) Rozpoczyamy rysowanie kwadracików: (12.) przed narysowaniem każdego kwadratu zmieniamy kolor na przeciwny i ustalamy (13.) kolor malowania i (14.) pisaka. (15. - 20.) Rysujemy kwadrat i (21. - 22.) przechodzimy do kwadratu obok na prawo. Po narysowaniu wiersza (24. - 25.) przechodzimy do pierwszego kwadratu wiersz wyżej. Na koniec (27. - 28.) przywracamy domyślne ustawienia pisaka i koloru pisaka.