Egzamin z programowania cz¦±¢ I

Transkrypt

Egzamin z programowania cz¦±¢ I
Egzamin z programowania
cz¦±¢ I
Zadanie 1. (12p) Zamie« poni»sze programy na ich odpowiedniki, w których nie ma instrucji
goto, a jedynymi strukturami steruj¡cymi s¡ p¦tla do while i instrukcja if.
a) L1: C1;
if (b1)
C2;
if (b2)
C3;
L2: C4;
b)
goto L1;
goto L2;
do {
C1;
if (b1) goto L1;
C2;
} while (b);
L1: C3;
c) L1: C1;
if (b)
{ C2;
if (b1) then goto
C3;
}
L1;
Zadanie 2. (12p) Listy mo»emy sortowa¢ za pomoc¡ metody zwanej sortowaniem przez scalanie. W metodzie tej dzielimy list¦ na dwie w przybli»eniu równe cz¦±ci, sortujemy je rekurencyjnie
i nast¦pnie scalamy tworz¡c wynikow¡, posortowan¡ list¦. Napisz funkcje:
a) dow* merge(dow *L1, dow *L2), która zwraca w wyniku wska¹nik do listy zawieraj¡cej elementy z list L1 oraz L2 w porz¡dku rosn¡cym. Zakªadamy, »e L1 oraz L2 s¡ posortowane.
b) void divide(dow *L, dow* &L1, dow* &L2), która dzieli L na dwie w przybli»eniu równe cz¦±ci i zwraca w L1 wska»nik do pierwszej z nich, a w L2 do drugiej.
c) dow* mergesort(dow *L), która sortuje list¦ L przez scalanie i zwraca do niej wska¹nik.
Dowi¡zanie jest zdeniowane jako struct dow { int key; dow* next }. Fukcja merge powinna
zdeniowana rekurencyjnie.
Zadanie 3. Pierwsze przybli»enie procedury sortuj¡cej przez wstawianie mogªoby wygl¡da¢ nast¦-
puj¡co:
i=0;
while(i<N) (
wstaw a[i] w odpowiednie miejsce w tablicy a[] w±ród pozycji 0,1,...,i
by¢ mo»e przesuwaj¡c pewne elementy
i=i+1;
)
a) (2p) Jak wygl¡daªby niezmiennik tej p¦tli u»yty w dowodzie stwierdzenia mówi¡cego, »e po
zako«czeniu dziaªania tablica jest posortowana?
b) (3p) Napisz ostateczn¡ wersj¦ tego fragmentu programu.
c) (4p) Napisz funkcj¦ bool ZawieraPodzbiór(int a[], int N, int K, int P) sprawdzaj¡c¡,
czy w tablicy a o wielko±ci N istnieje K elementowy podzbiór elementów, których suma jest
mniesza ni» P.
Zadanie 4. (10p) Denujemy skªadni¦ dwóch wersji programów licznikowych:
• Wersja (A), póªstrukturalna:
instrukcja =
|
|
|
|
[ etykieta ] instrukcja
ident "=" ident ( ("+" "1") | ("-" "1") )
ident "=" "0"
"if" ident ("=" | "!=") "0" "then" instrukcja { instrukcja } "fi"
"goto" etykieta
• Wersja (B), standardowa, nieznacznie wzbogacona:
instrukcja =
|
|
|
|
[ etykieta ] instrukcja
ident "=" ident ( ("+" "1") | ("-" "1") )
ident "=" "0"
"if" ident ("=" | "!=") "0" "then" "goto" etykieta
"goto" etykieta
W zadaniu tym masz napisa¢ procedur¦ void instrukcja() tªumacz¡c¡ instrukcj¦ z wersji A,
na ci¡g instrukcji napisanych w wersji B. Procedura instrukcja powinna korzysta¢ z globalnej
zmiennej token typu string, wskazuj¡cej na symbol, który aktualnie powinien by¢ zanalizowany.
Mo»esz korzysta¢ z:
• funkcji getToken() czytaj¡cej z wej±cia do zmiennej globalnej token oraz z funkcji putToken()
wypisuj¡cej na wyj±cie globaln¡ zmienn¡ token,
• funkcji copyToken(int n) { for (int i=0; i<n; i++) { putToken(); getToken();}}
• funkcji isIdent(string) sprawdzaj¡cej, czy argument jest identykatorem (nazw¡ zmiennej)
oraz funkcji isLabel(string) sprawdzaj¡cej, czy argument jest etykiet¡.
• funkcji string newLabel(), generuj¡cej za ka»dym wywoªaniem unikaln¡, nie wyst¦puj¡c¡
nigdzie wcze±niej etykiet¦.
Program powinien dziaªa¢ poprawnie przy zaªo»eniu, »e kompilowany program nie zawiera bª¦dów
skªadniowych.
Zadanie 5. Gramatyki G1 , G2 , G3 nad alfabetem {a, b}, okre±lone s¡, odpowiednio, przez zbiory
produkcji P1 , P2 , P3 , gdzie
P1 = {S → aSbS, S → aS S → ε}
P2 = {S → aS, S → SS, S → ε, S → aSb, S → bSa}}
P3 = {S → aS, S → ε, S → aSb, S → bSa}
Ponadto niech R = (a(ε + b + ab))∗ . Poka», »e
a) (4p) Je»eli w ∈ L(G1 ) oraz w = w1 w2 to waga(w1 ) ≥ 0, gdzie waga(w) = |w|a − |w|b .
b) (3p) L(G2 ) 6= L(G3 )
c) (4p) R ⊆ L(G2 )
Zadanie 6. Poni»sza gramatyka w notacji BNF opisuje fragment skªadni j¦zyka C.
<deklaracja> ::= <typ> <deklarator> ;
<typ> ::= int | char ;
<deklarator> ::= *<deklarator> | <deklarator>[<liczba>]
| <deklarator> ( <typ> ) | ( <deklarator> )
| <identyfikator>
a) (2p) Poka», »e powy»sza gramatyka nie jest jednoznaczna.
b) (4p) Podaj jednoznaczn¡ gramatyk¦ generuj¡c¡ ten sam j¦zyk.
2