个人项目四则运算生成程序进展——第二周

我认为四则运算生成程序功能上分为两大部分,随机生成四则运算表达式+四则运算表达式的计算

开始的时候想从编程结构上划分这两部分,用逆波兰表达式和栈的结构进行四则运算的计算,但是实现效果不太理想,编程到一半就编不下去了。

后来上网查阅了一些资料,并受到《编译原理》书中表达式可以用树的结构来表示的启发,我采用了二叉树的数据结构,并采用了生成表达式和计算表达式同时进行的方法,用递归运算的思想,重新编写了这个程序。

至于生成算式的随机性,则采用了控制表达式中数字个数的方法(叶子数量),来控制表达式的长度。

采用的数据结构如下:

其中每个单元存储运算结果和运算符,叶子存储的就是运算数字。

生成运算表达式和进行计算的过程结合在一起:自顶向下生成框架,填入运算符;然后自底向上填入数字,同时计算结果。

拿一个例子进行说明:

得出的结果为:(1+2)*3/4=9/4=2‘1/4

大致的设计思路和采用的数据结构就是这样的

下面总结一下编程的时候解决的问题:

1)首先就是四则运算程序需要支持真分数的运算,为了一致性,我把整数写成了真分数的形式,用一个struct保存分母和分子。

2)分数运算时要用到最小公倍数,约分时要用到最大公约数:最小公倍数=两数之积/最大公约数

3)输出到文件的时候采用的是ofstream类型的对象,遇到了两个问题:

首先,为了提高效率和减少代码冗余,我把屏幕上的输出和到文件的输出放到一个函数里,只周游树一遍就完成了两项工作。但是输出到文件就采用了递归的方式,但是输出的顺序有时会发生混乱,我采用了ofstream::flush()的方法解决。但是感觉这样的方法还是不好,如果输出逻辑再复杂一点,这个方法也许就不再适用了。

其次,我想在输出之前清空文件,如果采用ofstream对象,只好采用先打开文件再关闭它的方法,并加上清空文件的参数。感觉这也并不是一个好的方法,有点蠢......

总之,运行效果如下图:

目前进度是这里,通过做个人项目感觉自己对数据结构和算法的掌握还是太差了,还有很长一段路要走啊(望天).......

时间: 2024-10-14 21:00:34

个人项目四则运算生成程序进展——第二周的相关文章

个人项目四则运算生成程序进展——第三周

上个星期完成了基本功能后,我开始用MFC进行扩展,将它变成一个有图形界面的软件(?) 扩展之后的程序的对话框和类 Dialog: 1.IDD_ARITHMETIC_DIALOG 介绍:开始界面,需要填入生成表达式的个数.数字(整数以及真分数分母)的范围. 功能:接收用户传入的参数(默认的参数均为10),生成Questions子对话框并将参数传递给它. 截图:(尽管来吐槽我英语渣还坚持不懈地用English吧!) 2.IDD_QUESTIONS 介绍:生成问题的对话框,用户可以填入答案.判断对错.

结对项目进展第二周——模块化分析

结对项目第一步:把实现的四则运算程序的功能划分模块,将不同模块功能分开,从而使模块可复用,并作为独立的部分进行测试. 优化的四则运算程序需要高内聚和低耦合.而我们组写得代码使用了树的数据结构,虽然表达起来简单易懂,算法也比较容易实现,却有着一个很大的缺点:我们在递归生成运算表达式的同事计算了表达式的结果.这样虽然算法和实现的代码都很简便,却不符合模块化的思想. 我们选择的原型程序,一共有输入.随机生成表达式框架(只有运算符但没有数据).在框架中填入数字并计算结果.输出共四个模块.实现的时候觉得很

20165214 结队编程项目-四则运算(第二周)

20165214 第一次结队编程项目--四则运算第二周 需求分析 本周的结队编程想要实现一个四则运算系统,它可以自动生成n个计算题(本周不包括分数),其中n由我们输入.每输出一道题目,运行程序的人需要输入相应的答案,直到最后一道题做完.最后,统计正确率.然后,在这个基础上可以进行相应的功能扩展,比如语言支. 设计思路 我需要在上周的基础上对程序进行补充.在题目的生成上,应该再加上括号.÷./ 本周达成: ①能够随机生成n道题目,n由我们输入,最大长度可直接在程序里面修改: ②支持真分数运算: ③

20172327 结对编程项目-四则运算 第二周 阶段总结

20172327 结对编程项目-四则运算 第二周 阶段总结 结对编程项目-四则运算 第二周 输出阶段总结博客 结对对象: 学号:20172317 姓名:蒋子行 伙伴第二周博客地址: 学号:20172320 姓名:李闻洲 伙伴第二周博客地址: 担任角色: 驾驶员:蒋子行 副驾驶:李闻洲 马瑞蕃 小组结对编程的photo: 项目中自己负责的部分: 我在项目中真的没啥贡献,项目主要由祥哥主刀,我和李闻洲就是打杂的. 个人贡献度划分: 我在项目中真的没啥贡献,项目主要由祥哥主刀,我就是打杂的,提点建议和

20175314 结队编程项目——四则运算第二周

20175314 结队编程项目--四则运算第二周 一.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 能生成随机数 产生的算式要有括号 要建立堆栈,进行中缀转后缀,以及后续后缀的运算 能输入想要产生的题目数 能输入用户计算的答案 能够比较用户输入的答案是否正确 能够统计用户答题的正确率 二.设计思路 生成一个有加减乘除支持括号的算式,以字符串的形式输出,每个操作数或操作符中间都用

20175325 第二周结对编程项目 四则运算

20175325 第二周结对编程项目 四则运算 一.需求分析: 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 题目去重 能多次生成四则运算题目 能根据用户输入的数字生成四则运算的题目数量 多语言支持: 简体中文, 繁體中文, English 文件: 处理生成题目并输出到文件 完成题目后从文件读入并判题 用户能够选择是否开始答题 二. 设计思路: 产生随机数并且考虑符号的优先级. 能实现整

20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目(加.减.乘.除) 需要实现计算结果的输出 将正确的计算结果与用户输入的计算结果进行比较得出最终的正确率 之前编写的程序还有很多问题,这周主要对这些问题进行改进和升级,我们成功实现了这些功能. 设计思路 1. 首先我们需要编写随机生成数字和随机生成符号的代码,把他们编写好后保存 2. 我们需要利用之前编写好的随

20165202 结对编程项目-四则运算 第二周

一.码云链接 二.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 三.设计思路(同时输出UML类图) 这周的总体设计要在上周的基础上深化,上周我们的代码没有用到中缀表达式转后缀表达式,没有用到栈,所以这周不仅要对上一周的代码进行修改,而且还要在此基础上完成更深层的对真分数的要求. 实现四则运算中后缀转换类 实现四则运算后缀表达式计算类 实现四则运算真分数计算类 实现四则运算生成题

20165330 结对编程项目-四则运算 第二周

需求分析 实现一个命令行程序,要求:自动生成小学四则运算题目(加.减.乘.除) 可实现多个运算符一起运算 可以真分数形式输出结果 测试结果的正确性 统计题目完成数并计算正确率 设计思路 实验首先是完成一个计算器的功能,可以实现简单的+.-.*./运算,在这里设计一个主类生成随机数,生成题目,并判断正确率 实现多运算符,编入四个类分别实现整数运算.真分数运算.判断结果正确并计算正确率 利用JUnit检测非法输入 设计测试类,利用JUnit测试整数类与分数类的四则运算 UML类图 功能截图 Juni