练习一四则运算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型变量任意几位。

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

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

时间: 2025-01-03 05:32:26

练习一四则运算3.0的相关文章

四则运算2.0版

#include <stdio.h> #include <stdlib.h> main() { printf("\n\t欢迎使用四则运算练习软件\n\n"); Chioce(); } Chioce() { int ch1=0; printf("\t1.整数运算\n\t2.真分数运算\n\t请选择:"); scanf("%d",&ch1); if(ch1==1) { ZhengShuYunSuan(); } FenS

二柱子四则运算2.0版本

支持真分数的四则运算 可以自定义题目数量 源代码: 1 #include<stdio.h> 2 #include<iostream> 3 #include<time.h> 4 #include<string> 5 using namespace std; 6 int main() 7 {srand( (unsigned)time( NULL ) ); 8 int i,k,p,v,a,b; 9 int *s1,*s2,*s3; 10 char n; 11 st

小学生二年级四则运算2.0

在原有基础之上,希望加上分数的四则运算. 此次编程实现功能:30道四则运算题的编写(不重复编写) 支持整型四则运算,还有分数四则运算 可制定出题的数量 1 //开始编程时间:15:18 2 //结束编程时间:16:42 3 #include <iostream> 4 #include <time.h> 5 #include <stdlib.h> 6 using namespace std; 7 #define max 100 8 #define n 30 9 int m

四则运算 3.0 结对

目录 结对对象 任务要求 分工说明 设计思路 遇到的问题 源代码 运行成果 总结 结对对象 姓名:   侯熙磊 班级:  土1603-1班. 学号:  20160672 简介: 性别男.爱好下象棋,踢足球.在组内负责程序修改和测试,一般都是有很多BUG的,还要改进一下,显得更加美观. 姓名:   黄睿麒 班级:  土1603-1班. 学号:  20160697 简介:性别男,爱好女.性格随性洒脱,追求自由.常常会想到一些骚主意去结决问题,应变能力尚好.擅长摸鱼. 任务要求 实现在线答题. 答题结

python四则运算2.0

github项目地址: https://github.com/kongkalong/python PSP 预估耗时(分钟) Planning .Estimate 48*60 Development .Analysis 30 .Design Spec 30 .Design Review 0 .Coding Standard 30 .Design 60 .Coding 24*60 .Code Reviw 30 .Test 60 Reporting .Test Report 0 .Size Measu

结对子作业 四则运算 V2.0

#include<stdio.h> #include<stdlib.h> #include<time.h> int cc,i,n,z;//操作数 int count;//题目数目 int max,min;//数据的最大值.最小值 int dt=0;//记录做对题目的数目 int shu[4]; char fh[4]={'+','-','*','/'}; void zhengshu(); void fenshu(); int main(void) { int xz;//操

四则运算 2.0

#include<stdio.h> #include<stdlib.h> #include <time.h> #define N g main() { int a,b,k,i,n, c,d,e,f,g; do{ printf("\n请输入题目数量: "); scanf("%d",&g); printf("\n请输入数字类型(1.整数 2.真分数) -1为退出程序: "); scanf("%d&

四则运算2.0

题目要求: 1,实现在线答题: 2,答题结束后,可以判断对错: 3,并将错题的结果保存起来. #include<stdlib.h> #include<stdio.h> #include<conio.h> void main() { int a[10],b[10],d[10],c[10],num=0,result,add=0; float val; char fa[5]={'+','-','*','/'}; while(1) { d[num]=abs(rand())%4;

随机四则运算1.1版

之前写的四则运算1.0版,现在继续扩充 : <四则运算>题目的功能,要求: 题目避免重复:可以定制数量和打印方式: 可以控制下列参数 (1) 是否有乘除法 (2) 是否有括号 (3) 数值范围 (4) 加减有无负数 (5) 除法有无余数 (6) 是否支持分数(真分数.假分数…) (7) 是否支持小数(精确到多少位?) (8) 打印中每行的间隔 先上图看主要界面,及功能区,如下: 1: 一如既往的用JS来写,自认为在界面上可以做到更美观,功能也可以完全做到, 那么找几个功能来演示,那么就从默认条