20175314 结队编程项目——四则运算第一周
结对小组成员:20175302闫君廷 20175314薛勐
任务要求
1、自动生成四则运算题目(加、减、乘、除)
2、支持复合运算(支持整数、多运算符、支持真分数)
3、统计正确率或得分
4、既可以用前缀算法(波兰算法)实现加减乘除也可以用后缀算法实现
需求分析
1、自动生成表达式(多运算符,随机数为整数)
2、运用堆栈前缀表达式的计算机求值
3、计算自动生成的表达式的结果
4、判断用户输入的答案是否和正确答案相符
5、统计正确题目的个数
本周达成
- 自动生成四则运算题目(加、减、乘、除)并可控整数范围和题目数量
- 支持复合运算(支持整数、多运算符、支持真分数)
- 可以反馈题目正确与否,若错误则给出正确答案
代码
PracticeSystem.java
import java.util.*;
public class PracticeSystem {
public static void main(String[] args) {
int a, b, c, i, f , y, m1, m2, x1, x2;
yunsuan yunsuan =new yunsuan();
Scanner in = new Scanner(System.in);
System.out.println("欢迎使用四则运算系统");
System.out.println("请输入题目数量:");
int total = in.nextInt();
System.out.println("请输入整数范围:");
y = in.nextInt();
for (i = 0; i < total; i++) {
f = (int) (Math.random() * 2);//随机生成0或1,0是整数,1是真分数,3,4是复杂运算
if (f == 0) {
int d = 0;
int answer;
a = (int) (Math.random() * (y + 1));//随机生成一个范围内的整数
b = (int) (Math.random() * (y + 1));//随机生成一个范围内的整数
if (b == 0)
c = (int) (Math.random() * 3);//随机生成一个0-3的整数,0表示加法,1表示减法,2表示乘法,3表示除法
else
c = (int) (Math.random() * 4);
if (c == 0) {
d =yunsuan.jia(a,b);
}
if (c == 1) {
d =yunsuan.jian(a,b);
}
if (c == 2) {
d =yunsuan .cheng(a,b);
}
if (c == 3) {
d =yunsuan.chu(a,b);
}
answer = in.nextInt();
if (answer == d)
System.out.println("回答正确");
else
System.out.println("回答错误,正确答案是:" + d);
}
if (f == 1) {
String d = null;
m1 = 1 + (int) (Math.random() * y);//随机生成一个小于y的分母
x1 = 1 + (int) (Math.random() * m1);//生成一个比分母小的分子,实现真分数
m2 = 1 + (int) (Math.random() * y);//随机生成一个小于y的分母
x2 = 1 + (int) (Math.random() * m2);//生成一个比分母小的分子,实现真分数
c = (int) (Math.random() * 4);//生成运算符
if((x1/m1)<(x2/m2)&&c==1)
c--;
if (c == 0) {
d=yunsuan.fjia(m1,x1,m2,x2);
}
if (c == 1) {
d=yunsuan.fjian(m1,x1,m2,x2);
}
if (c == 2) {
d=yunsuan.fcheng(m1,x1,m2,x2);
}
if (c == 3) {
d=yunsuan.fchu(m1,x1,m2,x2);
}
String answer = in.next();
if (answer.equals(d))
System.out.println("回答正确");
else
System.out.println("回答错误,正确答案是" + d);
}
}
}
}
yunsuan.java
class yunsuan {
int jia(int a, int b){
System.out.print(a + " + " + b + " = " );
return a+b;
}
int jian(int a, int b){
System.out.print(a + " - " + b + " = " );
return a-b;
}
int cheng(int a, int b){
System.out.print(a + " * " + b + " = " );
return a*b;
}
int chu(int a, int b){
System.out.print(a + " / " + b + " = " );
return a/b;
}
String fjia(int m1,int x1,int m2,int x2){
int Z,M;
Z = x1 * m2 + x2 * m1;
M = m1 * m2;
System.out.print("("+x1 + "/" + m1 + ") + (" + x2 + "/" + m2 + ") = ");
return yuefen.yf(Z, M);
}
String fjian(int m1,int x1,int m2,int x2){
int Z,M;
Z = x1 * m2 - x2 * m1;
M = m1 * m2;
System.out.print("("+x1 + "/" + m1 + ") - (" + x2 + "/" + m2 + ") = ");
return yuefen.yf(Z,M);
}
String fcheng(int m1,int x1,int m2,int x2){
int Z,M;
Z = x1 * x2;
M = m1 * m2;
System.out.print("("+x1 + "/" + m1 + ") * (" + x2 + "/" + m2 + ") =");
return yuefen.yf(Z, M);
}
String fchu(int m1,int x1,int m2,int x2){
int Z,M;
Z = m2 * x1;
M = m1 * x2;
System.out.print("("+x1 + "/" + m1 + ") / (" + x2 + "/" + m2 + ") = ");
return yuefen.yf(Z, M);
}
}
yuefen.java
class yuefen {
static String yf(int a, int b) {
int y = 1;
for (
int i = a;
i >= 1; i--) {
if (a % i == 0 && b % i == 0) {
y = i;
break;
}
}
int z = a / y;
int m = b / y;
if (z == 0) {
return "0";
}
return "" + z + "/" + m;
}
}
UML类图
截图
问题
最早使用的是Scanner语句进行参数输入,后来请教了同学学习使用命令行输入,在终端java的时候一起输入参数,输入方式感觉极为奇怪,暂时没有发现这样输入的优势。