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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Gracja (dyskusja | edycje)
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
Linia 88: Linia 88:
         print(a[0], a[1], b);
         print(a[0], a[1], b);
       }''
       }''
==Test==
<quiz type="exclusive">
Który język nie pozwala na użycie parametrów z wartością domyślną?
<wrongoption reply="Źle">Ada</wrongoption>
<rightoption reply="Dobrze">C</rightoption>
<wrongoption reply="Źle">C++</wrongoption>
<wrongoption reply="Źle">PHP</wrongoption>
</quiz>
<quiz type="exclusive">
Przekazanie funkcji jako parametru można w C\# osiągnąć za pomocą mechanizmu:
<wrongoption reply="Źle">bezpośrednio, bez dodatkowych mechanizmów</wrongoption>
<rightoption reply="Dobrze">delegatów</rightoption>
<wrongoption reply="Źle">tablic wielowymiarowych</wrongoption>
<wrongoption reply="Źle">wskaźników do funkcji</wrongoption>
</quiz>
<quiz type="exclusive">
Który język nie sprawdza zgodności typów parametrów?
<wrongoption reply="Źle">Ada</wrongoption>
<wrongoption reply="Źle">C#</wrongoption>
<wrongoption reply="Źle">Java</wrongoption>
<rightoption reply="Dobrze">PHP</rightoption>
</quiz>
<quiz type="exclusive">
Przy której deklaracji procedury f wywołanie f(2*x + 3) jest poprawne?
<wrongoption reply="Źle">procedure f(n: in out Integer) w Adzie</wrongoption>
<wrongoption reply="Źle">procedure f(n: out Integer) w Adzie</wrongoption>
<rightoption reply="Dobrze">void f(int n) w języku C</rightoption>
<wrongoption reply="Źle">void f(int *n) w języku C</wrongoption>
</quiz>
<quiz type="exclusive">
Chcąc w języku C przekazać do funkcji tablicę przez wartość, trzeba:
<rightoption reply="Dobrze">,,obudować'' ją strukturą i przekazać tę strukturę</rightoption>
<wrongoption reply="Źle">użyć nawiasów kwadratowych po nazwie tablicy w wywołaniu funkcji</wrongoption>
<wrongoption reply="Źle">użyć nawiasów kwadratowych po nazwie parametru w nagłówku funkcji</wrongoption>
<wrongoption reply="Źle">nie trzeba robić niczego szczególnego</wrongoption>
</quiz>
<quiz type="exclusive">
Jaką dodatkową cechę mają parametry stałe deklarowane w C++
z użyciem const w stosunku do parametrów w trybie wejściowym w ogóle?
<rightoption reply="Dobrze">nie mogą być zmieniane nawet w obrębie podprogramu</rightoption>
<wrongoption reply="Źle">są zawsze alokowane statycznie</wrongoption>
<wrongoption reply="Źle">wymuszają statyczne sprawdzenie zgodności typu</wrongoption>
<wrongoption reply="Źle">nie mają żadnej dodatkowej cechy</wrongoption>
</quiz>
<quiz type="exclusive">
Załóżmy, że x jest parametrem w trybie out w procedurze w Adzie.
Która instrukcja ma szansę być poprawna?
<wrongoption reply="Źle">x \:\= x + 1</wrongoption>
<rightoption reply="Dobrze">x \:\= y + 1</rightoption>
<wrongoption reply="Źle">y \:\= x + 1</wrongoption>
<wrongoption reply="Źle">y \:\= T(x)</wrongoption>
</quiz>
<quiz type="exclusive">
Jawne przekazywanie przez referencję jest w C\# możliwe, jeśli
umieścimy słowo kluczowe ref:
<wrongoption reply="Źle">przy parametrze aktualnym</wrongoption>
<wrongoption reply="Źle">przy parametrze formalnym</wrongoption>
<rightoption reply="Dobrze">i przy parametrze formalnym, i przy aktualnym</rightoption>
<wrongoption reply="Źle">to w ogóle nie jest możliwe</wrongoption>
</quiz>
<quiz type="exclusive">
W językach z zakresem widoczności zmiennych wiązanym statycznie
jako środowiska wykonywania przekazanego przez parametr podprogramu najczęściej używa się:
<wrongoption reply="Źle">środowiska instrukcji (w podprogramie), wywołującej przekazany podprogram</wrongoption>
<rightoption reply="Dobrze">środowiska definicji przekazanego podprogramu</rightoption>
<wrongoption reply="Źle">środowiska instrukcji, która przekazała podprogram jako parametr</wrongoption>
<wrongoption reply="Źle">żadnego z wymienioinych środowisk</wrongoption>
</quiz>
<quiz type="exclusive">
W implementacji podprogramów bez zagnieżdżeń, ale z rekurencją
i z dynamicznymi zmiennymi lokalnymi na stosie potrzebne jest przechowywanie w rekordzie aktywacyjnym:
<rightoption reply="Dobrze">tylko łącza dynamicznego</rightoption>
<wrongoption reply="Źle">tylko łącza statycznego</wrongoption>
<wrongoption reply="Źle">łącza dynamicznego i statycznego</wrongoption>
<wrongoption reply="Źle">żadnego z nich</wrongoption>
 
</quiz>

Wersja z 21:23, 12 wrz 2006

Zadanie 1

Napisz program w dowolnym języku (niekoniecznie prawdziwym), który pokazywałby różnicę między (a) przekazywaniem parametrów przez wartość i wynik a (b) przekazywaniem przez referencję. Chodzi o to, by program wypisywał inny komunikat, jeśli zostanie uruchomiony przy założeniu (a), a inny przy (b).

Zadanie 2

