شیكاركردنی هاوكێشه به #c
پێشهكیله ههموو زمانهكانی بهرنامهداڕشتندا (
پێشهنگی priority) بۆ كرداره بیركاری (ماتماتیكی)یهكان دانراوه، بۆ وێنه كاری لێكدان پێش كۆكردنهوه ئهنجام دهدرێت، گهر تهماشای ئهم نموونه سادهیه بكهین بۆ تێگهیشتنی ئهم پێشهنگییه:
٣ ٭ ٤ + ٢
گهر بێت و كرداری (٭) یهكهمجار ئهنجام بدهین و پاشان (+)، ئهوا ئهنجامی دهستهواژهكه دهكاته: (١٤).
خۆ ئهگهر كرداری (+) یهكهمجار ئهنجام بدهین و پاشان (٭) ئهوا ئهنجامی دهستهواژهكه دهكاته: (١٨).
بهمشێوهیه له هاوكێشه ئاڵۆزهكاندا كه چهندین كردار و كهوانه دێنه پێش، شیكاركردنی به بهرنامهی تایبهت دهكرێت.
ئهمڕۆ (
نهخشه function)یهك دهنووسین به زمانی c# كه به "سی شارپ" دهخوێنرێتهوه، پاشان نه خشهكه له بهرنامهیهكدا دهسازێنین.
ڕێگهی گرافیكدهمانهوێ بهرنامهیهك بنووسین بتوانێ هاوكێشهیهك که (+)، (-)، (*)، (/)، (زۆرینه max)، (كهمینه min) و پهرانتێزی ههبێ، ههڵهێنێ (شیكار بکات). بۆ وێنه:
(2*(4+3*2))/(5-1)
بۆ ئهم کاره، هێندێ کهس دێن (هێڵكاری graph) بهكار دێنن، یانی لهپێشدا (هێڵكاری graph)یهك لهم فۆرمۆڵهی ساز دهکهن، دوایه له (هێڵكاری graph)یهكهدا له گهڵاکانڕا پێدا دێن یێک یێک وهڵامهکان دهردێنن ههتا دهگهنه ئهنجام:
ههڵبهت دهبێ ئهوهش بزانین چاکردن و بهڕێوهبردنی هێڵكاری، بیرگه و کاتێکی زۆرتری لهچاو شێوازهکانی تر پێویسته بۆیه بهکارهێنهرانی ئهم شێوازه (Algorithm?) له جیاتیی هێڵكاری، (Stack)ی دهکار دێنن.
ئێمه لێرهدا دهمانههوێ شیوازێکی دی بۆخۆمان داڕێژین که تێگهشتن و داڕشتنی (Implementation) هاسانه.
- ههتا پهڕانتێزێک ماوه
- فۆرمۆڵی نێو پهڕانتێزهکه دهربێنه
- فۆرمۆلهکهی ههڵهێنه (حهل کهوه)
- وهڵامهکهی لهجێی پهڕانتێزهکهی دانێ
private void doSolve_Click(object sender, System.EventArgs e)
{
string f = formula.Text;
string inner = FindInnerFormula(f);
while (inner != null)
{
f = f.Replace(string.Concat("(", inner, ")"), Evaluate(inner).ToString());
inner = FindInnerFormula(f);
}
result.Text = Evaluate(f).ToString();
}
private string FindInnerFormula(string formula)
{
int posL, posR = formula.IndexOf(')');
if (posR > 0)
{
posL = formula.LastIndexOf('(', posR);
return formula.Substring(posL + 1, posR - posL - 1);
}
return null;
}
بۆ وێنه:
(2*(4+3*2))/(5-1) --> (2*10)/(5-1) --> 20/(5-1) --> 20/4 --> 5
بۆ ههڵهێنانی فۆرمۆڵێکی بێپهڕانتێزیش بهپێی شێوازی خوارێ دهچینه پێشێ:
فۆرمۆڵهکهی بهسهر + ان دا بشکێنه، یانی 4+3*2 --> 4, 3*2
فۆرمۆڵهکهی بهسهر - ان دا بشکێنه، دوایه بهشهکان لێک کهم کهوه
فۆرمۆڵهکهی بهسهر * ان دا بشکێنه، دوایه بهشهکان تێکدا زهرب که
فۆرمۆڵهکهی بهسهر / ان دا بشکێنه، دوایه بهشهکان پێکدا بهش که
فۆرمۆڵهکهی بهسهر ^ ان دا بشکێنه (له جیاتی Min)، دوایه کهمترینیان ههڵبژێره
فۆرمۆڵهکهی بۆ ~ ی ههڵهێنه (حهل کهوه - ، زۆرینهی ههڵبژێره)
سهرچاوهی كۆدهكه
private double Evaluate(string f)
{
if (f.IndexOf('+') < 0)
return EvaluateMinus(f);
string[] pluses = f.Split(new char[]{'+'});
double res = 0;
for (int i = 0; i < pluses.Length; i++)
res += EvaluateMinus(pluses[i]);
return res;
}
private double EvaluateMinus(string plus)
{
if (plus.IndexOf('-') < 0)
return EvaluateMul(plus);
if (plus.StartsWith("-"))
plus = string.Concat("0", plus);
string[] minuses = plus.Split(new char[]{'-'});
double res = EvaluateMul(minuses[0]);
for (int i = 1; i < minuses.Length; i++)
res -= EvaluateMul(minuses[i]);
return res;
}
private double EvaluateMul(string minus)
{
if (minus.IndexOf('*') < 0)
return EvaluateDiv(minus);
string[] muls = minus.Split(new char[]{'*'});
double res = 1;
for (int i = 0; i < muls.Length; i++)
res *= EvaluateDiv(muls[i]);
return res;
}
private double EvaluateDiv(string mul)
{
if (mul.IndexOf('/') < 0)
return EvaluateMax(mul);
string[] divs = mul.Split(new char[]{'/'});
double res = EvaluateMax(divs[0]);
for (int i = 1; i < divs.Length; i++)
res /= EvaluateMax(divs[i]);
return res;
}
private double EvaluateMax(string div)
{
if (div.IndexOf('^') < 0)
return EvaluateMin(div);
string[] maxs = div.Split(new char[]{'^'});
double res = double.MinValue;
for (int i = 0; i < maxs.Length; i++)
{
double resi = EvaluateMin(maxs[i]);
if (res < resi)
res = resi;
}
return res;
}
private double EvaluateMin(string max)
{
if (max.IndexOf('~') < 0)
return Convert.ToDouble(max);
string[] mins = max.Split(new char[]{'~'});
double res = Convert.ToDouble(mins[0]);
for (int i = 1; i < mins.Length; i++)
if (res > Convert.ToDouble(mins[i]))
res = Convert.ToDouble(mins[i]);
return res;
}
داگرتن و نموونهئهو بهرنامهیهی به سهرچاوهی كۆدهكهوه دابهزێنه لهم بهستهرهدا:
هاوكێشه - نموونهی یهكهم دهتوانن پاش دابهزاندنی ئهو بهرنامهیه، بۆ وێنه ئهو فۆرمۆڵانه تاقی کهنهوه:
(2*3)^(5-1)
(3*19.5-2/1)/(32-3~2)