小组成员:
黄丽萍,杜若憧
工作照片:
设计思想:
没有括号时:
对整数’+’,’-’,’*’运算直接由用户输入结果,与计算结果进行比较。‘/’先化简再用字符串类型以最简分数的形式输出。
对分数运算:分别求出分子和分母,用simplify()函数将其化简,并用字符串类型将其以最简分数的形式输出。
有括号时:
使用新的数组rs[]储存括号计算结果,用op[]储存括号外的运算符。利用for循环,先找到‘*’,‘/’运算符将符号两边的数进行计算,将后一个数修改为0,此运算符修改为‘+’。再而计算‘+’,‘-’运算。
源代码:
import java.text.DecimalFormat;
import java.util.Scanner; public class operate { static int simplify(int x,int y){/*求两数最大公约数,用于分数化简*/ int t,xx,yy,k=1; if(x>y) { t=x;x=y;y=t; } if(x<0) { x=-1*x; } if(y<0) { y=-1*y; } for(int i=x;i>=2;i--) { xx=x%i;yy=y%i; if(xx==0&&yy==0) { k=i; break; } } return k; } public static void main(String[] args) { // TODO 自动生成的方法存根 int a1,a2,b1,b2,k; int count=0;//统计作对题目个数 /*控制题目个数*/ Scanner in=new Scanner(System.in); System.out.print("请输入题目个数(>0):"); int number=in.nextInt(); /*数值范围*/ System.out.print("请输入数值所取得最大值(>0):"); int max=in.nextInt(); /*判断括号*/ int backets; System.out.print("是否有括号:(0:无 1:有):"); backets=in.nextInt(); if(backets==0)//没有括号 { /*控制是否有负数*/ System.out.print("是否有负数:(0:无 1:有):"); int negative=in.nextInt(); /*控制是否有乘除*/ System.out.print("是否有乘除法(0:无 1:有):"); int panduan; for(;;) { panduan=in.nextInt(); if(panduan==0||panduan==1) break; else panduan=in.nextInt(); } /*有无余数*/ int remainder=0; if(panduan==1){ System.out.print("是否有余数:(0:无 1:有):"); remainder=in.nextInt();} /*算法的实现*/ for(int i=0;i<number;i++) { int index; if(panduan==0) { index=(int)(Math.random()*1); } else { index=(int)(Math.random()*4); //随机产生,控制运算符 } a1=(int)(Math.random()*max); a2=(int)(Math.random()*(max-1)+1); b1=(int)(Math.random()*max); b2=(int)(Math.random()*(max-1)+1); k=(int)(Math.random()*2); //控制是否是整数或分数,随机产生 if(k==0)//k=1输出整数运算 { if(index==0) //加法运算 { if(negative==0)//没有负数 { System.out.print(a1+"+"+b1+"="); int rs=a1+b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else //有负数 { a1=-1*a1; System.out.print(a1+"+"+b1+"="); int rs=a1+b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==1)//减法运算 { if(negative==0) {//无负数 if(a1>b1) { System.out.print(a1+"-"+b1+"="); int rs=a1-b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else { System.out.print(b1+"-"+a1+"="); int rs=b1-a1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else//有负数 { System.out.print(a1+"-"+b1+"="); int rs=a1-b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==2)//乘法运算 { System.out.print(a1+"*"+b1+"="); int rs=a1*b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } if(index==3)//除法运算 { if(remainder==0) {//没有余数 for(int kk=0;;) { //余数不为0.继续生成随机数 if(a1!=0) { //判断分母是否为0 if(b1%a1!=0) { a1=(int)(Math.random()*max); b1=(int)(Math.random()*max); } else break; } else a1=(int)(Math.random()*max);} } System.out.print(b1+"/"+a1+"="); String rs; if(b1==0) { rs=0+"";//结果为0,不需要化简 } int cd=simplify(b1,a1); b1=b1/cd;a1=a1/cd; if(a1==1) { rs=b1+""; } else { rs=b1+"/"+a1; } String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else//分数计算 { int s2=simplify(a1,a2); a1=a1/s2; a2=a2/s2; int s3=simplify(b1,b2); b1=b1/s3; b2=b2/s3; if(index==0) { if(negative==0) //没有负数 { /*分母不为1,分情况输出*/ if(a2!=1&&b2!=1) { System.out.println(a1+"/"+a2+"+"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b2+b1*a2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"+"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b2+b1;//分子 int cd=simplify(molecule,denom);//最大公约数 String rs; denom=denom/cd; molecule=molecule/cd; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"+"+b1+"="); int denom=a2; //分母 int molecule=a1+b1*a2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else{//有负数 if(a2!=1&&b2!=1) { System.out.print("-"+a1+"/"+a2+"+"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=b1*a2-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print("-"+a1+"+"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=b1-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print("-"+a1+"/"+a2+"+"+b1+"="); int denom=a2; //分母 int molecule=b1*a2-a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } if(index==1) { if(a1/a2>=b1/b2) {/*分类输出:分母是否为1*/ if(a2!=1&&b2!=1) { System.out.print(a1+"/"+a2+"-"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b2-a2*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"-"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b2-b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"-"+b1+"="); int denom=a2; //分母 int molecule=a1-a2*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else{ if(a2!=1&&b2!=1) { System.out.print(b1+"/"+b2+"-"+a1+"/"+a2+"="); int denom=a2*b2; //分母 int molecule=b1*a2-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(b1+"/"+b2+"-"+a1+"="); int denom=b2; //分母 int molecule=b1-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(b1+"-"+a1+"/"+a2+"="); int denom=a2; //分母 int molecule=b1*a2-a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } if(index==2)//分数乘法 { if(a2!=1&&b2!=1) { System.out.println(a1+"/"+a2+"*"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"*"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"*"+b1+"="); int denom=a2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==3)//分数除法 { if(a2!=1&&b2!=1) { for(int kk=0;;) { //余数不为0.继续生成随机数 if(b1==0) { //判断分母是否为0 b1=(int)(Math.random()*max); } else break; } System.out.print("("+a1+"/"+a2+")"+"/"+"("+b1+"/"+b2+")"+"="); int denom=a2*b1; //分母 int molecule=a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(molecule==0) { rs=0+""; } if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1&&a1!=0) { System.out.print(a1+"/"+"("+b1+"/"+b2+")"+"="); int denom=b1; //分母 int molecule=a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1&&b1!=0) { System.out.print("("+a1+"/"+a2+")"+"/"+b1+"="); int denom=a2*b1; //分母 int molecule=a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } } } else//有括号
{
int szgs,fhgs,x,z,y;//szgs数字个数 fhgs符号个数
double result;//结果
int sz[]=new int[20];//数字数组
char fh[]=new char[10];//字符数组
char operate[]={'+','-','*','/'};
for(int p=0;p<number;p++)
{
szgs=(int)(Math.random()*6+3);//生成3-4个数字
fhgs=szgs-1;//字符个数比数字少1
float rs[]=new float[20];
float c;String s;
char op[]=new char[10];//储存字符
for(y=0;y<szgs;y++)
{
sz[y]=(int)(Math.random()*max+1);//随机生成数
}
for(y=0;y<fhgs;y++)
{
x=(int)(Math.random()*4);//产生0~3的随机数 控制字符
fh[y]=operate[x];
}
fh[fhgs]='=';
if(fhgs%2==0)//偶数个运算符
{
System.out.print(sz[0]);System.out.print(fh[0]);
rs[0]=sz[0];op[0]=fh[0];
int d=1;
for(y=1;y<fhgs;y++)
{
System.out.print("(");
if(fh[y]=='/'||fh[y]=='-') //判断是否是真分数和负数
{
if(sz[y]<sz[y+1])
{//交换
int temp;
temp=sz[y];
sz[y]=sz[y+1];
sz[y+1]=temp;
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
else
{
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
}
else
{
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
System.out.print(")");
if(fh[y]=='+')
{
rs[d]=sz[y]+sz[y+1];
}
else if(fh[y]=='-')
{
rs[d]=sz[y]-sz[y+1];
}
else if(fh[y]=='*')
{
rs[d]=sz[y]*sz[y+1];
}
else if(fh[y]=='/')
{
c=(float)sz[y]/sz[y+1];
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
s = df.format(c);//返回的是String类型
rs[d] = Float.valueOf(s);
}
System.out.print(fh[y+1]);
op[d]=fh[y+1];
y=y+1;
d=d+1;
}
//先算乘除
for(d=0;d<fhgs/2;d++)
{
if(op[d]=='*')
{
rs[d]=rs[d]*rs[d+1];
rs[d+1]=0;
op[d]='+';
}
if(op[d]=='/')
{
c=(float)rs[d]/rs[d+1];
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
s = df.format(c);//返回的是String类型
rs[d] = Float.valueOf(s);
rs[d+1]=0;
op[d]='+';
}
}
float sum=rs[0];
//后算加减
for(int ii=0;ii<fhgs/2;ii++)
{
if(op[ii]=='+')
{
sum=sum+rs[ii+1];
}
if(op[ii]=='-')
{
sum=sum-rs[ii+1];
}
}
result=in.nextDouble();
if(result==sum)
{
System.out.println("回答正确!");
count++;
}
else
System.out.println("回答错误!");
System.out.println("正确结果:"+sum);
}
else//奇数运算符
{
int id=0;
for(y=0;y<fhgs;y++)
{
System.out.print("(");
if(fh[y]=='/'||fh[y]=='-') //判断是否是真分数和负数
{
if(sz[y]<sz[y+1])
{
int temp;
temp=sz[y];
sz[y]=sz[y+1];
sz[y+1]=temp;
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
else
{
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
}
else
{
System.out.print(sz[y]);
System.out.print(fh[y]);
System.out.print(sz[y+1]);
}
System.out.print(")");
//计算括号里的结果
if(fh[y]=='+')
{
rs[id]=sz[y]+sz[y+1];
}
else if(fh[y]=='-')
{
rs[id]=sz[y]-sz[y+1];
}
else if(fh[y]=='*')
{
rs[id]=sz[y]*sz[y+1];
}
else if(fh[y]=='/')
{
c=(float)sz[y]/sz[y+1];
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
s = df.format(c);//返回的是String类型
rs[id] = Float.valueOf(s);
}
System.out.print(fh[y+1]);
op[id]=fh[y+1];
y=y+1;
id=id+1;
}
//先算乘除
for(id=0;id<fhgs/2;id++)
{
if(op[id]=='*')
{
rs[id]=rs[id]*rs[id+1];
rs[id+1]=0;
op[id]='+';
}
if(op[id]=='/')
{
c=(float)rs[id]/rs[id+1];
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
s = df.format(c);//返回的是String类型
rs[id] = Float.valueOf(s);
rs[id+1]=0;
op[id]='+';
}
}
float sum=rs[0];
//后算加减
for(int ii=0;ii<fhgs/2;ii++)
{
if(op[ii]=='+')
{
sum=sum+rs[ii+1];
}
if(op[ii]=='-')
{
sum=sum-rs[ii+1];
}
}
result=in.nextDouble();
if(result==sum)
{
System.out.println("回答正确!");
count=count+1;
}
else
System.out.println("回答错误!");
System.out.println("正确结果:"+sum);
}
}
}
System.out.println("计算正确的个数:"+count);
}
}
实验结果截图:
周活动总结表
姓名:杜若憧 日期 2016/3/25
听课 |
编写代码 |
阅读课本 |
准备考试 |
日总计 |
|||
周日 |
|||||||
周一 |
100 |
40 |
140 |
||||
周二 |
48 |
48 |
|||||
周三 |
40 |
30 |
|||||
周四 |
50 |
50 |
|||||
周五 |
30 |
30 |
|||||
周六 |
77 |
77 |
|||||
周总计 |
100 |
245 |
30 |
375 |
时间记录日志
学生:杜若憧 日期:2016/3/25
教师:王建民 课程:软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3/21 |
8:00 |
9:50 |
10 |
100 |
听课 |
理论学时,课件 |
||
18:50 |
20:30 |
15 |
85 |
看书 |
看《构建之法》 |
|||
3/22 |
18:55 |
20:55 |
20 |
90 |
编程序 |
查资料,休息 |
||
3/23 |
16:30 |
17:30 |
60 |
讨论,编程序 |
讨论,共同写程序 |
|||
19:00 |
19:30 |
30 |
看书 |
|||||
3/24 |
15:30 |
18:00 |
30+10 |
110 |
编程序 |
作业,拿快递,玩手机 |
||
3/25 |
16:30 |
18:00 |
15 |
75 |
编程序 |
休息 |
||
3/26 |
8:45 |
10:21 |
96 |
编程序写报告 |
缺陷记录日志
学生:杜若憧
日期:2016/3/25
教员:王建民
程序号:四则运算3
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3/25 |
1 |
编码 |
编译 |
10min |
||
描述:负数分数运算输出的结果化简失败 |
||||||
2 |
编码 |
编译 |
10min |
|||
描述:分数除法运算,第二个分数分母=0,导致计算结果错误, |
||||||
3 |
编码 |
1min |
||||
描述:分数计算为0,不需要化简 |
||||||
4 |
编码 |
编译 |
60min |
|||
描述:有多个括号时,计算不出结果 |