zoukankan      html  css  js  c++  java
  • 练习一四则运算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("数学四则运算题目 	注意例子:(3/4)为真分数四分之三
    测试开始
     
    打印题目数量:");
     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+"题"+"	答对了"+right+"题
    ");
    108         System.out.print("你的分数是:	");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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("答对了!!
    ");
    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型变量任意几位。

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

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

  • 相关阅读:
    【转载】产品经理如何行之有效的提高执行力
    【转载】20个2013年最值得关注的网页设计趋势
    【转载】HTTP协议详解
    工作一年的心得与体会
    【转载】什么是SVG
    【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
    【转载】前台页面优化全攻略-系列博文
    flink的checkpoint
    HBase概述
    牛客题霸--跳台阶题解
  • 原文地址:https://www.cnblogs.com/maxx/p/4395177.html
Copyright © 2011-2022 走看看