您的位置:首页 > 其它

个人作业1——四则运算题目生成程序(基于控制台)

2017-03-07 21:54 465 查看
一、需求分析

1、题目要求:

看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习、练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序

从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

1、除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24

2、运算符为 +, −, ×, ÷

3、并且要求能处理用户的输入,并判断对错,打分统计正确率。

4、要求能处理用户输入的真分数, 如 1/2, 5/12 等

5、使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目

Myapp.exe -n 10

2、题目分析:

(1)是基于小学的四则运算题目,所以不会出现负数的结果,且只有两个数的简单四则运算;

(2)支持真分数和整数的运算;

(3)能够判断对错,若错误则输出正确答案;

(4)能够计算正确率并输出。

二、功能设计

1、自动随机生成真分数和整数;
2、随机生成一则简单的四则运算题目;
3、能够计算题目,并判断用户输入的答案正确与否,若错误则输出正确答案;
4、能够计算用户答题的正确率。

三、设计实现

java类有:createFraction、createInteger、main三类:
(1)createFraction:是负责随机创造两个真分数并组成四则运算,有真分数的运算方法,公约数的计算方法,最小公倍数的计算方法;
(2)createInteger:是负责随机创造两个整数并组成四则运算,有整数的运算方法,公约数的判断方法等;
(3)main:负责调用createFraction、createInteger两类,随机选择真分数或整数的四则运算组成多个题目并输出正确率。

四、代码说明

真分数生成:

public static int[] createFraction(){
int[] fraction=new int[2];
int fraction1 = (int)(Math.random()*10+1);//避免分子出现零
int fraction2 = (int)(Math.random()*10+1);//避免分母出现零
if(fraction1!=fraction2){           //避免出现分母分子相同
if(fraction1<fraction2){        //避免出现假分数
fraction[0]=fraction1;
fraction[1]=fraction2;
return fraction;
}else{
fraction[0]=fraction2;
fraction[1]=fraction1;
return fraction;
}
}else
createFraction();
return fraction;

}

最大公约数:

public static int GCD(int m, int n) {  //辗转相除法求最大公约数
if (n == 0)
{
throw new IllegalArgumentException("Argument 'divisor' is 0");
}
else
{
if ((m = m % n) == 0)
return n;
else
return m;
}
}

最小公倍数:

public static int LCM(int m, int n) {  //求最小公倍数
return m*n/GCD(m,n);
}

生成真分数的四则运算及判断对错:

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);//真分数的计算
int op=(int)(Math.random()*4+1);
int[] f1 = createFraction();
int[] f2 = createFraction();
int j=GCD(f1[0],f1[1]);
f1[0]=f1[0]/j;
f1[1]=f1[1]/j;
j=GCD(f2[0],f2[1]);
f2[0]=f2[0]/j;
f2[1]=f2[1]/j;
int gbs = LCM(f1[1],f2[1]);
if(op==1){//加法
System.out.println("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")=");
int num1=f1[0]*f2[1]+f2[0]*f1[1];

int num2=f1[1]*f2[1];
int num3=GCD(num1,num2);
num1=num1/num3;
num2=num2/num3;
String a=new String();
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
String ans=in.next();
if(ans.equals(a))
{
System.out.println("true");
}
else
{
System.out.println("false");
System.out.println("The correct answer is "+a);
wrong=wrong+1;
}

}
if(op==2){//减法
int num1=f1[0]*f2[1]-f2[0]*f1[1];
if(num1>0){  //防止出现负数
System.out.println("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")=");
int num2=f1[1]*f2[1];
String a=new String();
if(num1==0)
{
a="0";
}
else
{
int num3=Math.abs(GCD(num1,num2));
num1=num1/num3;
num2=num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
}
String ans=in.next();
if(ans.equals(a))
{
System.out.println("true");
}
else
{
System.out.println("false");
System.out.println("The correct answer is "+a);
wrong=wrong+1;
}
}else{
System.out.println("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")=");
int num11=f2[0]*f1[1]-f1[0]*f2[1];
int num2=f1[1]*f2[1];
String a=new String();
if(num11==0)
{
a="0";
}
else
{
int num3=Math.abs(GCD(num11,num2));
num11=num11/num3;
num2=num2/num3;
if(num11==num2)
{
a="1";
}
else
{
a=num11+"/"+num2;
}
}
String ans=in.next();
if(ans.equals(a))
{
System.out.println("true");
}
else
{
System.out.println("false");
System.out.println("The correct answer is "+a);
wrong=wrong+1;
}
}
}
if(op==3){//乘法
System.out.println("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")=");
int num1= f1[0]*f2[0];
int num2 = f1[1]*f2[1];
int num3=GCD(num1,num2);
String a=new String();
num1= num1/num3;
num2 = num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
String ans=in.next();
if(ans.equals(a))
{
System.out.println("true");
}
else
{
System.out.println("false");
System.out.println("The correct answer is "+a);
wrong=wrong+1;
}

}
if(op==4){//除法
System.out.println("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")=");
int num1= f1[0]*f2[1];
int num2 = f1[1]*f2[0];
int num3=GCD(num1,num2);
String a=new String();
num1= num1/num3;
num2 = num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
String ans=in.next();
if(ans.equals(a))
{
System.out.println("true");
}
else
{
System.out.println("false");
System.out.println("The correct answer is "+a);
wrong=wrong+1;
}

}

}

main类:

public static void main(String[] args) {
// TODO Auto-generated method stub
int wrong;
createFraction f = new createFraction();
createInteger i = new createInteger();
System.out.println("Please enter the subject number:");
Scanner a = new Scanner(System.in);
int n = a.nextInt();
int m = (int)(Math.random()*n+1);//随机整数题目和分数题目的题量
for(int j=0;j<(n-m);j++){//整数题目
f.main(null);
}
for(int j=0;j<m;j++){//分数题目
i.main(null);
}
wrong=f.wrong+i.wrong;//计算正确率
int sum=100-(wrong*100/n);
System.out.println("The accuracy is:"+sum+"%");
}

五、测试运行





六、PSP



七、小结

对java并不是很熟悉,所以写得很艰难,边百度边学边写,一开始并不知道怎么写,只能慢慢摸索,结果就是程序疯狂报错,最后好不容易才写完了_(:зゝ∠)_

因为用了很多的if嵌套语句,有的if语句还是后来添上的,大括号经常丢了,然后对个半天。。。。以及我没法把程序打包成exe文件,弄了半天还是不行,百度了也没解决_(:зゝ∠)_

我在真分数运算的createFraction类里的最大公约数那写了个异常抛出,在没写之前是经常给我报被除数为零的异常错误,我不知道错哪里了= =,而且我在整数运算里并没有写异常抛出也没报过错啊。。。。最后百度了半天才写了个异常抛出,然而并不知道到底写对了没_(:зゝ∠)_。。。

码市地址:https://git.coding.net/Belong033/java-Frist.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: