Laboratorium nr 2: Operacje na symbolach 1 Cel cwiczenia
Transkrypt
Laboratorium nr 2: Operacje na symbolach 1 Cel cwiczenia
Laboratorium nr 2: Operacje na symbolach 1 Cel ćwiczenia Opanowanie umiej˛etności tworzenia pliku typu Makefile oraz tworzenia programu wielomodułowego. Wykształcenie umiej˛etności dekompozycji funkcji składajacych ˛ si˛e na finalne rozwiazanie ˛ zadania. Wst˛epne zapoznanie si˛e z operacjami na strumieniach standardowych cin i cout. Wykształcenie umiej˛etności abstrahowania operacji arytmetycznych. Utrwalenie umiej˛etności tworzenie opisów funkcji. 2 Program zaj˛eć ˛ Materiały pomocnicze do zaj˛eć znajduja˛ si˛e w kartotece ∼ bk/edu/kpo/zad/z2. Wyst˛epujace w dalszej cz˛eści opisu nazwy podkatalogów odnosza˛ si˛e do zasobów wyst˛epujacych ˛ we wcześniej wspomnianej kartotece. • Ocena realizacji zadania z poprzedniego laboratorium – ocenie podlega poprawność programu, kompilacja (kompilacja musi przebiegać bez ostrzeżeń), styl pisania programu oraz opisy. • Modyfikacja programu wg wskazań osoby prowadzacej ˛ – ocenie b˛edzie podlegała poprawność realizacji modyfikacji. Prac˛e nad modyfikacja˛ programu (wszystkie operacje należy wykonywać na kopii) należy rozpoczać ˛ już w trakcie pierwszej fazy laboratorium, gdyż prowadzacy ˛ nie b˛edzie w stanie ocenić wcześniejszego programu wszystkim jednocześnie. • Demonstracja sposobu wyszukiwania bł˛edów w programie – do tego celu wykorzystany zostanie program zawarty w podkartotece zly_program. Sposób pracy z tym przykładem opisany jest w podrodziale 3. • Praca własna – w tej cz˛eści należy spróbować zdiagnozować przyczyny bł˛edu i skorygować demonstrowany program. • Realizacja wst˛epnej fazy prac nad nowym zadaniem – prac˛e nad programem należy rozpoczać ˛ już w trakcie pierwszej fazy laboratorium, o ile uda si˛e zakończyć wcześniej prac˛e nad modyfikacja˛ pierwszego programu, a prowadzacy ˛ nie zda˛ży ocenić wcześniejszego programu wszystkim osobom. W ramach wst˛epnej fazy pracy nad programem należy napisać odpowiedni plik Makefile oraz w odpowiednim module funkcj˛e realizujac ˛ a˛ operacj˛e dodawania symboli. Należy też stowrzyć plik main.cpp, który pozwoli wywołać t˛e funkcj˛e i wst˛epnie przetestować jej działanie. Opis zadania znajduje si˛e w podrozdziale 4. Stworzona funkcja powinna zostać odpowiednio opisana. Warto w tej fazie spróbować napisać również funkcj˛e wczytujaca ˛ i wyświetlajaca ˛ symbol. Traktowane to b˛edzie jako dodatkowy efekt ponad obowiazkowe ˛ minimum. • Ocena realizacji wst˛epnej wersji programu 1 3 Poprawność programów, plik core W podkatalogu zly_program znajduje si˛e program przetworz.c. Zawiera on jeden istotny bład. ˛ Aby go zidentyfikować, konieczne jest przetestowanie programu. Należy wspomniany program skompilować za pomoca˛ kompilatora gcc i uruchomić otrzymany plik wynikowy. gcc -Wall -pedantic przetworz.c ./a.out Jeżeli program spowodował bład ˛ naruszenia pami˛eci i pojawił si˛e plik core, to trzeba podjać ˛ prób˛e zlokalizowania źródła problemu poprzez obejrzenie zawartości stosu wywołań funkcji. W tym celu należy uruchomić program gdb. gdb a.out core Wyświetlenie stosu wywołań można uzyskać poprzez polecenie bt. Zakończenie współpracy z programem dokonujemy za pomoca˛ polecenia q. Nast˛epnie należy powtórnie skompilować program w trybie generacji dodatkowej informacji dla debuggera (opcja -g). gcc -g -Wall -pedantic przetworz.c Tak jak poprzednio należy uruchomić program wywołaniem ./a.out, a nast˛epnie obejrzeć stos wywołań funkcji za pomoca˛ debuggera gdb. Na podstawie otrzymanych informacji trzeba zlokalizować źródło bł˛edu i wyjaśnić przyczyn˛e dziwnego zachowania si˛e programu. W wyjaśnieniu problemu pomocne jest skompilowanie programu za pomoca˛ kompilatora j˛ezyka C++, a mianowicie g++. Należy zwrócić uwag˛e na ostrzeżenie, które wyświetli si˛e w trakcie kompilacji. Jest to przykład pokazujacy ˛ dlaczego nie należy lekceważyć ostrzeżeń. 4 Opis zadania programowego Należy napisać program, który testuje użytkownika ze znajomości prostej arytmetyki na symbolach. Program ma pokazywać symbol i pytać si˛e o operacj˛e dodawania lub odejmowania, której wynikiem b˛edzie dany symbol. W trakcie działania programu maja˛ być zliczane ilości dobrych i złych odpowiedzi. Po zakończeniu testu program powinien wyświetlić statystyk˛e dobrych i złych odpowiedzi. Pytania b˛eda˛ zadawane z ustalonego zbioru. 4.1 Przykład działania programu Układ pytań i odpowiedzi w niniejszym przykładzie należy traktować jako obowiazuj ˛ acy. ˛ Szczegółowe elementy, takie jak minki, sa˛ jedynie propozycja.˛ jkowalsk@panamint: rozwiazanie> ./arytmetyka :? Podaj operacj˛ e dodawania, ktorej wynikiem jest: d Twoja odpowiedz: a + b :( Blad. Wynikiem tej operacji jest: c :? Podaj operacj˛ e odejmowania, ktorej wynikiem jest: b Twoja odpowiedz: f - c 2 Wprowadzony zostal bledny symbol ’f’. Sprobuj jeszcze raz. Twoja odpowiedz: c = a Wprowadzony zotal bledny operator ’=’. Sprobuj jeszcze raz. :) Twoja odpowiedz: c - a Odpowiedz poprawna Koniec testu. Ilosc dobrych odpowiedzi: 1 Ilosc blednych odpowiedzi: 1 Wynik procentowy poprawnych odpowiedzi: 50% jkowalsk@panamint: rozwiazanie>_ 4.2 Definicje działań arytmetycznych Zbiór symboli to S = {e, a, b, c, d}. Zdefiniowane zostało działanie, które umownie nazwane zostało dodawaniem. Działanie dodawania zdefiniowane jest zgodnie z tabelkami: Działanie e e e a a b b c c d d "+" a a b c d e b b c d e a c c d e a b d d e a b c Tabelk˛e t˛e należy czytać w nast˛epujacy ˛ sposób argument_1wiersz operator argument_2kolumna = element_macierzywiersz,kolumna na przykład b + d = a. Należy zauważyć, że elementem neutralnym tej operacji jest symbol e, tzn. niezależnie do jakiego symbolu dodamy symbol e wynikiem b˛edzie pierwszy z symboli, np. b + e = b. Warto też zauważyć, że dla każdego elementu istnieje element odwrotny, których suma da element neutralny. Na przykład dla b takim elementem jest c, gdyż zgodnie z tabelka˛ działania b + c = e. Zbiór S z tak zdefiniowanym działaniem dodawania tworzy struktur˛e algebraiczna˛ (S, +) zwana˛ grupa. ˛ Ze wzgl˛edu na to, że działanie to jest przemienne, to struktur˛e taka˛ nazywamy grupa˛ przemienna˛ lub grupa˛ abelowa.˛ 3 Dla takiej grupy możemy zdefiniować operacj˛e odejmowania jako operacji dodawania elementu przeciwnego. Oznaczajac ˛ element przeciwny do b jako (−b) operacj˛e taka˛ możemy zapisać b − b = b + (−b) = b + c = e. 4.3 Dodatkowe wymagania Program powinien składać si˛e z trzech modułów, tzn. zawierać moduł główny z funkcja˛ main i dwa moduły pomocnicze. W pierwszym z nich powinny znajdować si˛e definicje funkcji realizujacej ˛ operacje dodawania, odejmowania, wczytywania symbolu z klawiatury oraz wypisywania symbolu na ekran. W drugim z modułów powinna znajdować si˛e definicja funkcji testujacej ˛ i definicje ewentualnych funkcji pomocniczych. W module tym powinna znajdować si˛e również definicja zbioru testowego. Same symbole należy zdefiniować jako odpowiedni typ wyliczeniowy. Pliki musza˛ być odpowiednio uporzadkowane, ˛ tzn. pliki nagłówkowe w podkatalogu inc, pliki źródłowe w podkatalogu src, tak jak to miało miejsce w przypadku zala˛żka do zadania nr 1. Ponadto musi być utworzony odpowiedni plik Makefile pozwalajacy ˛ na kompilacj˛e i konsolidacj˛e programu, jak też usuni˛ecie produktów kompilacji. W trakcie kompilacji finalej wersji programu nie moga˛ generować si˛e żadne ostrzeżenia. Kompilacj˛e należy wykonywać z opcjami -Wall oraz -pedantic. 4.4 Rozszerzenia nieobowiazkowe ˛ 1. Operacja powinny być wybierane losowo i generowane na bieżaco. ˛ Zakładamy ustalony zestaw pytań, np. 10. Wartość ta musi być zdefiniowana jako stała lub jako symbol dla preprocesora. 2. Program powinien uwzgl˛edniać również zapis operacji typu: -b + -c, a - -b itp. gdzie -b i -c to elementy odwrotne odpowiednio do b i c. 4.5 Pomoc Wst˛epne pliki do konstrukcji programu można znaleźć w podkatalogu zalazek. Ma on nast˛epujac ˛ a˛ struktur˛e: zalazek/ | +- inc/ | | | +- dzialania.hh | +- src/ | +- dzialania.cpp | +- test_dzialan.cpp Dostarczone pliki zawieraja˛ definicj˛e typu wyliczeniowego Symbol oraz zapowiedzi funkcji Dodaj i Odejmij (plik dzialania.hh). W pliku dzialania.cpp znajduja˛ si˛e zdefiniowana 4 tabelka operacji dodawania. Natomiast w pliku test_dzialan.cpp znajduje si˛e zdefiniowany zestaw testowy do odpytywania użytkownika. 5