Prosty interpreter działa´n arytmetycznych 1 Cel zadania

Transkrypt

Prosty interpreter działa´n arytmetycznych 1 Cel zadania
Prosty interpreter działań arytmetycznych
1 Cel zadania
Zadanie jest wst˛epem do praktycznego przećwiczenia dostosowania formatu i formy wyświetlania informacji dla własnych typów danych. Ma ono pokazać potencjalne możliwości adaptowania do własnych potrzeb operacji na standardowym strumieniu wejściowym i wyjściowym.
2 Opis zadania
Niniejsze zadanie składa si˛e z dwóch podzadań. Pierwsze z nich należy w całości zrealizować
na zaj˛eciach. Dotyczy ona praktycznego przećwiczenia realizacji operacji na standardowych
strumieniach wejścia i wyjścia. Ponadto należy napisać plik Makefile. Kompilacj˛e i konsolidacj˛e programu, a także jego uruchomienie, należy realizować za pomoca˛ polecenia make.
Drugie z podzadań, o ile to tylko jest możliwe, także dobrze jest zakończyć na zaj˛eciach.
Nie jest to jednak warunek konieczny. Jest ono rozszerzeniem wcześniejszego zadania i dotyczy
operacji wykonywanych na symbolach. W tym zadaniu konieczne jest przecia˛żenie operatorów
arytmetycznych oraz operatorów działajacych
˛
na strumieniach standardowych. Konieczne jest
również opisanie wszystkich zaimplementowanych funkcji i przecia˛żeń. Zalecenia co do samej
postaci opisów, ich treści i formy można znaleźć w pliku:
∼ bk/edu/kpo/zalecenia.txt
Plik dost˛epny jest zarówno na panamincie jak też na diablo.
2.1 Podzadanie nr 1 – prosty kalkulator arytmetyczny
Należy napisać program, który umożliwi realizacj˛e prostych działań arytmetycznych (dodawanie, odejmowanie, mnożenie i dzielenie) na liczbach całkowitych. Ma on wczytać liczb˛e
(pierwszy argument), znak operatora oraz kolejna˛ liczb˛e jako drugi argument. Nast˛epnie znak
operatora ma zostać odpowiednio zinterpretowany i po wykonaniu działania powinno ono zostać wyświetlone wraz z wynikiem.
Jeśli zostanie wykryty bład
˛ w zapisie wprowadzonej liczby lub znaku operatora, to należy
wyświetlić komunikat z informacja˛ o bł˛edzie. Jako bład
˛ program powinien również interpretować prób˛e dzielenia przez 0. Po wyświetleniu komunikatu o bł˛edzie trzeba przystapić
˛ do
wczytania kolejnej operacji. Wyjatkiem
˛
jest sytuacja, gdy użytkownik wprowadzi znak pojedynczej kropki. Ma ona sygnalizować koniec działania programu.
2.1.1
Przykład interakcji
Poniżej przedstawiony jest przykładowy przebieg interakcji programu z użytkownikiem. Przykład ten wyznacza obowiazuj
˛ ace
˛ form˛e realizacji takiej interakcji.
SunOS 10> ./arytm_kalk
Wyrazenia arytmetyczne nalezy wprowadzac w formie:
liczba_calkowita operator liczba_calkowita
Zbior operatorow to: + - / *
Zakonczenie dzialania programu poprzez wprowdzenie znaku kropki.
Podaj wyrazenie> 2 + 3
Wynik: 2+3=5
1
Podaj wyrazenie> x05 + 3
*** Blad zapisu liczby. Wyrazenie nie moze byc poprawnie zinterpretowane.
Podaj wyrazenie> 2 % 3
*** Bladny operator. Jako operator wprowadzono znak ’%’.
*** Dopuszczalne znaki operatorow to: ’+’ ’-’ ’/’ ’*’
Podaj wyrazenie> 2 / 0
*** Niedozwolona operacja. Proba dzielenia przez 0.
Podaj wyrazenie> .
Koniec dzialania programu.
SunOS 11>_
2.1.2
Dodatkowa pomoc
W kartotece ∼ bk/edu/kpo/zad/z2/przyklad1 znajduje si˛e plik wczytywanie_liczb.cpp,
który pokazuje przykładowa˛ obsług˛e bł˛edu operacji czytania. Plik ten można wykorzystać jako
zala˛żek własnego programu. Pragnac
˛ uwzgl˛ednić przypadek wczytawania dwóch liczb, przy
przekształcaniu programu nie można ograniczyć si˛e do zwykłego powielania kodu, Konieczne
jest przeprowadzenie dekompozycji problemu postawionego w zadaniu i wydzielenie mniejszych podporoblemów, których rozwiazanie
˛
można zamknać
˛ w pojedynczych funkcjach.
2.1.3
Dodatkowy podproblem
Należy skompilować i skonsolidować program, którego źródło zawarte jest w pliku
wczytywanie_liczb.cpp. Nast˛epnie należy go uruchomić i przetestować. W dalszej kolejności po uruchomieniu programu należy wprowadzić liczb˛e 12.3.
Zaobserwowane działanie programu należy wytłumaczyć i tak skorygować program, aby wprowadzenie liczby 12.3, jak też innych liczb ułamkowych w formacie dziesi˛etnym, nie powodowało przerwania działania programu.
2.2 Podzadanie nr 2 – prosty kalkulator operacji na symbolach
Bazujac
˛ na wcześniejszym programie należy go tak przekształcić, aby zamiast operacji na liczbach, realizować operacje na symbolach. Do implementacji przecia˛żeń operatorów dodawania i
odejmowania należy wykorzystać kod z zadania nr 1. Oprócz tego na podstawie tabelek operacji ’+’ i ’*’ należy zaimplementować operacje do nich odwrotne, tzn. operacje odejmowania
’-’ i dzielenia ’/’.
3 Przykład działania programu
SunOS 10> ./arytm_kalk
Wyrazenia arytmetyczne nalezy wprowadzac w formie:
symbol operator symbol
Symbolami sa litery: a, b, c, d, e.
Zbior operatorow to: + - / *
Zakonczenie dzialania programu poprzez wprowdzenie znaku kropki.
2
Podaj wyrazenie> a + b
Wynik: a+b=c
Podaj wyrazenie> x + 3
*** Bledny symbol. Wprowadzono: ’x’
*** Dopuszczalne znaki symbolu to: ’a’, ’b’, ’c’, ’d’, ’e’.
Podaj wyrazenie> b % a
*** Bladny operator. Jako operator wprowadzono znak ’%’.
*** Dopuszczalne znaki operatorow to: ’+’ ’-’ ’/’ ’*’
Podaj wyrazenie> c / e
*** Niedozwolona operacja. Proba dzielenia przez przez
*** element neutralny operacji dodawania.
Podaj wyrazenie> .
Koniec dzialania programu.
SunOS 11>_
4 Podpowiedzi i pomoc
4.1 Jak zaimplementować działania "−" i "/"
4.1.1
Wariant mniej ciekawy dla mniej ambitnych
Można to przeprowadzić analogicznie, tak jak dla operacji dodawania i mnożenia korzystajac
˛
z zamieszczonych tabelek działań "−" i "/". Tym razem operacje sa˛ nieprzemienne. Należy
pami˛etać, że pierwszy argument znajduje si˛e w lewej skrajnej kolumnie, zaś drugi w górnym
wierszu.
Działanie "−" (y − x)
Działanie "/" (y / x)
e a b c d
e a b c d
e e b a d c
e
e e e e
a a e d c b
a
c d a b
d c b a
b b c e a d
b
c c d b e a
c
b a c d
d d a c b e
d
a b d c
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 sa˛ przemienne. Widoczne to jest z postaci tabelek,
które nie sa˛ symetryczne wzdłuż przekatnej.
˛
4.1.2
Wariant ciekawszy dla bardziej ambitnych
Operacj˛e odejmowania można zdefiniować jako operacj˛e 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 postapić
˛ z implementacja˛ operacji
dzielenia.
3
4.2 Dodatkowa pomoc
Dodatkowy pomocniczy plik ułatwiajace
˛ realizacj˛e zadania znaleźć można na serwerze diablo
lub panamint w katalogu ˜bk/edu/po/zad/z2/przyklad2. W katalogu znajduje si˛e plik
wczytaj_symbol.cpp. Zawiera on przecia˛żenie operatora ">>" dla strumienia wejściowego
(istream). Pozwala ono wczytywać bezpośrednio symbole: a, b, c, d, e. Można go skompilować i przetestować jego działanie. Proponuje si˛e rozpocz˛ecie uzupełnienie tego pliku o definicj˛e
przecia˛żenia operatora "<<" dla strumienia wyjściowego (ostream).
Oryginalna wersja pliku tworzy program, który prosi użytkownika o wprowadzeniu symbolu (jednej z literek z zakresu od a do e). Nast˛epnie wczytany symbol jest wyświetlany w
postaci liczby. Przecia˛żenie operatora "<<" dla ostream pozwoli otrzymać program, który
wyświetli symbol, a nie wartość liczbowa.˛ B˛edzie to można uzyskać bez ingerencji w ciało
funkcji main.
Po przetestowaniu dodanego przecia˛żenia można te definicje przenieść do programu stworzonego w ramach podzadania nr 1.
4