小组成员:黄丽萍,杜若憧
讨论图片:
若果没有括号:
1、对整数‘+’,‘-’运算直接由用户输入结果,与计算结果进行比较。‘/’鲜花见再用字符串类型以最简分数的形式输出。
2、对于分数运算,分别求出分子与分母,再用simplify()函数将其化简,并用字符串类型将其以最简分数的形式输出。
当有括号时:
使用新的数组认识op[]储存括号计算结果,用op[]储存括号外的运算符。利用for循环,先找到‘*’,‘/’运算符,将符号两边的数值进行计算,将后一个数值改为0,次运算符修改为‘+’,在进行加减运算。
源代码为:
//要求判断结果是否正确
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()*7+3);//随机生成数字个数(3~7) //szgs=(int)(Math.random()*2+3); fhgs=szgs-1;//字符个数比数字少1 double rs[]=new double[fhgs];//储存每个括号计算结果 char op[]=new char[10];//储存字符 for(y=0;y<szgs;y++) { sz[y]=(int)(Math.random()*9);//随机生成数 } for(y=0;y<fhgs;y++) { x=(int)(Math.random()*3);//产生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("("); 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]=='/') { rs[d]=sz[y]/sz[y+1]; } 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]=='/') { rs[d]=rs[d]/rs[d+1]; rs[d+1]=0; op[d]='+'; } } double sum=rs[0]; //后算加减 for(int ii=0;ii<fhgs/2+1;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.print("回答错误!"); System.out.println("正确结果:"+sum); } else//奇数运算符 { int id=0; for(y=0;y<fhgs;y++) { System.out.print("("); 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]=='/') { rs[id]=sz[y]/sz[y+1]; } System.out.print(fh[y+1]); op[id]=fh[y+1]; y=y+1; id=id+1; } //先算乘除 for(id=0;id<fhgs/2+1;id++) { if(op[id]=='*') { rs[id]=rs[id]*rs[id+1]; rs[id+1]=0; op[id]='+'; } if(op[id]=='/') { rs[id]=rs[id]/rs[id+1]; rs[id+1]=0; op[id]='+'; } } double sum=rs[0]; //后算加减 for(int ii=0;ii<fhgs/2+1;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.print("回答正确!"); count=count+1; } else System.out.print("回答错误!"); System.out.println("正确结果:"+sum); } } } System.out.println("计算正确的个数:"+count); } }
运行结果截图为:
周活动总结表
学生:黄丽萍
日期:2016/3/26
日期 任务 | 听课 | 编写程序 | 阅读课本 | 准备考试 |
|
| 日总计 |
周日 |
|
|
|
|
|
| 0 |
周一 | 100 | 30 | 30 |
|
|
| 160 |
周二 |
| 40 |
|
|
|
| 40 |
周三 |
| 40 |
|
|
|
| 40 |
周四 |
| 50 | 30 |
|
|
| 80 |
周五 |
| 30 |
|
|
|
| 30 |
周六 |
| 60 |
|
|
|
| 60 |
周总计 | 100 | 250 | 60 |
|
|
| 410 |
事件记录日志
教师:王建民老师
学生:黄丽萍
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 | C | U |
3/21 | 8:00 | 9:50 | 10 | 100 | 听课 |
| √ |
|
3/21 | 20:00 | 20:30 |
| 30 | 阅读 | 构建执法 | √ |
|
3/21 | 13:00 | 15:30 | 30 | 编写程序,讨论 | √ | |||
3/22 | 20:00 | 20:50 | 20 | 40 | 编写程序,讨论 | 打电话 | √ |
|
3/23 | 16:00 | 17:40 |
| 40 | 编程序,讨论 |
| √ |
|
3/24 | 16:00 | 17:30 | 40 | 50 | 编写程序 | 聊天 | √ |
|
3/24 | 21:00 | 21:30 | 0 | 30 | 阅读 |
| √ |
|
3/25 | 16:30 | 17:00 | 0 | 30 | 编写程序 |
| √ |
|
3/26 | 12:50 | 14:00 | 10 | 60 | 编写程序 | √ |
缺陷记录日志
学生:黄丽萍
日期:2016/3/26
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/26 | 1 |
| 编码 | 编译 | 10min |
|
描述:负数分数运算输出的结果化简失败 | ||||||
| 2 |
| 编码 | 编译 | 10min |
|
描述:分数除法运算,第二个分数为0,导致计算结果错误, | ||||||
| 3 |
| 编码 | 编译 | 60min |
|
描述:有多个括号时无法实现预期结果 |