Napisz procedurę ZAKODUJ :wyraz, której wywołanie koduje :wyraz według następującej reguły: litera a ma zostać zastąpiona przez literę z, litera b przez y, litera c przez x, ..., wreszcie litera z ma zostać zastąpiona przez literę a. Zakodowane mają być jedynie małe litery alfabetu łacińskiego, wszystkie inne znaki (w tym polskie litery mają zostać wypisane bez zmian).
Oto przykładowe wyniki:
ZAKODUJ "abrakadabra | powinno wypisać na ekranie słowo zyizpzwzyiz |
---|---|
ZAKODUJ "AlaMaKota | powinno wypisać na ekranie słowo AozMzklgz |
Do rozwiązania tego zadania przyda się znajomość tablicy ASCII. Każdy znak to w rzeczywistości dla komputera liczba. Używając funkcji ascii możemy uzyskać jego kod. W celu zamienienia liczby na znak użyjemy funkcji znak:
(1.) Funkcja przyjmuje jeden argument :wyraz - jest to wyraz, który mamy zaszyfrować. (2.) Deklarujemy zmienną :wynik do której będziemy zapisywać kolejne litery tekstu wynikowego. (3.) Dla każdego znaku w :wyraz: (4.) tymczasowo każdą kolejną literę zapisujemy do zmiennej :a. (5.) Sprawdzamy warunek czy liczba jest większa od 97 i mniejsza od 122. (Znak 97 to a, a 122 to z, pomiędzy nimi znajdują się wszystkie pozostałe litery alfabetu łacińskiego w porządku alfabetycznym). Jeśli jest to mała litera to (6.) Na koniec :wynik dopisujemy zmieniony znak: obliczamy jego numer n w alfabecie i pobieramy n-ty alfabetu od końca. Jeśli jednak nie jest to mała litera alfabetu to (8.) dopisujemy znak do :wynik bez zmian. Na koniec (11.) zwracamy wartość zmiennej :wynik.
Napisz procedurę ILEPAR :liczba, która wypisze, ile razy w liczbie podanej jako parametr występują pary takich samych sąsiednich cyfr (np. w liczbie 2112 taka parą jest jedynie sekwencja dwóch kolejnych jedynek).
Oto przykładowe wyniki:
ILEPAR 6387644 | powinno wypisać na ekranie 1 |
---|---|
ILEPAR 212777 | powinno wypisać na ekranie 2 |
ILEPAR 33455 | powinno wypisać na ekranie 2 |
ILEPAR 3237 | powinno wypisać na ekranie 0 |
Rozwiązanie zadania opiera się o resztę z dzielenia przez dziesięc. W każdej iteracji pobieramy ostatnią cyfrę. Jest to reszta z dzielenia przez 10. W tej samej iteracji usuwamy tę cyfrę z liczby. Licznik zwiększymy tylko wtedy, gdy nowa wartość reszty jest równa poprzedniej. Oto rozwiązanie:
(1.) Funkcja ILEPAR przyjmuje tylko jeden argument :liczba. (2.) Deklarujemy zmienną :licznik i ustawiamy wartość na 0. Będziemy ją zwiększać kiedy wykryjemy, że dwie sąsiednie cyfry są identyczne. Pozbywając się cały czas ostatniej cyfry dojdziemy do momentu kiedy liczba wyniesie 0, dlatego wszystkie powtórzenia wykonujemy (3.) dopóki wartość :liczba jest większa od zera. (4.) Pobieramy ostatnią cyfrę :liczba i zapisujemy do zmiennej :a. (5.) Usuwamy ostatnią cyfrę z liczby. (6.) Porównujemy pobraną cyfrę z nową ostatnią cyfrą. Jeśli są równe to (7.) zwiększamy licznik. Na koniec (10.) zwracamy wartość :licznik.
Napisz procedurę LAS rysującą "losowy" las. Las powinien składać się z losowej liczby drzew i poziomego podłoża. Drzew powinno być co najmniej cztery, ale nie więcej niż osiem. Każde drzewo powinno mieć pionowy pień o wysokości stanowiącej od jednej czwartej do trzech czwartych wysokości ekranu. Od pnia, symetrycznie po obu jego stronach (parami), w górę pod kątem , powinny wyrastać gałęzie będące odcinkami. Liczba par gałęzi powinna być losowa, ale nie mniejsza niż pięć i nie większa niż dziesięć. Długość gałęzi w danej parze powinna być taka sama, choć różne pary gałęzi mogą mieć różne długości. Długość gałęzi powinna być losowa, nie dopuszczamy gałęzi o długości zero. Najniższa para gałęzi nie może wyrastać na poziomie podłoża, ponad najwyższą parą gałęzi powinien wystawać czubek drzewa. Żadne dwa drzewa nie mogą "nachodzić na siebie", mogą co najwyżej stykać się końcami gałęzi. Odległość pomiędzy pniami dwóch kolejnych drzew powinna być jednakowa. Rysunek powinien wykorzystywać całą szerokość ekranu.
Procedura LAS mogłaby stworzyć taki oto rysunek:
Podczas rozwiązywania zadania warto rozdzielić zadanie na dwa pod zadania. W pierwszej części napiszemy procedurę rysujące losowe drzewo dla podanej szerokości i wysokości. Druga funkcja będzie odpowiednio wywoływać pomocniczą. Taki podział znacząco uprości kod. Funkcja pomocnicza LAS_pom:
Funkcja LAS_pom rysuje drzewo od miejsca i kierunku gdzie żółw jest ustawiony. (1.) Do funkcji przekazujemy dwa argumenty :szer i :ws_max, które określają jak szerokie może być drzewo oraz jak wysokie. (2.) Losujemy ile będzie miało drzewo gałęzi z przedziału 5, a 10. (3.) Losujemy wysokość drzewa. (4.) Rysujemy :n gałęzi: (5.) odcinek pomiędzy ziemią i gałęzią, między gałęziamy i długość czubka są równe, dlatego przesuwamy o (doliczamy odcinek czubka). (5.) Obracamy żółwia w lewo o . (6.) Wyliczamy długość gałęzi. Dodajemy jeden, aby długość gałęzi nigdy nie wyniosła 0. (7. - 12.) Rysujemy dwie gałęzie i wracamy do miejsca gdzie skończyliśmy ruch z (5.). Na koniec (15.) dorysowujemy czubek i (16.) wracamy tam gdzie zaczęliśmy procedure LAS_pom.
Druga procedura LAS wyśrodkuje obraz i wyliczy szerokości drzew na podstawie wylsowanej ich ilości:
Ustalamy (2.) szerokość i (3.) wysokość obszaru w którym ma się zmieścić rysunek. (4.) Losujemy ilość drzew i zapisujemy do zmiennej :drzewa. (6.) Przesuwamy (5.) podniesiony pisak na poziom pni i opuszczamy (6.). (7. - 10.) Rysujemy dolną kreskę lasu. Znajdujemy się teraz w prawym dolnym rogu rysunku. (11.) Przesuwamy pisak na pozycję pierwszego drzewa. (12.) Rysujemy drzewa: (13.) Ustawiamy żółwia pionowo w górę, (14.) rysujemy drzewo, (15.) skręcamy w lewo o , (16.) podnosimy pisak i (17.) przesuwamy się na pozycję następnego drzewa.