Programowanie – materiały pomocnicze przygotowała Helena
Transkrypt
Programowanie – materiały pomocnicze przygotowała Helena
Programowanie – materiały pomocnicze przygotowała Helena Krupicka Struktury danych – listy Lista w Logo jest uj tym w nawiasy kwadratowe ci giem słów lub list; ci g ten mo e by pusty. Jest to definicja rekurencyjna. Lista pusta [ ] ma zero elementów. Lista niepusta ma co najmniej jeden element. Mo e nim by słowo lub lista. Przykłady: [ ], [1 2], [to jest lista] [[i ] [to jest] [lista]]. Słowem w Logo jest dowolny ci g znaków zako czony separatorem. Separatorami w Logo s : znaki spacji, przej cia do nowej linii, nawiasy kwadratowe i okr głe. Przegl danie listy - funkcje pierwotne: PIERW [a b c] = a, PIERW [[a] b c] = [a], BP [a b c] = [b c], BP [a] = [ ], OST [a b c] = c, BO [a b c] = [a c] pierwszy element listy (lub słowa) lista (słowo) bez pierwszego elementu ostatni element listy (słowa) lista (słowo) bez ostatniego elementu Rekurencyjny schemat przegl dania listy: 1. Je li lista jest pusta, to zako cz algorytm. 2. Wykonaj jakie czynno ci (bez rekurencji) dla pierwszego elementu listy. 3. Wykonaj ten sam algorytm (czyli rekurencja) dla listy bez pierwszego elementu (pierwszy mo na zast pi ostatnim). Zadanie 1. Napisz procedur , która dla danej listy liczb L drukuje te liczby od ostatniej do pierwszej, ka d w nowym wierszu. oto odKo ca :L Procedura odKo ca jest w pliku procedury_z_listami ;drukuje elementy listy L od ko ca je li :L=[ ] [stop] PS OST :L odKo ca BO :L ju Tworzenie listy Za pomoc funkcji pierwotnych mo na utworzy now list lub zmieni elementy istniej cej. Jedn z funkcji pierwotnych jest CL, której warto ci jest lista utworzona z elementów wpisywanych z klawiatury a do naci ni cia klawisza ENTER . Na przykład, je li w trakcie wykonywania instrukcji PRZYP ''L CL podamy ci g elementów 1 2 3 4 5 i naci niemy klawisz ENTER, to warto ci zmiennej L b dzie lista [1 2 3 4 5]. Warto ci funkcji pierwotnej CZ jest jeden znak przeczytany z klawiatury. Przykładem wykorzystania czytania listy jest nast puj ca procedura Poczekaj, która (czyta list i nic z ni nie robi) tylko czeka na naci ni cie klawisza Enter. Mo na t procedur wykorzystywa w przykładach, np. rysowania piramidy, do zatrzymywania działania programu a do naci ni cia klawisza Enter przez u ytkownika (zob. przykład w pliku piramidy_z_poczekaj). oto poczekaj ; czeka na naci ni cie klawisza Enter PS [ ] WPISZ [Naci nij klawisz Enter] je li CL = [ ][ ] ju oto piramida_B_z_poczekaj :a ;bez niezmiennika je li :a < 5 [STOP] prostok t :a 5 * :a hop 0.1 * 5*:a :a poczekaj piramida_B_z_poczekaj 0.8 * :a ju oto piramida_N_z_poczekaj :a ;z niezmiennikiem je li :a < 5 [STOP] prostok t :a 5 * :a hop 0.1 * 5 * :a :a poczekaj piramida_N_z_poczekaj 0.8 * :a hop ( - 0.1 * 5 * :a) (-:a) poczekaj ju Elementy listy s w Logo traktowane dosłownie, tzn. zapis [2 + 3] oznacza list zło on z 3 słów: 2, + i 3. Je li w li cie chcemy umie ci warto wyra enia, np. 2 + 3, to trzeba u y funkcji pierwotnych. Oto funkcje pierwotne, których warto ciami s listy utworzone z warto ci 2 argumentów: LISTA a b = [a b], LISTA [a b] c = [[a b] c] warto ci funkcji lista dla 2 parametrów jest lista zło ona z tych parametrów zd a* b* = [a** b**] ; je li a* (b*) jest atomem, czyli liczb lub słowem, to a** (b**) jest tym samym atomem; je li a* (b*) jest list , to a** (b**) jest zawarto ci tej listy (odpowiednio a* lub b*) po zdj ciu jednej pary zewn trznych nawiasów, NAP 2 [3 4] = [2 3 4] (pierwszy element dopisany na pocz tek listy b d cej drugim elementem) NAK 2 [3 4] = [3 4 2] (pierwszy element dopisany na ko cu listy b d cej drugim elementem) Programowanie – materiały pomocnicze przygotowała Helena Krupicka Przykłady definiowanych funkcji, których dane lub wyniki s listami (s w pliku procedury_z_listami, procedur główn jest starter) Warto ci funkcji długo oto długo :L je li :L = [ ] [wy 0] wy 1 + długo BP :L ju :L jest liczba elementów listy L Warto ci funkcji odwrotna :L jest lista L od ostatniego do pierwszego elementu oto odwrotna :L ; warto ci funkcji jest lista L od ostatniego do pierwszego elementu je li :L = [] [wy :L] wy zd ost :L odwrotna bo :L ju Funkcja listaLosowa, której warto ci jest lista zło ona z n (n > 0) liczb wybieranych losowo spo ród trzech liczb 1, 2 lub 3. oto listaLosowa :n ;n >= 1 je li :n = 1 [wy nap ( 1 + losowa 3 ) [ ] ] wy nak ( 1 + losowa 3 ) listaLosowa :n - 1 ju Funkcja max – maksymalna liczba z niepustej listy liczb. (max([l1, l2,...,ln]) = l1, je li n = 1 = l1, je li l1 > a, = a, w przec. razie, gdzie a = max([l2, l3,...,ln]). oto max_rk :l wy max_rk_pom :l pierw :l ju oto max_rk_pom :l :wynik je li ( DŁUGO :l ) = 0 [wy :wynik] wy max_rk_pom bp :l je eli ( :wynik < pierw :l ) [pierw :l][:wynik] ju Funkcja, której warto ci jest scalona lista z dwóch list zawieraj cych liczby uporz dkowane niemalej co. oto scalanie :l1 :l2 je li :l1 = [ ][wy :l2] je li :l2 = [ ][wy :l1] je li ( pierw :l1 ) < pierw :l2 [wy zd pierw :l1 scalanie bp :l1 :l2] wy zd pierw :l2 scalanie :l1 bp :l2 ju Programowanie – materiały pomocnicze przygotowała Helena Krupicka Zadanie I*. Napisz program, który symuluje automat losuj cy 6 (ró nych) liczb totolotka. Wydrukuj te liczby w kolejno ci rosn cej. Rozwi zanie zadania z losowaniem totolotka losuje 6 ró nych liczb totolotka i drukuje je od najmniejszej do najwi kszej; procedur główn starter Tak zaznacza si spacj , która ma by wydrukowana oto starter ct wpisz [Numery totolotka: \ ] ps totolotek ju Wypisuje wylosowane numery totolotka oto totolotek przyp "pom [ ] powtórz 6 [przyp "pom wstaw :pom losuj :pom] wy :pom ju Warto ci funkcji totolotek jest lista 6 rosn co uporz dkowanych liczb losowych z przedziału [1, 49] oto wstaw :pom :nr ; wstawia nr do listy pom, aby pozostala rosn ca je li :pom = [ ][wy zd :nr :pom] je li :nr < ( pierw :pom ) [wy zd :nr :pom] wy zd pierw :pom wstaw bp :pom :nr ju Dane: pom – rosn co uporz dkowana lista liczb, nr – liczba Warto ci funkcji jest rosn co uporzadkowana lista liczb pom zawieraj ca liczb nr oto losuj :pom przyp "nr 1 + losowa 49 je li nie_ma :nr :pom [wy :nr] wy losuj :pom ju Warto ci jest losowa liczba z przedziału [1, 49] ró na od liczb z listy pom oto nie_ma :nr :pom ; prawda, je li nr nie wystepuje na liscie pom, ; w przeciwnym razie fałsz je li :pom = [ ][wy "prawda] je li :nr = ( pierw :pom ) [wy "fałsz] wy nie_ma :nr bp :pom ju Funkcja o warto ci logicznej (prawda lub fałsz) Zadanie II: Dana jest lista dwuelementowych list KsTel= [[nr_telefonu abonent] ...] reprezentuj ca ksi k telefoniczn wewn trznych numerów telefonicznych, np. po wykonaniu instrukcji PRZYP ”KsTel [[3 Adrian] [5 Basia] [3 Romek] [ 12 Ala] ] warto ci zmiennej KsTel (reprezentuj c ksi k telefoniczn ) jest lista [[3 Adrian] [5 Basia] [3 Romek] [ 12 Ala] ] . Napisz program, który wydrukuje z tej ksi ki telefonicznej abonentów o podanym numerze telefonu; Program jest w pliku ksi kaTelefoniczna, procedur główn jest starter. oto Abonenci :KsTel :nr ; KsTel to ksi ka telefoniczna w postaci listy list [[nr-tel abonent] ...] utworzona wcze niej ; nr jest numerem, czyli liczb całkowit dodatni oto starter ;procedura drukuje nazwy abonentów o numerze :nr ct ps [Ksi ka telefoniczna] JE LI :KsTel = [ ] [STOP] JE LI :nr= PIERW PIERW :KsTel [PS OST PIERW :KsTel] ; -----------------------------------------------;wypełnienie ksi ki telefonicznej reprezentowanej przez zmienn Abonenci BP :KsTel :nr ksTel ju przyp "ksTel [[3 Bartek] [7 Ala] [3 Tomek] [12 Basia] [17 Kuba]] ;------------------------------------------------ps [Oto przykładowa ksi ka telefoniczna] Wpisz [ksTel=] poka :ksTel PS [Abonenci w ksi ce telefonicznej KsTel o podanym numerze telefonu.] PS [Podaj numer telefonu] PRZYP "nr PIERW CL Abonenci :KsTel :nr ps [--------------------Koniec] ju