上一节我们基本完成了界面设计和事件响应,这次我们继续来丰富功能。
我先讲按正常的思路来实现。
比如这样的字符输入
1+1+1-1
用我们人眼+人脑来计算,一看就是连加连减,而且还可以做简便运算,1-1=0就消了,结果就是1+1=2,非常容易。
但要想让程序读懂并且能够计算正确,却不是一件容易的事,它就相当于是个刚出生的婴儿,你得教它怎么做。
仅针对这个输入,我的思路是设置一个结果变量分别为result,初始值为0,还要记录一个上一次的符号变量last_operator,然后不断循环,找到每一个数字,用result和last_operator去跟这个数字做运算。大概需要这样的步骤:
按照这个思路,我编写了下面的代码:
string input = tbxInput.Text;
double result = 0;
string temp = "";
char last_operator = '+';
foreach (char c in input) //循环遍历每个字符
{
if (char.IsDigit(c)) //如果是数字
{
temp += c;
}
else
{
if (!string.IsNullOrEmpty(temp)) //如果不是空字符
{
switch (last_operator)
{
case '+':
result += int.Parse(temp);
break;
case '-':
result -= int.Parse(temp);
break;
}
}
last_operator = c;
temp = "";
}
}
if (!string.IsNullOrEmpty(temp))
{
switch (last_operator)
{
case '+':
result += int.Parse(temp);
break;
case '-':
result -= int.Parse(temp);
break;
}
}
逻辑倒是挺简单,之前没遇到过的函数我加了注释,应该不难理解。
运行效果:
细心的学员可能注意到,上面的代码中switch部分是一样的。对于代码相同或者是功能相似的部分,我们就提倡用函数进行封装,这样以后再使用的时候,直接调用这个函数就好了。比如,我们把上面用于计算的代码封装成下面的函数:
double calc_normal(double result, char op, string temp)
{
if (!string.IsNullOrEmpty(temp)) //如果不是空字符
{
switch (op)
{
case '+':
result += int.Parse(temp);
break;
case '-':
result -= int.Parse(temp);
break;
}
}
return result;
}
函数的声明:
double calc_normal(double result, char op, string temp)
返回类型 函数名 变量类型及变量名
这样在程序中,我们直接调用函数名的方式就好了。优化后的代码:
string input = tbxInput.Text;
double result = 0;
string temp = "";
char last_operator = '+';
foreach (char c in input) //循环遍历每个字符
{
if (char.IsDigit(c)) //如果是数字
{
temp += c;
}
else
{
result = calc_normal(result, last_operator, temp);
last_operator = c;
temp = "";
}
}
result = calc_normal(result, last_operator, temp);
代码精简了不少,看起来也很清晰。实际执行结果,跟之前一样。
函数,可以说是编程中的重中之重。我们经常听说很多经验丰富的老程序员,开发效率胜过十个新手,就是因为老程序员积累了丰富的类库,里面涵盖了各种各样的函数,这些函数都是经历过几年甚至十几年千万次的调用,通过无数次修改与Bug修复千锤百炼过的。想要什么功能就是一堆函数的组合,效率当然高了。拿我来说,我用C#开发了10多年,从一开始就慢慢建设并丰富自己的开发库,以前我开发出一个产品,可能需要1-2年的时间才能成型。现在,基于类库,开发出类似的产品,可能只需要2个月。当然类库的磨练也不是一蹴而就的,我现在的类库,至少经历了3次架构级别的调整。有点扯远了,归根结底一句话,编程也要学会积累。
回到我们的功能。虽然有了一些进展,能够实现了连加连减,但是乘法和除法我们并没有涉及到,并且还有更复杂的,比如括号嵌套,这种:
(1+2*(2+2/2))*2-2*2
加减乘除外加括号嵌套,常规的字符串处理复杂度太高了。想要完美解决,可能相当于要做一个小型的编译器了。
那要如何来解决呢?我们下节继续。
页面更新:2024-04-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号