实在是不好意思,也不知道前一段时间在忙些什么,映象中就是吃饭和睡觉了,不知不觉就已经开学过了两个星期了 。记得第一周老师要求了一个作业--编写计算器,身为班级一员有必要给大家解析一下这个题目。而且个人感觉作为一个学生给人讲程式、讲算法,不仅仅是共享一下代码就算完了,而是要引导大家去解决这个问题。更多的是提供现阶段广大同学的知识水平和编码水平相适应的解题报告。不过,我不太喜欢什么上来就是做题啊,解题啊的,所以以后更多的会用技术讨论性的词句了。好了,闲话说了这个多了,开始进入正题吧。
当我们面对这样一个看似简单,越想越复杂的题目时,得通过逐步分块逐步求精的思路方法。一般我们看到这个题目时候会逐步想起哪些东西呢?我不知道大家的想法,我的思路是这样乱成一团的:一个计算器就是计算一个表达式嘛,一个一个计算就好了;不对,因为加减乘除的优先级问题,又得优先计算乘除法;然后呢,好像还有括号吧,那又优先计算括号里面的内容了,括号里面又是一个形如前面的形式,咋成了一个递归定义的无限了呢!而且我们还没有考虑什么乘方啊,三角函数、算式中间有一些非法符号、括号不匹配什么的。这种情况下,就得赶快停下来,不能一口吃个胖子吧。记得高中信息学奥赛的时候就是栽在这道题上的。
那么下面几篇文章就会一步一步来解读这个程式。
我用三块来将程式划分开。
首先,我们知道需要计算一个表达式就得保证这个表达式中没有非法字符 像什么空格呀、缩进符等等。
其次,我们要保证表达式结构的正确性,主要是括号匹配、运算符、操作数(其实就是数字,那些学者就会用专业词汇吓唬人。)的位置正确性。
最后,才是计算表达式。
注意:我们的注意力应该在处理表达式的问题上面,所以大家不要为那些GUI界面和外围设备投入大量精力,没有什么意义。网上大部分采用的是后缀表达式求值等类似方法,既然大家没学,我们不会采用这种方法解答;另外有些同学听到一些新的名词--栈,就觉得很难,其实没有,在随后的解析过程中,我们会发现,这种数据结构会因为解答本程式的需要,会自己浮现到我们面前,所以不用担心;再则是,要学会自己想办法,在随后的文章中,大家会发现,只要是懂得基本的编程规则,解决这个问题是没有困难的(要不然我们高中那会没有这么多专业术语,咋搞啊)。
补充两句,如果有哪些地方可以加评论询问,本人表达能力有限所以这个学期选个语文好好补补。并且我发现如果无法将自己所学的知识表达出来并且让他人听懂是不算一个好学生的。
当我们面对这样一个看似简单,越想越复杂的题目时,得通过逐步分块逐步求精的思路方法。一般我们看到这个题目时候会逐步想起哪些东西呢?我不知道大家的想法,我的思路是这样乱成一团的:一个计算器就是计算一个表达式嘛,一个一个计算就好了;不对,因为加减乘除的优先级问题,又得优先计算乘除法;然后呢,好像还有括号吧,那又优先计算括号里面的内容了,括号里面又是一个形如前面的形式,咋成了一个递归定义的无限了呢!而且我们还没有考虑什么乘方啊,三角函数、算式中间有一些非法符号、括号不匹配什么的。这种情况下,就得赶快停下来,不能一口吃个胖子吧。记得高中信息学奥赛的时候就是栽在这道题上的。
那么下面几篇文章就会一步一步来解读这个程式。
我用三块来将程式划分开。
首先,我们知道需要计算一个表达式就得保证这个表达式中没有非法字符 像什么空格呀、缩进符等等。
其次,我们要保证表达式结构的正确性,主要是括号匹配、运算符、操作数(其实就是数字,那些学者就会用专业词汇吓唬人。)的位置正确性。
最后,才是计算表达式。
注意:我们的注意力应该在处理表达式的问题上面,所以大家不要为那些GUI界面和外围设备投入大量精力,没有什么意义。网上大部分采用的是后缀表达式求值等类似方法,既然大家没学,我们不会采用这种方法解答;另外有些同学听到一些新的名词--栈,就觉得很难,其实没有,在随后的解析过程中,我们会发现,这种数据结构会因为解答本程式的需要,会自己浮现到我们面前,所以不用担心;再则是,要学会自己想办法,在随后的文章中,大家会发现,只要是懂得基本的编程规则,解决这个问题是没有困难的(要不然我们高中那会没有这么多专业术语,咋搞啊)。
补充两句,如果有哪些地方可以加评论询问,本人表达能力有限所以这个学期选个语文好好补补。并且我发现如果无法将自己所学的知识表达出来并且让他人听懂是不算一个好学生的。