.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