2018102992小学四则运算练习软件项目报告
代码地址:https://coding.net/u/bow1024/p/testBybrm/git
1.需求分析
设计一个四则运算随机生成器,要求:
- 生成的运算符在3-5个(等号属于运算符),运算数为0-100的整数
- 每个式子至少有两种不同运算符(不包括等号)
- 运算存储在result.txt文件中,第一行是学号,后面存储运算式
- 程序输入仅有生成式子个数n
2.功能设计
实现基本运算功能:
- 运算式中不出现负数和非整数,结果中小数保留两位
- 命令行输入n(进行合法性控制),生成结果写入result.txt文件
3.设计实现
程序结构如下:
1.接收命令行输入正整数n,用正则表达式判断其合法性
2.循环n次,每次生成一个式子,当随机生成的式子不符合条件时(有两点,1所有运算符都一样,2除号后面是零)跳出此次循环,循环计数减一,重新生成式子。
3.生成的符合条件的式子进行计算,运算结果写入到result.txt文件中。
该部分重点建立程序整体结构,其核心部分为运算部分,在下一节中说明。
4.算法详解
运算过程从左向右一次读取随机生成的运算数和运算式,举例"2+3* 5-1="中有四个运算数[2,3,5,1]和四个运算符[+,*,-,=],其中乘除的优先级高,加减和等于的优先级低,则根据运算数前后的运算符决定其几种不同情况:
1.加(减)在结果中;
2.乘(除)在暂存数中;
3.乘(除)结束,暂存数加(减)在结果中。根据判断运算数前后的运算符进行不同运算。
//运算
//sum为最终结果,pro为乘积暂存,lastOp表示上一个运算符
double sum = 0.00, pro=1;
int lastOp = 0;
for (int j = 0; j < x; j++) {
int ysf = yunSuanFu.get(j); //取出此轮循环的数字和运算符
int sz = shuZi.get(j);
//乘除的情况全部暂乘(除)在pro里
if (ysf == 2 || ysf == 3) {
switch (lastOp) {
case 0:
pro *= sz;
break;
case 1:
pro *= -sz;
break;
case 2:
pro *= sz;
break;
case 3:
pro /= sz;
break;
default:
break;
}
}
//加减等于的情况
else {
if(lastOp == 0) sum += sz; //直接加减
else if(lastOp == 1) sum -= sz;
else if(lastOp == 2){
pro *= sz;
sum += pro;
pro = 1; //完成连乘(除)运算,pro清空为1
}else{
pro /= sz;
sum += pro;
pro = 1; //同上
}
}
lastOp = ysf;
System.out.print(sz+op[ysf]);
data.append(sz);
data.append(op[ysf]);
}
变量ysf为当前运算数后面的运算符对应的数组["+","-","*",“÷”,"="]下标,分两种情况进行讨论:
1.运算符为乘除,该数乘(除)在暂存数pro上
2.运算符为加减等于,当前面是加(减)时,该数加(减)在结果sum上;前面是乘(除)时,该数乘(除)在暂存数pro上,同时乘(除)结束,暂存数pro加(减)在结果中。
注:实现仅为加减乘除,未考虑实现扩展功能:带括号的算式,若考虑带括号的算式,该算法的逻辑变得太复杂,需选用堆栈进行计算。
5.代码测试
进行合法和非法输入测试,此处仅展示部分测试
打印到屏幕上与写入的文件进行对比
在此执行的结果会追加在该文件的内容后面
6.代码展示
接收命令行输入
String input = sc.nextLine();
//合法性控制
while(!isPositiveInteger(input)){
System.out.println("please input a positiveInteger n:");
input = sc.nextLine();
}
Integer n = Integer.parseInt(input);
随机生成一个3-5的数
//运算数字个数(3-5)
Integer x = (int)(Math.random() * 100) % 3 + 3;
生成式子
//生成式子
shuZi.add((int)(Math.random() * 100));
for (int j = 0; j < x-1; j++) {
//加一个运算符
int index = (int)(Math.random() * 100) % 4;
yunSuanFu.add(index);
judge.add(index);
//加一个数字
int num = (int)(Math.random() * 100);
shuZi.add(num);
//判断除零
if(index == 3 && num == 0){
judge_0 = 1;
break;
}
}
写入文件
//写入文件
FileWriter fileWritter = new FileWriter(file.getName(),true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
bufferWritter.write(data.toString()); //写入文件(StringBuffer转String)
bufferWritter.newLine();
bufferWritter.close();
7.结果
通过这个程序的设计及编写,在程序设计阶段,可以把功能切分,把涉及到相同变量的部分小功能模块化开发。
关于变量命名问题依然不太熟练,由于英语水平限制,很多变量命名时甚至需要翻译工具辅助,由此很多变量偷懒用了汉语拼音甚至缩写。
8.PSP
任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|
计划 | 10 | 10 |
估计所需时间并规划大概步骤 | 10 | 10 |
开发 | 198 | 271 |
需求分析 | 5 | 5 |
生成设计文档 | 5 | 8 |
设计复审 | 3 | 4 |
代码规范 | 5 | 4 |
具体设计 | 30 | 40 |
具体编码 | 90 | 120 |
代码复审 | 30 | 60 |
测试 | 30 | 30 |
报告 | 15 | 20 |
测试报告 | 5 | 6 |
计算工作量 | 5 | 4 |
事后总结 | 5 | 10 |