PDA

View Full Version : گفتگو: برنامه برای انجام اعمال ریاضی درون یک تکست باکس



arefba
جمعه 24 اردیبهشت 1389, 04:34 صبح
بسمه تعالی


با سلام
بچه ها استاد ما یه پروژه داده که خیلی گیچ کننده هست باور کنید از ساعت دوزاده شب نشستم پاش و الان که 4:51 دقیقه صبجهه هنوز حل نشده و هی کش پیدا میکنه
اصل موضوع اینه که ازمون خواسته برنامه ای بنویسیم که با توجه به اولویت عملگر ها رشته ی درون تکست باکس رو که کاربر وارد میکنه حل کنه

مثلا :
کاربر تو تکست باکس نوشته

5+4(3-12(7/2)/2)/44

حالا نتیجش حاصل شه تو یه تکست دیگه
اولش خندیدم گفتم چه سادست اما حالا فهمیدم که احتمالا راه حلی نداشته باشه
من از این تابع برای بدست آوردن کاراکتر هاش استفاده کردم

private int findchar(string a)
{

int lentxt = a.Length;
for (int i = 0; i < lentxt; ++i)
{
if (a.Substring(i, 1) == "(")
po[i] = i;


if (a.Substring(i, 1) == ")")
pc[i] = i;

if (a.Substring(i, 1) == "+")
cp[i] = i;
if (a.Substring(i, 1) == "-")
cm[i] = i;
if (a.Substring(i, 1) == "/")
ct[i] = i;
if (a.Substring(i, 1) == "*")
cz[i] = i;
}

}
حالا موندم چیکار کنم کسی راه حلی به زهنش رسید بگه اون دنیا جبران میکنم
پیشاپیش مچکرم

arefba
جمعه 24 اردیبهشت 1389, 04:35 صبح
راستی اگه جایی از حرفام خنده دار بود حسابی بخندی من بعد از 12 شب مغزم خاموشه

arefba
جمعه 24 اردیبهشت 1389, 04:35 صبح
ببخشید اینم اولویت عملگر ها
• عبارات داخل پرانتز
• توان رسانی
• ضرب و تقسیم
• تقسیم با خارج قسمت صحیح
• تعیین باقیمانده تقسیم
• جمع و تفریق

ricky22
جمعه 24 اردیبهشت 1389, 10:36 صبح
شما از Postfix و prefix استفاده کن
ساختمان داده پاس کردین؟
http://barnamenevis.biz/forum/showpost.php?p=699289&postcount=226
http://barnamenevis.biz/forum/showpost.php?p=824101&postcount=4
http://barnamenevis.org/forum/showpost.php?p=622480&postcount=164
http://barnamenevis.org/forum/showpost.php?p=624689&postcount=167
بهترین راه اینه

ricky22
جمعه 24 اردیبهشت 1389, 10:38 صبح
این 2 تا کدم به زبان vb.net است
سرچ کنید حل عبارات postfix
http://www.barnamenevis.biz/forum/showthread.php?t=47419

arefba
جمعه 24 اردیبهشت 1389, 17:21 عصر
بچه ها فکر نکنم این روش کار ساز باشه
اگه ما به کامپایلر این رشته رو بدیم a+ b اونوقت چه جوابی با فرمول پست فیکس میده
معلومه دیگه به درد نمیخوره
کسی روش بهتری نداره
که یه رشته رو محاسبه کنیم

arefba
جمعه 24 اردیبهشت 1389, 19:27 عصر
هیچکی در این مورد نمیدونه ؟؟؟؟

wolf_majid
جمعه 24 اردیبهشت 1389, 20:03 عصر
باید از قواعد ساختمان داده استفاده کنی
این کد برنامه ای که توی همین مایه از ما خواسته بودند با C++‎
تبدیلش دست خودت را می بوسه :لبخند:

در ضمن : این سورس برای اعدا یک حرفی عمل می کنه

arefba
جمعه 24 اردیبهشت 1389, 20:29 عصر
این کد رو نگاه کنید سعی کردم که تبدیل کنم عبارت رو به پست فیکس

خوب مشکل اینجاست که تو عبارت زیر قاتی می کنه راه حلی دارید ؟؟

((((a/b)-c)+(d*e))-(a*e))

string[] sbt = new string[20];
int[] pc = new int[10];
int[] ch = new int[10];
string alltxt = elEntryBox1.Text;
int lentxt = alltxt.Length;
int l=0;
int f=0;
int k = 0;
int por=0;

