个人开发流程
个人开发流程--四则运算(刘向宇)
一、需求分析
主要对于小学生写的四则运算软件,主要用来计算简单的算式,并且要能根据用户所提交的答案生成答题报告,答题报告中主要包括,本次答题的正确,错误,和重复表达式出现的情况。对生成的表达式有如下要求,不能在过程中产生负数,因为小学生并不会计算负数,以及不能出现除0的情况,因为小学生不会计算除以0,以及不能出现负数这个概念。
二、生成设计文档

从这个软件功能来看,大致可以分为三个模块,生成表达式,表达式计算(包括将表达式和答案写入文件),答题报告的生成(包括表达式的查重和根据输入完成的校验)。各个模块之间关系密切,故采用由下至上的不断迭代的开发模式。
表达式计算:可采用将随机生成的表达式转换为后缀,在对后缀表达式进行计算完成。
生成表达式模块:主要的关键点在于如何能够全覆盖所有不超过三个运算符含有真,假分数,整数的可以带有括号的四则运算表达式。
三、具体设计
随机生成一条四则运算式,并判断参与四则运算的运算符的运算次序,且运算结果必须大于0,否则循环重新产生一条四则运算式。屏幕显示四则运算式,用户输入自己的运算结果,至少精确2位小数。与系统标准结果进行比较,若相同则输出正确的提示信息,并使正确的运算结果条数+1,正确率+1;若不相同,则输出错误的提示信息,屏幕输出标准答案。
四、具体编码
初学习就是框架师 2021/4/10 18:51:51 import java.util.Arrays; import java.util.Scanner; import org.junit.Test; public class Oper1 { @Test public void testOperation(){ Scanner sc = new Scanner(System.in); //为了方便测试,没有用Scanner,用的话应该String s = sc.next();就能从控制台输入内容 String s ="10-2*2/2+4+3*4/4+1"; //将加号替换成减号,不能用减号替换加号,因为正则表达式的原因,这里就不多赘述 String s1 =s.replace("+","-"); //分割字符然后放进数组 String[] str = s1.split("-"); //这里初始化加减结果 double total1=0; //这里是查看切割后的结果,我们来看下结果:[10, 2*2/2, 4, 3*4/4, 1],截取出来就是这个样子。 System.out.println(Arrays.toString(str)); //然后我们来操作数组,把里面的乘除结果算出来,先遍历数组 for(String str1:str){ System.out.print(str1); //判断是否含有乘或除 if(str1.contains("*")||str1.contains("/")){ //乘除结果 double total = 0; //将有乘或除的字符串遍历 for(int i =0;i<str1.length();){ //截取字符串的变化长度 int count =1; //遍历后面的每一个字符 a:for(int j =i+1;j<str1.length();j++){ //截取字符 char c =str1.charAt(j); //判断是否是乘或除 if(c=='*'||c=='/'){ break a; }else{ count++; } } //将数字截取出来 String s2 =str1.substring(i,i+count); //转为小数 double d = Double.parseDouble(s2); if(i==0){ //将第一个数变为初始值 total = d; }else{ char c1 = str1.charAt(i-1); //判断数字前面的是乘或是除,然后分别乘除 if(c1=='*'){ total*=d; }else if(c1=='/'){ total/=d; } } //最后将计数器的累加条件改变 i+=count+1; } System.out.println(total); //将结果替换到原来的字符串里 s= s.replace(str1, total+""); System.out.println(s); } } //进行加减运算 System.out.println(s); for(int i =0;i<s.length();i++){ int count =1; a:for(int j=i+1;j<s.length();j++){ char c = s.charAt(j); if(c=='+'||c=='-'){ break a; }else{ count++; } } String s3= s.substring(i,i+count); System.out.println(s3); double d2 = Double.parseDouble(s3); if(i==0){ total1 = d2; }else{ char c = s.charAt(i-1); if(c=='+'){ total1+=d2; }else if(c=='-'){ total1-=d2; } } i+=count; } System.out.println(total1); } }
五、测试运行
本程序从源码开始经过多次调试,若产生的四则运算式的运算结果为整数,在对用户输入结果和系统标准结果进行比较时,则不会有问题。但是若产生的四则运算式的运算结果有小数位时,在对用户输入结果和系统标准结果进行比较时,即使两个结果相等,程序依然提示错误信息。
六、项目总结
在需求分析和设计上应该投入更多的时间,前期设计时并没有考虑查重应用导致后期若想采用二叉树代价略高,只能采用查重表达式的方式,其实现在想想比较好的处理方法应该是采用二叉树的数据结构方式去生成表达式,去计算表达式,去查重表达式,若只在查重阶段采用二叉树,则代价太高。
在完成这个项目的过程中,加深了我对java语言知识的充分运用以及理解,使自己的编程水平得到了一定的提高。我觉得自己在处理问题方面的能力也提高了,比如在编程中有时会忘记一些小步骤,未给变量赋初值就直接使用,导致程序无法运行。这时我会认真思考问题,调试代码,查找错误,理顺这其中的逻辑关系,然后再对程序进行修改,从而克服困难。
七、psp
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
20 |
25 |
|
· Estimate |
估计每个任务需要多少时间 |
20 |
25 |
|
Development |
开发 |
230 |
320 |
|
· Analysis |
需求分析 (包括学习新技术) |
30 |
20 |
|
· Design Spec |
生成设计文档 |
10 |
10 |
|
· Design Review |
设计复审 |
10 |
15 |
|
· Coding Standard |
代码规范 |
10 |
10 |
|
· Design |
具体设计 |
30 |
35 |
|
· Coding |
具体编码 |
60 |
70 |
|
· Code Review |
代码复审 |
30 |
25 |
|
· Test |
测试(自我测试,修改代码,提交修改) |
50 |
60 |
|
Reporting |
报告 |
30 |
35 |
|
Test Report |
测试报告 |
0 |
0 |
|
·workload |
计算工作量 |
30 |
40 |
|
·correction |
并提出过程改进计划 |
0 |
0 |

浙公网安备 33010602011771号