PDA

View Full Version : حرفه ای: دانلود برنامه ای برای رسم معادلات چند جمله ای در بازه های دلخواه



ehsan_faal
دوشنبه 31 فروردین 1394, 12:24 عصر
سلام به همه دوستان.
با راهنمایی های اساتید:قلب: بزرگوار این سایت بالاخره تونستم اولین برنامم رو بنویسم.امیدوارم که خوشتون بیاد.

130463


130464

لینک دانلود :
http://s6.picofile.com/file/8183668950/PolynomialProject.exe.html

hadisalahi2
دوشنبه 31 فروردین 1394, 12:57 عصر
پس کو کدش؟
کلا چه استفاده ای داره؟

ehsan_faal
دوشنبه 31 فروردین 1394, 14:52 عصر
حالا مگه قراره استفاده ای داشته باشه:گریه:
از ایدش که بشه با استفاده از عبارات با قاعده ضرایب و توان ها رو از هر شکل چند جمله ای در ورودی جدا کنه خوشم اومد و تصمیم گرفتم این رو درست کنم.
کد رو هم حتما میذارم:گیج:

hadisalahi2
دوشنبه 31 فروردین 1394, 16:59 عصر
حالا مگه قراره استفاده ای داشته باشه
چیزی که توی این دنیا ساخته بشه و ازش استفاده نشه ، چه فایده ای داره
فقط انجامش وقت تلف کنی عزیزم

کدش رو بزار
در مورد روش برنامه نویسی بحث کنیم

این که شما یک کاری کردی و یک فایل exe گذاشتی و میگی فقط واسه اینکه خودم اومد ، نه سودی برای خودت داره نه بقیه که از این برنامه استفاده کنند

مثلا همین رسم نمودارش برای من جالبه
چون تا حالا این مدل نمودار رسم نکردم
جالبه بدونم چه روشی استفاده کردی تا منم یاد بگیرم و تو هم در این وسط ثوابش رو ببری :لبخند:

مطمئنم بقیه دوستان هم با نظر من موافق باشن

یا حق

ehsan_faal
دوشنبه 31 فروردین 1394, 17:50 عصر
حق با شماست:گیج:

این هم کدها:

unit RegEx;

interface


uses
System.SysUtils, System.RegularExpressions,
System.Generics.Collections;


type
Equation = class
private
EquationParts: TArray<string>;
NumbersSequence: string;
Powers, Coefficients: TList<Double>;
procedure ArrangeNumbers;
function CoefficientsToString: string;
function PowersToString: string;
function Sign(Current: Double): string;
procedure GetNumberSequence;
procedure SplitPowersAndCoefficients;
published
property ShowCoefficients: string read CoefficientsToString;
property ShowPowers: string read PowersToString;
public
constructor Create(EquationString: string);
function PrintEquation: string;
function GetCoefficients: TList<Double>;
function GetPowers: TList<Double>;


end;


implementation


{ Equation }


procedure Equation.ArrangeNumbers;
var
PairOfEachTerm: TDictionary<Double, Double>;
Counter: Integer;
PowerHolder: Double;
begin
PairOfEachTerm := TDictionary<Double, Double>.Create;
for Counter := 0 to Coefficients.Count - 1 do
begin
if not(PairOfEachTerm.ContainsKey(Powers[Counter])) then
begin
PairOfEachTerm.Add(Powers[Counter], Coefficients[Counter]);
end
else
begin
PowerHolder := PairOfEachTerm.ExtractPair(Powers[Counter]).Value;
PairOfEachTerm.Add(Powers[Counter],
(PowerHolder + Coefficients[Counter]));
end;
end;
Coefficients.Clear;
Powers.Clear;
Coefficients := TList<Double>.Create(PairOfEachTerm.Values);
Powers := TList<Double>.Create(PairOfEachTerm.Keys);
end;


function Equation.CoefficientsToString: string;
var
Counter: Integer;
begin
Result := '[' + FloatToStr(Coefficients.First);
for Counter := 1 to Coefficients.Count - 1 do
begin
Result := Result + ' , ' + FloatToStr(Coefficients[Counter]);
end;
Result := Result + ']';
end;


constructor Equation.Create(EquationString: string);
begin
inherited Create;
Self.EquationParts := EquationString.Replace('*', '').Replace('-', ' -')
.Replace('+', ' ').Trim.Split([' ']);
GetNumberSequence;
SplitPowersAndCoefficients;
end;


function Equation.GetCoefficients: TList<Double>;
begin
Result := Coefficients;
end;