for(int i=0;i<lentxt;++i)
{
string tak=alltxt.Substring(i, 1);
if (tak == "(")
{
lentxt = alltxt.Length;
}

else
{
sbt[l] = tak;
if (sbt[l] == ")")
{
pc[f] = l;
++f;
}
if ((sbt[l] == "+") || (sbt[l] == "-") || (sbt[l] == "*") || (sbt[l] == "/"))
{
ch[k] = l;
++k;
}
++l;
}
}
for (int i = 0; i < 10; ++i)
if (ch[i] == 0)
i = 10;
else
por += 1;

for (int i = 0; i < por; ++i)
{

sbt[pc[i]] = sbt[ch[i]];
sbt[ch[i]] = "";
}
for (int i = 0; i < lentxt; ++i)
elEntryBox2.Text += sbt[i];

cardano7
جمعه 24 اردیبهشت 1389, 22:34 عصر
با سلام
بچه ها استاد ما یه پروژه داده که خیلی گیچ کننده هست باور کنید از ساعت دوزاده شب نشستم پاش و الان که 4:51 دقیقه صبجهه هنوز حل نشده و هی کش پیدا میکنه
اصل موضوع اینه که ازمون خواسته برنامه ای بنویسیم که با توجه به اولویت عملگر ها رشته ی درون تکست باکس رو که کاربر وارد میکنه حل کنه

سلام
من یک جایی یک برنامه دیدم که نوشته بود چطور میشه به صورت RunTime دستوری را که به شکل Text هست را در محیط C#‎ اجرا کرد. فکر می کنم این کار شما را راه بندازه بدون دردسر.
یادم نیست این را از کجا دانلود کردم ولی کدهاش رو دارم:

#region Copyright
/************************************************** **
* Author : Mennan *
* Created : 22.08.2006 *
* Purpose : To generate dynamically executables *
* via CodeDom in C#‎ *
* *
* Copyright: All Rights Reserved *
* ************************************************** */
#endregion Copyright

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;


namespace Compiler
{
public class ExeGenForm : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button BT_Generate;
private System.Windows.Forms.RichTextBox RTB_Code;
private System.Windows.Forms.SaveFileDialog SFD_Save;
private System.ComponentModel.Container components = null;

public ExeGenForm()
{
InitializeComponent();
}

protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typ eof(ExeGenForm));
this.label1 = new System.Windows.Forms.Label();
this.BT_Generate = new System.Windows.Forms.Button();
this.RTB_Code = new System.Windows.Forms.RichTextBox();
this.SFD_Save = new System.Windows.Forms.SaveFileDialog();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(8, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(100, 23);
this.label1.TabIndex = 0;
this.label1.Text = "Code";
//
// BT_Generate
//
this.BT_Generate.Location = new System.Drawing.Point(240, 376);
this.BT_Generate.Name = "BT_Generate";
this.BT_Generate.Size = new System.Drawing.Size(104, 32);
this.BT_Generate.TabIndex = 1;
this.BT_Generate.Text = "Generate EXE";
this.BT_Generate.Click += new System.EventHandler(this.BT_Generate_Click);
//
// RTB_Code
//
this.RTB_Code.Location = new System.Drawing.Point(8, 32);
this.RTB_Code.Name = "RTB_Code";
this.RTB_Code.Size = new System.Drawing.Size(568, 328);
this.RTB_Code.TabIndex = 2;
this.RTB_Code.Text = resources.GetString("RTB_Code.Text");
//
// SFD_Save
//
this.SFD_Save.Filter = "Executables|*.exe";
this.SFD_Save.Title = "Save Executable";
//
// ExeGenForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(600, 422);
this.Controls.Add(this.RTB_Code);
this.Controls.Add(this.BT_Generate);
this.Controls.Add(this.label1);
this.Name = "ExeGenForm";
this.Text = "EXE Generation...";
this.Load += new System.EventHandler(this.ExeGenForm_Load);
this.ResumeLayout(false);

}

[STAThread]
static void Main()
{
Application.Run(new ExeGenForm());
}

private void GenerateExe(string _code)
{
ICodeCompiler Compiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters Parameters = new CompilerParameters();

Parameters.ReferencedAssemblies.Add("System.dll");
Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
Parameters.ReferencedAssemblies.Add("System.Drawing.dll");
Parameters.ReferencedAssemblies.Add("System.Data.dll");
//Do not forget to add referenced assemblies!!!!

Parameters.OutputAssembly = "";

Parameters.GenerateExecutable = true;
Parameters.WarningLevel = 4;

CompilerResults Results = Compiler.CompileAssemblyFromSource(Parameters, _code);
if (Results.Errors.HasErrors)
{
string ErrorMessage = String.Empty;
ErrorMessage = Results.Errors.Count.ToString() + " Errors:";
for (int x = 0; x < Results.Errors.Count; x++)
ErrorMessage = ErrorMessage + "\r\nLine: " + Results.Errors[x].Line.ToString() + " - " +
Results.Errors[x].ErrorText;
MessageBox.Show(ErrorMessage, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (SFD_Save.ShowDialog() == DialogResult.OK)
{
File.Move(Results.PathToAssembly, SFD_Save.FileName);
}
}

private void BT_Generate_Click(object sender, System.EventArgs e)
{
GenerateExe(RTB_Code.Text);
}

private void ExeGenForm_Load(object sender, EventArgs e)
{

}
}
}






