Java (laboratorium)

zadanie nr 10

W pakiecie roznosci.funkcje zdefiniuj aplet, który będzie rysował wykresy funkcji, podawanych online przez użytkownika. Definicję funkcji należy wprowadzić w polu tekstowym w postaci ONP (odwrotna notacja polska). Po kliknięciu przycisku akcepującego, należy sprawdzić poprawność podanej definicji — jeśli jest ona poprawna, to trzeba wyświetlić tą funkcję w postaci infiksowej i narysować jej wykres, a w przeciwnym przypadku wyświetlić komunikat o błędzie (wskaż miejsce błędu i określ jego rodzaj) i przenieść fokus do pola z definicją funkcji.

W centralnej części apletu powinien się znajdować panel przeznaczony na wykres. Parametry wykresu, takie jak zakres widzialności (przedział od-do argumentów funkcji i jej wartości) czy gęstość siatki, powinno się określać dodatkowymi komponentami interfejsu graficznego (pola tekstowe, suwaki, przełączniki, listy wyboru).

Przy analizie funkcji skorzystaj z kolekcji standardowej java.util.Stack<Token>, gdzie Token reprezentuje leksem w wyrażeniu, oraz skonstruuj drzewo wyprowadzenia, gdzie w węzłach wewnętrznych będą się znajdowały tokeny operatorów lub funkcji wbudowanych, a w liściach tokeny literałów, predefiniowanych stałych lub token zmiennej (nazwa argumentu funkcji). Nazwę argumentu funkcji też należy wcześniej określić (powinna ona być różna od wszystkich nazw funkcji i predefiniowanych stałych). Drzewo wyprowadzenia powinno być tak zdefiniowane, by umożliwiać łatwe obliczanie wartości funkcji w zadanym punkcie.

Funkcje i stałe predefiniowane umieść w zbiorze asocjacyjnym java.util.HashMap<String,Operator>, w którym kluczami są napisy a wartościami obiekty typu Operator umiejące policzyć wartość określonej funkcji w zadanym punkcie. Do wyliczenia tej wartości zdefiniuj metodę ze zmienną liczbą argumentów, gdyż arności poszczególnych funkcji będą się różnić. W zbiorze funkcji i stałych predefiniowanych powinny się znaleźć podstawowe operatory arytmetyczne (wraz z potęgowaniem ** i logarytmowaniem //), liczby e i ϖ, funkcje abs, ceil, floor, ln, exp, min, max, sin, cos, atan, acot oraz 3-argumentowa funkcja if, która w zależności od wartości pierwszego zwraca wartość argumentu drugiego albo trzeciego.

Do zaprogramowania poszczególnych funkcji wykorzystaj klasę usługową java.lang.Math. Przed skorzystaniem z tej klasy zaimportuj ją statycznie.

Gdy będziesz potrzebował określić jakieś stałe parametry obiektów, zadeklaruj i wykorzystaj w tym celu klasę wyliczeniową.

Program należy opatrzeć stosownymi komentarzami dokumentacyjnymi i na końcu wygenerować dokumentację poleceniem javadoc.

Uwaga: Programy będą kompilowane i uruchamiane kompilatorem javy w wersji 1.5.

Uwaga: Pewne informacje dotyczące new features w javie 1.5 można znaleźć na stronie firmy SUN :

   • http://java.sun.com/developer/technicalArticles/releases/j2se15langfeat/
   • http://java.sun.com/j2se/1.5.0/docs/guide/language/index.html

Paweł Rzechonek

Wrocław, 21 grudnia 2004.