Zdefiniuj funkcję z parametrem SUMAJEDNOCYFROWA :liczba, której wartością będzie cyfra. Funkcja powinna liczyć sumę cyfr parametru :liczba, następnie sumę cyfr policzonej sumy, itd. aż suma będzie cyfrą. Zakładamy, że parametr :liczba jest liczbą całkowitą. Oto przykładowe wyniki:
SUMAJEDNOCYFROWA 12356 | ma wartość 8 |
---|---|
SUMAJEDNOCYFROWA 0 | ma wartość 0 |
SUMAJEDNOCYFROWA 123 | ma wartość 6 |
SUMAJEDNOCYFROWA 987656789 | ma wartość 2 |
Program najlepiej rozwiązać metodą rekurencji. Funkcja SUMAJEDNOCYFROWA będzie zliczać sumę cyfr, a jeśli ostateczna suma nie jest pojedynczą cyfrą to funkcja zwróci wynik jej ponownego wykonanie z tą różnicą, że za :liczba będzie podstawiona wyliczona suma.
(2.) Jeśli podana :liczba jest jednocyfrowa to (3.) funkcja może zwrócić :liczba. W przeciwnym wypadku (5.) ustalamy sumę cyfr s na 0 i (6. - 10.) sumuje wszystkie cyfry. (11.) Wynikiem działania funkcji jest wywołanie funkcji SUMAJEDNOCYFROWA z argumentem :s.
Napisz procedurę z parametrem KARTKI :wyraz, która utworzy możliwie duży rysunek pliku kartek. Parametr :wyraz to słowo pisane wyłącznie małymi literami i nie dłuższe niż 32 znaki. Stosik ma mieć tyle kartek ile liter ma słowo. Pierwszej literze odpowiada kartka na wierzchu. Spółgłoski są reprezentowane przez białe kartki a samogłoski przez czarne. Odległość między skrajnymi kartkami jest stała i równa długości boku kartki. Druga krawędź kartki jest rysowana kreską tej samej długości co krawędź przednia oraz jest nachylona do linii poziomej pod kątem 45o. Oto przykładowe wyniki wywołania procedury: KARTKI "i, KARTKI "nic oraz KARTKI "abrakadabrahokuspokus.
W celu zrozumienia w jaki sposób działa procedura KARTKI warto sprawdzić wyjaśnienie zadania 2 z poprzedniego etapu. Do rozwiązania bieżącego zadania należy dopisać nową funkcję samogłoska?, która zwróci czy dana :litera jest samogłoską.
Procedura STOSIK_karta będzie teraz przyjmowałą drugi argument :b. Jest to litera, którą ma przedstawić dana kartka. W zależności od tego czy jest samogłoską to (3. - 7.) procedura ustala kolor kartki.
Zmiany potrzebne też są w samej głównej procedurze KARTKI. Dany jest tym razem tylko :wyraz, dlatego, aby nie zmieniać całego kodu wystarczy (4.) zadeklarować zmienną :ilekart, która określi ile kartek trzeba narysować. (17.) Dodatkową zmianą jest przekazywanie litery jaką kartka reprezentuje. Procedura rysuje stos od dołu do góry, dlatego należy pamiętać, że trzeba pobierać kolejne litery od końca.
Dane jest co najmniej dwuliterowe słowo, w którym występują tylko litery a i b. Jeśli założymy, że długość słowa wynosi n, to w każdym takim słowie można wyodrębnić n-1 par sąsiednich liter, np. w słowie aabbab takimi parami są aa, ab, bb, ba. Napisz procedurę NAJCZPAR :wyraz, wypisującą tę parę liter (dwuznakowe słowo), która wśród par sąsiednich liter w parametrze :wyraz występuje najczęściej. Jeśli w słowie jest kilka par liter spełniających ten warunek, to wypisane mają być wszystkie z nich w dowolnej kolejności, w kolejnych wierszach. Oto przykłady:
NAJCZPAR "aabbab | powinno wypisać na ekranie słowo ab |
---|---|
NAJCZPAR "aaabbbaaabbb | powinno wypisać na ekranie słowo aa bb |
NAJCZPAR "aa | powinno wypisać na ekranie słowo aa |
NAJCZPAR "baba | powinno wypisać na ekranie słowo ba |
Poniższe rozwiązanie działa dla dowolnego słowa tj. niekoniecznie złożonego z samych liter a i b.
Zadeklarowanie pustych list (2.) zmienna :l_wyr będzie przechowywać wszystki unikalne dotychczas znalezione pary, a (3.) i-ta wartość na liście :l_licz określi ile razy wystąpił element i-ty z :l_wyr. (4.) W trakcie zwiększania liczników program będzie na bieżąco pamiętał jaka jest maksymalna wartość wśród liczników. (5.) Dla każdej pary liter: (6.) utworzenie słowa z pary liter i (7.) sprawdzenie czy wystepuje na liście :l_wyr. (8.) Jeżeli słowo występuje to (9.) należy zwiększyć odpowiedni licznik i (10. - 12.) zmienić :max jeśli istnieje taka potrzeba. (13.) Jeśli jednak dana para liter nie występuje to (14.) należy dopisać ją na listę i (15.) utworzyć nowy licznik o poczatkowej wartości 1.
Druga część kodu polega na usunięciu wszystkich wyrazów, których liczniki nie są równe maksymalnej wartości :max. (18.) W przypadku usuwania elementów z listy nie można polegać na npw, ponieważ po usunięciu kilku elementów indeksy kolejnych się zmieniają, dlatego zadeklarowany zostaje dodatkowy licznik :o. (19.) Dla każdego wyrazu na liście :l_wyr: (20.) Jeśli licznik wskazuje inną wartość niż :max to (21.) usuwany jest element z listy :l_wyr oraz (22.) odpowiadający mu licznik. (23.) Po usunięciu elementu z listy trzeba zmniejszyć indeks :o. (25.) Na koniec każdej iteracji należy niezależnie od potrzeby usunięcia elementu zwiększyć indeks :o. Na koniec (27.) program zwraca zmienną :l_wyr.