Paradygmaty programowania/Ćwiczenia 1: Co to jest paradygmat programowania?

From Studia Informatyczne

Ćwiczenie 1

Przyjrzyj się programom, pokazanym w przykładach na początku wykładu. Zapewne od razu widzisz, do czego mogą służyć. Upewnij się, że masz dostęp do komputera i oprogramowania, które umożliwia uruchamianie programów w jakimś typowym języku imperatywnym (np. Pascal) i obiektowym (np. Java); C++ może spełniać obydwie te role. Następnie uruchom pierwsze dwa programy, imperatywny i obiektowy, ewentualnie dostosowując je do wymagań języków, których używasz.

Ćwiczenie 2

Trzeci program, funkcyjny, można łatwo przerobić na program imperatywny. Zrób to i uruchom ów program. Czy potrafisz napisać program, który taki sam wynik obliczy znacznie prościej?

Wskazówka

Podany program (a właściwie funkcja) liczy oczywiście sumę kolejnych liczb całkowitych od m do n. W wersji imperatywnej można to osiągnąć za pomocą pętli dodającej owe liczby, ale prościej i szybciej jest wykorzystać wzór na taką sumę, czyli (n-m+1)(n+m)/2 wraz z ewentualnym sprawdzeniem, czy m \leq n.

Ćwiczenie 3*

Czwarty program, logiczny, jest znacznie trudniejszy w przetłumaczeniu na język imperatywny. Spróbuj jednak i tego. Zauważ, że oprócz przetłumaczenia treści tego konkretnego programu, trzeba zbudować zalążek „maszyny logicznej”, która potrafi wyciągać wnioski z podanych zależności.

Wskazówka

Tu pytamy, kto jest dziadkiem Janusza. Podane zależności pozwalają stwierdzić, że jest to Jan. Chcąc przetłumaczyć ten programik na język imperatywny, musimy skonstruować program, który nie tylko ma zapisane przykładowe „relacje rodzinne”, ale także próbuje znaleźć odpowiedź, dopasowując zależności ze zmiennymi do konkretnych imion.

Ćwiczenie 4

W historii informatyki parokrotnie podejmowano próby stworzenia „superjęzyka”, który zawierałby niemalże wszystkie znane w danym czasie mechanizmy. Przykładami są języki PL/I i Ada. PL/I dawno odszedł już w zapomnienie, zaś Ada dopiero w ćwierć wieku po powstaniu doczekała się przyzwoitych implementacji; trudno jednak uznać ją za język, który odniósł spektakularny sukces. Wymień parę powodów, dla których superjęzyki wydają się skazane na porażkę.

Wskazówka

Po pierwsze, obszerny język wymaga bardzo złożonego kompilatora. Praca nad nim może trwać tak długo, że język zdąży się zestarzeć, zanim zyska popularność. Po drugie, superjęzyk jest kosztowny pod względem wykorzystania zasobów komputera. Po trzecie, obfitość rozmaitych mechanizmów sprawia, że te same algorytmy można zapisać na wiele sposobów — co nie sprzyja niezawodności. Po czwarte, programistom trudniej jest się nauczyć wielu nowych rozwiązań. Z punktu widzenia sukcesu rynkowego wydaje się zatem, że lepszym rozwiązaniem jest stosunkowo prosty, zwarty język, który dopiero później „obrasta” bibliotekami.

Ćwiczenie 5

Zapisz za pomocą BNF składnię kilku typowych konstrukcji w wybranym języku programowania, np. instrukcji warunkowej (if), instrukcji wyboru (case lub switch), pętli while, deklaracji zmiennej tablicowej. Wyrażenia arytmetyczne oraz inne „żmudne” sytuacje pozostaw chwilowo bez definicji. Zauważ, że często definiujemy jakąś konstrukcję, a potem wykorzystujemy tę definicję do opisania większego lub bardziej ogólnego tworu.

Ćwiczenie 6

Zapisz w BNF definicje liczby całkowitej i liczby w zapisie zmiennopozycyjnym (chodzi o liczby postaci 1.23, –1.23E+45, 1.23E–4). Zauważ że tam, gdzie występują powtarzające się elementy (np. cyfry w liczbie), można użyć rekurencji lub nawiasów klamrowych.

Ćwiczenie 7

Zapisz w BNF definicję wyrażenia arytmetycznego z wybranego języka programowania.