PDA

View Full Version : سوال: ماشین حساب مهندسی



nava_2012
یک شنبه 15 تیر 1393, 22:24 عصر
سلام.
يه سوال اين ماشين حساب با اولويت بندي ها (پرانتز گذاري ) مثل ماشين حساب هاي مهندسي کار ميکنه
مثال
8=(2+2)/(5^2)
چطوری پیاده سازی کنم؟

Amiri.projects
یک شنبه 15 تیر 1393, 23:02 عصر
با سلام

تا اوونجایی که من اطلاعات دارم : به دو روش میتونید این ماشین حساب رو پیاده سازی کنید: 1) به کمک پشته (Stack) که حالا با آرایه یا صف یا لیست میتونید اینو پیاده سازی کنید 2) به کمک کدهای خود کامپایلر #C

در هر صورت اگه کمکی از دستم بر بیاد، خوشحال میشم

elec60
یک شنبه 15 تیر 1393, 23:17 عصر
سلام.
يه سوال اين ماشين حساب با اولويت بندي ها (پرانتز گذاري ) مثل ماشين حساب هاي مهندسي کار ميکنه
مثال
8=(2+2)/(5^2)
چطوری پیاده سازی کنم؟


یه سرچ تو ویکی بزن و الگوریتم RPN رو پیاده کن.(Reversed Polish Notation)

nava_2012
یک شنبه 15 تیر 1393, 23:34 عصر
using System;
using System.Collections.Generic;

class Rpn {
public static void Main() {
char [] sp = new char [] {' ','\t'};
for (;;) {
string s = Console.ReadLine();
if (s==null) break;
Stack<string> tks = new Stack<string>
(s.Split(sp,StringSplitOptions.RemoveEmptyEntries) );
if (tks.Count==0) continue;
try {
double r = evalrpn(tks);
if (tks.Count!=0) throw new Exception();
Console.WriteLine(r);
}
catch (Exception e) {Console.WriteLine("error");}
}
}

private static double evalrpn(Stack<string> tks) {
string tk = tks.Pop();
double x,y;
if (!Double.TryParse(tk, out x)) {
y = evalrpn(tks); x = evalrpn(tks);
if (tk=="+") x += y;
else if (tk=="-") x -= y;
else if (tk=="*") x *= y;
else if (tk=="/") x /= y;
else throw new Exception();
}
return x;
}
}
از این کد چطوری استفاده کنم؟

Amiri.projects
دوشنبه 16 تیر 1393, 18:36 عصر
public void Run()
{
Eval("(1+2)");
Eval("5*4/2");
Eval("((3+5)-6)");
}

public static void Eval(string input)
{
var ans = Evaluate(input);
MessageBox.Show(input + " = " + ans);
}

public static double Evaluate(String input)
{
String expr = input.Substring(0, 1) == "(" ? input : "(" + input + ")";
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();

for (int i = 0; i < expr.Length; i++)
{
String s = expr.Substring(i, 1);
if (s.Equals("("))
{
}
else if (s.Equals("+")) ops.Push(s);
else if (s.Equals("-")) ops.Push(s);
else if (s.Equals("*")) ops.Push(s);
else if (s.Equals("/")) ops.Push(s);
else if (s.Equals("sqrt")) ops.Push(s);
else if (s.Equals(")"))
{
int count = ops.Count;
while (count > 0)
{
String op = ops.Pop();
double v = vals.Pop();
if (op.Equals("+")) v = vals.Pop() + v;
else if (op.Equals("-")) v = vals.Pop() - v;
else if (op.Equals("*")) v = vals.Pop()*v;
else if (op.Equals("/")) v = vals.Pop()/v;
else if (op.Equals("sqrt")) v = Math.Sqrt(v);
vals.Push(v);

count--;
}
}
else vals.Push(Double.Parse(s));
}
return vals.Pop();
} فقط داخل متد،Run
عبارت دلخواه خودتو بذار

fariba-2
سه شنبه 04 آذر 1393, 07:12 صبح
public void Run()
{
Eval("(1+2)");
Eval("5*4/2");
Eval("((3+5)-6)");
}

public static void Eval(string input)
{
var ans = Evaluate(input);
MessageBox.Show(input + " = " + ans);
}

public static double Evaluate(String input)
{
String expr = input.Substring(0, 1) == "(" ? input : "(" + input + ")";
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();

for (int i = 0; i < expr.Length; i++)
{
String s = expr.Substring(i, 1);
if (s.Equals("("))
{
}
else if (s.Equals("+")) ops.Push(s);
else if (s.Equals("-")) ops.Push(s);
else if (s.Equals("*")) ops.Push(s);
else if (s.Equals("/")) ops.Push(s);
else if (s.Equals("sqrt")) ops.Push(s);
else if (s.Equals(")"))
{
int count = ops.Count;
while (count > 0)
{
String op = ops.Pop();
double v = vals.Pop();
if (op.Equals("+")) v = vals.Pop() + v;
else if (op.Equals("-")) v = vals.Pop() - v;
else if (op.Equals("*")) v = vals.Pop()*v;
else if (op.Equals("/")) v = vals.Pop()/v;
else if (op.Equals("sqrt")) v = Math.Sqrt(v);
vals.Push(v);

count--;
}
}
else vals.Push(Double.Parse(s));
}
return vals.Pop();
} فقط داخل متد،Run
عبارت دلخواه خودتو بذار

سلام
این جواب مربوط به سوال ماشین حساب بوسیله پشته است؟
میشه یه توضیح در موردش بدید؟