Zaimplementuj jeden generator liczb pseudolosowych w „czystym” C, a drugi w C# lub Javie. Jak można wykorzystać charakterystyczne cechy tych języków?

Wskazówka:

Zadanie 3

Załóżmy, że mamy kompilator pewnego języka o składni takiej jak C, o którym nie wiemy, czy zmienne lokalne są statyczne czy dynamiczne na stosie. Napisz program, który pozwoli to sprawdzić.

Wskazówka:

Zadanie 4

Napisz program w dowolnym języku, który pozwoli zaobserwować różnicę w szybkości przekazywania parametrów przez wartość i przez referencję. By zminimalizować wpływ obsługi wywołań na pomiar, przekazuj w obydwu przypadkach możliwie dużą tablicę.

Wskazówka:

Zadanie 5

Napisz program w języku, w którym można stosować parametry w „czystym” trybie wyjściowym, tzn. out, a nie in-out. Program ma wykazać, w którym momencie ów parametr jest wiązany z konkretną komórką pamięci — czy w chwili wywołania podprogramu, czy w chwili jego zakończenia, czy może jeszcze kiedy indziej.

Wskazówka:

Zadanie 6

Rozważmy następujący program w Adzie:

     function f(n: Integer) return Integer is
       function g(n: Integer) return Integer is
       begin
         if n <= 1 then return 1;
         else return n * f(n - 1);
         end if;
       end g;
     begin
       if n <= 1 then return 1;
       else return n * g(n - 1);
       end if;
     end f;

Jaka będzie największa długość łańcucha dynamicznego i statycznego, jeśli w wyrażeniu wywołano f(5)? Przedstaw schematycznie zawartość stosu w chwili, gdy zostanie wywołane f(1).

Zadanie 7

Jak należy zaimplementować instrukcję goto w języku, który pozwala na zagnieżdżanie podprogramów? Chodzi o sytuację, gdy goto powodowałoby „wyskoczenie” z podprogramu np. tak jak na rysunku poniżej (skok w obrębie podprogramu jest bezproblemowy, natomiast skok do wnętrza podprogramu stwarzałby niejasność co do wartości jego zmiennych lokalnych — więc go nie rozważamy).

     procedure P1
       procedure P2
       begin
       ...
       goto A;
       ...
       end P2;
     begin
     ...
     P2;
     ...
     A: ...
     ...
     end P1;

Zadanie 8

Podaj przykłady programów i sekwencji wywołań podprogramów, przy których długość łańcucha dynamicznego będzie mniejsza, równa i większa od długości łańcucha statycznego.

Zadanie 9

Co wypisuje poniższy program przy założeniu, że parametry przekazywane są przez wartość? Co, jeśli przez referencję? Co, jeśli przez wartość i wynik? Czy jest tu sytuacja, w której nie da się odpowiedzieć jednoznacznie bez ustalenia szczegółów implementacji?

     int a[] = {10, 20};
     int b = 0;
     void f(int x, int y, int z) {
       b = b+1;
       x = x+2;
       y = y+3;
       z = z+4;
       print(a[0], a[1], b, x, y, z);
     }
     void main() {
       f(a[b], b, b);
       print(a[0], a[1], b);
     }

Test

Który język nie pozwala na użycie parametrów z wartością domyślną?

Ada

C

C++

PHP

Przekazanie funkcji jako parametru można w C\# osiągnąć za pomocą mechanizmu:

bezpośrednio, bez dodatkowych mechanizmów

delegatów

tablic wielowymiarowych

wskaźników do funkcji

Który język nie sprawdza zgodności typów parametrów?

Ada

C#

Java

PHP

Przy której deklaracji procedury f wywołanie f(2*x + 3) jest poprawne?

procedure f(n: in out Integer) w Adzie

procedure f(n: out Integer) w Adzie

void f(int n) w języku C

void f(int *n) w języku C

Chcąc w języku C przekazać do funkcji tablicę przez wartość, trzeba:

,,obudować ją strukturą i przekazać tę strukturę

użyć nawiasów kwadratowych po nazwie tablicy w wywołaniu funkcji

użyć nawiasów kwadratowych po nazwie parametru w nagłówku funkcji

nie trzeba robić niczego szczególnego

Jaką dodatkową cechę mają parametry stałe deklarowane w C++ z użyciem const w stosunku do parametrów w trybie wejściowym w ogóle?

nie mogą być zmieniane nawet w obrębie podprogramu

są zawsze alokowane statycznie

wymuszają statyczne sprawdzenie zgodności typu

nie mają żadnej dodatkowej cechy


Załóżmy, że x jest parametrem w trybie out w procedurze w Adzie. Która instrukcja ma szansę być poprawna?

x \:\= x + 1

x \:\= y + 1

y \:\= x + 1

y \:\= T(x)

Jawne przekazywanie przez referencję jest w C\# możliwe, jeśli umieścimy słowo kluczowe ref:

przy parametrze aktualnym

przy parametrze formalnym

i przy parametrze formalnym, i przy aktualnym

to w ogóle nie jest możliwe

W językach z zakresem widoczności zmiennych wiązanym statycznie jako środowiska wykonywania przekazanego przez parametr podprogramu najczęściej używa się:

środowiska instrukcji (w podprogramie), wywołującej przekazany podprogram

środowiska definicji przekazanego podprogramu

środowiska instrukcji, która przekazała podprogram jako parametr

żadnego z wymienioinych środowisk

W implementacji podprogramów bez zagnieżdżeń, ale z rekurencją i z dynamicznymi zmiennymi lokalnymi na stosie potrzebne jest przechowywanie w rekordzie aktywacyjnym:

tylko łącza dynamicznego

tylko łącza statycznego

łącza dynamicznego i statycznego

żadnego z nich