在C#中用数组制作一个简单的计算器
Making a simple calculator with arrays in C#
我正在尝试用 C# 中的数组制作一个简单的计算器。首先,我尝试仅使用两个整数和一个运算符来实现它,并且效果很好。现在我正在尝试这样做,以便用户可以根据自己的喜好进行表达。例如 7 * 7 + 1 / 50 而不是简单的 9 + 8,后者仅包含一个运算符和两个整数。问题是,每当我键入一个包含多个数字和运算符的长表达式时,它只会使用第一个运算符计算前两个数字。什么是解决这个问题的好方法?提前致谢。
static void Main()
{
while (true)
{
Console.WriteLine("Write an expression with two numbers and an operator with space in-between, for example, 4 + 2");
string expression;
string[] array;
string[] array1;
expression = Console.ReadLine();
array = expression.Split();
array1 = Calculation(array);
Console.WriteLine("Press ENTER to write a new expression.");
Console.ReadLine();
Console.Clear();
}
}
static string[] Calculation(string[] arr)
{
double numLeft= 0.0;
double numRight = 0.0;
string sign = "";
double result = 0.0;
int index = 1;
while (true)
{
numLeft = Convert.ToDouble(arr[0]);
sign = Convert.ToString(arr[index]);
numRight = Convert.ToDouble(arr[index + 1]);
index = index + 2;
if (sign == "+")
{
Console.Clear();
Console.WriteLine();
result= result + numLeft;
}
else if (sign == "-")
{
Console.Clear();
result = result + numLeft;
numLeft = 0 - numRight;
}
else if (sign == "*")
{
Console.Clear();
numLeft = numLeft * numRight;
}
else if (sign == "/")
{
Console.Clear();
numLeft = numLeft / numRight;
}
else
{
break;
}
result = result + numLeft;
Console.WriteLine("Answer: {0}", result);
return arr;
}
return arr;
}
因为你 return 数组在 "while true" 的末尾,所以只计算前 2 个。
此外,这也不正确。例如:2 + 3 * 4 = 14,而不是 20,就像您的计算器会计算的那样。
这个怎么样?
将您的操作字符串拆分成多个部分并用它们填充一个列表;
7 * 7 + 1 / 50 => [7][*][7][+][1][/][50]
然后遍历列表,解决*和/操作。当您遇到其中一个运算符时,请删除运算符元素、它之前的一个和它之后的一个,并用结果替换它们。请记住,列表长度会发生变化。
第一次迭代 => [49][+][1][/][50]
第二次迭代 => [49][+][0.02]
然后对 + 和 - 运算符执行相同的操作
第一次迭代 => [49.02]
当列表中只剩下一个元素时,这就是你的结果。
对于简单的计算,.net 中有一个方法:
public static int Compute(string operation)
{
return new DataTable().Compute("7 * 7 + 1 / 50", null);
}
来源:C# Math calculator
如果你真的想实现这个,我建议使用递归二叉树算法。
伪代码:
1. 将传入的字符串在有数学运算符号的地方拆分成二叉树
2.遍历这棵树并解决具有更高优先级的操作(*在+之前)
3.递归应该return两个子叶的值等等,直到它只产生一个值给主程序
using System;
namespace _2nd_A_recap
{
class Program
{
static void Main(string[] args)
{
int result;
int a = 20, b = 10;
result = (a + b );
Console.WriteLine("Addition Opertaor:" + result);
result = (a - b);
Console.WriteLine("Subtraction Operator:" + result);
result = (a * b);
Console.WriteLine("Multiplication Operator:" + result);
result = (a / b);
Console.WriteLine("Division Operator:" + result);
result = (a % b);
Console.WriteLine("Modulus Operator:" + result);
Console.WriteLine("Press enter to end Calculator...");
Console.ReadKey();
}
}
}
我正在尝试用 C# 中的数组制作一个简单的计算器。首先,我尝试仅使用两个整数和一个运算符来实现它,并且效果很好。现在我正在尝试这样做,以便用户可以根据自己的喜好进行表达。例如 7 * 7 + 1 / 50 而不是简单的 9 + 8,后者仅包含一个运算符和两个整数。问题是,每当我键入一个包含多个数字和运算符的长表达式时,它只会使用第一个运算符计算前两个数字。什么是解决这个问题的好方法?提前致谢。
static void Main()
{
while (true)
{
Console.WriteLine("Write an expression with two numbers and an operator with space in-between, for example, 4 + 2");
string expression;
string[] array;
string[] array1;
expression = Console.ReadLine();
array = expression.Split();
array1 = Calculation(array);
Console.WriteLine("Press ENTER to write a new expression.");
Console.ReadLine();
Console.Clear();
}
}
static string[] Calculation(string[] arr)
{
double numLeft= 0.0;
double numRight = 0.0;
string sign = "";
double result = 0.0;
int index = 1;
while (true)
{
numLeft = Convert.ToDouble(arr[0]);
sign = Convert.ToString(arr[index]);
numRight = Convert.ToDouble(arr[index + 1]);
index = index + 2;
if (sign == "+")
{
Console.Clear();
Console.WriteLine();
result= result + numLeft;
}
else if (sign == "-")
{
Console.Clear();
result = result + numLeft;
numLeft = 0 - numRight;
}
else if (sign == "*")
{
Console.Clear();
numLeft = numLeft * numRight;
}
else if (sign == "/")
{
Console.Clear();
numLeft = numLeft / numRight;
}
else
{
break;
}
result = result + numLeft;
Console.WriteLine("Answer: {0}", result);
return arr;
}
return arr;
}
因为你 return 数组在 "while true" 的末尾,所以只计算前 2 个。
此外,这也不正确。例如:2 + 3 * 4 = 14,而不是 20,就像您的计算器会计算的那样。
这个怎么样?
将您的操作字符串拆分成多个部分并用它们填充一个列表;
7 * 7 + 1 / 50 => [7][*][7][+][1][/][50]
然后遍历列表,解决*和/操作。当您遇到其中一个运算符时,请删除运算符元素、它之前的一个和它之后的一个,并用结果替换它们。请记住,列表长度会发生变化。
第一次迭代 => [49][+][1][/][50] 第二次迭代 => [49][+][0.02]
然后对 + 和 - 运算符执行相同的操作 第一次迭代 => [49.02]
当列表中只剩下一个元素时,这就是你的结果。
对于简单的计算,.net 中有一个方法:
public static int Compute(string operation)
{
return new DataTable().Compute("7 * 7 + 1 / 50", null);
}
来源:C# Math calculator
如果你真的想实现这个,我建议使用递归二叉树算法。
伪代码: 1. 将传入的字符串在有数学运算符号的地方拆分成二叉树 2.遍历这棵树并解决具有更高优先级的操作(*在+之前) 3.递归应该return两个子叶的值等等,直到它只产生一个值给主程序
using System;
namespace _2nd_A_recap
{
class Program
{
static void Main(string[] args)
{
int result;
int a = 20, b = 10;
result = (a + b );
Console.WriteLine("Addition Opertaor:" + result);
result = (a - b);
Console.WriteLine("Subtraction Operator:" + result);
result = (a * b);
Console.WriteLine("Multiplication Operator:" + result);
result = (a / b);
Console.WriteLine("Division Operator:" + result);
result = (a % b);
Console.WriteLine("Modulus Operator:" + result);
Console.WriteLine("Press enter to end Calculator...");
Console.ReadKey();
}
}
}