Sprawdzian z arytmetyki symboli 1
Cel zadania
Zadanie jest wstępem do praktycznego przećwiczenia dostosowania formatu i formy wyświe-tlania informacji dla własnych typów danych. Ma ono pokazać potencjalne możliwości adapto-wania operacji na standardowym strumieniu wejściowym i wyjściowym do własnych potrzeb.
Ma ono również umożliwić zapoznanie się z podstawami konstrukcji klas.
2
Opis zadania
Niniejsze zadanie stanowi kontynuację zadania wcześniejszego. Bazując na zaimplemento-wanej strukturze algebraicznej ( S, +, ∗) należy napisać program, który będzie testował użytkownika z zakresu arytmetyki symboli. Zbiór operacji należy rozszerzyć jeszcze o operacje odejmowania i dzielenia. Należy je rozumieć jako operacje odpowiednio, dodawania elementu odwrotnego względem operacji “+” oraz mnożenie przez element odwrotny względem operacji
“*”.
Program ma zadawać pytania o wynik operacji dwuargumentowych. Zapis działań, które mają być pytaniem dla użytkownika będą pobierane z tablicy napisów. Rozmiar tablicy nie będzie jawnie określony. Znacznikiem końca tablicy będzie wskaźnik NULL. Przykladowy sposób zdefiniowania tej tablicy pokazany jest poniżej.
char*
TabDzialan[] = { "a+b", "c*e", "b-d", "c/a", NULL }; Użytkownik pownien wprowadzać odpowiednie symbole, które mają być wynikiem danej operacji.
Po przeczytaniu każdej specyfikacji pytania (tzn. pierwszego argumentu, operatora i drugiego argumentu operacji) program wyświetli ją użytkownikowi, prosi o odpowiedź, przeczyta ją i sprawdzi, a po wyczerpaniu wszystkich pytań z tablicy wyświetli statystykę poprawnych odpowiedzi i zakończy pracę.
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ć zdefiniowane klasy: ZbiorPytan, InterpreterOperacji, Statystyka.
ZbiorPytan – modeluje zestaw pytan z kontrolowanym dostępem. Obiekt tej klasy powinien umożliwiać odczytanie kolejnego pytania.
InterpreterOperacji – modeluje strukturę danych z którą powiązana jest operacja interpretacji działania i przekazania wyniku.
Statystyka – modeluje strukturę, która gromadzi informację o ilości odpowiedzi błędnych i poprawnych. Pozwala wyliczyć statystykę procentowej ilości poprawnych odpowiedzi.
5
Podpowiedzi i pomoc
5.1
Jak zaimplementować działania " −" i " /"
5.1.1
Wariant mniej ciekawy dla mniej ambitnych
Można to przeprowadzić analogicznie, tak jak dla operacji dodawania i mnożenia korzystając z zamieszczonych tabelek działań "−" i "/".
Działanie "−" (y − x)
Działanie "/" (y / x)
e
a
b
c
d
e
a
b
c
d
e
e
d
c
b
a
e
e
e
e
e
a
a
e
d
c
b
a
a
c
b
d
b
b
a
e
d
c
b
b
a
d
c
c
c
b
a
e
d
c
c
d
a
b
d
d
c
b
a
e
d
d
b
c
a
gdzie pusta pole oznacza brak określenia wyniku operacji. Jak widać operacja dzielenia przez e nie jest określona. Odpowiada jej dzielenie przez 0, tzn. element neutralny operacji dodawania.
Należy zauważyć, że oba działania nie są przemienne. Widoczne to jest z postaci tabelek, które nie są symetryczne wzdłuż przekątnej.
5.1.2
Wariant ciekawszy dla bardziej ambitnych
Operację odejmowania można zdefiniować jako operację dodawania pierwszego argumentu i wartości odwrotnej do drugiego argumenty. Wartości odwrotne można wyznaczyć na podstawie wcześniej podanej tabelki dodawania. Analogicznie można postąpić z implementacją operacji dzielenia.
2
Dodatkowa pomoc
Dodatkowe pomocnicze elementy ułatwiające rozpoczęcie realizację zadania znaleźć można na serwerze diablo lub panamint w katalogu ˜bk/edu/po/zad/z2. W katalogu tym znajdują się następujące podkatalogi i pliki:
˜bk/edu/po/zad/z2/.
src1/zalazek1.cpp
src2/zalazek2.cpp
src1/zalazek1.cpp
W pliku tym znajduje się przykładowe przeciążenie operatora ">>" dla strumienia wejściowego (istream). Można go skompilować i przetestować jego działanie. Pro-ponuje się rozpoczęcie pracy od tego pliku i uzupełnienie go o definicję przeciążenia operatora
"<<" dla strumienia wyjściowego (ostream).
Oryginalna wersja pliku zalazek1.cpp tworzy program, który prosi użytkownika o wpro-wadzeniu symbolu (jednej z literek z zakresu od a do e). Następnie wczytany symbol jest wyświetlany w postaci liczby.
Przeciążenie operatora "<<" dla ostream pozwoli otrzymać program, który wyświetli symbol, a nie wartość liczbową. Będzie to można uzyskać bez ingerencji w ciało funkcji main.
src1/zalazek2.cpp
Plik ten jest dalszym rozszerzeniem poprzedniego pliku. Znajduje się w nim definicja klasy ZbiorPytan, InterpreterDzialan oraz najważniejsze metody. Ponadto przedstawiona jest definicja jednej z metod oraz przeciążenia operatora "−" w wersji propono-wanej dla bardziej ambitnych. W przypadku pozostałych metod są jedynie zapowiedzi definicji.
Udostępniony kod zawiera także przykład realizacji opisów.
3