Metody programowania / Ćwiczenia 4: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pch (dyskusja | edycje)
 
(Nie pokazano 14 wersji utworzonych przez 2 użytkowników)
Linia 31: Linia 31:
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.


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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 53: 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 62: 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>


{{cwiczenie| 1|pytanko 1|<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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>


{{cwiczenie| 2|pytanko 2|<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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 policzy maksymalne k, takie że k=j-i, 1 &le; i &le; j &le; N, A[j] &ge; A[i].
Napisz funkcję która dla danej tablicy A typu array[1..N] of integer obliczy maksymalne k, takie że k=j-i, 1 &le; i &le; j &le; N, A[j] &ge; 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>


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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 95: Linia 113:
     '''if''' A[j] > Top(s) '''then'''
     '''if''' A[j] > Top(s) '''then'''
       Push(s, A[j]);
       Push(s, A[j]);
       j:=j+1
       j:=j-1
     '''end''';
     '''end''';
   i:=1;
   i:=1;
Linia 110: Linia 128:
  '''end''';
  '''end''';


''Koszt czasowy:'' liniowy ze względu na długość wyrażenia nawiasowego
''Koszt czasowy:'' liniowy ze względu na długość tablicy


''Koszt pamięciowy:'' liniowy ze względu na długość wyrażenia nawiasowego
''Koszt pamięciowy:'' liniowy ze względu na długość tablicy
</div>
</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 jednoelementowanego jeden.
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.


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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 170: 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''' '''liczba''' dziesiętnych liczb k-cyfrowych przy użyciu tablicy dziesięciu kolejek. Typ liczba to array[1..k] of integer, najmniej znaczący bit jest pod indeksem 1.   
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.   


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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>


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<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  
Linia 186: Linia 212:
     B: array[1..N] of liczba;
     B: array[1..N] of liczba;
     i,j,maks: integer;
     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]^[k]], 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 znaczącego bitu
   //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:=k-1 '''to''' 1 '''do'''  
   '''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[A[l]^[i]], l);
         '''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 221: 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