代码仓库地址:https://git.coding.net/jiapwy/NewHomework.git(修改后的代码且没有src ,控制台输入,生成1000道题目的问题均已解决,详见代码和此博客中)
以下为要求包含的主要内容
一、需求分析
1、面向对象为小学生,所以相应设计为包含三到五个运算符的四则运算,每个算式中至少含有两个不同的运算符,且运算过程中不能出现负数和小数以及非整数。
2、合法出题数范围设计为 0 至1000,对不合理出题数目有相应处理,且四则运算中每个数在 0 至100内随机生成。
3、创建"result.txt"文件,将学号和打印题目及结果输入文件。
4、根据自身能力,在算式中加入括号和进行真分数的加减运算。
二、功能设计
1、基本功能
(1)程序中可接受输入参数n,随机产生n道四则运算。
(2)每个数字在0到100之间随机产生,运算符个数在3到5之间(目前个人能力有限,此次只实现了具有三个运算符的四则运算,日后会完善改进)
(3)每个练习题至少含有两种不同的运算符,且过程中和结果都不能出现负数和小数以及非整数。
(4)将学号和练习题及正确结果输出到文件“result.txt”中,无额外信息,路径为相对路径。
2、扩展功能
(1)支持含有括号的运算(目前实现了有两个括号的算法),且个数不超过运算符数量。
(2)真分数的加减运算暂时没有实现。
3、当程序接收的参数为4时,以下为一个输出文件示例:
三、设计实现
1、设计一个Main主函数作为程序入口
2、设计一个lastResult函数将题目和答案打印出
3、设计一个firstFourCompute函数产生具有三个运算符的练习题并计算结果
4、采用for循环将每一个练习题输入到文件中并且同时输入学号
四、算法详解
因为java基础不是很扎实,所以调度场算法以及很多算法在看了很多遍之后依然不能熟练地用在程序中,所以就用了自己的想法。
先确定只有两个数字的简单运算练习题,将加,减,除运算符形成数组,随机产生0,1,2对应数组中的运算符。
再分情况讨论,当简单练习题中运算符分别为加减除时各个对应的情况,同时加入括号。
将其连接为三个数字的运算练习题并算出结果,同时调用函数进行打印以及输入到文件中。
五、测试运行
编译源文件,输入不合法
进行正确输入并实现括号
相应“result.txt”文件中的结果
修改后通过控制台输入
非法输入
用命令行输入1000并将题目打印出来并生成文件
生成文件中题目1000并且已经消除空格
六、代码展示
生成符合标准的具有三个数的练习题(取一种情况:当第一个运算符为减号时,分情况讨论第二个运算符和第三个数字的连接,并实现括号)
public static String firstFourCompute() { String[] sign = { "-", "÷" ,"+"}; java.util.Random r=new java.util.Random(); int x=(int)r.nextInt(3); int a=(int)(Math.random()*100); int b=(int)(Math.random()*100); int sum=0; switch(x){ case 0: if(a<=b){ int temp = a; a = b; b = temp; } String m = a + sign[x] + b; String[] sign1 = { "+","*", "÷" }; java.util.Random r1=new java.util.Random(); int x1=(int)r1.nextInt(3); int c=(int)(Math.random()*100); if(x1==0){ sum=a-b; m=m + sign1[x1]+c; sum=sum+c; m=m+"="+sum; lastResult(m); return m; }//当第一个运算符为减号时,第二个运算符为加号时 else if(x1==1){ if(a==0){ lastResult(""); return ""; }else{ int mp=a-b*c; if(mp>=0){ lastResult(""); return ""; }else if (mp<=0) { m="("+m+")"+ sign1[x1]+c; sum=(a-b)*c; m=m+"="+sum; lastResult(m); return m; } }//当第一个运算符为减号时,第二个运算符为乘号时 }else{ int bc=b/c; int temp1=a-b; int temp2=(a-b)%c; if(c!=0&&b>c&&b%c==0&&a>=bc){ if(a==0){ lastResult(""); return ""; }else{ m=m + sign1[x1]+c; sum=a-b/c; m=m+"="+sum; lastResult(m); return m; } }else if(temp1>c&&temp2==0&&c!=0){ m="("+m+")"+ sign1[x1]+c; sum=(a-b)/c; m=m+"="+sum; lastResult(m); }//当第一个运算符为减号时,第二个运算符为除号时 return ""; }//当第一个运算符为减法时,由此产生的算式并求和
将练习题打印出来
public static void lastResult(String m) { System.out.println(m); }//将算式打印出来
创建文件并输入学号和所有的练习题和答案(这部分觉得构思还不错,使用循环反复调用函数来实现所有练习题的形成以及向"result.txt"的输入)
File f = new File("src/result.txt"); if(f.exists()) { System.out.print("文件存在并创建成功"); } else { System.out.print("文件不存在"); } FileWriter writer = new FileWriter(f, true); writer.write("2016012012"); writer.write("\r\n"); for(int i=0;i<100;i++){ String Hresult= firstFourCompute(); writer.write(Hresult); writer.write("\r\n"); } writer.close(); }//创建文件,并且向其中写入学号和所有算式
七、总结
在这个过程中,我把这个程序要实现的功能都分开进行了实现,首先实现输入题目数量n的功能,然后实现含有三个数字,两个运算符的练习题,再通过调用函数将练习题打印出来并产生对应数量的题目,最后创建文件并将所有题目及答案和学号输入该指定文件中。最后功能基本实现。
八、不足与感想
这次并没有使用栈的方法来进行计算题目结果,而是采用了比较笨的方法硬算,导致整个程序有些冗长复杂。而且也没有使用调度场算法,到现在也没能熟练使用,所以在编程过程中因为逻辑问题大费周折,今后在这方面一上定会进一步学习和理解,正是因为这些问题,整个程序可能还存在着一些小问题。在程序中,循环反复调用了函数,觉得还有更简单去实现的方法,但是目前还还不是很有头绪,针对这些问题,我会努力优化改进程序并且一直不断进行学习。
在这次的作业中,其实心情是十分的复杂的,一开始有些抱怨而且也不是很有信心把它做出来,归结到最终还是java的基础不牢固甚至忘得差不多了。做这次作业也花费了很多的时间,记不清语法,遇到了各种的问题,上网百度,参考同学们的代码等等。中间有时候很崩溃,也很后悔当初为什么没好好学,也很羡慕很多同学很快就能做出来,还好从来没有失去信心,虽然写出来的程序还有很多不足,但是内心的高兴是实实在在的。大学剩下的时间说长不长说短不短,希望自己能有更大的进步,补好之前欠的账,也算是不枉此次遇到的所有困难了!最后感谢老师的阅读与指正!
九、PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
8 |
10 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
15 |
Development |
开发 |
1440 | 2880 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
50 |
· Design Spec |
· 生成设计文档 |
5 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
40 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
12 |
· Design |
· 具体设计 |
30 |
15 |
· Coding |
· 具体编码 |
1360 |
2200 |
· Code Review |
· 代码复审 |
30 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
30 |
Reporting |
报告 |
9 |
5 |
· Test Report |
· 测试报告 |
5 |
3 |
· Size Measurement |
· 计算工作量 |
5 |
3 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
20 |