、题目描述:

1. 使用 -n 参数控制生成题目的个数,例如

Myapp.exe -n 10 -o Exercise.txt

将生成10个题目。

2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如

Myapp.exe -r 10

将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。

3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。

4. 每道题目中出现的运算符个数不超过3个。

5. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。

生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:

1. 四则运算题目1

2. 四则运算题目2

……

其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。

6. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:

1. 答案1

2. 答案2

特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。

7. 程序应能支持一万道题目的生成。

8. 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目,输入参数如下:

Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt -o Grade.txt

统计结果输出到文件Grade.txt,格式如下:

Correct: 5 (1, 3, 5, 7, 9)

Wrong: 5 (2, 4, 6, 8, 10)

Repeat:2

RepeatDetail:

(1)   2,45+32  Repeat 3,32+45

(2)   5,3+(2+1)  Repeat 7,1+2+3

解释:

Correct: 5 ----5道题目正确,正确的题号 1,3,5,7,9

Wrong:5 -----5道题目错误,错误的题号 2,4,6,8,10

Repeat:2   2---组题目重复

(1) 第一组 题号2,题目 45+32  与题号3的题目重复,题号3为 32+45

(2)第二组  题号5,题目 3+(2+1) 与题号7的题目重复,题号7为 1+2+3

二、需求分析

一个基于java控制台的四则运算,要求能够实现生成并计算含有真,假分数,整数的不超过三个运算符带有括号的四则运算表达式,并且能根据用户所提交的答案生成答题报告,答题报告中主要包括,本次答题的正确,错误,和重复表达式出现的情况。生成的表达式和答案要存入文件中。
  从整个需求来看,大致可以分为三个模块,生成表达式,表达式计算(包括将表达式和答案写入文件),答题报告的生成(包括表达式的查重和根据输入完成的校验)。

生成表达式模块:通过随机数可以生成运算数,但需要通过字符串和数字的结合生成运算符号;
  表达式计算:可采用将随机生成的表达式转换为后缀,在对后缀表达式进行计算完成。
  答题报告的生成:关键在于查重的实现,通过二叉树可以实现

三、功能设计

通过控制台进行选择要执行的操作,生成四则运算表达式,并进行查重,然后进行批改,最后生成批改报告

四、设计实现

1.测试类(test.java)

2.分数类(fen.java)//对分数的定义,用于实现分数的运算。

