ZÁPOČTOVÁ PRÁCE z UIR Vědecká kalkulačka
Jméno a příjmení: Osobní číslo: Studijní skupina: Obor: E-mail:
Jan Tichava A04386 pondělí, 4 – 5 INIB – INF
[email protected]
Datum odevzdání: 1.5.2006
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Vědecká kalkulačka Zadání Označení zadání: 2004KT01
Vytvořte program "Vědecká kalkulačka", který bude realizovat běžné výpočty. Program umožní zadávat analytické výrazy, které bude analyzovat, a provádět výpočet. Čili dokáže pracovat např. s následujícím zápisem: sin(90)+200/cos(90)*300 Umožní navíc definovat až 10 proměnných (x1 až x10), které lze pak používat ve výrazech, např. tan(x1*x2).
Analýza úlohy Návrh vzhledu a funkce programu byl částečně inspirován v programu AllerCalc a částečně skutečnou kalkulačkou Texas Instruments TI-89 (odkazy na tyto produkty viz: http://home.zcu.cz/~jtichava/uir). Nalezl jsem několik různých postupů, jak vyhodnotit matematický výraz. Jednou možností je, rozložit si celý výraz do stromu podle závorem a pak strom postupně od listů vyhodnotit. Jinou možností je naprogramovat gramatiku pro rozpoznávání výrazů. Poslední možností, kterou jsem nalezl bylo vyhodnocování s postupných ukládáním výrazu do zásobníku. Uvažoval jsem mezi vyhodnocováním pomocí stromu a pomocí zásobníku. Vyhodnocování stromem není těžké, ale zavrhnul jsem ho, protože mi připadala složitější implementace zpracování funkcí. Proto jsem se rozhodl vyhodnocovat výraz pomocí zásobníku
Popis algoritmu řešení V souboru JAR je přiložena vygenerovaná JavaDoc dokumentace, která obsahuje popis všech public metod a tříd. Všechny metody jsou okomentovány pro JavaDoc, ale pro případné uživatele těchto tříd nejsou podstatné, protože nejsou z jiné metody viditelné.
1
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Prezentační vrstva Vrstva obsahuje metody pro zobrazování grafického prostřední a jeho obsluhu. Sbírá data od uživatele a předává je aplikační vrstvě k vyhodnocení. Po vyhodnocení výrazu zobrazí výsledek, případně chybu, pokud byl výraz nekorektní.
Aplikační vrstva Vrstva přijme od prezentační vrstvy textový řetězec jako vstupní výraz. Nejprve projde celý řetězec a nahradí znak desetinné čárky za desetinnou tečku. Pak nahradí všechny konstanty a proměnné v řetězci jejich skutečnými hodnotami, v případě, že není před konstantou či proměnnou operace, jaká se má provést, bude se předpokládat implicitní násobení. Před vlastním vyhodnocováním budou ještě nahrazeny všechny funkce jejich funkčními hodnotami, argumentem funkce může být libovolný aritmetický výraz – jedno číslo, libovolná aritmetická operace s čísly nebo další funkce se svými argumenty, výrazy uvnitř argumentu funkce je možno libovolně závorkovat. Na tomto místě se již ve výrazu nevyskytují proměnné a konstanty, proto je již neuvažuji. Nyní se ve výrazu vyskytují pouze čísla spojená různými operandy, mohou být ještě uzavřeny v závorkách, a jejich vyhodnocení je již triviální záležitost.
Vyhodnocení výrazu Výraz je definovatelný jako posloupnost: číslo, operand, číslo, operand … operand, číslo, proto se automaticky na konec přidává znak „=“, aby bylo možné vytvořit dvojice [číslo, operand]. Při průchodu řetězcem se přečte číslo a uloží do zásobníku pro čísla (dále ZC), pak se přečte operand a uloží do zásobníku pro operandy (dále ZO). Tuto akci porad opakuje a přitom porovnáváme jestli má operand, který právě přidáváme vyšší nebo nižší prioritu, pokud má nižší, tak provede operaci, která je v zásobníku a opět porovnáme operandy a postupujeme stejně. Pokud je priorita vyšší, pouze vložíme do zásobníku. Pokud se ve výrazu vyskytují závorky, nejprve se vyhodnotí obsah nejvíce vnořené závorky a postupně se hloubka zanoření zmenšuje, až bude výraz vyhodnocen celý. Obdobně se vyhodnocují funkce – vyhodnotí se vnitřek argumentu funkce jako obyčejný výraz a pak se vyhodnotí funkční hodnota.
Popis programu Aplikace je naprogramována v jazyce Java. Pro běh programu je nutné mít nainstalováno JRE verze 1.5, ideálně 1.5.0_06-b05 na které byl program testován. Na jiných verzích Javy nemusí být zaručena bezproblémová funkce programu – starší verze Javy nemají typované kolekce a naopak v novější verzi 1.6 nefunguje automatické posouvání výsledku.
2
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Jako přílohu přikládán UML diagram, nepopisuji v něm Prezentační vrstvu, protože obsahuje vesměs pouze velké množství tříd, které jsou potřebné pro GUI. Popis jednotlivých tříd a metod – viz vygenerovaný JavaDoc v JAR souboru.
Popis obsluhy programu Program je možné spustit na libovolné platformě, například Microsoft Windows, většina distribucí Linuxu a dalších, jedinou podmínkou je nainstalovaná Java, nejlépe ve verzi 1.5 a vhodné grafické prostředí – ze známých uvedu KDE nebo Gnome, která se často používají v Linuxu. Na všech systéme půjde program spustit pomocí příkazu java -jar kalkulacka.jar, který zobrazí navíc konzoli systému. Na většině systémů by mělo být možné spustit program také pomocí příkazu javaw -jar kalkulacka.jar, který již konzoli nezobrazuje. V případě správně nakonfigurovaného systému stačí poklepat na soubor a program se spustí. Hlavní okno programu
Celé okno lze rozdělit na 4 hlavní části: příkazový řádek, výstupní pole. numerická část a ovládací tlačítka.
Adresní řádek
Do adresního řádku může uživatel zadávat libovolné matematické výrazy, které kalkulačka podporuje a libovolně je uzavírat do kulatých závorek. např.: sin(90)+200/cos(90)*300
3
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Výstupní pole
Zobrazí se zde výraz, který uživatel zadal a bezprostředně pod ním hned výsledek, popřípadě „Chyba!“, pokud je výraz nekorektně napsaný nebo výsledek vede k chybě. Numerická část
Umožňuje zadávání jednoduchých matematických výrazů pomocí myši
Ovládací tlačítka
Paměť Stupně/Radiány Vymazat About
Zobrazí dialog pro správu proměnných Přepíná mezi počítáním ve stupních nebo radiánech Vymaže výstupní pole Zobrazí dialog s informacemi o aplikaci
Správa proměnných
4
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Přidání proměnné Po vyplnění názvu proměnné a její hodnoty je nutné stisknout tlačítko a proměnná bude přidána. Pokud proměnná se stejným názvem již existuje, bude její hodnota nahrazena novou. Odebrání proměnné Podobně jako při přidávání, ale pole pro hodnotu se nechá volné a proměnná bude odebrána. About
Podporované příkazy Základní operace +-*/ sqrt() %
sčítání, odčítání, násobení dělení druhá odmocnina zbytek po dělení
Pokročilé operace E ^ abs() sgn() ln() log() ()
exponent = *10^n umocňování na n-tou absolutní hodnota znaménko funkce přirozený logaritmus dekadický logaritmus upravení priorit závorkováním
Goniometrické funkce sin(), cos(), tan() sina(), cosa(), tana() sinh(), cosh()
základní inverzní hyperbolické
Konstanty pi exp
Ludolphovo číslo π (3,141592654) Eulerovo číslo (2,718281828)
Celý dokument a všechny screenshoty jsou umístěny v plné kvalitě zde: http://home.zcu.cz/~jtichava/uir
5
Jan Tichava A04386
Vědecká kalkulačka Semestrální práce KIV/UIR
Rozbor výsledků, zhodnocení Program je plně funkční téměř na každé myslitelné platformě, bez nutnosti jeho nové kompilace nebo jiných změn pro dané prostředí. Uživatel může zadat libovolný aritmetický výraz s využitím výše uvadaných funkcí a program je vyhodnotí. První nevýhodou je nutnost instalovat na počítač Java Runtime Environment, to je daň za výše uvedenou přenositelnost mezi různými platformami. Program má také o trochu vyšší hardwarové nároky na počítač na rozdíl od aplikace, která se překládá přímo do spustitelného kódu, ale to bych dnes již neoznačoval jako nevýhodu, ale spíše jen jako malé mínus. ¨
Závěr Program provádí vše, co bylo požadováno v zadání a navíc umožňuje deklarovat libovolné množství vlastních uživatelských proměnných s názvem, jaký si zvolí uživatel. Další funkce, kterou kalkulačka zvládá je přepínání mezi stupni a radiány. V případném dalším vývoji tohoto programu by bylo možné poměrně jednoduše implementovat další funkce, které by kalkulačka vyhodnocovala nebo vykreslování grafů funkcí.
6