procedure Equation.GetNumberSequence;
var
Counter: Integer;
StrWorker, StrHolder: string;
Patterns: TArray<string>;
begin
StrHolder := '';
SetLength(Patterns, 5);
Patterns[0] := '[+-]?[\d]+[\.]?[\d]*[a-zA-Z][\^][\d]+[\.]?[\d]*';
// -3.14x^2 & +3.14x^2
Patterns[1] := '[+-]?[\d]+[\.]?[\d]*[a-zA-Z](?!\^)';
// +3.14x & -3.14x
Patterns[2] := '[+-]?[a-zA-Z](?!\^)(?!\d)$';
// '[+-]?(?<!\d)[a-zA-Z](?!\^)(?!\d) ';
// -x & +x
Patterns[3] := '^[+-]?[\d]+[\.]?[\d]*$';
// +3.14 & -3.14
Patterns[4] := '[+-]?(?<!\d)[a-zA-Z][\^][\d]+[\.]?[\d]*';
// +x^2 & -x^2
for Counter := 0 to Length(EquationParts) - 1 do
begin
StrWorker := '';
if TRegEx.IsMatch(EquationParts[Counter], Patterns[0]) then
begin
StrWorker := StrWorker + TRegEx.Replace(EquationParts[Counter],
'[a-zA-Z][\^]', ' ');
end
else if TRegEx.IsMatch(EquationParts[Counter], Patterns[1]) then
begin
StrWorker := StrWorker + TRegEx.Replace(EquationParts[Counter],
'[a-zA-Z]', ' 1');
end
else if TRegEx.IsMatch(EquationParts[Counter], Patterns[2]) then
begin
StrWorker := StrWorker + TRegEx.Replace(EquationParts[Counter],
'[a-zA-Z]', '1 1');
end
else if TRegEx.IsMatch(EquationParts[Counter], Patterns[3]) then
begin
StrWorker := EquationParts[Counter] + ' 0';
end
else if TRegEx.IsMatch(EquationParts[Counter], Patterns[4]) then
begin
StrWorker := StrWorker + TRegEx.Replace(EquationParts[Counter],
'[a-zA-Z][\^]', '1 ');
end;
StrHolder := StrHolder + ' ' + StrWorker;
end;
Self.NumbersSequence := StrHolder;
end;


function Equation.GetPowers: TList<Double>;
begin
Result := Powers;
end;


function Equation.PowersToString: string;
var
Counter: Integer;
begin
Result := '[' + FloatToStr(Powers.First);
for Counter := 1 to Powers.Count - 1 do
begin
Result := Result + ' , ' + FloatToStr(Powers[Counter]);
end;
Result := Result + ']';
end;


function Equation.PrintEquation: string;
var
Counter: Integer;
begin
Result := '';
for Counter := 0 to Coefficients.Count - 1 do
begin
if Powers[Counter] = 0 then
begin
Result := Result + Sign(Coefficients[Counter]) +
FloatToStr(Coefficients[Counter]);
end
else if Powers[Counter] = 1 then
begin
Result := Result + Sign(Coefficients[Counter]) +
FloatToStr(Coefficients[Counter]) + '(x)'
end
else if Coefficients[Counter] = 1 then
begin
Result := Result + Sign(Coefficients[Counter]) + '(x)^' +
FloatToStr(Powers[Counter]);
end
else
begin
Result := Result + Sign(Coefficients[Counter]) +
FloatToStr(Coefficients[Counter]) + '(x)^' +
FloatToStr(Powers[Counter]);
end;
end;
Result := Result.Replace('-', ' - ').Replace('+', ' + ').TrimLeft;
end;


function Equation.Sign(Current: Double): string;
begin
Result := '';
if (Current >= 0) then
Result := '+'
else
Result := '';
end;


procedure Equation.SplitPowersAndCoefficients;
var
Counter: Integer;
TemporaryEquationParts: TArray<string>;
begin
Coefficients := TList<Double>.Create;
Powers := TList<Double>.Create;
TemporaryEquationParts := Trim(NumbersSequence).Split([' ']);
for Counter := 0 to Length(TemporaryEquationParts) - 1 do
begin
if (Counter mod 2) = 0 then
Coefficients.Add(StrToFloat(TemporaryEquationParts[Counter]))
else
Powers.Add(StrToFloat(TemporaryEquationParts[Counter]));
end;
ArrangeNumbers;
end;


end.






unit MainUnit;

interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, RegEx, Vcl.Menus,
Vcl.Clipbrd, Vcl.ExtCtrls, Unit2;


