练习1---四则运算(最终版)

  1 package 软件工程;
  2
  3 import java.math.RoundingMode;
  4 import java.text.DecimalFormat;
  5 import java.util.Scanner;
  6 import java.util.regex.Pattern;
  7 /*
  8  * 1.定制数量
  9  * 2.控制是否有乘除法
 10  * 3.控制数值范围
 11  * 4.定制真分数练习题
 12  * 5.校检用户输入
 13  * 6.输出答题正确率
 14  */
 15 public class Main {
 16     // 求最大公约数
 17     private static int calcMaxSubmultiple(int num1, int num2) {
 18         num1=Math.abs(num1);//防止负数时求不得最大公约数。
 19         num2=Math.abs(num2);
 20         int min = Math.min(num1, num2);
 21         int maxSubmultiple = 1;
 22         for (int i = min; i >= 1; i--) {
 23             if (num1 % i == 0 && num2 % i == 0)
 24             {
 25                 maxSubmultiple = i;
 26                 break;
 27             }
 28
 29         }
 30         return maxSubmultiple;
 31     }
 32 //主函数
 33     public static void main(String[] args) {
 34         int max = 10;// 控制算式个数
 35         char[] op = { ‘ ‘, ‘+‘, ‘-‘, ‘*‘, ‘/‘ };// 操作符
 36         int[] no = new int[4];// 操作符地址
 37         int useno = 0;// 控制操作符
 38         int n = 3;// 操作数个数(随机)
 39         int[] num1 = new int[10];// 操作数
 40         char opp;// 判断是否需要乘除法
 41         char real;// 判断是否需要真分数的题目
 42         int[] cs = { 1, 100 };// 数值范围
 43         String[] useranser = new String[max];// 用户输入的答案
 44         String[] staticanser = new String[max];// 标准答案
 45         int sign; // 累加运算时的符号
 46         float left, right;// 保存蹭结果
 47         int f = 0;// 控制输出真分数的操作符
 48         int count = 0;// 统计答题正确的数量
 49         DecimalFormat decimal = new DecimalFormat("#.##");
 50         decimal.setRoundingMode(RoundingMode.HALF_UP);
 51
 52         int s1 = 1;// 分子通分
 53         int ss1 = 1;// 分子通分
 54         int s2 = 1;// 分母通分
 55         int result = 0;// 分子计算
 56         int gys;// 最大公约数
 57         int ff = 0;// 分数除法,分子为0标志位
 58         int fff=0;//
 59         String zjfz = new String();// 最简分子
 60         String zjfm = new String();// 最简分母
 61         Pattern pattern = Pattern.compile("[0-9]*"); // 限定输入算式数量输入的必须是数字
 62
 63         Scanner in = new Scanner(System.in);
 64          //定制要求
 65         System.out.print("请输入需定制的算式数量:");// 1.定制数量
 66         do {
 67             String str = in.nextLine();
 68             if (pattern.matcher(str).matches()) {// 如果输入的是数字就执行
 69                 max = Integer.parseInt(str);
 70                 break;
 71             } else {
 72                 System.out.print("你输入的不是数字,请重新输入:");
 73             }
 74         } while (true);
 75
 76
 77         System.out.print("是否需要乘除法(Y/N):");// 2.控制乘除参数
 78         do {
 79             opp = in.next().charAt(0);
 80             if (opp == ‘Y‘ || opp == ‘y‘) {
 81                 useno = 4;
 82                 break;
 83             } else if (opp == ‘N‘ || opp == ‘n‘) {
 84                 useno = 2;
 85                 break;
 86             } else {
 87                 System.out.print("输入错误,请重新输入:");
 88             }
 89         } while (true);
 90
 91         System.out.print("参数范围(eg:1,100):");// 3.控制数值范围
 92         String str = new String();
 93         int sr = 0;//判断循环结束
 94         in.nextLine();// 过滤掉上面.next()方面的回车。
 95         do {
 96             try {
 97                 str = in.nextLine();
 98                 String[] ss = new String[2];
 99                 ss = str.split(",");
100                 cs[0] = Integer.valueOf(ss[0]);
101                 cs[1] = Integer.valueOf(ss[1]);
102                 sr = 1;
103             } catch (Exception e) {
104                 System.out.print("输入格式错误,请重新输入:");
105             }
106         } while (sr != 1);
107
108
109         System.out.print("是否增加真分数练习题(Y/N):");// 4.真分数题目
110          do {
111              real = in.next().charAt(0);
112              if ( real == ‘Y‘ || real == ‘y‘) {
113
114                  break;
115              } else if ( real == ‘N‘ || real == ‘n‘) {
116                 break;
117              } else {
118                  System.out.print("输入错误,请重新输入:");
119              }
120          } while (true);
121
122          //----------------题目-----------------------
123         System.out.println();
124         System.out.println("                2014-2015学年度第一单元测试卷");
125         System.out
126                 .println("班级:             姓名:             座号:          得分:                  ");
127         System.out.println();
128         System.out.println("一、请认真仔细地计算下面各题。(小数请保留小数点后两位)");
129         System.out.println();
130         for (int i = 0; i < max; i++) {
131
132             System.out.print("(" + (i + 1) + ") ");
133             n = (int) (Math.random() * 3 + 2);// 2-4个操作数
134             for (int j = 0; j < n; j++) {
135                 num1[j] = (int) (Math.random() * (cs[1] - cs[0]) + cs[0]);// 控制随机数数值
136             }
137             for (int k = 0; k < n - 1; k++) {
138                 no[k] = (int) (Math.random() * useno + 1);// 随机产生操作符
139                 if(no[k]==4&&num1[k+1]==0){
140                     do{
141                     num1[k+1]=(int) (Math.random() * (cs[1] - cs[0]) + cs[0]);//如果除号后为0,则重新取数。
142                     }while(num1[k+1]==0);
143                 }
144             }
145             for (int h = 0; h < n; h++) {
146                 if (h != n - 1) {
147                     System.out.print(num1[h]);
148                     System.out.print(op[no[h]]);
149                 } else {
150                     System.out.print(num1[h] + "=");
151                 }
152             }
153             System.out.println();
154
155             //  // 计算第一大题答案
156             left = 0;
157             right = num1[0];
158             sign = 1;
159
160             for (int g = 0; g < n - 1; g++) {
161                 switch (op[no[g]]) {
162                 case ‘+‘:
163                     left = left + sign * right;
164                     sign = 1;
165                     right = num1[g + 1];
166                     break;
167                 case ‘-‘:
168                     left = left + sign * right;
169                     sign = -1;
170                     right = num1[g + 1];
171                     break;
172                 case ‘*‘:
173                     right = right * num1[g + 1];
174                     break;
175                 case ‘/‘:
176                     right = right / num1[g + 1];
177                     break;
178                 }
179             }
180             staticanser[i] = String.valueOf(decimal.format(left + sign * right));
181             // System.out.println((i+1)+":"+staticanser[i]);
182         }
183
184         // 学生答题模块
185         System.out.println("==================答题分割线=========================");
186         for (int i = 0; i < max; i++) {
187             System.out.print((i + 1) + ":");
188             useranser[i] = in.next();
189             if (useranser[i].equalsIgnoreCase(staticanser[i])) {
190                 count++;
191             }
192         }
193         System.out.println("标准答案为:");
194         for (int i = 0; i < max; i++) {
195             System.out.println((i + 1) + ":" + staticanser[i]);
196         }
197         System.out.println("答题正确率为:" + String.valueOf(decimal.format(((float) count / (float) max) * 100))
198                 + "%");
199         System.out.println("==================答题分割线=========================");
200
201 //真分数
202         if (real == ‘Y‘ || real == ‘y‘) {
203             System.out.println("二、请计算下列真分数算式。(无法计算请填null)");
204             System.out.println();
205             for (int i = 0; i < max; i++) {
206                 System.out.print("(" + (i + 1) + ") ");
207                 for (int j = 0; j < 2; j++)// (第一个真分数)
208                 {
209                     num1[j] = (int) (Math.random() * (cs[1] - cs[0]) + cs[0]);// 控制随机数数值
210                     if (j == 1 ) {
211                         while (num1[j - 1] >num1[j]||num1[j]== 0) {
212                             num1[j] = (int) (Math.random() * (cs[1] - cs[0]) + cs[0]);// 控制随机数数值
213                         }
214                     }
215                 }
216                 for (int j = 2; j < 4; j++)// (第二个真分数)
217                 {
218                     num1[j] = (int) (Math.random() * (cs[1] - cs[0]) + cs[0]);// 控制随机数数值
219                     if (j == 3) {
220                         while (num1[j - 1] >num1[j]||num1[j]== 0) {
221                             num1[j] = (int) (Math.random() * (cs[1] - cs[0]) + cs[0]);// 控制随机数数值
222                         }
223                     }
224                 }
225
226                 for (int k = 0; k < 1; k++) {// 符号个数
227                     no[k] = (int) (Math.random() * useno + 1);// 随机产生操作符
228                 }
229                 for (int h = 0; h < 4; h++) {// 2个真分数
230                     if (h % 2 == 0)
231                         System.out.print(("(" + num1[h] + "/"));
232                     else if (h % 2 == 1) {
233                         System.out.print(num1[h] + ")");
234                         if (f < 1) {// 控制只输出一个操作符
235                             System.out.print(op[no[f]]);
236                             f++;
237                         } else
238                             System.out.println("=");
239
240                     }
241                 }
242
243                 f = 0;
244                 //计算第二大题标准答案
245                 count=0;
246                 for (int g = 0; g < 1; g++) {
247                     s1 = num1[0] * num1[3];
248                     ss1 = num1[1] * num1[2];
249                     s2 = num1[1] * num1[3];//分母
250                     ff=0;
251                     fff=0;
252                     switch (op[no[g]]) {
253                     case ‘+‘:
254                         result = s1 + ss1;//分子
255                         gys = calcMaxSubmultiple(result, s2);// 除以公约数得到最简分数
256                         //System.out.println(gys);
257                         zjfz = String.valueOf(result / gys);
258                         zjfm = String.valueOf(s2 / gys);
259                         break;
260                     case ‘-‘:
261                         result = s1 - ss1;
262                         gys = calcMaxSubmultiple(result, s2);
263                         //System.out.println(gys);
264                         zjfz = String.valueOf(result / gys);
265                         zjfm = String.valueOf(s2 / gys);
266                         break;
267                     case ‘*‘:
268                         result = num1[0] * num1[2];
269                         gys = calcMaxSubmultiple(result, s2);
270                         //System.out.println(gys);
271                         if(num1[0] == 0 || num1[2] == 0)
272                         {
273                             fff=1;
274                         }
275                         zjfz = String.valueOf(result / gys);
276                         zjfm = String.valueOf(s2 / gys);
277                         break;
278                     case ‘/‘:// 乘以倒数
279                         result = num1[0] * num1[3];
280                         s2 = num1[1] * num1[2];
281                         gys = calcMaxSubmultiple(result, s2);
282
283                         //System.out.println(gys);
284                         if (num1[0] == 0 || num1[2] == 0) {
285                             ff = 1;
286                         }
287                         zjfz = String.valueOf(result / gys);
288                         zjfm = String.valueOf(s2 / gys);
289                         break;
290                     }
291                 }
292                 if (ff == 1) {
293                     staticanser[i] = "null";//当第二个数的分子为零时无法做除法
294                 }else if(fff==1){
295                     staticanser[i] = "0";
296                 }else if(zjfz==zjfm){
297                     staticanser[i] = "1";
298                 }else if(zjfm.equalsIgnoreCase("1")){
299                     staticanser[i] = zjfz;
300                 }else{
301                     staticanser[i] = zjfz + "/" + zjfm;
302                 }
303                 // System.out.println((i+1)+":"+staticanser[i]);
304             }
305
306             // 答题模板
307             System.out.println("==================答题分割线=========================");
308             for (int i = 0; i < max; i++) {
309                 System.out.print((i + 1) + ":");
310                 useranser[i] = in.next();
311                 if (useranser[i].equals(staticanser[i])) {
312                     count++;
313                 }
314             }
315             System.out.println("标准答案为:");
316             for (int i = 0; i < max; i++) {
317                 System.out.println((i + 1) + ":" + staticanser[i]);
318             }
319             System.out.println("答题正确率为:" + String.valueOf(decimal.format(((float) count / (float) max) * 100))
320                     + "%");
321             System.out
322                     .println("==================答题分割线=========================");
323         }
324
325     }
326 }

