C#编程案例:入门计算器之一般实现

上一节我们基本完成了界面设计和事件响应,这次我们继续来丰富功能。

我先讲按正常的思路来实现。

比如这样的字符输入

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

标签:遍历   嵌套   括号   变量   计算器   函数   字符   入门   思路   案例   代码   功能   数字

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top