KOLOKWIUM PODTAWY PROGRAMOWANIA BARTOZ ZIELIŃKI pis treści 1. Zasady ogólne 2 2. Zadanie cześć wspólna 3 2.1. Cel zadania 3 2.2. Wskazówki 4 2.3. Uwagi na temat uruchamiania programów 5 3. Zestawy 7 3.1. Zestaw A 7 3.2. Zestaw B 8 3.3. Zestaw C 9 3.4. Zestaw D 10 3.5. Zestaw E 11 3.6. Zestaw F 12 3.7. Zestaw G 13 3.8. Zestaw H 14 4. Regu ly oceniania 15 1
2 BARTOZ ZIELIŃKI 1. Zasady ogólne (1) Czas pracy: 2h. (2) Można korzystać z notatek z zajeć, z ksiażek, z internetu (z istniejacych stron: nie wolno wysy lać pytań na fora dyskusyjne ani korzystać z maila). Nie wolno korzystać z pomocy kolegów, ani bezpośrednio ani za pośrednictwem internetu. (3) W przypadku niejasności co do treści zadania należy zadać pytanie prowadza- cemu, który może choć nie musi na nie odpowiedzieć (na przyk lad gdy uzna że odpowiedź u latwi laby nadmiernie rozwiazanie). (4) Ogólny zarys zadania jest wspólny dla wszystkich zestawów i jest opisany w ekcji 2. zczegó ly specyficzne dla poszczegónych zestawów podane sa w ekcji 3. (5) Każdemu studentowi prowadzacy przydziela jeden zestaw. (6) Rozwiazaniem zadania jest kompilujacy sie i poprawnie dzia lajacy program. (7) Na poczatku tekstu programu student powinien umieścić w komentarzu swoje imie i nazwisko a także numer przydzielonego zestawu. (8) Napisany program student powinien przes lać jako za lacznik maila z pustym cia lem wiadomości i tematem Kolokwium: Podstawy Programowania na adres bzielinski@uni.lodz.pl.
KOLOKWIUM: PODTAWY PROGRAMOWANIA 3 2. Zadanie cz eść wspólna 2.1. Cel zadania. Celem zadania jest napisanie programu wypisujacego generowane rekurencyjnie wzory, sk ladajace sie z dużych znaków z których każdy jest obrazkiem ACII. Na przyk lad, program może wypisać nastepuj acy obraz ACII: +- +- -+ +- -+ -+ *** *** *** *** ***** ***** ***** ***** ******* --+-- ******* ******* --+-- ******* +- +- ************ -+ +- ************ -+ -+ Obraz 1 reprezentujacy wygenerowany rekurencyjnie wzór: [[ ][ ]] gdzie +- +- [ ] -+ -+ --+-- * *** ***** ******* ******* Program powinien przyjmować od użytkownika dwa parametry: D i N. N opisuje charakterystyczny rozmiar obrazków ACII reprezentujacych symbole [, ], i, natomiast D podaje g l ebokość rekurencji. Każdy zestaw (patrz ekcja 3) podaje: (1) Postać konkretnej formu ly rekurencyjnej. Definicja wzoru we wszystkich zestawach wymaga dwóch funkcji wzajemnie rekurencyjnych f(d) i g(d). Przyjmujemy konwencje że dla parametru D powinna zostać wygenerowana grafika ACII odpowiadajaca wzorowi f(d). (2) Przyk lady wygenerowanych wzorów dla kilku wartości parametru D. (3) Zależna od N postać obrazków ACII odpowiadajacych symbolom i. (Do generowania obrazków ACII odpowiadajacych nawiasom [ i ] należy użyć funkcji C++ leftpar() i rightpar() zdefiniowanych w ekcji 2.2. Na przyk lad obrazek ACII podany na poczatku tej sekcji zosta l wygenerowany dla parametrów N = 3, D = 2 przez program rysujacy wzór f(d) zdefiniowany rekurencyjnie (z pomoca dodatkowej funkcji g(d)) jako: [g(d 1)g(d 1)] gdy d > 0, [f(d 1) f(d 1)] gdy d > 0. dla d = 0 [] dla d = 1 [[ ][ ]] dla d = 2 [[[] []][[] []]] dla d = 3
4 BARTOZ ZIELIŃKI Obrazki ACII odpowiadajace w tym wypadku symbolom i maja (zależna od parametru N) forme: - - - + - - - * * 2.2. Wskazówki. Problem w naturalny sposób dzieli sie na dwie cześci których rozwiazanie jest podobne do rozwiazania zadań omawianych na zajeciach: (1) Budowanie formu l definiowanych rekurencyjnie i sk ladajacych sie z niewielkiej ilości różnych znaków (w tym wypadku czterech). (2) Rysowanie obrazów ACII o ustalonym zarysie zależnych od rozmiaru. Majac rozwiazania tych dwóch podproblemów możemy je z lożyć w jedna ca lość. W miejscu w którym w funkcji budujacej rekurencyjnie wzór wys lalibyśmy na konsole pojedyńczy znak ACII reprezentujacy określony symbol (n.p. znak [ instrukcja cout<< [ ;) wywo lujemy funkcje rysujac a odpowiadajacy symbolowi obrazek ACII. Niestety na konsoli możemy wyświetlać tylko kompletne wiersze, nie możemy natomiast wyświetlić fragmentu wiersza a wrócić do niego potem. Z drugiej strony każdy z obrazków ACII reprezentujacych symbole, które musimy z lożyć obok siebie aby utworzyć kompletny wzór ma 2N + 1 wierszy. Wynika stad że nie możemy po prostu napisać funkcji rysujacych kompletny pojedyńczy symbol. Możemy natomiast napisać funkcje które wypisuja pojedyńczy wiersz (bez znaku nowej linii) danego symbolu. Na przyk lad funkcje poniżej wypisuja j-ty wiersz odpowiednio lewego i prawego nawiasu rozmiaru N: 1 void leftpar ( int N, int j ) 2 int width=(n>3)?n/2+1:2; 3 cout<< ; 4 i f ( j ==0 j==2 N) cout<< + ; 5 else cout<< ; 6 for ( int i =1; i<width ; i ++) 7 i f ( j ==0 j==2 N) cout<< ; 8 else cout<< ; 9 } 10 cout<< ; 11 } 12 13 void rightpar ( int N, int j ) 14 cout<< ; 15 int width=(n>3)?n/2+1:2; 16 for ( int i =1; i<width ; i ++)
KOLOKWIUM: PODTAWY PROGRAMOWANIA 5 17 i f ( j ==0 j==2 N) cout<< ; 18 else cout<< ; 19 } 20 i f ( j ==0 j==2 N) cout<< + ; 21 else cout<< ; 22 cout<< ; 23 } Warto zwrócić uwage na spacje wstawiane w wierszach 3,10,14 i 22 które wprawdzie znaduja sie poza obszarem znaku, ale zapobiegaja sklejaniu kolejnych znaków. tosowanie powyższych funkcji powinien wyjaśnić poniższy przyk lad: Kod dla N = 3 wypisuje for ( int j =0; j <2 N+1; j ++) leftpar (N, j ) ; leftpar (N, j ) ; rightpar (N, j ) ; rightpar (N, j ) ; cout<< \n ; } +- +- -+ -+ +- +- -+ -+ Do samodzielnego napisania przez studenta pozostaja funkcje: void sign(int N,int j); Wypisuje j-ty wiersz obrazka ACII o rozmiarze N void symbol(int N,int j); void f(int N,int j,int d); void g(int N,int j,int d); odpowiadajacego symbolowi. Wypisuje j-ty wiersz obrazka ACII o rozmiarze N odpowiadajacego symbolowi. Implementacja funkcji wzajemnie rekurencyjnych generujacych j wiersz wzoru zapisanego przy pomocy obrazków ACII o rozmiarze N. oraz funkcja main() która powinna wczytać parametry D i N oraz wywo lać f() w odpowiedniej p etli. 2.3. Uwagi na temat uruchamiania programów. Ponieważ okno konsoli tekstowej ma ograniczona szerokość, wiersze generowane przez nasz program sa na ogó l d luższe od szerokości konsoli a zawijanie wierszy psuje efekt, warto przekierować wyjście programu do pliku tekstowego. W tym celu zamiast uruchamiać skompilowany program poleceniem menu DEV a należy: (1) Wykomentować w kodzie programu linie system( PAUE ); i skompilować program. (2) Wybrać w menu TART program Wiersz polecenia. (3) Przejść do katalogu w którym znajduje sie plik wykonywalny naszego programu (ten z rozszerzeniem EXE) przy pomocy polecenia cd. (4) Zak ladajac że plik wykonywalny naszego programu nosi nazwe zadanie.exe należy wykonać na konsoli polecenie zadanie > wynik. txt
6 BARTOZ ZIELIŃKI które spowoduje że wszystko to co zosta loby wypisane na konsoli zostanie umieszczone w pliku wynik.txt. Jeśli plik o tej nazwie nie istnia l, zostanie utworzony, w przeciwnym wypadku dotychczasowa zawartość pliku zostanie zastapiona nowa.
KOLOKWIUM: PODTAWY PROGRAMOWANIA 7 3. Zestawy 3.1. Zestaw A. Formu la rekurencyjna: [g(d 1)g(d 1)] gdy d > 0, [f(d 1) f(d 1)] gdy d > 0. Obrazki ACII: dla d = 0 [] dla d = 1 [[ ][ ]] dla d = 2 [[[] []][[] []]] dla d = 3 - - - + - - - * *
8 BARTOZ ZIELIŃKI 3.2. Zestaw B. Formu la rekurencyjna: [] gdy d = 0, [f(d 1)g(d 1)] gdy d > 0, [g(d 1) f(d 1)] gdy d > 0. Obrazki ACII: [] dla d = 0 [[]] dla d = 1 [[[]][ []]] dla d = 2 [[[[]][ []]][[ []] [[]]]] dla d = 3 - - - + - - - * * *
KOLOKWIUM: PODTAWY PROGRAMOWANIA 9 3.3. Zestaw C. Formu la rekurencyjna: [g(d 1)] [g(d 1)] gdy d > 0, [] gdy d = 0, [g(d 1)f(d 1)] gdy d > 0. Obrazki ACII: dla d = 0 [[]] [[]] dla d = 1 [[[]]] [[[]]] dla d = 2 [[[[]][[]] [[]]]] [[[[]][[]] [[]]]] dla d = 3 + - - - - - - -
10 BARTOZ ZIELIŃKI 3.4. Zestaw D. Formu la rekurencyjna: [f(d 1)] [g(d 1)] gdy d > 0, [] gdy d = 0, [f(d 1)f(d 1)] gdy d > 0. Obrazki ACII: dla d = 0 [] [[]] dla d = 1 [[] [[]]] [[]] dla d = 2 [[[] [[]]] [[]]] [[[] [[]][] [[]]]] dla d = 3 - - - - - - - + * * * *
KOLOKWIUM: PODTAWY PROGRAMOWANIA 11 3.5. Zestaw E. Formu la rekurencyjna: [g(d 1)]g(d 1) gdy d > 0, [] gdy d = 0, [f(d 1) f(d 1)] gdy d > 0. Obrazki ACII: dla d = 0 [[]][] dla d = 1 [[ ]][ ] dla d = 2 [[[[]][] [[]][]]][[[]][] [[]][]] dla d = 3 - - - + - - - *
12 BARTOZ ZIELIŃKI 3.6. Zestaw F. Formu la rekurencyjna: g(d 1)[g(d 1)] gdy d > 0, [f(d 1) f(d 1)] gdy d > 0. Obrazki ACII: dla d = 0 [] dla d = 1 [ ][[ ]] dla d = 2 [[] []][[[] []]] dla d = 3 - - - - - - - + * * * *
KOLOKWIUM: PODTAWY PROGRAMOWANIA 13 3.7. Zestaw G. Formu la rekurencyjna: [] gdy d = 0, g(d 1)[f(d 1)] gdy d > 0, [f(d 1) g(d 1)] gdy d > 0. Obrazki ACII: [] dla d = 0 [[]] dla d = 1 [[] ][[[]]] dla d = 2 [[[]] [[] ]][[[] ][[[]]]] dla d = 3 - - - - - - - + *
14 BARTOZ ZIELIŃKI 3.8. Zestaw H. Formu la rekurencyjna: [] gdy d = 0, g(d 1) [f(d 1)] gdy d > 0, [f(d 1)g(d 1)] gdy d > 0. Obrazki ACII: [] dla d = 0 [[]] dla d = 1 [[]] [ [[]]] dla d = 2 [ [[]][[]]] [[[]] [ [[]]]] dla d = 3 + - - - - - - - * * * * *
KOLOKWIUM: PODTAWY PROGRAMOWANIA 15 4. Regu ly oceniania Maksymalnie po 4 punkty można otrzymać za: (1) Funkcje sign(). (2) Funkcje symbol(). (3) Funkcje f(), g() i main(). Do zdobycia jest zatem 12 punktów. W przypadku gdy nie zostana zaimplementowane funkcje rekurencyjne f() i g() ale program potrafi wypisać przynajmniej symbole z sign() i/lub symbol() student może otrzymać maksymalna ilość punktów za funkcje sign() i/lub symbol() ale nie otrzymuje punktu za main(). Na ocene poszczególnych cześci zadania ma wp lyw oprócz ogólnej poprawności także zgodność ze specyfikacja struktury programu (wymagany podzia l na funkcje itd.) Wstepny przelicznik punkty na oceny (może ulec zmianie na korzyść studentów jeśli okaże sie że zadanie by lo zdecydowanie za trudne): ocena = 2 + punkty 2 2.