要求:
1、学生写的程序必须能判定用户的输入答案是否正确,
例如程序输出:20 – 5 = ?用户输入15,那么程序就会反馈正确,然后继续出题。直到 30 道题目结束,程序最后告诉用户作对了几道题。
2、程序必须能处理四种运算的混合算式;
20 – 5 * 2 =? 正确答案是10.
20– 5 * 2 + 9 / 3 = ? 正确答案是13
思路:
在(二)基础上改进
1、定义 SIZE 打印题数
2、定义是否有乘除法(用以改变随机符号范围)
3、定义加减有无负数(用以改变加减符号状况下,数值的范围)
4、定义除法有无余数(用除数*整数商 得到被除数,算式就写被除数/除数)
5、(此为添加的函数)输出字符串(算式答案),目的用于比较用户输入的是否相同
分为加减乘除四种情况,总体计算方法为:若为整数,则分母为1 。最终将以分数来进加 减乘除,然后化简。
6、用for循环生成题目for(int i=0;i<SIZE;i++)
1、输入相关变量(有无负数、有无余数、有无乘除法、数值范围)
2、生成符号
3、生成第一个数
4、生成第二个数(若要求除法无余数,就在此定义第一个数)
5、得出算式 第一个数+符号+第二个数+=
其中需要用for循环来排除重复的(若重复,则 i-1,退出此循环,重新再大循环一次)
6、进行比较,列出正确性。
6、输出,总结正确与错误的个数
(有无乘除 将影响是否显示 除法有无余数 的选项)
import java.util.Scanner; public class operations3 { public static int SIZE(int size)//定制数量 { int s; s=size; return s; } public static int MultiplyDivide(String p1)//是否有乘除法 { int m = 4; if(p1.equals("Y")){m=4;} if(p1.equals("N")){m=2;} return m; } public static String Negative(String p2)//加减有无负数 { String n; n=p2; return n; } public static String Remainder(String p3)//除法有无余数 { String r; r=p3; return r; } public static int Max(int max)//最大数 { int m; m=max; return m; } public static int Min(int min)//最小数 { int m; m=min; return m; } public static String Compare(int nup1,int ndown1,int nup2,int ndown2,int mid)//答案 { String n=new String(); int nup3=1,ndown3=1; if(ndown1==-99999) { ndown1=1; } if(ndown2==-99999) { ndown2=1; } if(mid==0)//加 { ndown3=ndown1*ndown2; nup3=nup1*ndown2+nup2*ndown1; } if(mid==1)//减 { ndown3=ndown1*ndown2; nup3=nup1*ndown2-nup2*ndown1; } if(mid==2)//乘 { ndown3=ndown1*ndown2; nup3=nup1*nup2; } if(mid==3)//除 { int nd=nup2; nup2=ndown2; ndown2=nd; ndown3=ndown1*ndown2; nup3=nup1*nup2; } //化简 int z1=Math.abs(nup3),z2=Math.abs(ndown3); int chushu=2; if(z1>z2) { while(z2>=chushu) { if(z1%chushu==0&&z2%chushu==0) {z1=z1/chushu;z2=z2/chushu;} else {chushu++;} } } else if(z1<z2) { while(z1>=chushu) { if(z1%chushu==0&&z2%chushu==0) {z1=z1/chushu;z2=z2/chushu;} else {chushu++;} } } else { z1=1;z2=1; }; if(nup3<0){nup3=0-z1;} else {nup3=z1;} if(ndown3<0){ndown3=0-z2;} else {ndown3=z2;} //化简 if(ndown3==1) { n=nup3+""; } else if(ndown3==-1) { nup3=0-nup3; n=nup3+""; } else { if((nup3<0&&ndown3<0)||(nup3>0&&ndown3<0)) { nup3=0-nup3; ndown3=0-ndown3; } n=nup3+"/"+ndown3+""; } return n; } public static void Work(int MultiplyDivide,String Negative,String Remainder,int Max,int Min,int SIZE)//算式计算 { String Again[][]=new String[SIZE][1];//用数组装算式,用以判断是否重复 int Count1=0;//计数正确 int Count2=0;//计数错误 for(int i=0;i<SIZE;i++)//重复次数,用以确定算式多少 { int cha=Max-Min; int mid,nup1 =1,ndown1=1,nup2=1,ndown2=1; String s1=new String(); String s2=new String(); String suanshi=new String(); String fuhao=new String();//符号判定 mid=(int)(Math.random()*MultiplyDivide); if(mid==0) fuhao="+"; if(mid==1) fuhao="-"; if(mid==2) fuhao="*"; if(mid==3) fuhao="/"; for(int j=0;j<2;j++)//两次循环,第一次为第一个数字,第二次为第二个数字 { int n1 =-99999,n2=-99999;//用于后面是否为分数的判定 int s=(int)(Math.random()*2);//随机数判定整数或分数,0->整数,1->分数 if(s==0)//整数 { if(Negative.equals("N")) { if(mid==0||mid==1) { while(n1<0) {n1=(int)(Min+Math.random()*(cha+1));} } else { n1=(int)(Min+Math.random()*(cha+1)); } } if(Negative.equals("Y")) {n1=(int)(Min+Math.random()*(cha+1));} } if(s==1)//分数 { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); if(Negative.equals("N")) { if(mid==0||mid==1) { while(n1<=0||n2<=0) { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } else { while(n1==0||n2==0) { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } } if(Negative.equals("Y")) { while(n1==0||n2==0) { n1=(int)(Min+Math.random()*(cha+1)); n2=(int)(Min+Math.random()*(cha+1)); } } int z1=Math.abs(n1),z2=Math.abs(n2); int chushu=2; if(z1>z2) { while(z2>=chushu) { if(z1%chushu==0&&z2%chushu==0) {z1=z1/chushu;z2=z2/chushu;} else {chushu++;} } } else if(z1<z2) { while(z1>=chushu) { if(z1%chushu==0&&z2%chushu==0) {z1=z1/chushu;z2=z2/chushu;} else {chushu++;} } } else { z1=1;z2=1; }; if(n1<0){n1=0-z1;} else {n1=z1;} if(n2<0){n2=0-z2;} else {n2=z2;} } if(j==0)//第一个数字 { nup1=n1;ndown1=n2; if(ndown1==-1&&nup1<0) {nup1=Math.abs(nup1);} if(ndown1==-1&&nup1>0) {nup1=0-nup1;} if(ndown1>-99999)//如果存在分母,则为分数 { if(Math.abs(ndown1)!=1) { if(nup1<0&&ndown1<0) {nup1=Math.abs(nup1);ndown1=Math.abs(ndown1);} if(ndown1<0) {s1="("+nup1+"/("+ndown1+"))"+"";} else {s1="("+nup1+"/"+ndown1+")"+"";} } if(Math.abs(ndown1)==1)//否则为整数 { if(nup1>=0) {s1=nup1+"";} if(nup1<0) {s1="("+nup1+")"+"";} } } else//否则为整数 { if(nup1>=0) {s1=nup1+"";} if(nup1<0) {s1="("+nup1+")"+"";} } } if(j==1)//第二个数字 { nup2=n1;ndown2=n2; if(mid==3)//当为除法时,除数不能为0, { while(nup2==0) {nup2=(int)(Min+Math.random()*(cha+1));}//分子或整数不能为0 } if(ndown2==-1&&nup2<0) {nup2=Math.abs(nup2);} if(ndown2==-1&&nup2>0) {nup2=0-nup2;} if(ndown2>-99999)//如果存在分母,则为分数 { if(Math.abs(ndown2)!=1) { if(nup2<0&&ndown2<0) {nup2=Math.abs(nup2);ndown2=Math.abs(ndown2);} if(ndown2<0) {s2="("+nup2+"/("+ndown2+"))"+"";} else {s2="("+nup2+"/"+ndown2+")"+"";} } else { if(nup2<0) { s2="("+nup2+")"+""; } if(nup2>0) { s2=nup2+""; } } } else//否则为整数 { if(nup2<0) { s2="("+nup2+")"+""; } if(nup2>0) { s2=nup2+""; } } if(mid==3&&Remainder.equals("N")) { nup1=nup2*n1;ndown1=ndown2; if(ndown1%n1==0) {ndown1=ndown1/n1;nup1=nup1/n1;} if(ndown1>-99999)//如果存在分母,则为分数 { if(Math.abs(ndown1)!=1) {s1="("+nup1+"/"+ndown1+")"+"";} else//否则为整数 { s1=nup1+""; } } else//否则为整数 { s1=nup1+""; } } } } suanshi=suanshi+s1+fuhao+s2+"=";//算式 Again[i][0]=suanshi; for(int k=0;k<(i+1);k++) { if(Again[i][0].equals(Again[k][0])){k--;break;} } System.out.print(suanshi); String Daan=Compare(nup1,ndown1,nup2,ndown2,mid); Scanner Shuru=new Scanner(System.in); String Answer=Shuru.next(); if(Answer.equals(Daan)) { System.out.println("正确"); Count1++; } else { System.out.println("错误,正确答案为:"+Daan); Count2++; } } System.out.println("一共"+SIZE+"道题,其中正确:"+Count1+"道,错误:"+Count2+"道"); } public static void main(String args[]) { String p3="Y"; Scanner pan=new Scanner(System.in); System.out.println("请输入定制数量:"); int size=pan.nextInt(); System.out.println("是否有乘除法,Y--有,N--没有"); String p1=pan.next(); System.out.println("加减有无负数,Y--有,N--没有"); String p2=pan.next(); if(p1.equals("Y")) { System.out.println("除法有无余数,Y--有,N--没有"); p3=pan.next(); } System.out.println("请输入数值范围最大值:"); int max=pan.nextInt(); System.out.println("请输入数值范围最小值:"); int min=pan.nextInt(); int zhi=SIZE(size); int a=MultiplyDivide(p1) ; String b=Negative(p2); String c=Remainder(p3); int d=Max(max); int e=Min(min); Work(a,b,c,d,e,zhi); } }
结果截图:
【项目计划总结表】
任 务 (日 期) |
听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 |
周日 | |||||
周一 | 100 | 120 | 220 | ||
周二 | 90 | 90 | |||
周三 | |||||
周四 | 60 | 60 | |||
周五 | 30 | 30 | |||
周六 | 240 | 60 | 300 | ||
周总计 | 100 | 420 | 120 | 640 |
【时间记录日志】
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
2016/3/21 | 8:00 | 8:50 | 50 | 上课 | ||
9:00 | 9:50 | 50 | 上课 | |||
14:00 | 16:00 | 120 | 编程序 | 单元测试 | ||
2016/3/22 | 15:00 | 16:00 | 60 | 看书 | java编程 | |
19:00 | 19:30 | 30 | 看书 | 构建之法 | ||
2016/3/24 | 15:00 | 16:00 | 60 | 编程序 | 四则运算 | |
2016/3/25 | 19:00 | 19:30 | 30 | 看书 | ||
2016/3/26 | 10:00 | 11:30 | 30min | 60 | 看书 | 构建之法 |
13:00 | 17:30 | 30min | 240 | 编程序 |
【缺陷记录日志】
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间 | 问题描述 |
2016/3/26 | 1 | 编程 | 改进代码 | 2016/3/26 |
简化分数,想以函数方法简化程序,未成功 |
时间: 2024-10-23 12:43:24