Wstęp do programowania / Ćwiczenia 2: Różnice pomiędzy wersjami
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: | ||
{| border="1" cellpadding="5" cellspacing="0" | |||
|- | |||
< | | <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. | |||
{| border="0" cellpadding="4" cellspacing="0" | |||
W tym zadaniu chodzi o przećwiczenie metody zejść rekurencyjnych (była na wykładzie). Niestety | |- | ||
| <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> || → || | < | <= | > | >= | <> | = | |||
|} | |||
<!-- 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 i 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