ولی اگه اصرار دارید که با روش های معمولی حلش کنید باید بگم که من این سوال را اون قدیما برای یکی از بچه های رشته ی کامپیوتر به زبان ++C نوشتم تا به استادش تحویل بده. برنامه 90 خط بیشتر نبود. مثل اون قدیما حوصله ندارم برنامه ی شما رو تحلیل کنم بگم مشکش کجاست. فقط این را بگم که بهتره که مثل من از یک تابع بازگشتی از نوع اعشار با ورودی string استفاده کنید در غیر این صورت برنامه در تحلیل پرانتزهای تو در تو دچار مشکل میشه. توی هر مرحله از صدا زده شدن تابع برنامه یک Level عبارت را ساده تر می کنه. بنابراین برنامه خیلی هم ساده تر خواهد شد. اول باید پرانتزها رو تشخیص بده بعد عبارت داخل پرانتز را بدون پرانتزهای محیطی برای خودش دوباره ارسال کنه. بعد عملگرها را از هم تفکیک کنه و با توجه به اولویت عملگر عبارت را به یک عملگر و دو عملوند تقسیم کنه(حتی اگه 100 تا عمگر هم وجود داشته باشه). بعد برای محاسبه ی عملوندها دوباره خودش رو صدا بزنه. این قدر این کار را انجام میده تا عبارت باقی مانده یک عدد یا variable بشه.

امیدوارم که گیجتون نکنم. این روند محاسبه ی ((((a/b)-c)+(d*e))-(a*e)) به این روش هست:


((((a/b)-c)+(d*e))-(a*e))
(((a/b)-c)+(d*e))-(a*e)

(((a/b)-c)+(d*e)) - (a*e)
---->> op1 - op2

op1>> (((a/b)-c)+(d*e))
op1>> ((a/b)-c)+(d*e)
op1>> ((a/b)-c) + (d*e)
---->> op3 + op4

op3>> ((a/b)-c)
op3>> (a/b)-c
---->> op5 - op6

op5>> a/b
---->> op7/op8
op7>> solved
op8>> solved
op6>> solved

op4>> (d*e)
op4>> d*e
op4>> op9*op10
op9>> solved
op10>> solved

op2>> (a*e)
op2>> a*e
op2>> op11*op12

op11>> solved
op12>> solved

arefba
جمعه 24 اردیبهشت 1389, 23:12 عصر
واقعاااااااااا ازتون ممنونم حسابی بهم کمک کردین
در مورد برنامه اول که گذاشتین
فکر کنم باید کامپونت داشته باشه
میشه نسخه آپدیت شدش رو بدین لطفا

cardano7
شنبه 25 اردیبهشت 1389, 01:16 صبح
واقعاااااااااا ازتون ممنونم حسابی بهم کمک کردین
در مورد برنامه اول که گذاشتین
فکر کنم باید کامپونت داشته باشه
میشه نسخه آپدیت شدش رو بدین لطفا

خواهش می کنم،
برنامه تو خود همین سایت بود. اما ... (حذف شده) . فقط تونستم فایلی را که دارم Upload کنم:
http://www.4shared.com/file/36-aFxSZ/Compiler.html

ASKaffash
شنبه 25 اردیبهشت 1389, 10:02 صبح
سلام
به کمک SQLSever قبول است ؟


public partial class Form6 : Form
{
public Form6()
{
InitializeComponent();
this.textBox1.Text = "5+4*(3-12*(7/2)/2)/44";
}
private void ButtonCalc_Click(object sender, EventArgs e)
{
var C = new SqlConnection("Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=master;server=");
C.Open();
this.textBox2.Text = new SqlCommand("Select " + this.textBox1.Text, C).ExecuteScalar().ToString();
C.Close();
}
}

arefba
شنبه 25 اردیبهشت 1389, 21:56 عصر
جواب مسئله رو پیدا کردم باید از پشته برای اینکار استفاده کنی
به صورتی که
کاراکتر ها را به جدا در یک آرایه و و اعداد نیز در آرایه دیگر
هر کسی نیاز داشت نظر خصوص بده سورسش رو بدم
با تشکر از تموم کسانی که کمک کردن