练习一四则运算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.开始的界面:

 练习一四则运算3.0

2.判断正错:

 练习一四则运算3.0

3.真分数算式用户答案可以输入分式或者小数,答案必须是最简:

练习一四则运算3.0

4.计算成绩:(可以按题量给分,可以计算对了多少题)

 练习一四则运算3.0

二、实现的功能

1.能打印出含有真分数的算式;

2.能判断正确答案:

3.能处理用户的输入的小数或String(算式):

4,输入题型只能输入数字0-9范围,不然提示重新输入:

 练习一四则运算3.0

三、针对上次的改进:

1.格式问题—java类名大写了

2.功能问题:

       (1)分数算式中能判断用户输入的分数,或则小数并进行判断

       (2)除法答案更加精准,之前是用int型变量进行计算,改进后用double型,之前15/16=0,,现在15/16=0.94,一般结果保留两位小数

3.用户输入的分数答案必须是最简的分式,其中用到一个方法求最大公约数,用了辗转相除法

 

四、遇到的问题

 1.分数算式中减法会出现负数,有时候符号会跑到分母的前面,如应该是-2/4,答案可能变成2/-4

 练习一四则运算3.0

解决办法:如果答案小于0,分子分母去绝对值,并将分子改成负数,同一负号放在分子前面,可以看看代码

2.经过其他同学提醒,题量数目的输入检测,如果输入字符会出错

解决办法:学会用pattern类,去检测用户输入是否正确

3.学会了用DecimalFormat类,可以保留double型变量任意几位。

 

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

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

 

你可能感兴趣的:(四则运算)