• 第一次大作业总结——四则运算程序


    经过两周的时间,总算完成了第一次大作业。需求非常简单,编写一个四则运算程序,要求可以从记事本读取算式,并算出结果。支持与用户交互,对用户输入的答案的对错进行判断,并统计回答结果。附加要求是程序自己随机生成算式,并以txt格式存档。

    程序分为两部分,运算部分和生成部分。

    鉴于之前做过类似的程序,运算部分已经基本完成。只需要将从键盘输入算式改为从文件读取算式即可。我使用了c++的库中提供的文件流以及字符串流来完成这个转换,因为无论是文件流还是字符串流都与输入输出流有着类似的操作方式,可以以较小的代价实现功能的转换。

    简单来说,在使用文件流和字符串流时,需要先创建fstream和stringstream的类对象,之后便可以运用"<<"和">>"两个操作符像使用cout和cin一样,在文件流和字符串流中存取数据了。此外,fstream和stringstream还提供了多种函数来辅助存取。比如我在程序中使用的.getline(...)函数,就可以轻松的读取一整行数据,而不是以空格作为结束标志。

    运算部分的逻辑是靠两个栈来实现的,一个存储符号,另一个存储数值。当扫描到数值时,将数值压入栈中。当扫描到符号时,将当前符号与栈顶符号比较,若当前符号优先级高,则将当前符号压入栈中,若当前符号优先级低,则搁置当前符号,弹出栈顶符号,并连续弹出两个栈顶数值,完成一次运算,将结果压入数值栈中。再把搁置的符号作为当前的运算符,继续与符号栈顶的运算符比较优先级,重复上述过程,直到遇到优先级比当前运算符高的符号为止。

    数值的类型是我自己定义的分数类,成员变量分为分子和分母,以满足本次大作业的要求。符号则是标准的“+”,“-”,“*”,“/”,“=”,“(”和“)”再加上我自己定义的符号“$”来代表分数线。可能有人会觉得分数线和除号用一样的就好,但是这样实际是错误的。当我们要表示“10除以5分之2”时应该写成“10 / 2 $ 5”这样的话结果是25;但是若写成“10 / 2 / 5”仅表示“10除以2除以5”,结果是1。可能有人觉得给2/5加上括号就好了,可是当我们回忆小学数学课时,分数与除法确实应该是独立的两个概念,而且不会有括号来干扰。因此,我将“$”符号作为一个独立的运算,它的做法就是将两个数相除,但是它的优先级在除法之上,这样一来,“10 / 2 $ 5”就可以不借助括号来表示“10除以5分之2”这个数学算式了。

    运算部分基本按上述过程执行。

    生成部分我才用了三叉树的形式来生成算式,之所以不是二叉树是因为形如“(E)”的算式若用二叉树来表示,则无法向下继续伸展(因为E做父节点,“(和“)”做子节点)。而三叉树可以生成形如“E+E”,“E-E”,“E*E”,“E/E”,“E$E”和“(E)”的所有算式。只要熟悉c++的堆栈分配,new和delete的操作,delete[]和delete的区别,在编程中基本没有什么太大的问题。唯一需要说的一点是除零错误的处理。因为生成三叉树的节点是完全随机的,在生成父节点时,子节点还未生成,无法确定是否会发生除零错误,所以需要在完全生成整个三叉树后进行校验。我校验的方法就是调用负责运算的模块处理生成的每一个表达式,若发现除零错误则重新生成。虽然效率不高,但是避免了这种错误的发生。

    以上就是我关于这次大作业的一点感想。

  • 相关阅读:
    fetch与xhr的对比
    使用 fetch
    数组的剩余方法
    slice方法与splice方法
    php命名空间使用
    PHP面向对象编程学习之对象基础
    ubuntu下lamp环境配置及将window代码迁移至linux系统
    ThinkPHP中使用ajax接收json数据的方法
    给js文件传递参数
    JavaScript和php常用语法——切割字符串
  • 原文地址:https://www.cnblogs.com/ACskyline/p/5295378.html
Copyright © 2020-2023  润新知