+++++++++++++++++++++++++++++++++++++++++++总结++++++++++++++++++++++++++++++++++++++++++++++++=
1.一开始使用DecimalFormat decimal = new DecimalFormat("#.##");

decimal.format(...); 进行截取小数点后的位数时,

发现仍然有有些数不会自动四舍五入,后来百度了一下,找到了解决方法。

decimal.setRoundingMode(RoundingMode.HALF_UP);//加入这个语句:设置舍入模式

2.分数计算时,发现有部分的分数不能约分到最简,后来发现如果算出来的数是负数,那么calcMaxSubmultiple(int num1, int num2) // 求最大公约数

这个方法里面不符合循环条件,for (int i = min; i >= 1; i--)

因此,先求绝对值,再进行求最大公约数。

3.分数计算时要判断很多东西,首先是分数分母不为零;其次是,当分子为零时,乘法为零,除法无法计算;最后是标准答案格式,当分子分母相同时要输出“1”,当结果分母为“1”时,只输出分子。

4.根据老师指出的BUG,已进行修改。

缺点:首先是代码没有封装,所以看起来有点乱。

其次是觉得把所有的定义都放在最前面(C语言做法)不太好,以后的编程会改进。

总结了几次出现的问题一步一步地解决,解决完感觉超棒的~~~~~~~~~~yo 呼~~~~\(^o^)/~

