作业在github的地址:https://github.com/LVowe999/Demo_2
说起小学四则运算,刚开始我觉得并不是很难,因为在上一周我就用android写了一个四则运算运算器,题目是手动输入的,因为之前也没有进行项目分析,导致我写错了项目。
直到这周看了发布的作业以后,下面是对项目的设计
一:需求分析
本次程序是设计一个适合自动出题,适合小学生练习四则运算的程序,程序要求如下:
程序可接收一个输入参数n,n为整数,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,这样的数字在小学生的知识中是可接受和可运算的。运算符在3个到5个之间,运算符的产生也是随机的。
为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。这样写适合学生练题之后进行结果比对。
二:功能设计:
本软件的功能是实现自动出题,其中学生输入n 整数表示所出的题目数量,n只能为自然整数。所出的题目之间不能重复。算出正确答案并且和学生提交的答案进行对比,给出提示。
三:设计实现
使用模块化程序设计,第一个模块产生随机数字和运算符;第二个模块对产生的运算式进行打印输出,并且运算结果和小学生提交的结果进行对比和答案提示;第三个模块是对运算过程使用的算法进行详细规划。
因为java学的不好!所以总的类就写了一个。函数别是 input()实现四则元算的产生和运算结果的回调与小学生提交的答案的对比后的结果进行输出;add()进行加法运算的算法实现;sub()进行减法运算的算法和被减数与减数之间的规则;
四:软件测试
对软件进行功能测试,是否符合出题规则:1,被减数大于等于减数;2,被除数是除数的整数倍;3,运算符的优先级是否正确。
五:测试结果
PSP:
PSP2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 20 | 15 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 200 | 300 |
·· Analysis | 需求分析 (包括学习新技术) | 15 | 30 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 5 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 8 | 8 |
· Design | 具体设计 | 10 | 180 |
· Coding | 具体编码 | 100 | 180 |
· Code Review | · 代码复审 | 8 | 6 |
· Test | · 测试(自我测试,修改代码,提交修改) | 10 | 15 |
Reporting | 报告 | 8 | 8 |
·· Test Report | · 测试报告 | 5 | 10 |
· Size Measurement | 计算工作量 | 2 | 2 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 30 | 30 |
六:软件总结
通过本次软件设计让我充分的了解到了软件分析和算法设计的重要性,因为第一次写四则运算的时候我选用的算法是迭代算法,一次性给出了随机产生的五个数字和四个随机运算符号,当然这样设计是很容易就会产生一个式子的,问题也很明显,就是在这个随机产生的式子中很难去约束1,被减数大于等于减数;2,被除数是除数的整数倍;3,运算符的优先级是否正确。因为花了一天时间也没有想出来具体的算法实现。以下附上第一次设计的代码
import java.util.Scanner; public class Demo_1 { static int n; public static void main(String[] args) { input(); } public static void input(){//a,b,表示前一个随机数和当前随机数,e表示计算的结果, int a,b,c,d=1,e=0,able,temp = 0,equal = 0,answer; String str,oprt=null; System.out.println("***请输入要输入出题的道数***"); Scanner s =new Scanner (System.in); n=s.nextInt(); while(n>0){ b=1+(int)(Math.random()*100); str=String.valueOf(b); for(int i=0;i<3;i++){ e=b; temp=1+(int)(Math.random()*4); a=1+(int)(Math.random()*100); switch(temp){ case 1: oprt="+"; if(i==0) e=b; else if(i>0) b=b+a; break; case 2: if(b>=a){ oprt="-"; } else if(b<a){ c=a; a=b; b=c; oprt="-"; } else b=b-a; break; case 3: oprt="*"; b=b*a; break; case 4: if(b>a||b%a==0){ oprt="/"; b=b/a; } else{ oprt="*"; b=b*a; } break; } str=str+oprt+a; equal=a; } System.out.println(str+"="+"\n请输入计算的答案"); // answer(str); answer=s.nextInt(); if(answer==equal){ System.out.println("答案正确"); } else System.out.println("答案错误!正确答案为:"+equal); n--; str=""; oprt=""; } } }
最后我意识到之所以程序写不下去是因为我在需求分析和算法设计上的问题的时候,我又花了三个小时从新分析需求和算法设计,当我设计好算法以后用了大概四个小时写出了基本的需求,完成了最基本的需要,因此我从中认识到了一个项目或者程序,最重要的阶段是需求分析和项目设计阶段,如果这个阶段做的好了的话,那么写一个程序在单纯的编写过程中是不会用很多时间的。