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