Test GR: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 3: | Linia 3: | ||
</quiz> | </quiz> | ||
<quiz type="exclusive"> | |||
Zapisany w Haskellu nagłówek f \:\: (Integer -> Integer) -> (Integer -> Integer) deklaruje f jako funkcję, której parametrami i wynikiem są: | |||
<rightoption reply="Dobrze">parametr\: funkcja biorąca liczbę całkowitą i zwracająca liczbę całkowitą, wynik\: takaż funkcja</rightoption> | |||
<wrongoption reply=„Źle”>parametry\: dwie liczby całkowite, wynik\: dwie liczby całkowite</wrongoption> | |||
<wrongoption reply=„Źle”>parametr\: liczba całkowita, wynik\: liczba całkowita i funkcja biorąca liczbę całkowitą i zwracająca liczbę całkowitą</wrongoption> | |||
<wrongoption reply=„Źle”>taka deklaracja nie jest w Haskellu poprawna</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Definicje funkcji, w których trzeba rozpatrzyć osobne przypadki, można w Haskellu zapisać na kilka sposobów. Który z wymienionych sposobów nie jest poprawny? | |||
<wrongoption reply=„Źle”>dopasowywanie do wzorca</wrongoption> | |||
<wrongoption reply=„Źle”>dozory</wrongoption> | |||
<wrongoption reply=„Źle”>if-then-else</wrongoption> | |||
<rightoption reply="Dobrze">switch</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Haskellowy typ Integer obejmuje liczby całkowite mieszczące się: | |||
<wrongoption reply=„Źle”>w dwóch bajtach</wrongoption> | |||
<wrongoption reply=„Źle”>w czterech bajtach</wrongoption> | |||
<wrongoption reply=„Źle”>to zależy od implementacji</wrongoption> | |||
<rightoption reply="Dobrze">bez ograniczeń (Haskell przydziela dostępną pamięć w miarę potrzeby)</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
W nagłówku kw :: Num a \=> a -> a określamy typ parametru i wyniku | |||
funkcji kw jako: | |||
<wrongoption reply=„Źle”>Num</wrongoption> | |||
<rightoption reply="Dobrze">dowolny typ z klasy Num</rightoption> | |||
<wrongoption reply=„Źle”>dowolny typ, bez ograniczeń</wrongoption> | |||
<wrongoption reply=„Źle”>ta deklaracja jest niepoprawna</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Jeśli funkcja ma typ (Float, Float) -> Float, to po rozwinięciu będzie miała typ: | |||
<rightoption reply="Dobrze">Float -> (Float -> Float)</rightoption> | |||
<wrongoption reply=„Źle”>Float -> (Float, Float)</wrongoption> | |||
<wrongoption reply=„Źle”>(Float -> Float) -> Float</wrongoption> | |||
<wrongoption reply=„Źle”>rozwinięcie nie jest w tym przypadku możliwe</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Zapis Float -> Float -> Float jest interpretowany jako: | |||
<rightoption reply="Dobrze">Float -> (Float -> Float)</rightoption> | |||
<wrongoption reply=„Źle”>Float -> (Float, Float)</wrongoption> | |||
<wrongoption reply=„Źle”>(Float -> Float) -> Float</wrongoption> | |||
<wrongoption reply=„Źle”>nawiasy są tu konieczne, nie można ich pominąć</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Typ [(Integer,Integer)] oznacza: | |||
<wrongoption reply=„Źle”>listę liczb całkowitych o długości ograniczonej do dwóch elementów</wrongoption> | |||
<rightoption reply="Dobrze">listę par liczb całkowitych</rightoption> | |||
<wrongoption reply=„Źle”>parę list liczb całkowitych</wrongoption> | |||
<wrongoption reply=„Źle”>taki typ nie jest poprawny</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Które użycie operatora dodawania jest w Haskellu niepoprawne? | |||
<wrongoption reply=„Źle”>1 + 2</wrongoption> | |||
<wrongoption reply=„Źle”>(+) 1 2</wrongoption> | |||
<wrongoption reply=„Źle”>((+) 1) 2</wrongoption> | |||
<rightoption reply="Dobrze">(+)(1, 2)</rightoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Jeśli funkcja f jest typu Integer -> Integer -> Integer, to `f` (nazwa funkcji ujęta w odwrócone apostrofy) jest: | |||
<wrongoption reply=„Źle”>funkcją typu (Integer, Integer) -> Integer</wrongoption> | |||
<wrongoption reply=„Źle”>funkcją typu (Integer -> Integer) -> Integer</wrongoption> | |||
<rightoption reply="Dobrze">operatorem, którego można używać infiksowo, np. 1 `f` 2</rightoption> | |||
<wrongoption reply=„Źle”>zapis taki jest niepoprawny</wrongoption> | |||
</quiz> | |||
<quiz type="exclusive"> | |||
Zapis (3 +) oznacza: | |||
<rightoption reply="Dobrze">funkcję typu Integer -> Integer</rightoption> | |||
<wrongoption reply=„Źle”>parę złożoną z liczby 3 i znaku plus</wrongoption> | |||
<wrongoption reply=„Źle”>trzyargumentową wersję operatora dodawania</wrongoption> | |||
<wrongoption reply=„Źle”>zapis taki jest niepoprawny</wrongoption> | |||
</quiz> | |||
Wersja z 13:42, 13 wrz 2006
Zapisany w Haskellu nagłówek f \:\: (Integer -> Integer) -> (Integer -> Integer) deklaruje f jako funkcję, której parametrami i wynikiem są:
parametr\: funkcja biorąca liczbę całkowitą i zwracająca liczbę całkowitą, wynik\: takaż funkcja
<wrongoption reply=„Źle”>parametry\: dwie liczby całkowite, wynik\: dwie liczby całkowite</wrongoption> <wrongoption reply=„Źle”>parametr\: liczba całkowita, wynik\: liczba całkowita i funkcja biorąca liczbę całkowitą i zwracająca liczbę całkowitą</wrongoption> <wrongoption reply=„Źle”>taka deklaracja nie jest w Haskellu poprawna</wrongoption>Definicje funkcji, w których trzeba rozpatrzyć osobne przypadki, można w Haskellu zapisać na kilka sposobów. Który z wymienionych sposobów nie jest poprawny? <wrongoption reply=„Źle”>dopasowywanie do wzorca</wrongoption> <wrongoption reply=„Źle”>dozory</wrongoption> <wrongoption reply=„Źle”>if-then-else</wrongoption>
switch
Haskellowy typ Integer obejmuje liczby całkowite mieszczące się: <wrongoption reply=„Źle”>w dwóch bajtach</wrongoption> <wrongoption reply=„Źle”>w czterech bajtach</wrongoption> <wrongoption reply=„Źle”>to zależy od implementacji</wrongoption>
bez ograniczeń (Haskell przydziela dostępną pamięć w miarę potrzeby)
W nagłówku kw :: Num a \=> a -> a określamy typ parametru i wyniku funkcji kw jako: <wrongoption reply=„Źle”>Num</wrongoption>
dowolny typ z klasy Num
<wrongoption reply=„Źle”>dowolny typ, bez ograniczeń</wrongoption> <wrongoption reply=„Źle”>ta deklaracja jest niepoprawna</wrongoption>Jeśli funkcja ma typ (Float, Float) -> Float, to po rozwinięciu będzie miała typ:
Float -> (Float -> Float)
<wrongoption reply=„Źle”>Float -> (Float, Float)</wrongoption> <wrongoption reply=„Źle”>(Float -> Float) -> Float</wrongoption> <wrongoption reply=„Źle”>rozwinięcie nie jest w tym przypadku możliwe</wrongoption>Zapis Float -> Float -> Float jest interpretowany jako:
Float -> (Float -> Float)
<wrongoption reply=„Źle”>Float -> (Float, Float)</wrongoption> <wrongoption reply=„Źle”>(Float -> Float) -> Float</wrongoption> <wrongoption reply=„Źle”>nawiasy są tu konieczne, nie można ich pominąć</wrongoption>Typ [(Integer,Integer)] oznacza: <wrongoption reply=„Źle”>listę liczb całkowitych o długości ograniczonej do dwóch elementów</wrongoption>
listę par liczb całkowitych
<wrongoption reply=„Źle”>parę list liczb całkowitych</wrongoption> <wrongoption reply=„Źle”>taki typ nie jest poprawny</wrongoption>Które użycie operatora dodawania jest w Haskellu niepoprawne? <wrongoption reply=„Źle”>1 + 2</wrongoption> <wrongoption reply=„Źle”>(+) 1 2</wrongoption> <wrongoption reply=„Źle”>((+) 1) 2</wrongoption>
(+)(1, 2)
Jeśli funkcja f jest typu Integer -> Integer -> Integer, to `f` (nazwa funkcji ujęta w odwrócone apostrofy) jest: <wrongoption reply=„Źle”>funkcją typu (Integer, Integer) -> Integer</wrongoption> <wrongoption reply=„Źle”>funkcją typu (Integer -> Integer) -> Integer</wrongoption>
operatorem, którego można używać infiksowo, np. 1 `f` 2
<wrongoption reply=„Źle”>zapis taki jest niepoprawny</wrongoption>Zapis (3 +) oznacza:
funkcję typu Integer -> Integer
<wrongoption reply=„Źle”>parę złożoną z liczby 3 i znaku plus</wrongoption> <wrongoption reply=„Źle”>trzyargumentową wersję operatora dodawania</wrongoption> <wrongoption reply=„Źle”>zapis taki jest niepoprawny</wrongoption>
Używane w Prologu klauzule Horna mają w następniku:
co najmniej jeden term
dokładnie jeden term
dokładnie dwa termy
zero lub jeden term
Stosowana w Prologu metoda wnioskowania to:
indukcja pozaskończona
rezolucja
unifikacja
zasada instancjonowania prostego
Klauzula ,,dziadek(X, Z) \:- ojciec(X, Y), ojciec(Y, Z)".:
mówi tylko, że jeśli X jest ojcem Y i Y jest ojcem Z, to X jest dziadkiem Z
wyklucza, by któs mógł być swoim własnym dziadkiem
wyklucza, by któs mógł być swoim własnym ojcem
jest niepoprawna składniowo
Do tworzenia i rozkładania list w Prologu stosuje się:
funkcje cons, head i tail
operatory ++, + i -
operator | i odpowiednie dopasowania
w Prologu nie ma list
Zapis ,,X is 3 * Y + 4 w Prologu powoduje:
podstawienie wartości wyrażenia 3*Y+4 pod zmienną X
utożsamienie (lub sprawdzenie utożsamienia) zmiennej X z wartością wyrażenia 3*Y+4
wypisanie rozwiązania równania X\=3*Y+4
taki zapis jest niepoprawny
Jeśli Prologowi nie uda się udowodnić jednego z podcelów, to:
wraca do poprzednich podcelów, próbując znaleźć alternatywne rozwiązania
wypisuje komunikat o niepowodzeniu rezolucji
zgłasza błąd wykonania
nie robi nic, tzn. kontynuuje działanie
Dla stwierdzeń złożonych Prolog stosuje:
przeszukiwanie w głąb
przeszukiwanie wszerz
przeszukiwanie w głąb lub wszerz, w zależności od dostępnej pamięci
inną metdoę, nie wymienioną tutaj
Zapis [X | Y] w Prologu oznacza:
konkatenację list X i Y
listę, gdzie X jest głową, a Y -- ogonem listy
parę uporządkowaną złożoną z elementów X i Y
wyrażenie warunkowe z dozorem X
Jaką klauzulę należałoby dopisać przed ,,f(X, [_ | Y]) \:- f(X, Y).", by otrzymać funktor sprawdzający przynależność elementu do listy?
f(X, []).
f(X, [X]).
f(X, [X | _]).
tego nie da się tak zrobić
Lista [1, [2, 3], 4, []] ma długość:
3
4
5
jest niepoprawna składniowo
Test 6
Czego z zasady nie ma w językach funkcyjnych?
parametrów z domyślnymi wartościami
pętli
wyrażeń warunkowych
wywołań rekurencyjnych
Która cecha jest typowa dla języków funkcyjnych, a rzadko występuje w językach imperatywnych i obiektowych?
kompilacja do kodu pośredniego
możliwość używania funkcji wyższego rzędu
silne typowanie
zaawansowane konstrukcje enkapsulacyjne
Listy służą w Lispie do zapisywania:
tylko danych
tylko kodu
i danych, i kodu
w Lispie nie ma list
Wywołanie ((LAMBDA (x) (* x x)) 2) w języku Scheme:
podstawi 2 pod wskaźnik do zmiennej x
wyświetli 4
zdefiniuje gwiazdkę jako operator o priorytecie 2
zdefiniuje LAMBDA jako funkcję dwuargumentową
Funkcja DISPLAY w języku Scheme:
nie ma żadnych efektów ubocznych
nie może być używana wewnątrz funkcji rekurencyjnej
wyświetla opis stanu interpretera
wyświetla swój argument na ekranie
Wartością wyrażenia (CAR ‘(A B C)) w języku Scheme jest:
A
(B C)
C
to wyrażenie jest niepoprawne
Wartością wyrażenia (CONS ‘(A B) ‘(C D)) w języku Scheme jest:
(A B C D)
(A B (C D))
((A B) C D)
to wyrażenie jest niepoprawne
Jak w języku Scheme należy zapisać wywołanie złożenia funkcji f z samą sobą na argumencie x, czyli (f o f)(x)?
(f (f x))
f(f(x))
((f f) x)
składanie funkcji nie jest w tym języku dozwolone
Które stwierdzenie nie jest prawdziwe w odniesieniu do języka ML?
lista może zawierać elementy różnych typów
można pisać funkcje polimorficzne
ML stosuje niejawne nadawanie typów
wyrażenia arytmetyczne zapisuje się w postaci infiksowej
Do łączenia list w Haskellu służy:
funkcja CONS
operator ++
operator &
nie ma operatora, po prostu zapisuje się dwie listy obok siebie
Test 5 Której cechy język obiektowy nie musi posiadać?
abstrakcyjne typy danych
dynamiczne wiązanie wywołań metod z metodami
dziedziczenie
podprogramy rodzajowe
Jakie ograniczenie na przedefiniowywanie metod trzeba narzucić w języku silnie typowanym?
przedefiniowana metoda musi być bezparametrowa
przedefiniowana metoda musi być typu void
przedefiniowana metoda musi zachować taki sam protokół
nie trzeba narzucać żadnych ograniczeń
Rozstrzyganie odwołań do bytów o takiej samej nazwie mających definicje w dwóch klasach bazowych odbywa się w C++ za pomocą:
operatora \:\: (dwa dwukropki)
operatora . (kropka)
tego nie da się zrobić
dziedziczenie wielokrotne nie jest w C++ dozwolone
W języku C++ obiekty zaalokowane na stosie dealokowane są:
niejawnie
za pomocą delete
za pomocą free
w C++ nie ma takich obiektów
Językiem, w którym stosowane jest zawsze dynamiczne wiązanie wywołań z metodami, jest:
C++
C\#
Java
Smalltalk
Językiem, w któym klasa może być samoistna (tzn. nie mieć nadlasy), jest:
C++
C\#
Java
Smalltalk
W języku C++ metody, które mają być wiązane dynamicznie, deklaruje się za pomocą:
operatora -> (strzałka)
słowa abstract
słowa dynamic
słowa virtual
Który nagłówek poprawnie deklaruje w C++ metodę abstrakcyjną?
virtual void p();
virtual void p() \=0;
void p() \=0;
abstract void p();
Klasy ,,lekkie, deklarowane jako struct, alokowane na stosie i nie pozwalające na dziedziczenie występują w:
C++
C\#
Javie
we wszystkich wymienionych tu językach
Który element nie występuje w JavaScripcie?
klasy
obiekty złożone z par (nazwa własności, wartość)
operator new
zmienne
Test 4
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
Test 3 Pojęcie typu w językach imperatywnych bliskie jest pojęciu:
całki Riemanna
pary uporządkowanej
zbioru nieskończonego
zbioru skończonego
Który z opisanych poniżej typów można uznać za typ abstrakcyjny? Rzecz dzieje się w języku C:
struktura wraz z kilkoma działającymi na niej funkcjami
typ wskaźnikowy T *, gdzie T jest zdefiniowane następująco\: typedef int T[10];
wbudowany typ float
unia złożona z pól tego samego typu
W której sytuacji tablica asocjacyjna byłaby istotnie wygodniejsza niż zwykła tablica?
mamy katalogi ponumerowane od 1 do 100 i zapisujemy ich rozmiar
sortujemy obszerną tablicę liczb typu double
wyszukujemy największą liczbę w tablicy
zapisujemy kolor przejeżdżających samochodów, identyfikując je numerami rejestracyjnymi
Ewentualne luki między przechowywanymi w pamięci polami rekordu biorą się z:
konieczności sprawdzenia zgodności typów
konieczności umieszczania pól pod adresami, których 1 lub 2 najmniej znaczące bity są zerami
niedoskonałości kompilatorów
szybkich przesunięć cyklicznych w jednostce arytmetyczno-logicznej procesora
Załóżmy, że w języku C sprawdzamy równość struktur (oczywiście tego samego typu). Dlaczego w ogólności nie można tego zrobić przez porównywanie bloków pamięci?
istnieje kilka rozmiarów liczb całkowitych
napisy mogą zawierać nieistotne znaki za znacznikiem końca
nie można z góry przewidzieć, czy napisy są zapisane w kodzie ASCII, czy Unicode
reprezentacja liczb float i double nie jest jednoznaczna
Który operator języka C jest potrzebny, gdy wykorzystujemy wskaźniki do adresowania pośredniego?
&
++
--
nawiasy kwadratowe do indeksowania
Załóżmy, że p jest zmienną wskaźnikową. W którym języku wyrażenie ++p jest poprawne?
C++
C\#
Java
Pascal
Które stwierdzenie jest fałszywe w odniesieniu do klas w języku C++?
definicja klasy nie musi zawierać destruktora
funkcje z klasy mogą być kompilowane jako inline
konstruktor ma taką samą nazwę jak klasa
konstruktor nie może być przeciążany
W Javie obiekty są alokowane:
dynamicznie na stercie
dynamicznie na stosie
statycznie na stercie
statycznie na stosie
Sparametryzowane typy abstrakcyjne uzyskuje się w C++ za pomocą deklaracji z użyciem słowa kluczowego:
args
generic
params
template
Test 2
Program może zawierać dwie różne zmienne o tej samej nazwie, gdy są to zmienne:
alokowane dynamicznie
globalne
lokalne w dwóch różnych blokach
lokalne w tym samym bloku
L-wartością nazywamy:
bieżący adres zmiennej
wynik wyrażenia arytmetycznego
indeks tablicy
wartość zmiennej po dokonaniu podstawienia
Wiązanie statyczne:
może zmienić się w trakcie wykonania programu
następuje w trakcie wykonania programu
następuje przed wykonaniem programu
odnosi się tylko do zmiennych globalnych
Wnioskowanie o typie zmiennej jest najczęstsze w językach:
funkcyjnych
logicznych
obiektowych
nie występuje w żadnym przyzwoitym języku
Okres życia zmiennej to:
czas pomiędzy alokacją zmiennej a jej dealokacją
czas od uruchomienia programu do chwili wykonania na tej zmiennej delete, free itp.
obszar kodu pomiędzy deklaracją zmiennej a końcem zawierającego ją bloku
czas od pierwszego podstawienia pod tę zmienną do ostatniego jej użycia w programie
Obiekty w Javie są alokowane:
dynamicznie, na stercie
dynamicznie, na stosie
dynamicznie, na stosie lub na stercie (decyzję podejmuje kompilator)
statycznie
Spośród wymienionych tu języków najbliższy silnemu typowaniu jest:
C
C++
C\#
PHP
Silne typowanie bywa ,,osłabiane przez:
jawne konwersje typów
niejawne konwersje typów
dynamiczne sprawdzanie zgodności typów
statyczne sprawdzanie zgodności typów
Podtyp to:
typ powstały przez ograniczenie zakresu istniejącego typu, zgodny z owym typem
nowy typ oparty na już istniejącym, niezgodny z dotychczasowym
typ tablicowy, w którym ograniczono zakres indeksów
jedno z pól unii
W języku C++ dostęp do przesłoniętej zmiennej nielokalnej można uzyskać za pomocą operatora:
\:\: (dwa dwukropki)
. (kropka)
* (gwiazdka)
-> (strzałka)