Metody programowania / Ćwiczenia 2: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 20 wersji utworzonych przez 3 użytkowników) | |||
Linia 18: | Linia 18: | ||
Napisz procedurę Odwróć(var l:lista) odwracającą listę l. | Napisz procedurę Odwróć(var l:lista) odwracającą listę l. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''procedure''' Odwróć(var l:lista); | '''procedure''' Odwróć(var l:lista); | ||
//Odwracamy listę l | //Odwracamy listę l | ||
Linia 42: | Linia 44: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 2 (Scalanie dwóch posortowanych list)== | == Zadanie 2 (Scalanie dwóch posortowanych list)== | ||
Napisz funkcję Scal(l1,l2:lista):lista scalającą dwie posortowane niemalejąco listy l1 i l2, tak aby wynikowa lista również była posortowana niemalejąco. | Napisz funkcję Scal(l1,l2:lista):lista scalającą dwie posortowane niemalejąco listy l1 i l2, tak aby wynikowa lista również była posortowana niemalejąco. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' Scal(l1,l2:lista): lista; | '''function''' Scal(l1,l2:lista): lista; | ||
//Listy l1 i l2 są posortowane niemalejąco; scalamy je do jednej listy również posortowanej niemalejąco | //Listy l1 i l2 są posortowane niemalejąco; scalamy je do jednej listy również posortowanej niemalejąco | ||
Linia 55: | Linia 59: | ||
atrapa^.nast:=nil; | atrapa^.nast:=nil; | ||
akt:=atrapa; | akt:=atrapa; | ||
'''while''' l1 <> nil and l2 <> nil '''do''' | '''while''' (l1 <> nil) and (l2 <> nil) '''do''' | ||
'''if''' l1^.w < l2^.w '''then''' '''begin''' //jeśli l1^.w < l2^.w | '''if''' l1^.w < l2^.w '''then''' '''begin''' //jeśli l1^.w < l2^.w | ||
akt^.nast:=l1; | akt^.nast:=l1; | ||
Linia 67: | Linia 71: | ||
l2:=l2^.nast; | l2:=l2^.nast; | ||
'''end''' | '''end''' | ||
'''else''' '''begin''' //jeśli l1^.w = l2^.w | '''else''' '''begin''' //jeśli l1^.w = l2^.w - ten else można sobie darować, i tak będzie dobrze | ||
akt^.nast:=l1; | akt^.nast:=l1; | ||
akt:=akt^.nast; | akt:=akt^.nast; | ||
Linia 75: | Linia 79: | ||
l2:=l2^.nast; | l2:=l2^.nast; | ||
'''end'''; | '''end'''; | ||
'''if''' l1 = nil '''then''' | '''if''' l1 = nil '''then''' //obsługa końcówki listy która nie jest pusta | ||
akt^.nast:=l2 | |||
akt^.nast:= | '''else''' | ||
akt^.nast:=l1; | |||
Scal:=atrapa^.nast; | Scal:=atrapa^.nast; | ||
dispose(atrapa); | dispose(atrapa); | ||
Linia 91: | Linia 93: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Czy instrukcja atrapa^.nast:=nil jest potrzebna? W jakich przypadkach ? | Czy instrukcja atrapa^.nast:=nil jest potrzebna? W jakich przypadkach ? | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 3 (Usuwanie elementów zadanych listą)== | == Zadanie 3 (Usuwanie elementów zadanych listą)== | ||
Napisz procedurę Usuń(var l1:lista; l2:lista) która usunie z listy l1 wszystkie elementy z listy l2. Zakładamy, że listy l1 i l2 są | Napisz procedurę Usuń(var l1:lista; l2:lista) która usunie z listy l1 wszystkie elementy z listy l2. Zakładamy, że listy l1 i l2 są posortowane niemalejąco. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''procedure''' Usuń(var l1:lista; l2:lista); | '''procedure''' Usuń(var l1:lista; l2:lista); | ||
//Usuwamy z listy l1 wszystkie elementy z listy l2; zakładamy, że listy l1 i l2 są posortowane niemalejąco | //Usuwamy z listy l1 wszystkie elementy z listy l2; zakładamy, że listy l1 i l2 są posortowane niemalejąco | ||
Linia 109: | Linia 113: | ||
atrapa^.nast:=l1; | atrapa^.nast:=l1; | ||
poprz:=atrapa; | poprz:=atrapa; | ||
'''while''' l1 <> nil and l2 <> nil '''do''' | '''while''' (l1 <> nil) and (l2 <> nil) '''do''' | ||
'''if''' l1^.w < l2^.w '''then''' '''begin''' //jeśli l1^.w < l2^.w | '''if''' l1^.w < l2^.w '''then''' '''begin''' //jeśli l1^.w < l2^.w | ||
l1:=l1^.nast; | l1:=l1^.nast; | ||
Linia 132: | Linia 136: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Czy lista l1 musi być przekazywana przez zmienną ? W jakich przypadkach jest to konieczne ? | Czy lista l1 musi być przekazywana przez zmienną ? W jakich przypadkach jest to konieczne ? | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 4 (Uporządkowanie elementów w liście)== | == Zadanie 4 (Uporządkowanie elementów w liście)== | ||
Napisz procedurę Uporządkuj(var l:lista) która przestawi elementy w liście l tak by najpierw były elementy w których pole w jest ujemne, potem równe zero, a na końcu dodatnie. Dodatkowo względna kolejność | Napisz procedurę Uporządkuj(var l:lista) która przestawi elementy w liście l tak by najpierw były elementy w których pole w jest ujemne, potem równe zero, a na końcu dodatnie. Dodatkowo względna kolejność elementów jednego rodzaju (dodatnich, równych zero i ujemnych) powinna być zachowana. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''procedure''' Uporządkuj(var l:lista); | '''procedure''' Uporządkuj(var l:lista); | ||
//Ustawiamy elementy listy l tak by najpierw były | //Ustawiamy elementy listy l tak by najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie | ||
//Osobno zbieramy elementy ujemne, dodatnie i | //Osobno zbieramy elementy ujemne, dodatnie i równe zero i potem je łączymy | ||
'''var''' atrapau, atrapaz, atrapad, u, z, d : lista; | '''var''' atrapau, atrapaz, atrapad, u, z, d : lista; | ||
'''begin''' | '''begin''' | ||
Linia 182: | Linia 188: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 5 (Problem Józefa Flawiusza)== | == Zadanie 5 (Problem Józefa Flawiusza)== | ||
Linia 188: | Linia 194: | ||
k > 0 i niepustej cyklicznej listy l, cyklicznie usuwa co k-ty element listy l, aż pozostanie w niej tylko jeden element. Liczenie rozpoczynamy od elementu wskazywanego przez l. | k > 0 i niepustej cyklicznej listy l, cyklicznie usuwa co k-ty element listy l, aż pozostanie w niej tylko jeden element. Liczenie rozpoczynamy od elementu wskazywanego przez l. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''procedure''' Flawiusz(var l:lista; k:integer); | '''procedure''' Flawiusz(var l:lista; k:integer); | ||
//Usuwamy z listy l cyklicznie co k-ty element dopóki nie zostanie jeden element; k>0, l niepusta cykliczna | //Usuwamy z listy l cyklicznie co k-ty element dopóki nie zostanie jeden element; k>0, l niepusta cykliczna | ||
Linia 195: | Linia 203: | ||
poprz:=l^.nast; | poprz:=l^.nast; | ||
'''while''' poprz^.nast <> l '''do''' poprz:=poprz^.nast; //poprz wskazuje na element poprzedzający l | '''while''' poprz^.nast <> l '''do''' poprz:=poprz^.nast; //poprz wskazuje na element poprzedzający l | ||
'''while''' poprz <> poprz^.nast '''do''' | '''while''' poprz <> poprz^.nast '''do''' '''begin''' //dopóki lista ma więcej niz jeden element | ||
'''for''' i:=1 '''to''' k-1 '''do''' | '''for''' i:=1 '''to''' k-1 '''do''' poprz:=poprz^.nast; | ||
pom:=poprz^.nast; | pom:=poprz^.nast; | ||
poprz^.nast:=pom^.nast; | |||
dispose(pom); | |||
'''end'''; | |||
l:=poprz; | l:=poprz; | ||
'''end'''; | '''end'''; | ||
Linia 209: | Linia 216: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 6 (Listy łączące się)== | == Zadanie 6 (Listy łączące się)== | ||
Dane są dwie listy proste (kończące się nilami). Napisz funkcję stwierdzającą czy te listy mają jakiś wspólny element (nie wartość typu integer, a element typu el_listy). | Dane są dwie listy proste (kończące się nilami). Napisz funkcję stwierdzającą czy te listy mają jakiś wspólny element (nie wartość typu integer, a element typu el_listy). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jeśli listy mają wspólny element to ostatni niepusty element l1 i ostatni niepusty element l2 muszą być takie same. | Jeśli listy mają wspólny element to ostatni niepusty element l1 i ostatni niepusty element l2 muszą być takie same. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' Wspólny(l1, l2:lista):boolean; | '''function''' Wspólny(l1, l2:lista):boolean; | ||
//Sprawdzamy czy listy proste l1 i l2 maja wspólny element | //Sprawdzamy czy listy proste l1 i l2 maja wspólny element | ||
Linia 238: | Linia 246: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 7 (Pierwszy wspólny element list łączących się)== | == Zadanie 7 (Pierwszy wspólny element list łączących się)== | ||
Dane są dwie listy proste (kończące się nilami) i takie że maja one element wspólny (funkcja Wspólny z poprzedniego zadania dałaby wynik true). Napisz funkcję odnajdującą pierwszy element wspólny tych list. | Dane są dwie listy proste (kończące się nilami) i takie że maja one element wspólny (funkcja Wspólny z poprzedniego zadania dałaby wynik true). Napisz funkcję odnajdującą pierwszy element wspólny tych list. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Każdy wspólny element list jest tak samo odległy od końca list. Jeśli więc obliczymy długości list to możemy iść po nich równocześnie w takiej samej odległości od końca i sprawdzać czy trafiliśmy już na wspólny element czy nie. | Każdy wspólny element list jest tak samo odległy od końca list. Jeśli więc obliczymy długości list to możemy iść po nich równocześnie w takiej samej odległości od końca i sprawdzać czy trafiliśmy już na wspólny element czy nie. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' PierwszyWspólny(l1, l2:lista):lista; | '''function''' PierwszyWspólny(l1, l2:lista):lista; | ||
//Listy l1 i l2 maja wspólny element; szukamy pierwszego elementu wspólnego tych list | //Listy l1 i l2 maja wspólny element; szukamy pierwszego elementu wspólnego tych list | ||
Linia 277: | Linia 287: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Skąd wiadomo, że w ostatnim while'u l1 i l2 sa zawsze różne od nil ? | Skąd wiadomo, że w ostatnim while'u l1 i l2 sa zawsze różne od nil ? | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 8 (Listy z cyklem)== | == Zadanie 8 (Listy z cyklem)== | ||
Napisz | Napisz funkcję która sprawdzi czy dana l typu lista jest listą prostą czy też listą z cyklem. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Wystarczy poruszać sie po liście dwoma wskaźnikami o dwóch różnych względnie pierwszych prędkościach; wtedy albo trafimy szybszym wskaźnikiem na nil albo oba wskaźniki się zejdą. | Wystarczy poruszać sie po liście dwoma wskaźnikami o dwóch różnych względnie pierwszych prędkościach; wtedy albo trafimy szybszym wskaźnikiem na nil albo oba wskaźniki się zejdą. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' ListaZCyklem(l:lista):boolean; | '''function''' ListaZCyklem(l:lista):boolean; | ||
//Sprawdzamy czy lista l jest listą z cyklem, czy tez kończy się nilem | //Sprawdzamy czy lista l jest listą z cyklem, czy tez kończy się nilem | ||
Linia 311: | Linia 326: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 9 (Długość cyklu w liście z cyklem)== | == Zadanie 9 (Długość cyklu w liście z cyklem)== | ||
Napisz | Napisz funkcję która dla danej listy z cyklem obliczy długość cyklu. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Można poruszać sie po liście dwoma wskaźnikami tak jak w zadaniu poprzednim; gdy wskaźniki sie zejdą to znaczy, że jesteśmy na cyklu; wystarczy zatrzymać jeden wskaźnik a drugim obejść cykl i obliczyć jego długość. | Można poruszać sie po liście dwoma wskaźnikami tak jak w zadaniu poprzednim; gdy wskaźniki sie zejdą to znaczy, że jesteśmy na cyklu; wystarczy zatrzymać jeden wskaźnik a drugim obejść cykl i obliczyć jego długość. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' DługośćCyklu1(l:lista):integer; | '''function''' DługośćCyklu1(l:lista):integer; | ||
//Obliczamy długość cyklu dla listy z cyklem | //Obliczamy długość cyklu dla listy z cyklem | ||
Linia 347: | Linia 364: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jeśli przechodząc po liście z cyklem będziemy ją odwracać to dojdziemy do początku; odwiedzimy przy tym 2m+n elementów gdzie n to długość cyklu a m to liczba elementów poza cyklem. Wtedy (2m+n div 2)-ty element leży na cyklu i poczynając od niego można obliczyć długość cyklu. | Jeśli przechodząc po liście z cyklem będziemy ją odwracać to dojdziemy do początku; odwiedzimy przy tym 2m+n elementów gdzie n to długość cyklu a m to liczba elementów poza cyklem. Wtedy (2m+n div 2)-ty element leży na cyklu i poczynając od niego można obliczyć długość cyklu. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' DługośćCyklu2(l:lista):integer; | '''function''' DługośćCyklu2(l:lista):integer; | ||
//Obliczamy długość cyklu dla listy z cyklem | //Obliczamy długość cyklu dla listy z cyklem | ||
Linia 385: | Linia 405: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 21:52, 28 maj 2020
To są zadania na listy.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
W poniższych zadaniach będziemy używać następujących typów:
type lista = ^el_listy; el_listy = record w: integer; nast: lista; end;
Zadanie 1 (Odwracanie listy)
Napisz procedurę Odwróć(var l:lista) odwracającą listę l.
Rozwiązanie 1
Zadanie 2 (Scalanie dwóch posortowanych list)
Napisz funkcję Scal(l1,l2:lista):lista scalającą dwie posortowane niemalejąco listy l1 i l2, tak aby wynikowa lista również była posortowana niemalejąco.
Rozwiązanie
Ćwiczenie
Zadanie 3 (Usuwanie elementów zadanych listą)
Napisz procedurę Usuń(var l1:lista; l2:lista) która usunie z listy l1 wszystkie elementy z listy l2. Zakładamy, że listy l1 i l2 są posortowane niemalejąco.
Rozwiązanie
Ćwiczenie
Zadanie 4 (Uporządkowanie elementów w liście)
Napisz procedurę Uporządkuj(var l:lista) która przestawi elementy w liście l tak by najpierw były elementy w których pole w jest ujemne, potem równe zero, a na końcu dodatnie. Dodatkowo względna kolejność elementów jednego rodzaju (dodatnich, równych zero i ujemnych) powinna być zachowana.
Rozwiązanie
Zadanie 5 (Problem Józefa Flawiusza)
Napisz procedurę Flawiusz(var l:lista; k:integer), która dla danego k > 0 i niepustej cyklicznej listy l, cyklicznie usuwa co k-ty element listy l, aż pozostanie w niej tylko jeden element. Liczenie rozpoczynamy od elementu wskazywanego przez l.
Rozwiązanie
Zadanie 6 (Listy łączące się)
Dane są dwie listy proste (kończące się nilami). Napisz funkcję stwierdzającą czy te listy mają jakiś wspólny element (nie wartość typu integer, a element typu el_listy).
Wskazówka
Rozwiązanie
Zadanie 7 (Pierwszy wspólny element list łączących się)
Dane są dwie listy proste (kończące się nilami) i takie że maja one element wspólny (funkcja Wspólny z poprzedniego zadania dałaby wynik true). Napisz funkcję odnajdującą pierwszy element wspólny tych list.
Wskazówka
Rozwiązanie
Ćwiczenie
Zadanie 8 (Listy z cyklem)
Napisz funkcję która sprawdzi czy dana l typu lista jest listą prostą czy też listą z cyklem.
Wskazówka
Rozwiązanie
Zadanie 9 (Długość cyklu w liście z cyklem)
Napisz funkcję która dla danej listy z cyklem obliczy długość cyklu.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2