type
TForm1 = class(TForm)
edtinput: TEdit;
edtcoeff: TEdit;
edtpowers: TEdit;
edtmodified: TEdit;
btnstart: TButton;
btnplotwindow: TButton;
pm1: TPopupMenu;
Example1: TMenuItem;
img1: TImage;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
lbl4: TLabel;
Copy1: TMenuItem;
Paste1: TMenuItem;
procedure Example1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure edtinputKeyPress(Sender: TObject; var Key: Char);
procedure btnstartClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnplotwindowClick(Sender: TObject);
procedure img1Click(Sender: TObject);
procedure img1MouseEnter(Sender: TObject);
procedure img1MouseLeave(Sender: TObject);
procedure Copy1Click(Sender: TObject);
procedure Paste1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;
InputEquation: Equation;
Flag: Boolean = False;
ChartTitle: string;


implementation


{$R *.dfm}


procedure TForm1.btnplotwindowClick(Sender: TObject);
var
PlotForm: TForm2;
begin
if Flag then
begin
PlotForm := TForm2.Create(nil);
PlotForm.cht1.Title.Text.Text := 'Polynomial Equation: ' + ChartTitle;
PlotForm.powers := InputEquation.GetPowers;
PlotForm.Coefficients := InputEquation.GetCoefficients;
PlotForm.ShowModal;
end;
edtinput.SetFocus;
edtinput.SelStart:=Length(edtinput.Text);
end;


procedure TForm1.btnstartClick(Sender: TObject);
begin
if edtinput.Text <> '' then
begin
InputEquation := Equation.Create(edtinput.Text);
// 2*x-54+3x^2-3.14x^5-6.89x
edtcoeff.Text := InputEquation.ShowCoefficients;
edtpowers.Text := InputEquation.ShowPowers;
ChartTitle := InputEquation.PrintEquation;
edtmodified.Text := ChartTitle;
Flag := True;
end;
edtinput.SetFocus;
edtinput.SelStart := Length(edtinput.Text);
end;


procedure TForm1.Copy1Click(Sender: TObject);
begin
edtinput.CopyToClipboard;
end;


procedure TForm1.edtinputKeyPress(Sender: TObject; var Key: Char);
begin
if ((Key = chr(VK_SPACE)) and (edtinput.Text <> '')) then
begin
edtinput.Text := '';
edtcoeff.Text := '';
edtpowers.Text := '';
edtmodified.Text := '';
FreeAndNil(InputEquation);
end
else if ((Key = chr(VK_RETURN)) and (edtinput.Text <> '')) then
begin
btnstart.Click;
edtinput.SelStart := edtinput.GetTextLen;
end;
end;


procedure TForm1.Example1Click(Sender: TObject);
begin
edtinput.Text := '';
edtcoeff.Text := '';
edtpowers.Text := '';
edtmodified.Text := '';
edtinput.Text := '1024*x^11-2816*x^9+2816*x^7-1232*x^5+220*x^3-11x';
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(InputEquation);
end;


procedure TForm1.FormCreate(Sender: TObject);
var
KeyState: TKeyboardState;
begin
Clipboard.AsText := '';
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
GetKeyboardState(KeyState);
if (KeyState[VK_NUMLOCK] = 0) then
begin
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY or 1, 0);
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP or 1, 0);
end;
end;


procedure TForm1.img1Click(Sender: TObject);
begin
edtinput.Text := '';
edtcoeff.Text := '';
edtpowers.Text := '';
edtmodified.Text := '';
Flag := False;
end;


procedure TForm1.img1MouseEnter(Sender: TObject);
begin
img1.Left := img1.Left + 5;
img1.Top := img1.Top + 5;
end;


procedure TForm1.img1MouseLeave(Sender: TObject);
begin
img1.Left := img1.Left - 5;
img1.Top := img1.Top - 5;
end;


procedure TForm1.Paste1Click(Sender: TObject);
begin
edtinput.PasteFromClipboard;
end;


end.






unit Unit2;

interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VclTee.TeeGDIPlus, VclTee.TeEngine,
VclTee.Series, Vcl.ExtCtrls, VclTee.TeeProcs, VclTee.Chart,
System.Generics.Collections,
Vcl.StdCtrls, System.Math, Vcl.ExtDlgs, Vcl.ComCtrls, Vcl.Imaging.jpeg;


