Zadanie 1
Napisz bezparametrową procedurę/funkcję BRAMA, po wywołaniu której na ekranie powstanie rysunek taki, jak poniżej. Szara podstawa bramy ma wysokość 24 i szerokość 624. Wielkości pozostałych elementów odczytaj z rysunku pomocniczego.
Rysunek Pomocniczy BRAMA Rozwiązanie
W zadaniu powtarza się jedynie mały i duży słup i te fragmenty kodu można przepisać jako dodatkowego procedury. Pozwoli to na napisanie bardziej zwięzłego kodu. Oto kolejne procedury, które rysują mały i duży słup o zadanej szerokości :a.
- oto brama_malyslup :a
- lw 90
- prostokat :a*5 :a "czerwony
- np :a*5 lw 90
- np :a pw 90
- prostokat :a :a*3 "czerwony
- np :a lw 90
- np :a pw 90
- niech "b (:a*5)/pwk(2)
- wielokąt [
- ukm "czerwony
- pw 45 np :b
- pw 90 np :b
- ]
- pod
- ws :a*6 pw 90
- np :a*2
- opu
- już
- oto brama_duzyslup :a
- lw 90
- prostokat :a*15 :a*2 "czerwony
- np :a*14
- prostokat (-:a) (-:a) "czerwony
- pod
- pw 90 np :a*2
- opu
- prostokat :a :a "czerwony
- lw 90 ws :a*14
- pw 90 ws :a*2
- już
Obydwie powyższe procedury korzystają z procedury prostokat do narysowania prostokątów.
- oto brama
- niech "a 24
- niech "d :a*pwk(2)
- pod
- ws :a*19/2 pw 90
- ws :a*13 lw 90
- opu
- wielokąt [
- ukm "szary
- powtórz 2 [
- np :a pw 90
- np (:a*26) pw 90
- ]
- ]
- np :a pw 90
- np :a brama_malyslup :a
- np :a*3 brama_duzyslup :a
- np :a*4 brama_malyslup :a
- np :a*9 brama_malyslup :a
- np :a*3 brama_duzyslup :a
- np :a*4 brama_malyslup :a
- pod
- np :a*2 lw 90
- np :a*12 lw 90
- opu
- wielokąt [
- ukm "czerwony
- np (:a*26) pw 135
- np :d pw 45
- np (:a*24)
- ]
- pod
- ws :a pw 90
- np :a*5 lw 90
- opu
- wielokąt [
- ukm "czerwony
- np (:a*28) lw 135
- np (:d*2) lw 45
- np (:a*24)
- ]
- ws :a
- wielokąt [
- ukm "czerwony
- np (:a*30) pw 135
- np :d pw 45
- np (:a*28)
- ]
- już
Brama będzier rysowana od dolnej podstawy do górnej. Bardzo ważne, aby pamiętać, że najpierw należy narysować słupy, a dopiero później poziome elementy bramy. Oto kod procedury:
- oto brama
- niech "a 24
- niech "d :a*pwk(2)
- pod
- ws :a*19/2 pw 90
- ws :a*13 lw 90
- opu
- wielokąt [
- ukm "szary
- powtórz 2 [
- np :a pw 90
- np (:a*26) pw 90
- ]
- ]
- np :a pw 90
- np :a brama_malyslup :a
- np :a*3 brama_duzyslup :a
- np :a*4 brama_malyslup :a
- np :a*9 brama_malyslup :a
- np :a*3 brama_duzyslup :a
- np :a*4 brama_malyslup :a
- pod
- np :a*2 lw 90
- np :a*12 lw 90
- opu
- wielokąt [
- ukm "czerwony
- np (:a*26) pw 135
- np :d pw 45
- np (:a*24)
- ]
- pod
- ws :a pw 90
- np :a*5 lw 90
- opu
- wielokąt [
- ukm "czerwony
- np (:a*28) lw 135
- np (:d*2) lw 45
- np (:a*24)
- ]
- ws :a
- wielokąt [
- ukm "czerwony
- np (:a*30) pw 135
- np :d pw 45
- np (:a*28)
- ]
- już
W kodzie wartość 24 została przypisana do :a. Oznacza to, że możliwe jest narysowanie bramy większej / mniejszej.
Zadanie 2
Napisz jednoparametrową procedurę/funkcję RAMA, po wywołaniu której na środku ekranu powstanie kwadratowa ramka, taka jak poniżej. Parametr określa liczbę elementów tworzących bok ramki (patrz rysunek pomocniczy) i może przyjmować wartości od 1 do 12. Wysokość rysunku jest stała i wynosi 480.
Rysunek pomocniczy Rozwiązanie
Uproszczenie kodu polega na rozbiciu go na dwie procedury: główną do rysowania całego wzoru oraz pomocniczej do rysowania pojedynczego elementu o pewnej szerokości :a. Kod procedury do rysowania pojedynczego elementy wygląda następująco:
- oto rama_el :a
- niech "d :a*pwk(2)
- wielokąt [
- ukm "czarny
- np :a pw 90
- np (:a*7) lw 90
- np :a pw 90
- np :a pw 90
- np (:a*2) pw 90
- np (:a*8) pw 90
- ]
- pod
- np :a*3 pw 90
- np :a*3 lw 90
- opu
- wielokąt [
- ukm "czarny
- lw 45
- np :d pw 45
- np (:a*2) pw 90
- np (:a*7) pw 45
- np :d pw 135
- np (:a*7) lw 90
- np (:a*2)
- ]
- pod
- pw 90 np :a
- lw 90
- opu
- wielokąt [
- ukm "czarny
- np :a pw 90
- np (:a*3) pw 45
- np :d pw 135
- np (:a*4)
- ]
- pod
- ws :a*3 pw 90
- np :a*6 lw 90
- opu
- wielokąt [
- ukm "czarny
- lw 45
- np :d pw 45
- np (:a*3) pw 90
- np :a pw 90
- np (:a*4)
- ]
- już
Wtedy główna procedura upraszcza się do następującej postaci. Tutaj bardzo ważne jest wyliczenie szerokości :a w linijce (3.)
- oto rama :n
- niech "w 480
- niech "a :w/(:n*11 + 7)
- pod
- ws :w/2 pw 90
- ws :w/2 lw 90
- opu
- powtórz 4 [
- wielokąt [
- ukm "czarny
- powtórz 2 [
- np (:a*7) pw 90
- np :a pw 90
- ]
- ]
- powtórz :n [
- rama_el :a
- pod
- pw 90 np :a lw 90
- opu
- ]
- pod
- pw 90 np :a*7
- lw 180
- opu
- ]
- już
Zadanie 3
Jaś wydaje własne książki. Każda strona jest numerowana kolejnymi liczbami, pierwsza strona ma numer 1. Jeśli w numerze strony występuje 13 (tj. cyfra 1, a bezpośrednio po niej cyfra 3), to drukuje te cyfry kolorem złotym. Napisz jednoparametrową funkcję ILE, której parametrem jest liczba stron książki wydanej przez Jasia, a wynikiem liczba cyfr wydrukowanych kolorem złotym. Parametr może przyjmować wartości od 10 do 15000.
Rozwiązanie
Do rozwiązania wystarczy jedna pętla oraz funkcja numel. Należy jednak pamiętać, że rozpoczynamy sprawdzanie od 10, więc będzie :n - 10 powtórzeń. Ponadto należy pamiętać, że może występować więcej niż jedna liczba 13. Zgodnie z zadaniem np. liczba 1313 będzie całkowicie wydrukowana kolorem złotym.
- oto ile :n
- niech "w 0
- dopóki [:n >0][
- niech "k :n
- dopóki [:k >= 10][
- jeśli (reszta :k 100 = 13) [
- niech "w :w + 2
- ]
- niech "k int(:k / 10)
- ]
- zmniejsz "n
- ]
- wynik :w
- już