标签:
1 //20150324 练习1 2 import java.util.*; 3 import java.util.regex.Pattern; 4 import java.math.RoundingMode; 5 import java.text.*; 6 import java.math.*; 7 public class Exercuise { 8 static double a,b,a1,b1; 9 static char[]ch={‘+‘,‘-‘,‘*‘,‘/‘}; 10 11 static int number;//number是总共的提数 12 static int right=0;//right是答对的题数 13 static int total=0;//总分 14 static double answer1;//用户输入的数字答案 15 static String answer2 = null;//用户输入的字符串 16 static double answer;//用户输入的String转换为数值 17 static String str1;//最简分式 18 static double MaxD;//最大公约数 19 static double ans; 20 static Scanner in=new Scanner(System.in); 21 static DecimalFormat df=new DecimalFormat("#.00");//对double型变量保留两位小数 22 23 //用于分数的算式 24 static int c = 0; 25 static int d=0; 26 static int e=0; 27 static int f=0; 28 29 30 31 32 public static void main(String[] args) 33 { 34 35 Pattern pa = Pattern.compile("[0-9]*"); 36 df.setRoundingMode(RoundingMode.HALF_UP);//保证答案的四舍五入 37 System.out.println("数学四则运算题目 \t注意例子:(3/4)为真分数四分之三\n测试开始\n \n打印题目数量:"); 38 boolean B=false; 39 String s1; 40 while(B==false){ 41 s1=in.next(); 42 if(pa.matcher(s1).matches())//检测用户输入是否正确 43 { 44 number=Integer.parseInt(s1);//出题数目 45 B=true; 46 break; 47 } 48 else 49 { 50 System.out.println("输入的格式错误请重新输入:"); 51 } 52 53 } 54 55 for(int i=0;i<number;i++) 56 { 57 int n = new Random().nextInt(5);//获取运算的方式0—— + 1—— - 2—— * 3—— / 58 if(n==0 || n==2 || n==3 || n==1)//int型的运算 59 { 60 a1 = new Random().nextDouble()*100;//获取式子的运算随机数 61 a=Double.parseDouble(df.format(a1)); 62 b1 =new Random().nextDouble()*100+1;//除数不能为0 63 b=Double.parseDouble(df.format(b1)); 64 65 System.out.print(a+""+ch[n]+""+b+"=");//输出式子 66 67 answer1=in.nextDouble();//获取答案处理用户输入 68 //判断答案是否正确的方法 69 judge(n);//判断是否正确 70 } 71 else if(n==4)//含有真分数的运算 72 { 73 boolean t = true; 74 while(t==true)//判断并输出真分数 75 { 76 c = new Random().nextInt(10); 77 d =new Random().nextInt(10);//获取式子的运算随机数 78 if(c<d) 79 t=false; 80 } 81 t=true; 82 while(t==true)//判断并输出真分数 83 { 84 e =new Random().nextInt(10)+1; 85 f =new Random().nextInt(10);//获取式子的运算随机数 86 if(e<f) 87 t=false; 88 89 } 90 n=new Random().nextInt(4); 91 System.out.print("("+c+"/"+d+")"+ch[n]+"("+e+"/"+f+")"+"="); 92 93 //判断用户输入类型,int,String 94 answer2 = in.next(); 95 try { 96 answer1 = Double.parseDouble(answer2); //可以转换为整型; 97 } 98 catch (Exception g) { 99 100 } 101 judge1(n);//分式运算的判断方法 102 103 } 104 105 } 106 //打分统计 107 System.out.print("总共"+number+"题"+"\t答对了"+right+"题\n"); 108 System.out.print("你的分数是:\t"); 109 if(right==number) 110 System.out.print("100分"); 111 else 112 System.out.print((total=right*(100/number))+"分"); 113 114 } 115 static void judge(int n)//一般算式判断对错 116 { 117 118 if(n==0)//加法 119 { answer=a+b; 120 answer=Double.parseDouble(df.format(answer));//保留两位小数 121 if(answer1==answer) 122 { 123 System.out.printf("答对了!!\n"); 124 right=right+1; 125 } 126 else 127 System.out.println("答错了!!答案是"+answer); 128 } 129 else if(n==1)//减法 130 { 131 answer=a-b; 132 answer=Double.parseDouble(df.format(answer));//保留两位小数 133 if(answer1==answer) 134 { 135 System.out.printf("答对了!!\n"); 136 right=right+1; 137 } 138 else 139 System.out.println("答错了!!答案是"+answer); 140 } 141 else if(n==2) 142 { 143 answer=a*b; 144 answer=Double.parseDouble(df.format(answer));//保留两位小数 145 if(answer1==answer) 146 { 147 System.out.printf("答对了!!\n"); 148 right=right+1; 149 } 150 else 151 System.out.println("答错了!!答案是"+(answer)); 152 } 153 else if(n==3) 154 { 155 156 ans=Double.parseDouble(df.format(a/b));//保留两位小数 157 if(answer1==ans) 158 { 159 System.out.printf("答对了!!\n"); 160 right=right+1; 161 } 162 else 163 System.out.println("答错了!!答案是"+ans); 164 } 165 } 166 static void judge1(int n)//分数的算式判断 167 { 168 double fm=0; 169 double fz=0;//答案的分子分母 170 //真分数运算的判断 171 if(n==0)//加法 172 { 173 174 fm=d*f; 175 fz=(c*f)+(e*d); 176 //简化约分 177 MaxD=getMaxDivi(fz,fm);//最大公约数 178 fz=fz/MaxD; 179 fm=fm/MaxD; 180 181 //double不保留小数 182 //简化完毕 183 //标准答案 184 str1=(int)fz+"/"+(int)fm;//得出最简答案 185 ans=Double.parseDouble(df.format(fz/fm)); 186 //判断 187 if(answer1==ans || answer2.equals(str1)) 188 { 189 System.out.printf("答对了!!\n"); 190 right=right+1; 191 } 192 else 193 System.out.println("答错了!!答案是:"+str1+" 或者是:"+ans);//改成最简真分数 194 } 195 196 197 198 else if(n==1)//减法 199 { 200 fm=d*f; 201 fz=(c*f)-(e*d); 202 MaxD=getMaxDivi(fz,fm); 203 fz=fz/MaxD; 204 fm=fm/MaxD; 205 if(fz<0||fm<0) 206 { 207 fz=-(Math.abs(fz)); 208 fm=Math.abs(fm); 209 210 } 211 str1=(int)fz+"/"+(int)fm;//正确答案的String 212 ans=Double.parseDouble(df.format(fz/fm)); 213 214 if(answer1==ans ||answer2.equals(str1)) 215 { 216 System.out.printf("答对了!!\n"); 217 right=right+1; 218 } 219 else 220 System.out.println("答错了!!答案是:"+str1+" 或者是:"+ans); 221 } 222 else if(n==2)//乘法 223 { 224 fz=c*e; 225 fm=d*f; 226 MaxD=getMaxDivi(fz,fm); 227 fz=fz/MaxD; 228 fm=fm/MaxD; 229 230 str1=(int)fz+"/"+(int)fm;//正确答案的String 231 ans=Double.parseDouble(df.format(fz/fm)); 232 233 if(answer1==ans ||answer2.equals(str1)) 234 { 235 System.out.printf("答对了!!\n"); 236 right=right+1; 237 } 238 else 239 System.out.println("答错了!!答案是:"+str1+" 或者是:"+ans); 240 } 241 else if(n==3)//除法 242 { 243 fz=c*f; 244 fm=d*e; 245 MaxD=getMaxDivi(fz,fm); 246 fz=fz/MaxD; 247 fm=fm/MaxD; 248 249 str1=(int)fz+"/"+(int)fm;//正确答案的String 250 ans=Double.parseDouble(df.format(fz/fm)); 251 if(answer1==ans || answer2.equals(str1)) 252 { 253 System.out.printf("答对了!!\n"); 254 right=right+1; 255 } 256 else 257 System.out.println("答错了!!答案是:"+str1+" 或者是:"+ans); 258 } 259 260 261 } 262 263 static double getMaxDivi(double a,double b)//求最大公约数,运用辗转相除法 264 { 265 double maxdivd=0; 266 if(a==0||b==0) 267 { 268 maxdivd=1; 269 return maxdivd; 270 } 271 else 272 { 273 if(a<b) 274 getMaxDivi(b,a); 275 boolean value=false; 276 if(a==0) 277 { 278 maxdivd=1; 279 value=true; 280 } 281 282 while(value==false) 283 { 284 int n=(int) (a/b); 285 int m=(int) (a%b); 286 if(m==0) 287 { 288 maxdivd=b; 289 value=true; 290 } 291 else 292 { 293 a=b; 294 b=m; 295 } 296 } 297 } 298 return maxdivd; 299 } 300 301 }
一、程序执行效果
1.开始的界面:
2.判断正错:
3.真分数算式用户答案可以输入分式或者小数,答案必须是最简:
4.计算成绩:(可以按题量给分,可以计算对了多少题)
二、实现的功能
1.能打印出含有真分数的算式;
2.能判断正确答案:
3.能处理用户的输入的小数或String(算式):
4,输入题型只能输入数字0-9范围,不然提示重新输入:
三、针对上次的改进:
1.格式问题—java类名大写了
2.功能问题:
(1)分数算式中能判断用户输入的分数,或则小数并进行判断
(2)除法答案更加精准,之前是用int型变量进行计算,改进后用double型,之前15/16=0,,现在15/16=0.94,一般结果保留两位小数
3.用户输入的分数答案必须是最简的分式,其中用到一个方法求最大公约数,用了辗转相除法
四、遇到的问题
1.分数算式中减法会出现负数,有时候符号会跑到分母的前面,如应该是-2/4,答案可能变成2/-4
解决办法:如果答案小于0,分子分母去绝对值,并将分子改成负数,同一负号放在分子前面,可以看看代码
2.经过其他同学提醒,题量数目的输入检测,如果输入字符会出错
解决办法:学会用pattern类,去检测用户输入是否正确
3.学会了用DecimalFormat类,可以保留double型变量任意几位。
这次的作业更新到这里,大家有什么更好建议,可以提出来,我尽力将他继续修改,希望可以一步一步地进步,谢谢,希望能发出去。。。。。。
用家里的网络可以发出去了
标签:
原文地址:http://www.cnblogs.com/maxx/p/4395177.html