type
TForm2 = class(TForm)
cht1: TChart;
btnexit: TButton;
btnsave: TButton;
btnprint: TButton;
btnplot: TButton;
edtMin: TEdit;
edtMax: TEdit;
edtSample: TEdit;
lbl1: TLabel;
lbl2: TLabel;
dlgPnt1: TPrintDialog;
dlg1: TSavePictureDialog;
LocationPos: TStatusBar;
lbl3: TLabel;
lbl4: TLabel;
lbl5: TLabel;
lbl6: TLabel;
Series1: TLineSeries;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure btnexitClick(Sender: TObject);
procedure btnplotClick(Sender: TObject);
procedure btnprintClick(Sender: TObject);
procedure btnsaveClick(Sender: TObject);
procedure Series1Click(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure cht1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
Powers: TList<Double>;
Coefficients: TList<Double>;
end;


var
Form2: TForm2;
Flag: Boolean = False;


implementation


{$R *.dfm}


procedure TForm2.btnexitClick(Sender: TObject);
begin
Close;
end;


procedure TForm2.btnplotClick(Sender: TObject);
var
XValue, YValue, Xmin, Xmax, Step: Double;
Sample, Counter, TermCounter: Integer;
begin
Flag := True;
Series1.Clear;
Sample := StrToInt(edtSample.Text);
// Xmin := StrToFloat(min.Text);
// Xmax := StrToFloat(max.Text);
Xmin := Double.Parse(edtMin.Text);
Xmax := Double.Parse(edtMax.Text);
Step := abs(Xmax - Xmin) / Sample;
lbl2.Caption := FormatFloat('#.#####', Step) + ' ';
// FloatToStr(Step) + ' ';
// cht1.Axes.Bottom.Minimum := Xmin;
// cht1.Axes.Bottom.Maximum := Xmax;
cht1.Axes.Bottom.SetMinMax(0, 0);
cht1.Axes.Bottom.SetMinMax(Xmin, Xmax);
cht1.Axes.Bottom.Increment := Sample * Step / 20;
for Counter := 0 to Sample do
begin
XValue := Xmin + Counter * Step;
YValue := 0;
for TermCounter := 0 to Powers.Count - 1 do
begin
YValue := YValue + Coefficients[TermCounter] *
Power(XValue, Powers[TermCounter]);
end;
Series1.AddXY(XValue, YValue);
end;
cht1.SetFocus;
end;


procedure TForm2.btnprintClick(Sender: TObject);
begin
begin
if Flag then
begin
if dlgPnt1.Execute then
begin
cht1.print;
end;
end;
end;
end;


procedure TForm2.btnsaveClick(Sender: TObject);
begin
if Flag then
begin
if dlg1.Execute then
begin
cht1.SaveToBitmapFile(dlg1.FileName);
end;
end;
end;


procedure TForm2.cht1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
XVal: Double;
YVal: Double;
PanelWidth: Integer;
begin
cht1.Series[0].GetCursorValues(XVal, YVal);
XVal := cht1.Axes.Bottom.CalcPosPoint(X);
YVal := cht1.Axes.Left.CalcPosPoint(Y);
PanelWidth := Floor((ClientWidth - LocationPos.Panels.Items[0].Width) / 2);
LocationPos.Panels.Items[1].Width := PanelWidth;
LocationPos.Panels.Items[2].Width := PanelWidth;
if Flag then
begin
LocationPos.Panels.Items[1].Text := 'X Value: ' +
FormatFloat('#.#####', XVal);
LocationPos.Panels.Items[2].Text := 'Y Value: ' +
FormatFloat('#.#####', YVal);
end;
end;


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Flag := False;
end;


procedure TForm2.FormCreate(Sender: TObject);
begin
Series1.Clear;
cht1.Title.Font.Size := 14;
cht1.Title.Font.Color := clRed;
lbl2.Caption := '0.008';
end;


procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
LocationPos.Panels.Items[1].Text := 'Cursor Out Of The Chart!';
LocationPos.Panels.Items[2].Text := 'Cursor Out Of The Chart!';
end;


procedure TForm2.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
XVal: Double;
YVal: Double;
begin
cht1.Series[0].GetCursorValues(XVal, YVal);
Hint := '(X,Y) : (' + cht1.Series[0].GetHorizAxis.LabelValue(XVal) + ',' +
cht1.Series[0].GetVertAxis.LabelValue(YVal) + ')';
Application.HintHidePause := 6000;
end;


end.

hadisalahi2
سه شنبه 01 اردیبهشت 1394, 13:27 عصر
اگه پروژه رو اینجا آپلود میکردی فکر کنم هم واسه تو راحت تر بود و هم واسه بقیه :چشمک:

اون نمودار رو خودت دستی رو Canvas رسم میکنی یا با کامپوننته؟

ehsan_faal
سه شنبه 01 اردیبهشت 1394, 15:20 عصر
دیگه شرمنده دیگه، استفاده از چند تا یونیت و یه سری کار اضافی نباید کار سختی باشه.
نمودار رو هم با تی چارت ریم کردم که تو خود دلفی به صورت پیش فرض هست.

یوسف زالی
سه شنبه 01 اردیبهشت 1394, 15:26 عصر
یک سوال:
به غیر از توابع چند جمله ای دیگه چیا می تونه انجام بده؟
و این که مثلا این رو می فهمه:
X^3 + X^3 --(-8+++-(3))--7 +X^2

ehsan_faal
سه شنبه 01 اردیبهشت 1394, 16:02 عصر
سلام.نه این چیزا رو هنوز روش کار نکردم.کارهایی که فعلا باهاش میشه انجام داد علاوه بر رسمش اینه که اتوماتیک جملات دارای توان یکسان رو بسته به علامت ضریبشون با هم جمع یا تفریق میکنه و از توان و ضرایب اعشاری هم پشتیبانی میکنه.

ehsan_faal
پنج شنبه 03 اردیبهشت 1394, 14:08 عصر
من قبلا یه مدل از این برنامه رو به زبان جاوا دیده بودم که یه ویژگیه خیلی عالی داشت و اون این بود که یه دایره کوچیک(یا حالا هر شکل دیگه ای) روی خود نمودار میومد و وقتی روش کلیک میشد وسعی میکردیم حرکتش بدیم فقط و فقط روی خود نمودار حرکت میکرد و توی استاتوس بار هم موقعیت اون دایره رو نشون میداد.میشه یه راهنمایی کنید که برای اضافه کردن همچین قابلیتی به برنامم باید چیکار کنم؟

با تشکر

یوسف زالی
سه شنبه 08 اردیبهشت 1394, 12:03 عصر
یک کنترل (مثلا shape) بسازید، x موس رو به تابع بدید تا y رو بده، این مختصات رو برای کنترلتون ست کنید. همین!

ehsan_faal
سه شنبه 08 اردیبهشت 1394, 19:19 عصر
به جای چیزی که شما گفتی اینو نوشتم(پیدا کردم) ولی نمیدونم چرا نتیجه زیاد جالب نیست.اولا که حتما باید روی خود نمودار کلیک کنم تا مارکر جابجا بشه و ثانیا اینکه انگار اصلا جابجا نمیشه(یه حالتی مثله اینکه مارکر غیب میشه و توی جای جدید ظاهر میشه).
میشه حرکتش رو رووون تر کرد طوری که با حرکت موس روی صفحه مارکر اتوماتیک جابجا بشه و نیاز به کلیک روی نمودار نباشه؟
در ضمن نمیدونم چرا مختصات مارکر با مختصاتی که از نمودار میگیره یکی نمیشه؟


procedure TForm2.cht1AfterDraw(Sender: TObject);var
xPos, yPos: Integer;
yMax, yMin: Integer;
XVal,YVal:Double;
begin
cht1.Canvas.Pen.Color := clRed;
cht1.Canvas.Pen.Style := psSolid;
cht1.Canvas.Pen.Width := 1;
cht1.Canvas.Pen.Mode := pmCopy;


cht1.Series[0].GetCursorValues(XVal,YVal);


xPos := cht1.BottomAxis.CalcPosValue(XVal);
yPos := cht1.LeftAxis.CalcPosValue(YVal);


cht1.Canvas.Donut(xPos, yPos, 6, 6, 0, 360, 0);


cht1.Canvas.Pen.Color := clGreen;
cht1.Canvas.Pen.Style := psDash;


yMax := cht1.LeftAxis.CalcPosValue(cht1.LeftAxis.Maximum);
yMin := cht1.LeftAxis.CalcPosValue(cht1.LeftAxis.Minimum);
cht1.Canvas.DoVertLine(xPos, yMax, yMin);
end;


به خصوص وقتی زوم میکنم عدم تطابقشون بیشتر خودشو نشون میده:

130730

golbafan
یک شنبه 20 اردیبهشت 1394, 16:08 عصر
این دایره ای که شما میخواهید در خود tchart هست (نسخه فول البته)

برای پردازش جملات هم بهتر بود از مفسرها استفاده میکردید