练习一四则运算3.0

  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型变量任意几位。

 

这次的作业更新到这里,大家有什么更好建议,可以提出来,我尽力将他继续修改,希望可以一步一步地进步,谢谢,希望能发出去。。。。。。

用家里的网络可以发出去了

 

posted @ 2015-04-06 00:16  51冯美欣max  阅读(259)  评论(5编辑  收藏  举报