PDA

View Full Version : سوال: نجوه محاسبه چند عمل در برنامه ماشین حساب ؟



Ohadi ali
شنبه 18 خرداد 1392, 20:18 عصر
سلام خدمت همه اساتید
در برنامه ماشین حساب که طراحی نموده ام به طور هم زمان فقط قادر به انجام یک عملگر می باشد
یعنی فقط می توان 2را ضربدر 3 کرد و مساوی را زد و دبار عملگر بعدی
حالا شوال ؟ اگه بخوام مثلا 2*3+4/2 کنم و جوابش رو بهم بده چکار باید بکنم ؟
توضیح : در برنامه فقط دو تا متغیر وجود داره

volcano_c
شنبه 18 خرداد 1392, 20:40 عصر
با سلام

بهترین حالت استفاده از الگوریتم های PreOrder و PostOrder می باشد

در مورد این دو سرچ کنی هم کد و هم الگوریتم هاشو پیدا می کنی

volcano_c
شنبه 18 خرداد 1392, 20:45 عصر
من قبلا برای این کار یک کلاس هم طراحی کردم

حالشو ببر :لبخندساده:

public class Calculator
{
private string[] _operator = {"(","+", "-", "*", "/" , " "};
private int[] _weightOPerator = { 0, 12, 12, 13, 13 ,13};


private string _strString ;
public string strString
{
get { return (_strString); }
set { _strString = value; }

}

public double Calculate()
{
System.Collections.Generic.List<char> Postfix = new System.Collections.Generic.List<char>();

PostfixtoInfix(strString,ref Postfix);
return(Proccess(Postfix));
}

private void PostfixtoInfix(string infix,ref System.Collections.Generic.List<char> Postfix)
{
System.Collections.Stack stack = new System.Collections.Stack();
char op=' ';

for (int i = 0; i < infix.Length; i++)
{
if (infix[i] == '(')
stack.Push('(');
else if (infix[i] == ')')
{
char tmp;
while (stack.Count != 0)
{
tmp = (char)stack.Pop();
if (tmp != '(')
Postfix.Add(tmp);
else
break;
}
}
else if (infix[i] >= '0' && infix[i] <= '9')
Postfix.Add(infix[i]);
else
{
try
{
op = (char)stack.Pop();
stack.Push(op);
}
catch { }
//op >= str
if (!Pred(op, strString[i])==true || stack.Count==0 )
{
//if(op!=' ')
// stack.Push(op);
stack.Push(strString[i]);
}
else
{
op = (char)stack.Pop();
while (Pred(op,strString[i])==true)
{
Postfix.Add(op);
if (stack.Count == 0)
break;
op = (char)stack.Pop();
}
stack.Push(strString[i]);
}
}

}

while (stack.Count!=0)
{
op =(char) stack.Pop();
Postfix.Add(op);
}

}

private bool Pred(char op1,char op2)
{
int p1=0, p2=0;
for (int i = 0; i < _operator.Length; i++)
{
if (op1.ToString()==_operator[i])
{
p1 = i;
}
}
for (int i = 0; i < _operator.Length; i++)
{
if (op2.ToString() == _operator[i])
{
p2 = i;
}
}

if (_weightOPerator[p1] >= _weightOPerator[p2])
return true;
else
return false;
}

private double Proccess(System.Collections.Generic.List<char> Postfix)
{
System.Collections.Generic.Stack<double> stack = new System.Collections.Generic.Stack<double>();
char symbol;
double operand1, operand2,result;

for (int i = 0; i < Postfix.Count; i++)
{
symbol = Postfix[i];
if (symbol >= '0' && symbol <= '9')
{
stack.Push((double)Postfix[i]-48);
}
else
{
operand2 = stack.Pop();
operand1 = stack.Pop();

result = Operate(symbol, operand1, operand2);

stack.Push(result);
}
}
return( stack.Pop());
}

private double Operate(char symbol, double opr1, double opr2)
{
double result=0.0;

switch (symbol.ToString())
{
case "+":
result = opr1 + opr2;
break;
case "-":
result = opr1 - opr2;
break;
case "*":
result = opr1 * opr2;
break;
case "/":
result = opr1 / opr2;
break;
}

return (result);
}

}


فقط کافیه مقدار ورودی و به strString بدی و متد Calculate() رو فراخوانی کن

volcano_c
شنبه 18 خرداد 1392, 21:11 عصر
راستی برنامه کامل شده همین کلاس رو داخل تاپیک نمونه برنامه های کوچک و مفيد در سي شارپ قرار داده ام

لینک

http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=1788913&viewfull=1#post1788913

tooraj_azizi_1035
یک شنبه 19 خرداد 1392, 12:15 عصر
چرخ رو دوباره اختراع نکن:
var result = new DataTable().Compute("2-3/4*12", null);

Ohadi ali
یک شنبه 19 خرداد 1392, 18:29 عصر
ممنون از راهنماییتون
ولی این ماشین حساب که طراحی کردم تحت ویندوزه اگه میشه یک کمک بنمایید که راحت باشه به طوری که بشه تو کلاس ارائه کرد

Ohadi ali
یک شنبه 19 خرداد 1392, 18:31 عصر
ممنون از راهنماییتون
ولی این ماشین حساب که طراحی کردم تحت ویندوزه اگه میشه یک کمک بنمایید که راحت باشه به طوری که بشه تو کلاس ارائه کرد

Ohadi ali
یک شنبه 19 خرداد 1392, 18:32 عصر
ممنون از راهنماییتون
ولی این ماشین حساب که طراحی کردم تحت ویندوزه اگه میشه یک کمک بنمایید که راحت باشه به طوری که بشه تو کلاس ارائه کرد