Laboratorium nr 4: Arytmetyka liczb zespolonych 1 Cel ćwiczenia Wykształcenie umiejętności definiowania przeciążeń operatorów arytmetycznych dwuargumentowych i jednoargumentowych dla własnych struktur danych. Nabycie umiejętności definiowania metod. Przećwiczenie podstawowych operacji na strumieniach plikowych. 2 Program zajęć Ocena realizacji zadania z poprzedniego laboratorium ocenie podlega poprawność programu, kompilacja (kompilacja musi przebiegać bez ostrzeżeń), styl pisania programu oraz opisy. Modyfikacja programu wg wskazań osoby prowadzacej ocenie będzie podlegała poprawność realizacji modyfikacji. Pracę nad modyfikacją programu (wszystkie operacje należy wykonywać na kopii) należy rozpocząć już w trakcie pierwszej fazy laboratorium, gdyż prowadzący nie będzie w stanie ocenić wcześniejszego programu wszystkim osobom jednocześnie. Realizacja wstępnej fazy prac nad nowym zadaniem pracę nad programem należy rozpocząć już w trakcie pierwszej fazy laboratorium, o ile uda się zakończyć wcześniej pracę nad modyfikacją pierwszego programu, a prowadzący nie zdąży ocenić wcześniejszego programu wszystkim osobom. Za punkt wyjścia do pracy nad nowym zadaniem należy przyjąć program z poprzedniego zadania. Zakładanym końcowym efektem tej fazy jest dodanie menu i przerobienie funkcji, które zadają pytania w ten sposób, aby użytkownik był pytany o wynik działania. W tej fazie należy ograniczyć się do działań na symbolach. Ocena realizacji wstępnej wersji programu 3 Opis zadania programowego W tym zadaniu ponownie trzeba będzie rozszerzyć i zmodyfikować wcześniejszy program. Tym razem program ma testować użytkownika z realizacji działań na liczbach zespolonych. Ma on udostępniać dwa typy testu. Pierwszy ma mieć dotychczasową formę, zaś drugi ma zadawać pytanie o wynik konkretnego działania. Zarówno w pierwszym, jak też w drugim przypadku, dane do testu mają być czytane z plików tekstowych znajdujących się w katalogu bieżącym. Dane do pierwszego testu należy umieścić w pliku test_liczby_zespolone.dat, zaś do drugie w pliku test_wyrazenia_zespolone.dat. Tak jak wcześniej, program musi zawierać kontrolę poprawności czytanych danych (zarówno z klawiatury, jak też z pliku) oraz także kontrolę poprawności otwarcia pliku. W przypadku napotkania błędnego zapisu wyrażenia w pliku (może to się odnosić do błędu liczby, formy nawiasu lub operatora) program powinien poinformować o wykrytym błędzie, pominąć tę linię i przejść do czytania następnego wyrażenia lub liczby. Ponadto program musi udostępniać proste menu, które pozwoli na wybór jednego z testów. Dla uproszczenia zakładamy, że liczby zespolone będziemy wprowadzać w nawiasach. 1
3.1 Działanie programu Układ pytań i odpowiedzi w niniejszym przykładzie należy traktować jako obowiązujący. Szczegółowe elementy, takie jak minki, są jedynie propozycją. jkowalsk@noxon: rozwiazanie>./test_arytmetyka Twoj wybor (m - menu)> x Bledna opcja menu. Twoj wybor (m - menu)> m Twoj wybor (m - menu)> w :? Podaj wynik operacji: (1.2+2i) + (0+2i) = Twoja odpowiedz: (1.2+3i) :( Blad. Prawidlowym wynikiem jest: 1.2+4i :? Podaj wynik operacji: (2-0i) * (-1+2.3i) = Twoja odpowiedz: (-z+4.6i) Blad wprowadzenia wartosci. Sprobuj jeszcze raz. Twoja odpowiedz: (-2+4.6i) :? Podaj wynik operacji: (1-4i) / (0-2i) = Twoja odpowiedz: (2+0.5i) :? Podaj wynik operacji: (1+2i) - (1-2i) Twoja odpowiedz: (0+4i) 2
:? Podaj wynik operacji: (0+0i) * (1241-2890i) Twoja odpowiedz: (0+0i) Koniec testu. Ilosc dobrych odpowiedzi: 3 Ilosc blednych odpowiedzi: 1 Wynik procentowy poprawnych odpowiedzi: 75.0% Twoj wybor (m - menu)> w Twoj wybor (m - menu)> l :? Podaj operację dodawania, ktorej wynikiem jest: (1+2i) Twoja odpowiedz: (1+0i)+(1+2i) :( Blad. Wynikiem tej operacji jest: (2+2i) :? Podaj operację odejmowania, ktorej wynikiem jest: (345-7i) Twoja odpowiedz: [1+0i)*(345-7i) Wprowadzony zostal blednie pierwszy argument. Sprobuj jeszcze raz. Twoja odpowiedz: (1+0i)=(345-7i) Wprowadzony zotal bledny operator =. Sprobuj jeszcze raz. Twoja odpowiedz: (1+0i)*(345-7i) Ilosc dobrych odpowiedzi: 1 Ilosc blednych odpowiedzi: 1 Wynik procentowy poprawnych odpowiedzi: 50.0% Twoj wybor (m - menu)> k Koniec dzialania programu. jkowalsk@noxon: rozwiazanie>_ 3
3.2 Format plików testowych 3.2.1 Plik test_liczby_zespolone.dat Plik zawiera zestaw liczb zespolonych. Jego zawartość przedstawiona jest poniżej. Błędy w zapisie niektórych liczb są celowe. (1.2+2i) (0+2j) (3+4) (5-7i) (2+ai) (4*3i) Plik ten znajduje się na panamincie/diablo w katalogu bk/edu/kpo/zad/z4. 3.2.2 Plik test_wyrazenia_zespolone.dat Poniżej przedstawiona jest zawartość pliku. W pliku specjalnie wprowadzone są błędne wyrażenia. (1.2+2i) + (0+2i) (2-0i) * (-1+1.3i) (2-0i) & (-1+1.3i) (1-4i) / (0-2i) (C-0i) + (-1+1.3i) (1+2i) - (1-2i) [1-0i] * [-1+1.3i] (0+0i) * (1241-2890i) Plik ten znajduje się na panamincie/diablo w katalogu bk/edu/kpo/zad/z4. 3.3 Definicje działań arytmetycznych Implementując działanie dzielenia liczb zespolonych należy wziąć pod uwagę, że można je zapisać następująco z 1 = z 1z 2 = z 1z 2 z 2 z 2 z 2 z 2 2 gdzie z 2 to liczba zespolona sprzężona do z 2, zaś z 2 jest modułem tej liczby. Należy zwrócić uwagę, że w ostatnim przypadku mamy dzielenie liczby zespolonej przez liczbę rzeczywistą. 3.4 Wymagania co do konstrukcji programu Oprócz wymagań sformułowanych w opisie zadania należy uwzględnić uwarunkowania przedstawione poniżej. Program musi zachować strukturę modułową i odpowiednią strukturę kartotek. O ile będzie to konieczne, należy zmodyfikować plik Makefile (np. gdy dodany zostanie nowy moduł). 4
Program powinien mieć osobny moduł, który zawiera definicje wszystkich niezbędnych metod klasy LZespolona oraz przeciążeń działań: dodawania, odejmowania, mnożenia i dzielenia. Musi on również zawierać przeciążenia operacji na strumieniach dla tej klasy. Należy również zdefiniować dzielenie przez liczbę i porównanie z liczbą. Nagłówek do tego modułu powinien zawierać definicję tej klasy i zapowiedź definicji odpowiednich przeciążeń. Dla uproszenia zakładamy, że liczbę zespoloną zapisujemy bez żadnych spacji. Operacje wyświetlania, jak też wczytywania liczb zespolonych (zarówno ze strumienia standardowego jak też plikowego) muszą być realizowane wyłacznie z wykorzystanie przeciążeń operatorów «i». Program nie może operować na standardowych struminiach, jak też strumieniach plikowych za pomocą funkcji języka C, takich jak scanf, fscanf, printf, fprintf itd. Należy też w sposób przemyślany wydzielić te funkcje, które biorą udział w interakcji z użytkownikiem i generują odpowiednie komunikaty dla niego, oraz te, które tego nie robią. W szczególności w bezpośredniej interakcji nie powinny brać udział przeciążenia operatorów. Wyjątkiem są tu komunikaty o wystąpieniu błędu fatalnego. W takim przypadku komunikat musi być kierowany na wyjście standard error (dostęp do niego jest poprzez obiekt cerr), a nie standard output (dostęp do niego jest poprzez obiekt cout). Wszystkie funkcje należy opisać. Należy także zwrócić uwagę, że szczególnie w przypadku operacji dzielenia niezbędne są odpowiednie warunki wstępne (jakie?). W trakcie kompilacji finalej wersji programu nie moga generować się żadne ostrzeżenia. Kompilację należy wykonywać z opcjami -Wall oraz -pedantic. Niniejsza uwaga dotyczy tego i wszystkich następnych programów realizowanych w ramach niniejszego kursu, o ile w opisie zadania nie będzie innych zaleceń. 3.5 Wersja uproszczona oceniana nie więcej niż na 3,5 Program nie zawiera menu, a jedynie przeróbkę wcześniejszej wersji programu na wariant liczb zespolonych. 3.6 Rozszerzenia nieobowiazkowe Rozszerzenieniem zadania jest możliwość czytania liczb zespolonych w skróconej notacji, która pomija liczbę zero oraz jedynkę. Tak więc taki program powinien umieć odczytać następujące wyrażenia: (1.2+2i)+(2i) (2)*(-1+2.3i) (-4i)/(3-i) 5