Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Komponenty
Matematika v programech
16. srpna 2001, 00.00 | Dnes si popíšeme komponentu EditExp, která vyhodnocuje matematické výrazy a vyzkouzkoušíme si program na vykreslování grafů funkcí.
Vraťme se na chvíli do školních lavic, a zavzpomínejme si na předmět, který nás nejvíce trápil a možná také i nejvíce bavil.
Velmi zajímavým programátorským oříškem je řešení algebraických výrazů , kdy program vypočítá ze zadané rovnice funkční hodnoty tohoto výrazu. Dostala se mi do ruky komponenta, která tuhle problematiku šikovně řeší. Jde o komponentu odvozenou z komponenty Edit, která vypočítavá funkční hodnoty matematického výrazů. A tak se podívejme, co umí, a jak se s ní pracuje.
TEditExp
Komponenta o které mluvím se jmenuje TEditExp. Naleznete ji na serveru sodev v sekci matematika. (Download z Builderu zde) Zde naleznete spoustu free komponent. Dnes se tedy podívejme na tuto komponentu.
Jak jsem již říkal, jde o Edit, o editační políčko, do kterého vložíme matematický vzorec. Ten posléze komponenta vyhodnotí a můžeme pracovat s výsledkem ve tvaru řetězce nebo čísla double.
Podívejme se nyní na to, jak se s komponentou pracuje. Instalace komponenty je velmi jednoduchá. Rozbalíme si archivační soubor do libovolného adresáře. Zvolíme menu Component/Install Component a vybereme soubor editexp.pas. Jde o komponentu pro Delphi, leč jde ji nainstalovat i do C++ Builderu 4.0 a nahrajeme editexp.hpp do adresáře INCLUDES.
S komponentou je dodáván přehledný help, ve kterém není problém se vyznat. Vyzkoušet si můžete také malý přiklad (exptest.dpr).
Matematický vzorec, který chceme nechat řešit uložíme do vlastnosti Text (jak jsme zvyklí od komponenty Edit). Je typu AnsiString. Komponenta automaticky vyhodnotí matematický výraz. Matematický výraz ale musí mít předepsaný formát (syntaxe). Například:
sin(Pi/2)*log(5)^2
2+3*5
Vše potřebné najdeme v nápovědě.
Vyhodnocený výraz, výsledek dostaneme do vlastnosti Value (double) nebo SValue (AnsiString). Takže výsledek výrazu dostaneme
Edit1->Text = EditExp1->SValue; // jde o řetězec AnsiString
Edit1->Text = EditExp1->Value; // jde o číslo double
Výsledek, tedy formát toho co můžeme přečíst, nastavíme ve vlastnosti Mask. Například:
EditExp1.Mask = "0.00";
- zobrazí výsledek na dvě desetinná místa.
Pokud je syntaxe matematického výrazu napsána chybně, zjistíme to ve vlastnosti
GetError
. Vrací řetězec, například "Illegal character",
když použijeme v syntaxi nepovolený znak. Pokud je vše v pořádku GetError
vrátí řetězec "NoError".
Další možností, kterou tato komponenta je použití proměnných (tzv. variables). To znamená, že v matematických zápisech můžeme s výhodou použít nezávisle proměnnou X (nebo jinou).
Nejprve musíme aktivovat použití proměných a vytvořit tabulku proměnných. Tabulku proměnných tvoříme do komponenty StringGrid. Takže použití proměnných inizializujeme takto:
EditExp1->VarGrid = StringGrid1;
EditExp1->UseVar = true;
Například chceme při výpočtech použít proměnou x a do ní uložit hodnotu 1.
StringGrid1->Cells[1][1] = "X";
StringGrid1->Cells[2][1] = "1";
Hodnotu a název proměnné určíme řetězcem.
Teď už známe všechno, co je potřeba na práci s touto komponentou. Podívejme se na následující program.
Program vykresluje grafy matematických funkcí ve tvaru y = f(x). Funkce zadáváme
do editačního políčka a vyhodnocuje ji komponenta EditExp na předem zvoleném
intervalu. Takže aby komponenta EditExp správně počítala, musíme zadat správnou
syntaxi matematického výrazu. Proměnná x se uzavírá do hranatých závorek [x]
a je úplně jedno jestli používáme malá nebo velká písmena.
Program má však malou chybičku, není ošetřen pro body nespojitosti.
Poznámky ke kódu:
Jako tlačítka jsem použil komponentu LbSpeedButton, o které psal nedávno kolega Václav Krejčí a její popis najdete ve výše uvedeném článku. Zde bych jen poznamenal, že ji lze s úspěchem nainstalovat i do C++ Buileru 4.
Asi nejzajímavější funkcí v tomto programu je obsluha stisknutí tlačítka, které má kreslit graf.
|
Při výpočtech použijeme s výhodou tzv. absolutních souřadnic, např. souřadnice
0, 0 je uprostřed obrázku, kde je fyzická souřadnice přibližně (300, 250). Absolutní
souřadnice převedeme na reálné souřadnice. K tomuto účelu nám poslouží naše
funkce x_absolut, y_absolut. Vykreslení grafu na zadaném intervalu rozsekáme
do n fází (segmentů), takže čím více segmentů, tím více je graf přesnější. Implicitně
jsem zadal 500 segmentů. Vykreslujeme vždy po kroku hx, a kreslíme vždy z bodu
A do bodu B, přičemž bod A je vždycky totožný s bodem B z předchozího průchodu
smyčkou .
Na maličký zádrhel jsem narazil při práci s čísli, protože AnsiString píše číslo
s desetinou čárkou, kdežto komponenta EditExp požaduje pro vstup čísla s desetinou
tečku. Ale všechno vyřeší
if ((pocet = Cislo.LastDelimiter(",")) != NULL) Cislo[pocet] = '.'; StringGrid1->Cells[2][1] = Cislo;
Výsledek si můžete stáhnout zde.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007