Wstęp do programowania / Ćwiczenia 2: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Poprawienie formatowania
Finito!
Linia 19: Linia 19:
nie startujemy/kończymy na ścianie lub poza tablicą.
nie startujemy/kończymy na ścianie lub poza tablicą.


Zapis rozwiązania bardzo się upraszcza jeśli założymy, że mamy ścianę
Zapis rozwiązania bardzo się upraszcza jeśli założymy, że mamy ścianę dookoła labiryntu, jest to pewna forma strażnika.
dookoła labiryntu, jest to pewna forma strażnika.


Należy się też zastanowić, co by było, gdyby zamiast usuwać markowanie
Należy się też zastanowić, co by było, gdyby zamiast usuwać markowanie
Linia 126: Linia 125:


==Zadanie 6 (Parser)==
==Zadanie 6 (Parser)==
Dla zadanej poniżej gramatyki języka programowania (będącego
Dla zadanej poniżej gramatyki języka programowania (będącego uproszczoną wersją Pascala) napisz metodą zejść rekurencyjnych zestaw procedur weryfikujących poprawność programów zapisanych w tym języku. W przypadku napotkania błędu należy wypisać stosowny komunikat i zakończyć działanie. Należy założyć istnienie procedury GetSym(Symbol), która daje kolejny symbol (identyfikator, liczbę, operator (:=,<,>,<=,>=,=,<>),  separator (;, ., (, ) ) z wejścia. Należy także zaprojektować odpowiedni typ danych do pamiętania symboli wejściowych.
uproszczoną  
wersją Pascala) napisz metodą zejść rekurencyjnych zestaw procedur
weryfikujących
poprawność programów zapisanych w tym języku. W przypadku napotkania
błędu należy wypisać stosowny komunikat i zakończyć działanie. Należy
założyć
istnienie procedury GetSym(Symbol), która daje kolejny symbol
(identyfikator,
liczbę, operator (:=,<,>,<=,>=,=,<>),  separator (;, ., (, ) ) z
wejścia. Należy także  
zaprojektować odpowiedni typ danych do pamiętania symboli wejściowych.


Gramatyka:
Gramatyka:
W opisie gramatyki występują następujące symbole:
W opisie gramatyki występują następujące symbole:
  <nieterminal>
  terminal
  { coś }                                      wielokrotne (być może 0-krotne) wystąpienie cosia
  ->                                              rozdziela lewą część produkcji od prawej
  |                                                rozdziela poszczególne produkcje
Jest to trochę rozszerzona (o {}) gramatyka bezkontekstowa.


<program> -> <dekl> begin <ciąg instrukcji> end .
{| border="1" cellpadding="5" cellspacing="0"
<ciąg instrukcji> -> <instrukcja> { ; <instrukcja>}
|-  
<deklaracja> -> var <zmienna> {, <zmienna>} ;
| <nieterminal> || 
<instrukcja> ->
|-  
  while <warunek> do <instrukcja>                            |
| terminal ||
          if <warunek> then <instrukcja> else <instrukcja>  |
|-
          begin <ciąg instrukcji> end                                      |
| { coś } || wielokrotne (być może 0-krotne) wystąpienie cosia
  <zmienna> := <wyrażenie>
|-
<warunek> -> <składnik> {and <składnik>}
| &rarr;  || rozdziela lewą część produkcji od prawej
<składnik> -> <czynnik> {or <czynnik>}
|-
<czynnik> -> true | false | not <czynnik> | <wyrażenie> <oprel>
| | |     || rozdziela poszczególne produkcje
<wyrażenie> | ( <warunek> )
|}
<wyrażenie> -> <zmienna> | <liczba>
<oprel> -> < | <= | > | >= | <> | =


Jest to trochę rozszerzona (o nawiasy klamrowe { } ) gramatyka bezkontekstowa.


Rozw.
{| border="0" cellpadding="4" cellspacing="0"
  W tym zadaniu chodzi o przećwiczenie metody zejść rekurencyjnych (była na wykładzie). Niestety
|-
na razie nie mamy dostatecznie ciekawych typów danych, żeby móc zapamiętać strukturę danych
| <program>    || &rarr; || <deklaracja> begin <ciąg instrukcji> end .
programu (i np. po tem go wykonywać). Tym nie mniej zadanie jest pouczające. Typ danych który
|-
ma być wymyślony to rekord z wariantami. Można uatrakcyjnić to zadanie każąc sprawdzać, czy każda
| <ciąg instrukcji>  || &rarr; ||  <instrukcja> { ; <instrukcja> }
użyta zmienna była wcześniej zadeklarowana i czy nie była deklarowana kilkakrotnie (tablica
|-
napisów).
| <deklaracja>  || &rarr; ||  var <zmienna> { , <zmienna> } ;
|-
| <instrukcja>  || &rarr; ||  while <warunek> do <instrukcja>
|-
|    || || | | if <warunek> then <instrukcja> else <instrukcja>
|-
|    || || | | begin <ciąg instrukcji> end
|-
|    || || | | <zmienna> := <wyrażenie>
|-
| <warunek> || &rarr; || <składnik> {and <składnik>}
|-
| <składnik> || &rarr; || <czynnik> {or <czynnik>}
|-
| <czynnik> || &rarr; || | true | false | not <czynnik> | <wyrażenie> <oprel> <wyrażenie> | ( <warunek> )
|-
| <wyrażenie> || &rarr; || | <zmienna> | <liczba>
|-
| <oprel> || &rarr; || | < | <= | > | >= | <> | =
|}
 
<!-- to między || i pierwszą | to są parametry komórki, więc żeby wpisać w komórce kreskę, to trzeba zacząc komórkę od _spacja_kreska_  :) -->
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''  
<div class="mw-collapsible-content" style="display:none">
W tym zadaniu chodzi o przećwiczenie metody zejść rekurencyjnych (była na wykładzie). Niestety na razie nie mamy dostatecznie ciekawych typów danych, żeby móc zapamiętać strukturę danych programu (i np. po tem go wykonywać). Tym nie mniej zadanie jest pouczające. Typ danych który ma być wymyślony to rekord z wariantami. Można uatrakcyjnić to zadanie każąc sprawdzać, czy każda użyta zmienna była wcześniej zadeklarowana i czy nie była deklarowana kilkakrotnie (tablica napisów).
</div>
</div>

Wersja z 18:58, 11 lip 2006

To są ćwiczenia z rekurencji.

Zadanie 1 (Labirynt)

Czy istnieje droga miedzy wskazanymi punktami (x1,y1) i (x2,y2) w labiryncie reprezentowanym przez prostokątną tablicę liczb całkowitych A o rozmiarze n×m, zawierająca zera (droga) i jedynki (ściana)?

Wskazówka 1

Zadanie 2 (Z górki na pazurki)

W tablicy liczb całkowitych o rozmiarze n×m zapisana jest mapa gór (każdy punkt ma podaną dodatnią wysokość). Sprawdzić, czy da się przejść z punktu startowego do docelowego idąc:

  • tylko w dół lub po płaskim
  • tylko w dół

Wskazówka 1

Zadanie 3 (Wieże Hanoi z ograniczeniami)

Na wykładzie były wieże Hanoi. Ciekawa modyfikacja tego zadania polega na zabronieniu ruchów pomiędzy niektórymi pałeczkami, np. z pierwszej na drugą. Zapisać procedurę realizującą to zadanie przy zabronionych niektórych ruchach.

Wskazówka 1

Rozwiązanie 1

Zadanie 4 (Ustawianie hetmanów)

Napisz procedurę znajdująca wszystkie takie rozstawienia 8 hetmanów na szachownicy, by żadne dwa hetmany się nie atakowały.

Wskazówka 1

Zadanie 5 (Mnożenie wielomianów stopnia n-1)

Dane są dwie tablice (array[0..n-1] of real) reprezentujące dwa wielomiany. Należy obliczyć iloczyn tych wielomianów metodą dziel-i-zwyciężaj. Zakładamy, że N jest potęgą dwójki.

Wskazówka 1

Zadanie 6 (Parser)

Dla zadanej poniżej gramatyki języka programowania (będącego uproszczoną wersją Pascala) napisz metodą zejść rekurencyjnych zestaw procedur weryfikujących poprawność programów zapisanych w tym języku. W przypadku napotkania błędu należy wypisać stosowny komunikat i zakończyć działanie. Należy założyć istnienie procedury GetSym(Symbol), która daje kolejny symbol (identyfikator, liczbę, operator (:=,<,>,<=,>=,=,<>), separator (;, ., (, ) ) z wejścia. Należy także zaprojektować odpowiedni typ danych do pamiętania symboli wejściowych.

Gramatyka: W opisie gramatyki występują następujące symbole:

<nieterminal>
terminal
{ coś } wielokrotne (być może 0-krotne) wystąpienie cosia
rozdziela lewą część produkcji od prawej
| rozdziela poszczególne produkcje

Jest to trochę rozszerzona (o nawiasy klamrowe { } ) gramatyka bezkontekstowa.

<program> <deklaracja> begin <ciąg instrukcji> end .
<ciąg instrukcji> <instrukcja> { ; <instrukcja> }
<deklaracja> var <zmienna> { , <zmienna> } ;
<instrukcja> while <warunek> do <instrukcja>
| if <warunek> then <instrukcja> else <instrukcja>
| begin <ciąg instrukcji> end
| <zmienna> := <wyrażenie>
<warunek> <składnik> {and <składnik>}
<składnik> <czynnik> {or <czynnik>}
<czynnik> true | false | not <czynnik> | <wyrażenie> <oprel> <wyrażenie> | ( <warunek> )
<wyrażenie> <zmienna> | <liczba>
<oprel> < | <= | > | >= | <> | =

Wskazówka 1