[英]C# string calculator
功能思想是充當計算器,輸入是帶有符號(* / +-)和數字的字符串,輸出是計算值示例:輸入:“ 5 * 7 + 32-2 * 5”輸出:“ 57”
static string Calculate(ref string s) {
int left, right, leftOp, rightOp;
string calculated, signPool = "*/+-";
char sign;
for (int j = 0; j < 4; j++) {
sign = signPool[j];
for (int i = s.IndexOf(sign); i != -1; i = s.IndexOf(sign)) {
for (left = i-1; Char.IsDigit(s[left]); left--) { };
left++;
for (right = i+1; Char.IsDigit(s[right]); right++) { };
right--;
leftOp = Convert.ToInt32(s.Substring(left, i - left));
rightOp = Convert.ToInt32(s.Substring(right, right - i));
switch (sign) {
case '*':
calculated = Convert.ToString(leftOp * rightOp);
break;
case '/':
calculated = Convert.ToString(leftOp / rightOp);
break;
case '+':
calculated = Convert.ToString(leftOp + rightOp);
break;
case '-':
calculated = Convert.ToString(leftOp - rightOp);
break;
}
calculated = Convert.ToString(leftOp * rightOp);
s = s.Replace(s.Substring(left, right - left + 1), calculated);
}
}
return s;
}
問題是variale的“ left”一直都變為0,請幫助
for (int i = s.IndexOf(sign); i != -1; i = s.IndexOf(sign)) {
for (left = i-1; Char.IsDigit(s[left]); left--) { };
left++;
注意for循環內的for循環。 您使用left作為循環變量,而應該使用其他變量作為循環條件。 嘗試分配一個變量,例如x = i-1; 如果您需要將左側更改為i-1,請在循環開始之前執行此操作。 我希望這有幫助。
您的計算器算法未遵循正確的PEMDAS規則。 乘法和除法是等效的運算,應在遇到時從左到右執行。 這意味着您需要在從左向右移動的同時搜索乘法和除法運算符。 當前,您正在從左到右執行所有乘法,然后再從左到右執行所有除法。
例如,請考慮以下問題:
5 * 7 / 5 * 2
用乘法和除法從左到右作為等效運算來解決:
// Correct
35 / 5 * 2
7 * 2
14
但是,使用您當前的算法求解,將得出不同的答案:
// Incorrect
35 / 5 * 2
35 / 10
3.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.