一、需求分析
(1)自动生成10道100以内的2个操作数的四则运算算式(+ - * /),要求运算结果也在100以内
(2)剔除重复算式。 2 + 3 = 和 2 + 3 = 是重复算式 2 + 3 = 和 3 + 2 = 不属于重复算式
(3)题目数量可定制
(4)相关参数可控制
是否包含乘法和除法
操作数数值范围可控(如操作数 在100以内 还是1000以内)
操作数是否含负数
(5)生成的运算题存储到外部文件result.txt中
二、功能设计
基本功能: 1.题目数量可定制
2.二则和四则运算可选
3.操作数数值范围可控
4.操作数是否含负数
5.重复算式可过滤
三、设计实现
本次设计只用到一个主类,其中包含了主方法和其他方法共同实现程序的相关功能
。判断是否需要负数的方法
。判断是否需要包含乘除的方法
。获取算式得数的方法
。主方法
四、测试运行
五、代码片段
- package math;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import java.util.Scanner;
public class SuanShi {
- public static void main(String[] args) {
- try { Scanner sc = new Scanner(System.in);
- System.out.println("这是一个自动生成四则运算试题的程序。接下来请选择相关的参数。");
- System.out.println("请输入要生成题目的数量(数量>1)");
- int num = sc.nextInt();
- System.out.println("请选择是否包含乘除法(包含请输入1,不包含请输入0)");
- int LevelFlg = sc.nextInt();
- System.out.println("请选择结果是否包含负数(包含请输入1,不包含请输入0)");
- int MinusFlg = sc.nextInt();
- System.out.println("请选择结果的最大范围(比如100,200,1000)");
- int maxNumFlg = sc.nextInt(); //生成对象,然后调用它的方法
- SuanShi SuanShi=new SuanShi();
- List<Equation> from = new ArrayList<Equation>(); //调用生成算式的程序,参数分别为 题目数量,是否含有乘除法,是否含有负数,最大的结果范围
- from = SuanShi.createEquation(num,LevelFlg,MinusFlg,maxNumFlg); //在控制台上展示算式
- SuanShi.showEquation(from); //将算式保存到文件中
- SuanShi.saveEquation(from);
} catch (Exception e){
- System.out.println("Error!" + e);
- System.exit(0); } } // 生成算式
- public List<Equation> createEquation(int num , int LevelFlg,int MinusFlg,int maxNumFlg) {
List<Equation> from = new ArrayList<Equation>(); //通过一个死循环来循环生成算式,然后检查是否符合条件,将满足条件的算式添加到list中,满足数量后跳出循环
- while(true) { Random rand = new Random();
- int operator = rand.nextInt(LevelFlg == 1 ? 4 : 2) + 1;// 是否乘除可控
- int numA = rand.nextInt(maxNumFlg) + 1;
- int numB = rand.nextInt(maxNumFlg) + 1; //将生成的算式放入对象中
- Equation equation = new Equation(numA,numB,operator); //检查生成的竖式符合条件吗
- if(check(from,equation,MinusFlg,maxNumFlg)) { // 将产生的并且通过检查的算式添加到List集合中
- from.add(equation); }; //满足最大数量num后跳出循环
- if(from.size()>=num) break;
- }
- return from;
- }
// 在控制台上展示算式
- public void showEquation(List<Equation> from) {
- System.out.println("结果如下:");
- for(int i=0;i<from.size();i++) {
- System.out.println(from.get(i).printAnswer());
- }
- }
// 保存算式
- public void saveEquation(List<Equation> from) {
- BufferedWriter bufferedWriter = null;
- String path = "D:\\homework\\result.txt" ;
- try{ File file = new File(path);
- if (!file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
- } file.createNewFile(); // 获取该文件的缓冲输出流
- bufferedWriter = new BufferedWriter (new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); // 写入信息
- bufferedWriter.write("以下为本次程序生成的试题,共有"+from.size()+"道题\r\n");
- for (int i=0;i<from.size();i++) { //依次写入本地文件中 bufferedWriter.write(i+1+". "+from.get(i).printAnswer()+"\r\n");
- } bufferedWriter.flush();// 清空缓冲区 bufferedWriter.close();// 关闭输出流
- System.out.println("文件保存完毕!");
- }catch (IOException e) { e.printStackTrace();
- }finally { } } //检查生成的算式是否正确。
- public boolean check(List<Equation> from, Equation equation,int MinusFlg,int maxNumFlg) {
- boolean result = true; //判断新生成的算式是否超过最大范围
- if(equation.getResult()>maxNumFlg) result = false; //判断新生成的算式是否有负数
- if(MinusFlg==0 &&equation.getResult()<0) result = false; //判断新生成的算式是否和以前的重复
- for(int i=0;i<from.size()-1;i++) {
- if(from.get(i).getNumA()==equation.getNumA()
- &&from.get(i).getNumB()==equation.getNumB()
- &&from.get(i).getOperator()==equation.getOperator()) result = false;} //输出通过检查的算式
- return result;
- } }
六、总结
通过本次练习,学到了许多知识。经过一步步需求分析到功能的一步步实现,虽然编写过程中有很多地方不清楚,但通过网上查找和询问他人慢慢的弄明白了,收获颇多。
七、PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
20 |
25 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
20 |
Development |
开发 |
300 |
480 |
·· Analysis |
需求分析 (包括学习新技术) |
10 |
20 |
· Design Spec |
· 生成设计文档 |
0 |
0 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
15 |
· Design |
具体设计 |
15 |
20 |
· Coding |
具体编码 |
300 |
420 |
· Code Review |
· 代码复审 |
10 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
10 |
20 |
Reporting |
报告 |
10 |
15 |
·· Test Report |
· 测试报告 |
15 |
20 |
· Size Measurement |
计算工作量 |
0 |
0 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
10 |
20 |
原文地址:https://www.cnblogs.com/GXTSTAY/p/11522820.html
时间: 2024-10-07 05:50:56