周记1--“随机生成表达式”项目进展及收获体会

本周我开始了我的第一个个人软件工程项目——自动生成算式。在做这个看似没事什么难度的项目的过程中,我的收获还是有很多的。

我这个人解决问题的一般思路基本上都是由简到繁,循序渐进。所以我首先并没有考虑如何随机生成算式,而是怎样让程序从txt文档中读入算式,然后再进行计算。首先我来搞定10以内的四则运算。具体方法是将写在txt文档中的算式以string的格式读入到程序中,然后按照在数据结构课中学到的方法把这个中缀表达式转换成后缀表达式,然后计算这个后缀表达式。Ok,接下来我来做10以上的数的四则运算,这就涉及到string和int的相互转换问题,让我想到了以前接触过的stringstream类,这个东西虽然好像效率不是特高,但是对于我们这种工程来说应该够用了。在搞定了这些之后,我接着思考怎样既能进行整数运算又能进行分数运算。我想最好的方法应该就是建立一个统一的标准才行。所以我写了一个分数的struct,包括int分子和int分母,还写了分数四则运算函数。整个计算过程均为分数运算,即把所有整数都当成分母为1的分数。最后在对得到的分数结果进行化简即可。

做完了这些,完成了这个工程的基本要求,接下里我来思考怎样自动生成算式。由于要生成各种类型的表达式,而各式各样的表达式都可以用二叉树的形式来描述,所以我想到用满二叉树来生成算数表达式。有了大致思路,接下来我开始考虑细节的问题。首先要确定的是这棵树的内部节点是运算符,叶子节点就是操作数。接下来怎样让表达式的长度随机呢。我想从根开始,每个节点以一定的概率(如1/2)生成他的子节点即可但又不能无限生长下去,所以要控制整棵树的最大深度。然后就是操作数和运算符也要随机生成,这个好说。那么怎样计算表达式的值呢?从叶子节点开始自底向上计算即可,这个写个递归函数比较好实现。恢复整个表达式?依然是让每个节点保存一个string记录这个节点及他的两棵子树形成的表达式,再自底向上生成整个表达式即可。还需要注意的一个点就是生成表达式的时候是否需要加括号。这个需要根据子节点运算符的优先级和父节点运算符的优先级来确定。

有了大致思路,我就开始实现了,整个过程比较悲催的一点是之前写好的算法基本上没什么用了。主要的代码全部要重新写。这也是我由简到繁的方法的一个弊端所在——没有从整体考虑问题,之前做的工作在之后有可能完全用不到。

好了,我目前的进展大概就是这样,不知道我的方法是不是有点low。

时间: 2024-10-22 10:37:19

周记1--“随机生成表达式”项目进展及收获体会的相关文章

个人项目——四则运算题目的随机生成

任务:实现一个自动生成小学四则运算题目的命令行程序. 一.时间预估及实际花费时间 PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 15h Development 开发 · Analysis · 需求分析 (包括学习新技术) 2h · Design Spec · 生成设计文档 0.5h · Design Review · 设计复审 (和同事审核设计文档) 0.5h · Coding

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

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

个人项目-随机生成四则运算

本周做的是一个自己单独完成的小程序,用来随机生成小学四则运算的题目. 看到这个题目时,头脑有大概的一个编写代码的思路,但都言万事开头难,到真正开始的时候却不知从何下手.于是采取老师的建议参考别人的代码,然后再自己做修改.我在百度上搜索了实现该题目的代码,最终我采用的是百度知道的知道行家ahulxh老师的代码,该代码是在Windows系统上运行,开发环境为visaul c++ 6.0.首次运行老师的代码时出现了一个bug,显示的原因是缺少头文件#include<stdio.h>,修改以后再次运行

结对项目进展二

经过这一周的结对编程工作,我们的项目取得了很大进展.我进一步体会到了结对编程的优势和劣势.优势是两人合作得当可以提高debug的效率.在队友的帮助下,我可以更快地理清思路,发现我的代码中的错误.提高效率.但是我们在交流一些深入的问题的时候,也要花费额外的时间,这也是劣势所在. 由于我们之前的程序模块划分不是很明确,不符合软件工程中“高内聚,低耦合”的思想,不便于跨平台.这次我们仔细分析了程序的结构,把功能划分成几个独立的模块,封装在类中,模块之间通过接口交换信息. 1.界面类(基于QT中的Mai

四则运算个人项目进展

一.项目要求 基本要求:将10-20道四则运算题目写入文档,程序读取并输出题目,同时计算出正确结果.使用者对每道题目计算答案,答对进行提示,答错输出正确结果.分别记录回答正确.错误的数目并输出.四则运算题目基本要求:1.加减乘除四种运算全部出现 3.算式中要出现括号2.出现真分数和假分数的运算4.最少出现一个长度为10的四则运算(10个数字的混合运算) 二.项目进展 我使用了C++进行编写,主要使用的类为自定义的堆栈类: template <class T> class arrStack{ p

结队项目进展报告

我们的结队项目打算用python语言实现. 最初决定用python实现也是因为需要自己学了一下python,但是经过一天的了解,发现python是很容易上手的,而且自己感觉和其他语言比较起来,更加贴近我的逻辑,更贴近我的语言. 但是一下子习惯python还是有些困难,在编程的过程中,我发现了以下几个问题,在此总结一下: 1.注释问题 单行注释:# 多行注释:‘‘‘ 2.数组问题 python中有list和str两种类型,list定义a=[]即可,在操作时候,由于python中不用声明变量的类型,

随机生成两个数的四则运算

Github项目地址: https://github.com/123diandian/sizeyunsuan PSP: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 20 Estimate 估计这个任务需要多少时间 1440 2200 Development 开发 700 200 Analysis 需求分析 (包括学习新技术) 180 100 Design Spec 生成设计文档 5 5 Desi

简历生成平台项目开发-STEP4第二次项目例会讨论

时间:2016.7.15周五7点半 地点:图书馆 讨论主题:交流各自手头项目进展,确定下一步任务 内容:按照之前的讨论的任务大家各自汇报进度. 汇报人:谭卓.尹忠诚 内容:1.基于富文本编辑器的模板,用户直接编辑. ~浏览器端生成(貌似不可行) ~直接打印页面(调研如何隐藏页眉页脚,貌似不可行) 见 http://stackoverflow.com/questions/1960939/disabling-browser-print-options-headers-footers-margins-

随机生成密钥

做项目用到了这个东西,遂百度其方法,记录之.代码奉上随机生成n位数字: function randomNum(n){ //n为生成数字的位数 var t=''; for(var i=0;i<n;i++){ t+=Math.floor(Math.random()*10); } return t; } alert(randomNum(6)); 随机生成n位字母 function getRandomString(len) { var chars = 'ABCDEFGHJKMNPQRSTWXYZabcd