.NET > Obecné

Parsovani matematickych vyrazu

(1/1)

erdt.martin:
Ahoj,

parsuji matematicke vyrazy pres knihovnu flee.dll, zde je odkaz: http://flee.codeplex.com/releases/view/8625 bohužel tato knihovna vykresluje v grafu spatne vyrazy typu: -x^2+4, vykresli se spatne, ale kdyz ji napisu takto: -(x^2)+4, vykresli se dobre. Nemate nekdo nejaky jiny matematicky parser s ukazkou pouziti???

erdt.martin:
Toto je metoda pro výpočet určitého integrálu středovou metodou:


--- Kód: C++ ---using System;using System.Collections.Generic;using System.Linq;using System.Text;using Ciloci.Flee;using ZedGraph;using System.Drawing;using NCalc; namespace Určitý_Integrál{    class Middle    {        public double hodnotaFunkceMiddle(string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)        {            // vytvoreni a zkopilovani vyrazu            ExpressionContext context = new ExpressionContext();            context.Imports.AddType(typeof(Math));            context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi            IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);                        /*            Expression context = new Expression(textFunkce);            context.Parameters["x"] = (double)0;            */             double celkovyObsah = 0; // vsech obdelniku            double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku             for (int i = 0; i < pocetObdelnikuZ; i++)            {                // pro kazdy obdelnik                context.Variables["x"] = stredObdelniku; // dosazeni hodnoty                double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika                double obsahObdelniku = hodnotaFunkceVeStreduObdelniku * sirkaObdelnikuZ; // obsah obdelnicku                celkovyObsah += obsahObdelniku;                 stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku            }            return celkovyObsah;        }         public void CreateGraphMiddle(ZedGraphControl zgc, string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)        {            zgc.GraphPane.CurveList.Clear();             // vytvoreni a zkopirovani vyrazu            ExpressionContext context = new ExpressionContext();            context.Imports.AddType(typeof(Math));            context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi            IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);              GraphPane myPane = zgc.GraphPane;             myPane.Title.Text = "Graf funkce: " + textFunkce;            myPane.XAxis.Title.Text = "x";            myPane.YAxis.Title.Text = "y";             PointPairList list1 = new PointPairList(); // puvodni funkce            PointPairList list2 = new PointPairList(); // aproximace (obdelniky)             double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku            for (int i = 0; i < pocetObdelnikuZ; i++)            {                // pro kazdy obdelnik                context.Variables["x"] = stredObdelniku; // dosazeni hodnoty                double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika                list1.Add(stredObdelniku, hodnotaFunkceVeStreduObdelniku);                list2.Add(stredObdelniku - sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);                list2.Add(stredObdelniku + sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);                  stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku            }            LineItem myCurve = myPane.AddCurve("Funkce", list1, Color.Red, SymbolType.Circle);            LineItem myCurve2 = myPane.AddCurve("Aproximace", list2, Color.Blue, SymbolType.None);            myCurve2.Line.Fill = new Fill(Color.White, Color.Red, 45F);             zgc.AxisChange();            zgc.RestoreScale(myPane);         }    }}  
tak nejak, aby se ten jiny parser dal pouzit zde...

vandrovnik:
Možná http://cc.embarcadero.com/item/15974
Sice ho používám, ale pro celkem primitivní záležitosti.

vandrovnik:
Jinak v tom Parser10 - v unitě P10Build jsem měnil jednu drobnost kvůli 64bitové aplikaci.
Původně:

--- Kód: ---function HackSetLength(var S: String; NewLen: Integer): integer;
type
  PInteger = ^Integer;
begin
  Result := Length(S);
  PInteger(Longint(S)-4)^ := NewLen;
end;

--- Konec kódu ---
Nově:

--- Kód: ---function HackSetLength(var S: String; NewLen: Integer): integer;
begin
  Result := Length(S);
  SetLength(s, NewLen);
end;

--- Konec kódu ---

Navigace

[0] Seznam témat

Přejít na plnou verzi