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