java实现随机四则运算
使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习,软件基本功能要求如下:
- 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
- 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
- 当程序接收的参数为4时,以下为输出文件示例。
2018010230
13+17-1=29
11*15-5=160
3+10+4=1
15/5+3-2=4
Github项目地址:
需求分析:
- 通过程序接受一个数字,产生N道加减乘除练习题。
- 判断传入参数是否合法
- 每个数字在0-100之间,运算符3-5个
- 运算过程不能出现负数和非整数
- 计算练习题
- 所有信息输出到txt文件
功能设计:
- 编写主函数
- 编写输入是否合法函数
- 随机生成运算式
- 编写计算运算式函数
- 结果写入txt辅助类
设计实现:
- 编写主函数并通过命令行接收参数
- 判断传入参数是否合法
- 随机选择加减乘除运算符
- 根据产生运算符的个数生成一定运算数的运算式并存入List集合
- 当随机产生的运算符是“/”时,判断被除数是否能整除除数,如果不能,随机产生能够被整除的除数。
- 遍历List集合通过函数计算集合中每个运算式的结果
- 编写写入txt文件函数
测试运行:
核心代码:
随机产生num个运算式,并将产生的运算式存入List集合
char[] operator=new char[]{'+','-','*','/'};
Random random=new Random();
ArrayList<String> expression=new ArrayList<String>();
for(int i=0;i<num;i++){
int n=random.nextInt(3)+3; //3-5个运算符
int[] number=new int[n+1];
String ex=new String();
for(int j=0;j<=n;j++){
number[j]=random.nextInt(100)+1; //4-5个数字
}
for(int j=0;j<n;j++){
int s=random.nextInt(4);//随机选择某个运算符
ex+=String.valueOf(number[j])+String.valueOf(operator[s]);///5+4+6+9
if(s==3){number[j+1]=decide(number[j],number[j+1]);}
}
ex+=String.valueOf(number[n]);
expression.add(ex);
}
当被除数不能整除除数时,随机生成能够整除的除数
/**
* 随即取x,y为1-100之间,x可以整除y的y值
* @param x
* @param y
* @return
*/
private static int decide(int x,int y){//通过递归实现整除
Random random=new Random();
if(x%y!=0){
y=random.nextInt(100)+1;
return decide(x,y);
}
else{
return y;
}
}
通过javascript的eval函数计算字符串内的运算式
/**
* 计算每个等式的结果,并返回运算式
* @param arrayList
* @return arrayList
*/
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
private static ArrayList<String> calculate(ArrayList<String> arrayList){
ArrayList<String> ArithExpress=new ArrayList<String>();
for(String ax:arrayList){
try {
ax=ax+"="+jse.eval(ax);
System.out.println(ax);
ArithExpress.add(ax);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return ArithExpress;
}
总结:
本程序的主要难点在于运算式的随机生成和运算式的计算,后者借助于Javascript的eval函数通过求解字符串内的运算式得到解决,编程重点解决随机生成运算式部分
PSP:
PSP | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
计划 | 10 | 12 | |
Estimate | 需求分析,函数实现 | 10 | 10 |
开发 | 30 | 30 | |
Analysis | 需求分析 | 5 | 10 |
Design Spec | 设计 | 5 | 5 |
Design Review | 设计复审 | 2 | 2 |
Design | 具体设计 | 5 | 5 |
Coding | 具体编码 | 20 | 20 |
Code Review | 代码复审,查找语法错误 | 2 | 2 |
Test | 测试 | 5 | 5 |
报告 | 10 | 10 | |
Test Report | 经测试,程序编译正确,运行结果正确,完全符合要求 | 2 | 2 |
Size Measurement | 由于程序功能较为简单,需求分析的工作量很小,故本次实验的主要工作主要在于编程 | 2 | 2 |
Postmortem | 对于此程序,计算部分还有大的改进空间,可以采用将中缀表达式转换为后缀表达式,通过正则判断运算符优先级来实现算式的结果,而不是另辟他法调用Javascript函数 | 2 | 2 |