Sprawdzian z arytmetyki symboli
1
Cel zadania
Zadanie jest wst˛epem do praktycznego prze´cwiczenia dostosowania formatu i formy wy´swie-
tlania informacji dla własnych typów danych. Ma ono pokaza´c potencjalne mo˙zliwo´sci adapto-
wania operacji na standardowym strumieniu wej´sciowym i wyj´sciowym do własnych potrzeb.
Ma ono równie˙z umo˙zliwi´c zapoznanie si˛e z podstawami konstrukcji klas.
2
Opis zadania
Niniejsze zadanie stanowi kontynuacj˛e zadania wcze´sniejszego. Bazuj ˛
ac na zaimplemento-
wanej strukturze algebraicznej (S, +, ∗) nale˙zy napisa´c program, który b˛edzie testował u˙zyt-
kownika z zakresu arytmetyki symboli. Zbiór operacji nale˙zy rozszerzy´c jeszcze o operacje
odejmowania i dzielenia. Nale˙zy je rozumie´c jako operacje odpowiednio, dodawania elementu
odwrotnego wzgl˛edem operacji “+” oraz mno˙zenie przez element odwrotny wzgl˛edem operacji
“*”.
Program ma zadawa´c pytania o wynik operacji dwuargumentowych. Zapis działa´n, które
maj ˛
a by´c pytaniem dla u˙zytkownika b˛ed ˛
a pobierane z tablicy napisów. Rozmiar tablicy nie
b˛edzie jawnie okre´slony. Znacznikiem ko´nca tablicy b˛edzie wska´znik NULL. Przykladowy
sposób zdefiniowania tej tablicy pokazany jest poni˙zej.
char*
TabDzialan[] = { "a+b", "c*e", "b-d", "c/a", NULL };
U˙zytkownik pownien wprowadza´c odpowiednie symbole, które maj ˛
a by´c wynikiem danej ope-
racji.
Po przeczytaniu ka˙zdej specyfikacji pytania (tzn. pierwszego argumentu, operatora i dru-
giego argumentu operacji) program wy´swietli j ˛
a u˙zytkownikowi, prosi o odpowied´z, przeczyta
j ˛
a i sprawdzi, a po wyczerpaniu wszystkich pyta´n z tablicy wy´swietli statystyk˛e poprawnych
odpowiedzi i zako´nczy prac˛e.
3
Przykład działania programu
bk@noxon: rozwiazanie> ./arytmetyka
? Podaj wynik operacji:
a + b =
Twoja odpowiedz: d
! Blad. Prawidlowym wynikiem jest: c
? Podaj wynik operacji:
c * e =
Twoja odpowiedz: e
! Odpowiedz poprawna
Koniec testu.
Ilosc dobrych
odpowiedzi: 1
Ilosc blednych odpowiedzi: 1
1
Wynik procentowy poprawnych odpowiedzi:
50%
bk@noxon: rozwiazanie>_
4
Struktura danych
W programie powinny zosta´c zdefiniowane klasy: ZbiorPytan, InterpreterOperacji, Statystyka.
ZbiorPytan – modeluje zestaw pytan z kontrolowanym dost˛epem. Obiekt tej klasy powinien
umo˙zliwia´c odczytanie kolejnego pytania.
InterpreterOperacji – modeluje struktur˛e danych z któr ˛
a powi ˛
azana jest operacja interpretacji
działania i przekazania wyniku.
Statystyka – modeluje struktur˛e, która gromadzi informacj˛e o ilo´sci odpowiedzi bł˛ednych i
poprawnych. Pozwala wyliczy´c statystyk˛e procentowej ilo´sci poprawnych odpowiedzi.
5
Podpowiedzi i pomoc
5.1
Jak zaimplementowa´c działania "−" i "/"
5.1.1
Wariant mniej ciekawy dla mniej ambitnych
Mo˙zna to przeprowadzi´c analogicznie, tak jak dla operacji dodawania i mno˙zenia korzystaj ˛
ac z
zamieszczonych tabelek działa´n "−" i "/".
Działanie "−" (y − x)
Działanie "
/" (y / x)
e
a
b
c
d
e
e
d
c
b
a
a
a
e
d
c
b
b
b
a
e
d
c
c
c
b
a
e
d
d
d
c
b
a
e
e
a
b
c
d
e
e
e
e
e
a
a
c
b
d
b
b
a
d
c
c
c
d
a
b
d
d
b
c
a
gdzie pusta pole oznacza brak okre´slenia wyniku operacji. Jak wida´c operacja dzielenia przez e
nie jest okre´slona. Odpowiada jej dzielenie przez 0, tzn. element neutralny operacji dodawania.
Nale˙zy zauwa˙zy´c, ˙ze oba działania nie s ˛
a przemienne. Widoczne to jest z postaci tabelek,
które nie s ˛
a symetryczne wzdłu˙z przek ˛
atnej.
5.1.2
Wariant ciekawszy dla bardziej ambitnych
Operacj˛e odejmowania mo˙zna zdefiniowa´c jako operacj˛e dodawania pierwszego argumentu i
warto´sci odwrotnej do drugiego argumenty. Warto´sci odwrotne mo˙zna wyznaczy´c na podstawie
wcze´sniej podanej tabelki dodawania. Analogicznie mo˙zna post ˛
api´c z implementacj ˛
a operacji
dzielenia.
2
5.2
Dodatkowa pomoc
Dodatkowe pomocnicze elementy ułatwiaj ˛
ace rozpocz˛ecie realizacj˛e zadania znale´z´c mo˙zna na
serwerze
diablo
lub
panamint
w katalogu
˜bk/edu/po/zad/z2
. W katalogu tym znajduj ˛
a
si˛e nast˛epuj ˛
ace podkatalogi i pliki:
˜bk/edu/po/zad/z2/.
src1/zalazek1.cpp
src2/zalazek2.cpp
src1/zalazek1.cpp
W pliku tym znajduje si˛e przykładowe przeci ˛
a˙zenie operatora "
>>" dla
strumienia wej´sciowego (
istream
). Mo˙zna go skompilowa´c i przetestowa´c jego działanie. Pro-
ponuje si˛e rozpocz˛ecie pracy od tego pliku i uzupełnienie go o definicj˛e przeci ˛
a˙zenia operatora
"
<<" dla strumienia wyj´sciowego (
ostream
).
Oryginalna wersja pliku
zalazek1.cpp
tworzy program, który prosi u˙zytkownika o wpro-
wadzeniu symbolu (jednej z literek z zakresu od a do e). Nast˛epnie wczytany symbol jest
wy´swietlany w postaci liczby.
Przeci ˛
a˙zenie operatora "
<<" dla
ostream
pozwoli otrzyma´c program, który wy´swietli
symbol, a nie warto´s´c liczbow ˛
a. B˛edzie to mo˙zna uzyska´c bez ingerencji w ciało funkcji
main
.
src1/zalazek2.cpp
Plik ten jest dalszym rozszerzeniem poprzedniego pliku. Znajduje si˛e w
nim definicja klasy
ZbiorPytan
,
InterpreterDzialan
oraz najwa˙zniejsze metody. Ponadto
przedstawiona jest definicja jednej z metod oraz przeci ˛
a˙zenia operatora "−" w wersji propono-
wanej dla bardziej ambitnych. W przypadku pozostałych metod s ˛
a jedynie zapowiedzi definicji.
Udost˛epniony kod zawiera tak˙ze przykład realizacji opisów.
3