主函数:

  1. public static void main(String[] args) {
  2. String corr = "";
  3. String wro = "";
  4. // String s = "";
  5. String[] repeat = null;
  6. int re = 0;
  7. Scanner scanner = new Scanner(System.in);
  8. while (true) {
  9. System.out.println("********四则运算程序********");
  10. System.out.println("请选择操作");
  11. System.out.println("1.生成题目");
  12. System.out.println("2.进行批改(需要进入txt中答题)");
  13. System.out.println("3.退出");
  14. int choice = scanner.nextInt();
  15. if (choice == 1) {//生成题目
  16. System.out.print("请输入生成题目的个数为:");
  17. String s1=getScannerStr();
  18. while (!isInt(s1)) {//判断是否为整型
  19. System.out.println("输入错误,不是整数类型,请重新输入!");
  20. s1 = getScannerStr();
  21. }
  22. String[] strr = new String[Integer.parseInt(s1) + 1];
  23. String[] strr2 = new String[Integer.parseInt(s1) + 1];
  24. repeat = new String[Integer.parseInt(s1) + 1];
  25. re = 0;
  26. System.out.print("请输入生成题目中数值的范围:");
  27. String s2=getScannerStr();
  28. while (!isInt(s2)) {//判断是否为整型
  29. System.out.println("输入错误,不是整数类型,请重新输入!");
  30. s2 = getScannerStr();
  31. }
  32. char[] ch = { '+', '-', '*', '÷' };
  33. // 清除之前的文件内容
  34. try {
  35. FileWriter fw = new FileWriter(
  36. "G:/test/Exercises.txt");
  37. fw.write("");
  38. fw.close();
  39. } catch (IOException e) {//异常处理
  40. System.out.println("文件写入失败!" + e);
  41. }
  42. try {
  43. FileWriter fw = new FileWriter(
  44. "G:/test/Answers.txt");
  45. fw.write("");
  46. fw.close();
  47. } catch (IOException e) {//异常处理
  48. System.out.println("文件写入失败!" + e);
  49. }
  50. // 生成表达式
  51. for (int i = 1; i <= Integer.parseInt(s1); i++) {
  52. str = "";
  53. int x = (int) (Math.random() * 2);//随机数
  54. int y = (int) (Math.random() * 3);//随机数
  55. int t1 = 0;
  56. int t2 = 0;
  57. String num = "";
  58. String opera = "";
  59. String ex = "";
  60. for (int j = 0; j <= x; j++) {
  61. int a = (int) (Math.random() * 2);//表达式符号
  62. if (a == 0) {
  63. num = (1 + (int) (Math.random() * (Integer.parseInt(s2) - 1))) + "";
  64. } else if (a == 1) {
  65. int b = (int) (Math.random() * (Integer.parseInt(s2)));
  66. int q = 2 + (int) (Math.random() * (Integer.parseInt(s2) - 1));
  67. if (b == 0) {
  68. num = (1 + (int) (Math.random() * (q - 1)))
  69. + "/" + q;
  70. } else {
  71. num = b + "'"
  72. + (1 + (int) (Math.random() * (q - 1)))
  73. + "/" + q;
  74. }
  75. }
  76.  
  77. opera = ch[(int) (Math.random() * 4)] + "";
  78. if (t1 != 0) {
  79. if ((int) (Math.random() * 2) == 1) {
  80. ex = ex + num + ")" + opera;
  81. t1--;
  82. }
  83.  
  84. }
  85. if (y == 0) {
  86. ex = ex + num + opera;
  87. } else if (y == 1) {
  88. ex = ex + "(" + num + opera;
  89. t1++;
  90. } else if (y == 2) {
  91. ex = "(" + ex + num + opera;
  92. t1++;
  93. }
  94.  
  95. }
  96. ex = ex + (1 + (int) (Math.random() * (Integer.parseInt(s2) - 1)));
  97. while (true) {
  98. if (t1 == 0)
  99. break;
  100. ex = ex + ")";
  101. t1--;
  102. }
  103. for (int u = 0; u <= x; u++) {
  104. if (ex.substring(0, 1).equals("(")) {
  105. t2++;
  106. for (int k = 1; k < ex.length(); k++) {
  107. if (ex.substring(k, k + 1).equals("("))
  108. t2++;
  109. if (ex.substring(k, k + 1).equals(")")) {
  110. t2--;
  111. if (k != ex.length() - 1) {
  112. if (t2 == 0)
  113. break;
  114. } else {
  115. ex = ex.substring(1, ex.length());
  116. ex = ex.substring(0, ex.length() - 1);
  117. }
  118. }
  119. }
  120.  
  121. }
  122. }
  123. String ex1 = generate(ex);
  124. suffixExpression2Tree(ex1);
  125. strr[i] = str;
  126. strr2[i] = ex;
  127. int xy = 1;
  128. for (int h = 1; h < i; h++) {
  129. if (strr[h].equals(str)) {
  130. xy = 0;
  131. repeat[re] = h + "," + strr2[h] + " Repeat " + i
  132. + "," + ex;
  133. re++;
  134. break;
  135. }
  136. }
  137. if (xy == 0) {
  138. i--;
  139. continue;
  140. } else {
  141. // System.out.print(i + ". ");
  142. // System.out.print(ex + "=");
  143. // String an = new String();
  144. // an=scanner.next();
  145. String result = PRNCal(ex1);
  146. // System.out.print("......." + ex1 + "=");
  147. String[] ary = result.split("/");
  148. int a = Integer.parseInt(ary[0].trim());
  149. int b = Integer.parseInt(ary[1].trim());
  150. if ((Math.abs(a) < Math.abs(b)) && (a != 0) && (b != 0)) {
  151. result = a + "/" + b;
  152. } else if (a == b) {
  153. result = 1 + "";
  154. } else if (a == -b) {
  155. result = -1 + "";
  156. } else {
  157. int yu;
  158. int da;
  159. if (a == 0 || b == 0) {
  160. yu = 0;
  161. da = 0;
  162. } else {
  163. yu = a % b;
  164. da = a / b;
  165. }
  166. if (yu == 0)
  167. result = da + "";
  168. else
  169. result = da + "'" + Math.abs(yu) + "/"
  170. + Math.abs(b);
  171.  
  172. }
  173.  
  174. // 存入文件
  175. try {
  176. FileWriter fw = new FileWriter(
  177. "G:/test/Exercises.txt", true);
  178. fw.write(i + ".");
  179. fw.write(ex);
  180. fw.write("=" + " " + "\r\n");
  181. fw.close();
  182. } catch (IOException e) {
  183. System.out.println("文件写入失败!" + e);
  184. }
  185. try {
  186. FileWriter fw = new FileWriter(
  187. "G:/test/Answers.txt", true);
  188. fw.write(i + ":");
  189. fw.write(result);
  190. fw.write("\r\n");
  191. fw.close();
  192. } catch (IOException e) {
  193. System.out.println("文件写入失败!" + e);
  194. }
  195. }
  196.  
  197. }
  198.  
  199. } else if (choice == 2) {
  200. try {
  201. System.out.print("批改结果如下:");
  202. InputStreamReader reader = new InputStreamReader(
  203. new FileInputStream(
  204. "G:/test/Answers.txt"), "gbk");
  205. BufferedReader br = new BufferedReader(reader);
  206. String s = null;
  207. InputStreamReader reader1 = new InputStreamReader(
  208. new FileInputStream(
  209. "G:/test/Exercises.txt"),
  210. "gbk");
  211. BufferedReader br1 = new BufferedReader(reader1);
  212. String s1 = null;
  213. int i = 0;
  214. corr = "";//正确题号
  215. wro = "";//错误题号
  216. int wrong = 0;//定义错误个数
  217. int correct = 0;//定义正确个数
  218. while (((s = br.readLine()) != null)
  219. && (s1 = br1.readLine()) != null) {
  220. i++;
  221. String[] st = s.split(":");
  222. String[] st1 = s1.split("=");
  223. // System.out.println(st[1] + "......" + st1[1]);
  224.  
  225. if (st[1].trim().equals(st1[1].trim())) {
  226. correct++;
  227. corr = corr + i + ",";
  228. } else {
  229. wrong++;
  230. wro = wro + i + ",";
  231. }
  232.  
  233. }
  234. System.out.print("Correct:" + correct);//输出正确格式
  235. if (corr.length() <= 1)
  236. System.out.println("(" + ")");
  237. else
  238. System.out.println("("
  239. + corr.substring(0, corr.length() - 1) + ")");
  240.  
  241. System.out.print("Wrong:" + wrong);//输出错误格式
  242. if (wro.length() <= 1)
  243. System.out.println("(" + ")");
  244. else
  245. System.out.println("("
  246. + wro.substring(0, wro.length() - 1) + ")");
  247. System.out.println("Repeat:" + (re));
  248. System.out.println("RepeatDetail:");
  249. for (int u = 0; u < re; u++) {
  250. System.out.print("(" + (u + 1) + ")");
  251. System.out.print(" ");
  252. System.out.println(repeat[u]);
  253. }
  254.  
  255. } catch (Exception e) {
  256. e.printStackTrace();
  257. }
  258. } else if (choice == 3) {
  259. System.out.println("退出成功!");
  260. break;
  261. } else {
  262. System.out.println("输入的命令错误,请重新输入!");
  263. }
  264.  
  265. }
  266.  
  267. }

