2017012314——100以内的混合四则运算项目报告
大家好! 本文大致描述了一个小学生四则运算软件的开发过程,既是对该段时间学习的记录,亦是对自己学习过程的一个总结。
需求分析
1.通过命令行程序输入一个数字n,产生n道100以内的加减乘除练习题;
2.判断传入参数是否合法,是否是在0-100之间的整数(或真分数);
3.考虑到用户对象是小学生,每个数字在0-100之间,运算符3-5个;
4.由于小学生的知识储备,故运算过程不能出现负数(减法时注意)和非整数(除法时注意);
5.一个完整的软件还需考虑进倒计时功能,如一道题若20s内未能完成,即得0分进入下一题;或者可以检验并输出判断对错,给出对错的数量,从而记录成绩或展现历史记录;并保证题目不重等;
6.最后计算出练习题结果,并将所得信息输出到result.txt文件。
基础功能设计
1)程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号±*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
2)为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
3)练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
扩展功能设计
1)支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。
2)扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。
PSP记录
任务 | 实际所用时间(min) |
---|---|
计划(planning) | 60 |
-需求分析(analysis)- | -40- |
查找资料(research) | 460 |
– | – |
设计(design) | 60 |
-编码(coding)- | -280- |
复审(review) | 200 |
– | – |
测试(test) | 80 |
-报告(reporting)- | -160- |
核心代码
1.处理负数和整除问题
// An highlighted block
int answer=0;//判断结果是否为负数
public String EasyQuestion1() {
// 产生最简单部分等式的方法
int a = (int) (Math.random() * 100);// 产生100以内的随机数
int b = (int) (Math.random() * 100);
int c = (int) (Math.random() * 4);// 产生整数0到3
if (c == 1) {
// 如果是“-”,保证a比b大,避免出现负数
if (a < b) {
int temp = a;
a = b;
b = temp;
}
}
if (c == 3) {
// 如果是除法,保证能整除
b = (int) (Math.random() * 20) + 1;
a = (int) (Math.random() * 6) * b;
}
String m = a + op[c] + b;
if (op[c].equals("-") || op[c].equals("+")) {
// 减号时使flag等于1
flag = 1;
}
return m;
}
2.括号问题
// An highlighted block
public String ComplexQuestion2(int p) {
// 产生一个包含3-5个运算符的四则运算的方法
String question = "";
for (int i = 0; i < p; i++) {
if (i < p - 1) {
String con = op1[(int) (Math.random() * 2)];
if (con.equals("*")) {
String com = EasyQuestion1();
if (flag == 1) {
//如果前面是加减后面是乘除的话,加括号
question += "(" + com + ")" + con;
} else {
question += com + con;//生成一个最简运算式子,和符号
}
} else {
question += EasyQuestion1() + con;
}
} else {
question += EasyQuestion1();//最后一次只需生成一个最简运算式子,不需要再生成符号
}
flag = 0;//每次生成完把falg清0
}
return question;
}
3.利用栈中缀表达式转后缀表达式
// An highlighted block
public void MakeQuestion3() {
//运算混合四则运算方法,利用栈实现
Stack<String> number = new Stack<String>();//创建一个存储数字或符号的栈
Stack<Character> operate