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