git地址:https://git.coding.net/lhycoding/qylbc2.git
一、需求分析
- 程序可从命令行接收一个输入参数n,然后随机产生n道加减乘除练习题。
- 每个数字在0和100之间,运算符3个到5个之间。
- 每个练习题至少要包含2种运算符。
- 所出的练习题在运算过程中不得出现负数与非整数。
- 将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中。
- 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。(附加)
- 支持真分数的出题与运算(只需要涵盖加减法即可),且支持分数的自动化简。(附加)
二、功能设计
1.基本功能:
Ⅰ程序接收参数n,并对n的合法性作出判断,若出现错误则提示。
Ⅱ自动生成n个运算式,并计算得出结果。
Ⅲ将计算后的结果与运算式一同存入txt文件中,保存在指定目录下。
2.扩展功能(附加):
Ⅰ由于面向对象是小学生,因此数字在0-100之间。
Ⅱ随机产生括号并保证括号的合法有效性。
Ⅲ加入分数运算式,并且保证计算前后都是真分数,且不可化简。
三、设计实现
1.先建一个类进行随机数的生成
2.并用符号去进行随机数组的生成
3.然后再去将他们合并的一个字符串中
4.建两个字符串,一个用来输出,一个用来计算结果
5.最后进行输出
四、算法详解
将数字和符号输入到一个字符串中,判断如果为÷,则str1加一个/,否则str和str1同时加入产生的符号或者数字,最后对整串进行求解,截图上只是三个运算符的计算,四个和五个的原理相同,都通过这样去解决
for (int m=0;m
// int i&#61;5;int a,b,c,d,e,f;char k,y,z,q,w;String temp;if(i&#61;&#61;3){a&#61;Operate.num();String str &#61; Integer.toString(a);String str1 &#61; Integer.toString(a);k&#61;Operate.getOperator();str &#43;&#61; String.valueOf(k);if(k&#61;&#61;&#39;÷&#39;){str1 &#43;&#61; &#39;/&#39;;}else{str1 &#43;&#61; String.valueOf(k);}b&#61;Operate.num();str &#43;&#61; b;str1 &#43;&#61; b;y&#61;Operate.getOperator();str &#43;&#61; String.valueOf(y);if(y&#61;&#61;&#39;÷&#39;){str1 &#43;&#61; &#39;/&#39;;}else{str1 &#43;&#61; String.valueOf(y);}c&#61;Operate.num();str &#43;&#61; c;str1 &#43;&#61; c;z&#61;Operate.getOperator();str &#43;&#61; String.valueOf(z);if(z&#61;&#61;&#39;÷&#39;){str1 &#43;&#61; &#39;/&#39;;}else{str1 &#43;&#61; String.valueOf(z);}d&#61;Operate.num();str &#43;&#61; d;str1 &#43;&#61; d;System.out.print(str);System.out.print("&#61;");System.out.println(jse.eval(str1));temp &#61; String.valueOf(jse.eval(str1));Double result &#61; Double.parseDouble(temp);if(result<0||result%1!&#61;0){m--;}else {System.out.print(str);System.out.print("&#61;");System.out.println(jse.eval(str1));fop.write(str.getBytes());fop.write(("&#61;" &#43; jse.eval(str1)).getBytes());fop.write("\r\n".getBytes());}
五、测试运行
命令行中显示的结果
文件中结果
六、部分代码展示
public class Operate {public static char getOperator() {char[] a &#61; {&#39;&#43;&#39;, &#39;-&#39;, &#39;÷&#39;, &#39;*&#39;};int b &#61; (int) (Math.random() * 4);char x &#61; a[b];return x;}public static int num() {int number &#61; (int) (Math.random() * 101);return number;}
}
这段代码是用来产生随机数和运算符号&#xff0c;因为要求用÷显示&#xff0c;所以在除的时候显示÷。
import jdk.nashorn.internal.ir.CallNode;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Main {public static void main(String [] args) throws ScriptException, IOException {int x;try {x &#61; Integer.parseInt(args[0]);if(x<1||x>1000){System.out.println("Sorry,you can only input the number between 1 to 1000!");return;}}catch (NumberFormatException e){System.out.println("Sorry,you can only input the number between 1 to 1000!");return;}MakeFile makeFile &#61; new MakeFile();makeFile.getFile(x);}
}
这一段&#xff0c;让用户输入时出现错误的时候进行提醒&#xff0c;如果输入非法字符&#xff0c;则进行提示。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileOutputStream;
import java.io.IOException;public class MakeFile {public void getFile(int x) throws ScriptException, IOException {ScriptEngine jse &#61; new ScriptEngineManager().getEngineByName("Javascript");java.io.File file &#61; new java.io.File("result.txt"); //生成保存结果的文件FileOutputStream fop &#61; new FileOutputStream(file);if (!file.exists()) {file.createNewFile();}String serialNo &#61; "2016012027";fop.write(serialNo.getBytes());fop.write("\r\n".getBytes());for (int m&#61;0;m
这一段用来进行计算&#xff0c;一个str一个str1&#xff0c;一个进行显示&#xff0c;一个进行计算&#xff0c;最后结果result&#xff0c;用来加到显示str之后&#xff0c;让用户看到的式子是÷。题数上的话&#xff0c;我是通过for循环&#xff0c;如果结果是分数或者小数&#xff0c;使循环的数减一&#xff0c;即相当于不加&#xff0c;而如果是整数的话&#xff0c;则进行输出&#xff0c;这样就保证了输出的算式数量与用户需求一样。
代码上的话&#xff0c;因为之前没学过Java&#xff0c;所以这一个星期&#xff0c;临阵磨枪&#xff0c;学了一些Java的简单输入输出语句&#xff0c;以及看了看网上的一些博客的做法&#xff0c;最后还是决定用js里的eval函数&#xff0c;这个函数用起来比较方便仅通过几行代码&#xff0c;便实现了需要好多行代码才能实现的功能
七、项目总结
之前没有接触过Java&#xff0c;这个作业做了好多天&#xff0c;自从布置了作业一直在看这个东西怎么做&#xff0c;好多次因为在工作室看这个忘记时间&#xff0c;去了食堂已经没饭&#xff0c;只能回去泡面&#xff0c;不过所幸最后做出来一个基本功能&#xff0c;也算有所收获&#xff0c;周末也如杨老师说的一样&#xff0c;在补以前的东西&#xff0c;附加功能的话&#xff0c;实在是时间太短&#xff0c;做不出来&#xff0c;这次项目&#xff0c;学到了一些Java的基本语言&#xff0c;有所收获。
八、PSP展示
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
Planning | 计划 | 2 | 2 |
· Estimate | · 估计这个任务需要多少时间&#xff0c;并规划大致工作步骤 | 1 | 1 |
Development | 开发 | 20 | 37 |
· Analysis | · 需求分析 (包括学习新技术) | 0.5 | 0.5 |
· Design Spec | · 生成设计文档 | 0.2 | 0.2 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0.1 | 0.1 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0.5 | 0.6 |
· Design | · 具体设计 | 1 | 1 |
· Coding | · 具体编码 | 15 | 20 |
· Code Review | · 代码复审 | 2 | 2 |
· Test | · 测试&#xff08;自我测试&#xff0c;修改代码&#xff0c;提交修改&#xff09; | 1 | 2 |
Reporting | 报告 | 1 | 3 |
· Test Report | · 测试报告 | 1 | 1 |
· Size Measurement | · 计算工作量 | 1 | 1 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 0.2 | 0.2 |