时间: 2024-10-05 15:02:37

练习1---四则运算(最终版)的相关文章

结对项目--四则运算图形化最终版

四则运算器图形化最终版 (然而被我做成了奇怪的东西 组员:13070030张博文 13070033刘云峰 一.概念阶段 最初是想试试用android做个计算器app,无奈从零学起着实太赶,而且这个计划在试用了无比卡顿占内存的android studio后就彻底搁浅了. 然后就被路人谣传说MFC好用,无奈从零学起着实太赶,而且这个计划在无人指导的摸黑下也顺手搁浅了. 最终便沦为了EasyX旧传统,好歹有点基础,但果然还是不太甘心. 以及因为当初想做app,所以抠了iphone计算器的图想当UI,结

20172333 2017-2018-2 《程序设计与数据结构》实验2报告(最终版)

20172333 2017-2018-2 <程序设计与数据结构>实验2报告(最终版) 1.结对成员 李楠20172330 领航员:李楠 驾驶员:严域俊 成绩分配:五五开 2.相关测试过程及截图 [x] 完整一套流程截图(创建题目,中缀转后缀,计算后缀,对比答案,答案正确个数.) [x] 分数测试类单独测试截图 [x] 整数测试类单独测试截图 [x] 中缀转后缀单独测试截图 3.测试中遇到的问题及解决办法 这周主要问题所在:由于在最后计算测试类编写的时候运用的方法来自几个类的合并,导致了在输出答

jQuery 3.0最终版发布,十大新特性眼前一亮

jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终版www.lampbrother.net. 通过jQuery 3.0的版本更新说明,我们看到了一个保持着向后兼容的更轻便,更快速的jQuery.在本文中,我们将介绍一些令人眼前一亮的jQuery 3.0全新特性. 开始前的说明 如果你想要下载jQuery 3.0进行亲自实验,可以通过该页面进行下载.另

最终版的Web(Python实现)

天啦,要考试了,要期末考试了,今天把最终版的Python搭建Web代码先写这里记下了.详细的过程先不写了. 这次是在前面的基础上重写 HTTPServer 与 BaseHTTPRequestHandler,主要利用 python 提供 的 socket 进行编程,从而实现消息的接收与相应:然后再接着引入多线程,分别处理来自客户端的请求:最后实现根据客户端传递的参数动态生成页面的功能. 主要步骤如下: 一. .重写 HTTPServer 与 BaseHTTPRequestHandlerPython

四则运算终极版

四则运算终极版要求: 1.生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在e1-e2的子表达式,那么结果大于等于0: 2.生成的题目中如果存在形式如e1/e2的子表达式,那么其结果应该是真分数. 3.每道题目中出现的运算符个数不超过3个,括号不做详细要求. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml

理解《JavaScript设计模式与开发应用》发布-订阅模式的最终版代码

最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线空间功能和命名空间功能,以达到先发布再订阅的功能和防止名称冲突的效果.但是令人感到遗憾的是最终代码并没有给出足够的注释.这让像我一样的小白就感到非常的困惑,于是我将这份最终代码仔细研究了一下,并给出了自己的一些理解,鉴于能力有限,文中观点可能并不完全正确,望看到的大大们不吝赐教,谢谢! 下面是添加了个人注释的

成为C++高手之最终版计算器

下面做我们的计算器最终版. 当前还存在的问题是用户只能算一次.如果有人买一个一次性计算器,那么他肯定是个土豪.我们的计算器不能只给土豪用,所以要改成可以反复使用的. 使用循环语句就可以了,但是循环哪些代码呢?从用户输入到打印出结果这个过程要反复执行,代码如是: enum OPT{ jia = 1, jian, cheng, chu }; int main(void) { //保存用户输入的数 int number1; int number2; int opt;//运算符 //循环从输入到输出结果

四则运算界面版结对

四则运算界面版编译环境 Eclipse开发人员 周伟雄 学号 201306114339队友 邵家文 学号 201306114322 博客:http://www.cnblogs.com/shaojiawen/ 1.程序支持正整数四则运算,支持分数,除法保留两个小数2.可以出表达式李含有的负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不带括号3用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数4用户在第一次答题时,需要用户输

结对作业:四则运算网页版

coding克隆仓地址:https://git.coding.net/huyifeng1998/jieduixiangmu.git 一.预期PSP: 二.结对编程对接口的设计 information hiding: 信息隐藏是指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的. 我们在结对项目中将各种经常用到的类和方法放在外联,而不是内嵌在一个类中,这样每个类分工明确,便于修改.信息隐藏同时体现在各种类.算法对用户不可见,能隐藏复杂度

25岁,我习得了自愈近视的魔法-最终版(填坑版)

转自:http://blog.sina.com.cn/s/blog_624791ed0100ftp9.html#comment4 距离上次发帖差不多有2个月了,之前的帖子差了很多东西,很糙,特别是没和所发资料有所关联.而且那段时间我比较忙.压力也比较大,没时间去整理自己的想法.而且所发书上所述不是完全正确的,特别是台湾和日本的那两本,没什么理论根据.近几天我把这些书又翻了一遍,决定按照毕业论文的格式再写一遍,也算是对上次不怎么负责任的发帖的补偿吧.感谢S1er的支持,不废话了. 简述 简述一下整