计算公式
本文关键字:计算 | 更新日期: 2023-09-27 17:51:05
我试图实现一个程序,从用户(在1行)中获取方程并输出结果。到目前为止,我用indexof找到了+号,然后我试着找到+号左右的数字的值-
string input = "5+4+6";
while (input.Contains('+'))
{
Console.WriteLine(input.IndexOf("+"));
string position1 = input.Substring(0, input.IndexOf("+"));
int number1 = Convert.ToInt32(position1);
String position2 = input.Substring(2, input.IndexOf("+"));
int number2 = Convert.ToInt32(position2);
int sum = (number1 + number2);
我的代码的问题是,我陈述的数字到左边,并将其转换为int,而在现实生活中的数字在方程将是未知的,可以是2+4,或3+5+6+4,为了简单,现在我试图做+和-,然后/和*。
谁能建议改进代码或任何帮助?我知道还有其他方法可以计算公式,比如ncalc,但我想坚持使用这种方法。
谢谢
根据您给出的,如果这是期望的string
输入,您可以这样做:
string input = "5+4+6";
int result = 0;
while (input.Contains('+'))
{
var numbers = input.Split('+');
foreach(var num in numbers)
{
result += Convert.ToInt32(num);
}
}
类似的操作应该可以工作,您可以用+
替换任何操作符。
如果您需要担心的唯一操作符是+,则只需使用string.Split()创建字符串数组,然后将它们转换为整数并将它们相加。您甚至可以使用Linq进一步简化其中的一些。
string[] numbers = input.Split('+');
int sum = input.Select(n => int.Parse(n)).Sum();
你甚至可以把它们放到一个语句中
int sum = input.Split('+').Select(n => int.Parse(n)).Sum();
好吧,为了学习的目的,对于这种特殊情况,您可以使用"手动"解析的方法。
但在现实生活中,如果你想解析公式,我建议你阅读反向波兰符号和分流码算法。这是您解析任何公式而不受任何操作限制的方式(您可以实现"+",然后添加"-","*","/"甚至"sin","cos"操作)。
处理加、减、乘、除以及考虑运算顺序…我会查一下分流场算法。这将接受作为中缀表示法给出的输入表达式,并将其转换为反波兰表示法。你可以看看分流场算法的很多。net实现。
正如大家所说,如果输入只包含一种操作类型,比如加法,那么您可以使用.Split('+')
,然后解析出每个整数并将它们相加。
我使用与Excel相同的优先级。+ - * /
.net Fiddle
这只适用于公式中的整数。即使当返回double来存储除法。如果您想在公式中接受双精度,请尝试double.Parse
而不是int.Parse
=1+2*3/4-5+6*7/8-9
将得到-6.75。
第一个操作是3/4和7/8
然后2 * 0.75和6 * 0.875
然后是1.5 - 5和5.25 - 9
最后1 + (-3.5)+ (-3.75)
=1+2+3+4+5+6+7+8+9
is 45 =1-2-3-4
是-8 =1*2*3*4
= 24 =1/2/3/4
= 0.416667
public static void Main()
{
int n;
bool isNumeric;
string input = "1+2*3/4-5+6*7/8-9";
string[] addSplit = input.Split('+');
double addTotal = 0;
foreach (string addCode in addSplit)
{
isNumeric = int.TryParse(addCode, out n);
if (isNumeric)
{
addTotal += n;
}
else
{
string[] addMinus = addCode.Split('-');
double minusTotal = 0;
bool firstMinus = true;
foreach (string minusCode in addMinus)
{
isNumeric = int.TryParse(minusCode, out n);
if (isNumeric)
{
if (firstMinus) {
minusTotal = n;
firstMinus = false;
}
else {
minusTotal -= n;
}
}
else
{
string[] multySplit = minusCode.Split('*');
double multyTotal = 1;
foreach (string multyCode in multySplit)
{
isNumeric = int.TryParse(multyCode, out n);
if (isNumeric)
{
multyTotal *= n;
}
else
{
string[] divSplit = multyCode.Split('/');
int.TryParse(divSplit[0], out n);
double divTotal = n;
for( int i = 1; i < divSplit.Length ; i++ ) {
int.TryParse(divSplit[i], out n);
divTotal /= n;
}
multyTotal *= divTotal;
}
}
if (firstMinus) {
minusTotal = multyTotal;
firstMinus = false;
}
else {
minusTotal -= multyTotal;
}
}
}
addTotal += minusTotal;
}
}
Console.WriteLine("addTotal: " + addTotal);
}