Matematika v programech - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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.

float x = -10, hx = 0;
float A[2], B[2];

// inic. hodnoty počítadla
pocitadlo = 0;
//natáhnout vzorec do paměti
EditExp1->Text = Edit12->Text;

// přírustek na ose X, 1 krok pro výpočet 
hx = (x2-x1)/Form2->Edit11->Text.ToInt(); 

x=x1;
A[0] = x;
// dosadit do proměnné hodnotu
 EditExp1->VarGrid = StringGrid1; // použití EditExp
 EditExp1->UseVar  = true;
 // abychom mohli využít proměnou x, musí být UseVar = true
 StringGrid1->Cells[1][1] = "X";
 // proměná bude mít identifikáátor X
 StringGrid1->Cells[2][1] = (AnsiString) x; 
// její hodnota bude x

A[1] = EditExp1->Value;
do {
	B[0] = x+hx;

  AnsiString Cislo = (AnsiString) (x+hx);
  int pocet = 0;
  if ((pocet = Cislo.LastDelimiter(",")) != NULL)
    // nutné nahradit , za .
    Cislo[pocet] = '.';


  StringGrid1->Cells[2][1] = Cislo;
  // v každém kroku smyčky změnit hodnotu x
  B[1] = EditExp1->Value;
  Label3->Caption = EditExp1->GetError();
  // zistit, jestli nedošlo k nule


  Image1->Canvas->MoveTo(x_absolut(A[0]), y_absolut(A[1]));   
   // nakreslí čáru z bodu A do bodu B
  Image1->Canvas->LineTo(x_absolut(B[0]), y_absolut(B[1]));
    A[0]=B[0], A[1]=B[1];
    x+=hx;
    pocitadlo = 0; // duležite
} while (x < x2);

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.

Tématické zařazení:

 » Rubriky  » Komponenty  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: