Metody programowania / Ćwiczenia 4: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 17 wersji utworzonych przez 3 użytkowników) | |||
Linia 26: | Linia 26: | ||
function Empty(k:kolejka): boolean; //sprawdza czy kolejka jest pusta | function Empty(k:kolejka): boolean; //sprawdza czy kolejka jest pusta | ||
procedure Destroy(k:kolejka); //niszczy kolejkę (zwalnia pamięć) | procedure Destroy(k:kolejka); //niszczy kolejkę (zwalnia pamięć) | ||
==Zadanie 1 (Poprawność wyrażeń nawiasowych)== | ==Zadanie 1 (Poprawność wyrażeń nawiasowych)== | ||
Napisz funkcję sprawdzającą czy zadane wyrażenie nawiasowe składające się z nawiasów okrągłych i kwadratowych jest poprawne. Zakładamy, że dana jest funkcja DajZnak:integer, która przyjmuje następujące wartości: -1 dla (, 1 dla ), -2 dla [, 2 dla ] i 0 na oznaczenie końca wyrażenia nawiasowego. | Napisz funkcję sprawdzającą czy zadane wyrażenie nawiasowe składające się z nawiasów okrągłych i kwadratowych jest poprawne. Zakładamy, że dana jest funkcja DajZnak:integer, która przyjmuje następujące wartości: -1 dla (, 1 dla ), -2 dla [, 2 dla ] i 0 na oznaczenie końca wyrażenia nawiasowego. | ||
<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''' PoprawneNawiasy: boolean; | '''function''' PoprawneNawiasy: boolean; | ||
//Sprawdzamy czy wyrażenie nawiasowe otrzymane przez kolejne wartości funkcji DajZnak jest poprawne | //Sprawdzamy czy wyrażenie nawiasowe otrzymane przez kolejne wartości funkcji DajZnak jest poprawne | ||
Linia 52: | Linia 55: | ||
'''else''' ok:=false; | '''else''' ok:=false; | ||
0: '''if''' not Empty(s) '''then''' ok:=false; | 0: '''if''' not Empty(s) '''then''' ok:=false; | ||
'''end''' {case} | |||
'''until''' (z = 0) or (not ok) | '''until''' (z = 0) or (not ok) | ||
PoprawneNawiasy:=ok; | PoprawneNawiasy:=ok; | ||
Linia 61: | Linia 65: | ||
''Koszt pamięciowy:'' liniowy ze względu na długość wyrażenia nawiasowego | ''Koszt pamięciowy:'' liniowy ze względu na długość wyrażenia nawiasowego | ||
</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 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Czy dodanie następnych typów nawiasów istotnie zmieniłoby rozwiązanie ? | Czy dodanie następnych typów nawiasów istotnie zmieniłoby rozwiązanie ? | ||
</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 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jak wygląda optymalne rozwiązanie dla jednego typu nawiasów ? | Jak wygląda optymalne rozwiązanie dla jednego typu nawiasów ? | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 2 (Maksymalnie odległy porządek)== | ==Zadanie 2 (Maksymalnie odległy porządek)== | ||
Napisz funkcję która dla danej tablicy A typu array[1..N] of integer | Napisz funkcję która dla danej tablicy A typu array[1..N] of integer obliczy maksymalne k, takie że k=j-i, 1 ≤ i ≤ j ≤ N, A[j] ≥ A[i]. | ||
<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"> | |||
Jeśli po elemencie i indeksie j pojawi się element większy o indeksie j' większym od j, to element o indeksie j nie ma szans być rekordowym. Takim elementem nie ma się co przejmować, jako końcem potencjalnego rekordowego skoku. | |||
</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"> | |||
Przeglądając tablicę od tyłu wkładamy na stos kandydatów na bycie najlepszym j. Potem przeglądając tablicę od przodu wyliczamy k, zdejmując zużytych kandydatów na j ze stosu. | Przeglądając tablicę od tyłu wkładamy na stos kandydatów na bycie najlepszym j. Potem przeglądając tablicę od przodu wyliczamy k, zdejmując zużytych kandydatów na j ze stosu. | ||
</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''' MaksOdległość(N:integer; A:array[1..N] of integer): integer; | '''function''' MaksOdległość(N:integer; A:array[1..N] of integer): integer; | ||
//Obliczamy maksymalne k, takie że k=j-i, 1 <= i <= j <= N, A[j] >= A[i] | //Obliczamy maksymalne k, takie że k=j-i, 1 <= i <= j <= N, A[j] >= A[i] | ||
Linia 90: | Linia 109: | ||
Push(s, A[N]); | Push(s, A[N]); | ||
j:=N-1; | j:=N-1; | ||
'''while''' j >= 1 '''do''' | '''while''' j >= 1 '''do''' | ||
'''begin''' //wkładamy kandydatów na j na stos | |||
'''if''' A[j] > Top(s) '''then''' | '''if''' A[j] > Top(s) '''then''' | ||
Push(s, A[j]); | Push(s, A[j]); | ||
j:=j-1 | |||
'''end'''; | |||
i:=1; | i:=1; | ||
maks:=0; | maks:=0; | ||
Linia 106: | Linia 128: | ||
'''end'''; | '''end'''; | ||
''Koszt czasowy:'' liniowy ze względu na długość | ''Koszt czasowy:'' liniowy ze względu na długość tablicy | ||
''Koszt pamięciowy:'' liniowy ze względu na długość | ''Koszt pamięciowy:'' liniowy ze względu na długość tablicy | ||
</div> | |||
</div> | </div> | ||
==Zadanie 3 (Najpłytszy liść w drzewie)== | ==Zadanie 3 (Najpłytszy liść w drzewie)== | ||
Napisz funkcję która dla danego drzewa (definicja typu w [[MP Ćwiczenia2]]) obliczy głębokość najpłytszego (najbliższego korzeniowi) liścia. Dla drzewa pustego wynikiem powinno być zero, a dla | Napisz funkcję która dla danego drzewa (definicja typu w [[MP Ćwiczenia2]]) obliczy głębokość najpłytszego (najbliższego korzeniowi) liścia. Dla drzewa pustego wynikiem powinno być zero, a dla jednoelementowego jeden. | ||
<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"> | |||
Trzeba użyć przeszukiwania wszerz i kolejki w której trzymane będą pary składające się ze wskaźnika do węzła i głębokości węzła. | Trzeba użyć przeszukiwania wszerz i kolejki w której trzymane będą pary składające się ze wskaźnika do węzła i głębokości węzła. | ||
</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"> | |||
'''type''' para = record | '''type''' para = record | ||
drz: drzewo; | drz: drzewo; | ||
Linia 166: | Linia 192: | ||
''Koszt pamięciowy:'' liniowy ze względu na N | ''Koszt pamięciowy:'' liniowy ze względu na N | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 4 (Sortowanie liczb k-cyfrowych)== | ==Zadanie 4 (Sortowanie liczb k-cyfrowych)== | ||
Zaimplementuj algorytm sortowania tablicy A typu array[1..N] of | Zaimplementuj algorytm sortowania tablicy A typu '''array'''[1..N] '''of''' '''liczba''' dziesiętnych liczb k-cyfrowych przy użyciu tablicy dziesięciu kolejek. Typ liczba to array[1..k] of integer, najbardziej znaczący bit jest pod indeksem 1. | ||
<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"> | |||
Zastosujmy k-krotne sortowanie kubełkowe: przeglądamy ciąg liczb patrząc na i-tą (i=k..1) cyfrę i wkładamy liczbę do właściwej kolejki. Po przejrzeniu ciągu kontynuujemy ze zmniejszonym o jeden i. | Zastosujmy k-krotne sortowanie kubełkowe: przeglądamy ciąg liczb patrząc na i-tą (i=k..1) cyfrę i wkładamy liczbę do właściwej kolejki. Po przejrzeniu ciągu kontynuujemy ze zmniejszonym o jeden i. | ||
</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"> | |||
'''procedure''' Sortuj(N:integer; var A: array[1..N] of liczba); | '''procedure''' Sortuj(N:integer; var A: array[1..N] of liczba); | ||
//Sortujemy tablicę liczb k-cyfrowych | //Sortujemy tablicę liczb k-cyfrowych | ||
'''var''' T: array[0..9] of kolejka; | '''var''' T: array[0..9] of kolejka; | ||
B: array[1..N] of liczba; | B: array[1..N] of liczba; | ||
i,j,maks, | i,j,maks: integer; | ||
'''function''' i_taCyfra(x,i:Integer):Integer; | |||
//wyznacza i-tą cyfrę liczby x | |||
'''var''' j:Integer; | |||
'''begin''' | |||
'''for''' j:=1 '''to''' i-1 '''do''' x:=x div 10; | |||
//Tu zamiast pętli można by użyć dzielnika pobranego z tablicy potęg 10 raz ustawionej na początku działania programu | |||
i_taCyfra:=x mod 10 | |||
'''end;''' | |||
'''begin''' | '''begin''' | ||
'''for''' c:=0 '''to''' 9 '''do''' Init(T[c]); | '''for''' c:=0 '''to''' 9 '''do''' Init(T[c]); | ||
'''for''' j:=1 '''to''' N '''do''' PutLast(T[A[j] | '''for''' j:=1 '''to''' N '''do''' PutLast(T[i_taCyfra(A[j],1)], j); | ||
'''for''' c:=0 '''to''' 9 '''do''' PutLast(T[c], -1); | '''for''' c:=0 '''to''' 9 '''do''' PutLast(T[c], -1); | ||
//Liczby z A (a raczej ich indeksy w A) są umieszczone w kolejkach tablicy T względem najbardziej | //Liczby z A (a raczej ich indeksy w A) są umieszczone w kolejkach tablicy T względem najbardziej znaczącej cyfry | ||
//Na końcu każdej kolejki jest -1 żeby wiedzieć kiedy zmniejszyć i | //Na końcu każdej kolejki jest -1 żeby wiedzieć kiedy zmniejszyć i | ||
'''for''' i:= | '''for''' i:=2 '''to''' k '''do''' | ||
'''for''' c:=0 '''to''' 9 '''do''' '''begin''' | '''for''' c:=0 '''to''' 9 '''do''' '''begin''' | ||
'''repeat''' | '''repeat''' | ||
GetFirst(T[c], l); | GetFirst(T[c], l); | ||
'''if''' l <> -1 '''then''' PutLast(T[ | '''if''' l <> -1 '''then''' PutLast(T[i_taCyfra(l,i)], l); | ||
'''until''' l = -1; | '''until''' l = -1; | ||
'''for''' c:=0 '''to''' 9 '''do''' PutLast(T[c], -1); | '''for''' c:=0 '''to''' 9 '''do''' PutLast(T[c], -1); | ||
Linia 217: | Linia 256: | ||
''Uwaga:'' Koszt pamięciowy związany jest z zawartościa kolejek w T i z pomocniczą tablicą B (obie rzędu N). | ''Uwaga:'' Koszt pamięciowy związany jest z zawartościa kolejek w T i z pomocniczą tablicą B (obie rzędu N). | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 22:02, 28 maj 2020
To są zadania na kolejki i stosy.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Przyjmijmy następujące definicje, gdzie typ lista był zdefiniowany w Ćwiczeniach 2.
type stos = lista; kolejka = record pocz, kon : lista; end;
Dla stosów dostępne są następujące funkcje i procedury:
procedure Init(var s:stos); //tworzy pusty stos s procedure Push(var s:stos; w:integer); //wstawia w na wierzchołek stosu procedure Pop(var s:stos); //zdejmuje wierzchni element stosu function Top(s:stos): integer; //wyznacza wartość na wierzchołku stosu function Empty(s:stos): boolean; //sprawdza czy stos jest pusty procedure Destroy(s:stos); //niszczy stos (zwalnia pamięć)
Dla kolejek dostępne są następujące funkcje i procedury:
procedure Init(var k:kolejka); //tworzy pustą kolejkę k procedure PutLast(var k:kolejka; w:integer); //wstawia w na koniec kolejki procedure GetFirst(var k:kolejka; var w:integer); //usuwa pierwszy element kolejki i zapisuje na w function Empty(k:kolejka): boolean; //sprawdza czy kolejka jest pusta procedure Destroy(k:kolejka); //niszczy kolejkę (zwalnia pamięć)
Zadanie 1 (Poprawność wyrażeń nawiasowych)
Napisz funkcję sprawdzającą czy zadane wyrażenie nawiasowe składające się z nawiasów okrągłych i kwadratowych jest poprawne. Zakładamy, że dana jest funkcja DajZnak:integer, która przyjmuje następujące wartości: -1 dla (, 1 dla ), -2 dla [, 2 dla ] i 0 na oznaczenie końca wyrażenia nawiasowego.
Rozwiązanie
Ćwiczenie 1
Ćwiczenie 2
Zadanie 2 (Maksymalnie odległy porządek)
Napisz funkcję która dla danej tablicy A typu array[1..N] of integer obliczy maksymalne k, takie że k=j-i, 1 ≤ i ≤ j ≤ N, A[j] ≥ A[i].
Wskazówka 1
Wskazówka 2
Rozwiązanie
Zadanie 3 (Najpłytszy liść w drzewie)
Napisz funkcję która dla danego drzewa (definicja typu w MP Ćwiczenia2) obliczy głębokość najpłytszego (najbliższego korzeniowi) liścia. Dla drzewa pustego wynikiem powinno być zero, a dla jednoelementowego jeden.
Wskazówka
Rozwiązanie
Zadanie 4 (Sortowanie liczb k-cyfrowych)
Zaimplementuj algorytm sortowania tablicy A typu array[1..N] of liczba dziesiętnych liczb k-cyfrowych przy użyciu tablicy dziesięciu kolejek. Typ liczba to array[1..k] of integer, najbardziej znaczący bit jest pod indeksem 1.
Wskazówka
Rozwiązanie