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

5.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

Document Outline

  • Cel zadania
  • Opis zadania
  • Przyklad dzialania programu
  • Struktura danych
  • Podpowiedzi i pomoc
    • Jak zaimplementowac dzialania "-" i "/"
      • Wariant mniej ciekawy dla mniej ambitnych
      • Wariant ciekawszy dla bardziej ambitnych
    • Dodatkowa pomoc