Sprawdzian z arytmetyki liczb zespolonych 1
Cel zadania
Zadanie demonstruje zalety realizacji przeciążeń operacji arytmetycznych oraz przeciążeń operacji na strumieniach, zarówno wyjściowych jak też wyjściowych. Demonstruje ono jak bardzo można istotnie zmienić wewnętrzne mechanizmy działania programu bez potrzeby istotnych zmian w głównej części programu.
2
Opis zadania
Niniejsze zadanie jest kontynuacją wcześniejszego zadania. W ramach jego realizacji należy napisać program, który umożliwia wykonanie w identyczny sposób jak to miało miejsce w przypadku wcześniejszego zadania, sprawdzian z arytmetyki liczb zespolonych. Tak jak to miało miejsce wcześniej, operacje, które należy oprogramować, to dodawanie, odejmowanie, mnożenie oraz dzielenie.
Analogicznie jak we wcześniejszym zadaniu, zakładamy, że zestaw pytań dostępny jest w tablicy napisów. Tym razem zestaw ten ma formę: char*
TabDzialan[] = { "(1.2+2i)+(0+2i)", "(2-0i)*(-1+2.3i)",
"(0-4i)/(3-1i)", NULL };
W zapisie tym dla ułatwienia zachowanych jest kilka reguł:
• Każda liczba zespolona zawsze zapisywana jest w nawiasach półokrągłych.
• Zawsze występuje liczba oznaczająca część rzeczywistą, niezależnie od tego czy jest ona różna od zera, czy też równa jest zeru.
• Zawsze występuje liczba oznaczająca część urojoną, niezależnie od tego czy jest ona różna od zera, czy też równa jest zeru.
Zakładamy że użytkownik, jako odpowiedzi, wprowadza liczby zespolone zgodnie zgodnie z drugą i trzecią regułą (bez nawiasów).
3
Przykład działania programu
bk@noxon: rozwiazanie> ./arytmetyka
? 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: -2+4.6i
! Odpowiedz poprawna
? Podaj wynik operacji: (0-4i) / (3-1i)
=
Twoja odpowiedz: 0.4-1.2i
1
Koniec testu.
Ilosc dobrych
odpowiedzi: 2
Ilosc blednych odpowiedzi: 1
Wynik procentowy poprawnych odpowiedzi: 66.7%
bk@noxon: rozwiazanie>_
4
Struktura programu
Klasę liczb zespolonych należy wprowadzić jako oddzielny moduł. Zmiany wewnątrz w pro-gramie powinny być możliwie minimalne. Zasadnicza część interpretera działań, jak też po-zostałych klas, nie powinna ulec zmianie poza zmianą typu pól oraz zmiennych, w których wcześniej były przechowywane symbole.
Program powinien mieć strukturę modułową. W katalogu:
~bk/edu/po/zad/z3/prog_i_modul
udostępniony został zestaw plików wraz całą strukturą katalogów oraz plik Makefile. Można przekopiować całą strukturę i odpowiednio dostosować do własnego programu.
UWAGA: Pliki źródłowe powinny być w katalogu src, zaś pliki nagłówkow w katalogu inc, tak jak jest to w dostarczonym przykładzie. Pliki obiektowe tworzone podczas kompilacji powinny być zapisywane w katalogu obj.
Nadwyraz złym rozwiązaniem jest umieszczanie wszystkich wyżej wymienionych plików w jednym katalogu.
5
Wariant ciekawszy
Dla chętnych proponuje się rozszerzenie programu o możliwość wyboru zestawu zadawanych plików. W najproszym rozwiązaniu może być kilka tablic. Wskaźnik wyselekcjonowanej tablicy po dokonaniu wyboru powinien zostać zapisany w obiekcie modelującym zestaw pytań.
Wariant trudniejszy powinien umożliwiać czytanie z plików (poprzez strumienie plikowe, konstrukcje z języka C nie są poprawnym rozwiązaniem zadania). Przykład menu wyboru: Wybierz zestaw pytań:
1 - latwe
2 - trudniejsze
3 - jeszcze troche trudniejsze
Twoj wybor>_
Kolejnym rozszerzenieniem jest możliwość czytania liczb zespolonych w sktóconej notacji, która pomija liczbę zero oraz jedynkę. Tak więc taki program powinien umieć odczytać nastę-
pujące wyrażenia:
char*
TabDzialan[] = { "(1.2+2i)+(2i)", "(2)*(-1+2.3i)",
"(-4i)/(3-i)", NULL };
2