五、测试运行

1.运行程序

生成题目并输入相应的参数

3.题目文档

4.正确答案文档

5.答题文档

6.进行批改,批改结果

六、源代码

代码地址:https://gitee.com/buildup/operations.git

七、小结

此程序并未做好封装,所以函数以及排版显得杂乱无章,下次应当注意改进。

小学生四则运算出题软件-基于java控制台的实现的更多相关文章

  1. 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)

    前言: 这周是和我队友苏卫喜一起结对开发,我主要是写项目文档需求分析,她是通过我的需求文档来进行做思维导图,之后我们通过思维导图一起讨论用户界面设计. 以下就是我的需求分析1.0版本 1.   软件名 ...

  2. 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’

    这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...

  3. 小学生四则运算出题程序 无操作界面java版 简单的运用java中一些基本操作

    这是本学期java课中实验大纲里的第一个实验,这里简单做了一个无用户界面版本. import java.util.Random; import java.util.Scanner; public cl ...

  4. 四则运算出题系统,java

    程序设计思想: 首先通过判断选择计算的范围,然后用随机数生成两个随机数,定义另一个数,将两个随机数计算得到的值赋给定义的数 程序代码: package Kaos1; import java.util. ...

  5. 3.结对编程成果报告(小学生四则运算的出题程序,Java实现)

    程序名称:小学生四则运算的出题程序 先附上代码: package com.makequestion; import java.text.DecimalFormat;import java.util.R ...

  6. java小学生四则运算带面板版 但我不知道为什么同类变量却进不了动作监听中去

    ---恢复内容开始--- package yun; import java.util.*; import java.awt.*; import java.awt.event.ActionEvent; ...

  7. 软件工程项目基于java的wc实现

    WC软件工程项目JAVA实现博客 github地址:https://github.com/liudaohu/myrepository.git 功能实现 ·    -w 统计单词数 -c 统计字符数 - ...

  8. 作业六:小学生四则运算之NABCD模型与产品Backlog。

    NABCD模型与产品Backlog NABCD模型 ) N (Need 需求) 方便了老师和学生,使他们可以想要的时候随时可以得到,省时省力,快速出题,马上得到答案. ) A (Approach 做法 ...

  9. 作业6小学生四则运算测试APP的NABCD模型

    小学生四则运算测试NABCD模型 组员:李新,朱浩龙,叶煜稳,陈俊金,林德麟 (1)  N (Need 需求) 需求分析: 四则运算是小学生学习数学的核心和基础,必须经过大量的练习才能熟练掌握,但是一 ...

随机推荐

  1. Centos6.5使用yum安装svn

    1.测试环境 centos5.5 2.安装svn yum -y install subversion //测试SVN是否安装成功,执行:svnserve --version 3.配置 mkdir /w ...

  2. Websphere MQ Cluster

    大纲: 1.什么是集群 2.建立一个基本的集群 3.DISPLAY命令 4.负载均衡 5.高级配置和管理 6.答疑 7.关于文章.红宝书等 一. 什么是集群       集群就是Websphere M ...

  3. MVC 带扩展名的路由无法访问

    在MVC中,路由是必不可少的,而且MVC对Url的重写非常方便,只需要在路由中配置相应的规则即可.假如我们需要给信息详情页配置路由,代码如下: routes.MapRoute( name: " ...

  4. eclipse自动编译

    自动编译:对java应用没有什么意义,对web应用来说,当修改了代码时,会自动帮你编译并发布到web容器中去,省的重启web容器了. build:编译,Eclipse的编译是基于时间戳的判断机制的.c ...

  5. dns轮询

    负载均衡最开始一步,利用它实现负载均衡集群的定位

  6. jumpserver会话终端故障

    查看jumpserver的终端,发现无法访问,情况如下图 页面中提到,需要部署luna,coco和nginx的url分发. 然后进入到jumpserver的服务器,发现nginx启动了,但是没有coc ...

  7. Android用户界面开发:TabHost

    TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容.TabHost的二种实现方式:第 ...

  8. Java桌面程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

  9. 2017-05~06 温故而知新--NodeJs书摘(一)

    前言: 毕业到入职腾讯已经差不多一年的时光了,接触了很多项目,也积累了很多实践经验,在处理问题的方式方法上有很大的提升.随着时间的增加,愈加发现基础知识的重要性,很多开发过程中遇到的问题都是由最基础的 ...

  10. python接口自动化测试十二:对返回的json的简单操作

    # 1.requests里面自带解析器转字典 print(r.json()) print(type(r.json())) # 取出json中的'result_sk_temp'字段 # {"r ...