四则运算题目自动生成程序

四则运算表达式生成器

目录

  • 一.github地址
  • 二.PSP表格(预期)
  • 三.性能测试
  • 四.设计实现过程
  • 五.关键代码
  • 六.功能测试
  • 七.PSP表格(完成)
  • 八.总结

一.github地址

https://github.com/HTwo2O/ArithmeticCalculator

项目参与者: 罗泉水 3118005101 陈鸿畅 3118005087

二.PSP表格(预期)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30
Estimate 估计这个任务需要多少时间 30
Development 开发 13
Analysis 需求分析 (包括学习新技术) 60
Design Spec 生成设计文档 0
Design Review 设计复审 (和同事审核设计文档) 0
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10
Design 具体设计 180
Coding 具体编码 1000
Code Review 代码复审 30
Test 测试(自我测试,修改代码,提交修改) 30
Reporting 报告 120
Test Report 测试报告 60
Size Measurement 计算工作量 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30
总计 1460

三.性能测试

  • 分析:字符数组和字符串数据占用了大量的内存。对象的实例化多,耦合性很大。

四.设计实现过程

  • 编程语言

JAVA

  • 解题思路

    • 主函数引导用户输入创建题目的条件。
    • 主函数实例化ArithmeticGen类(四则运算获得方法),以获得四则运算题目。
    • ArithmeticGen中实例化Expression(表达式实体类),获得用户想要个数的算术表达式。
    • Expression中由Fraction(分数实体类)构成,关于分数的操作放在FractionUtil(分数操作工具类)中。
    • ArithmeticGen获得很多的Expression(表达式)后,通过FileUtil(文件IO工具类)将题目和答案打印在文件中。
    • 用户在题目文件输入答案后,通过Correcting(批改类)批改答案,并将答题情况打印在文件中。
  • 项目结构

五.关键代码

  • 主函数主要部分

            ArithmeticGen Gen = new ArithmeticGen(numRange);
            TwoTuple<String,String> twoTuple = Gen.expBuilder(expAmount);
            FileUtil.write("exercise.txt", twoTuple.first);
            FileUtil.write("answer.txt", twoTuple.second);
    
            System.out.println("出题完毕,请在题目文件中输入您的答案并保存文件");
            System.out.println();
            System.out.println("完成答题后,输入1批改答案,输入其他退出程序");
    
            Scanner scanner = new Scanner(System.in);
            if(scanner.nextLine().equals("1")){
                try {
                    Correcting.correctAnswer();
                    System.out.println("批改完成,请在“Grade.txt”文件中查看答题情况");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else {
                System.exit(0);
            }
    
  • ArithmeticGen类中创建多条表达式的方法
	 public TwoTuple<String,String> expBuilder(int expAmount) {
		 StringBuilder exptext = new StringBuilder();
		 StringBuilder anstext = new StringBuilder();
		 for(int i=1; i<=expAmount; i++) {
			 Expression expBean = new Expression();

			 int optNum = random.nextInt(3)+1;
			 for(int n = 0; n < optNum; n++){
				 expBean=createExp(expBean);
			 }

			 exptext.append("第" + i + "题: " + expBean.getExpression() + "   请作答:"+"\n");

			 anstext.append("第" + i + "题: " + expBean.getFraction() + "\n");
		 }
		 return tuple(exptext.toString(), anstext.toString());
	 }
  • 创造一条表达式的方法

    	 private Expression createExp(Expression expBean1) {
    		 Expression expBean=new Expression();
    	    	Boolean flagZero = false;
    	    	Fraction f2= FractionUtil.CreatFraction(num);
    
    	    	//随机设置f2自然数
    	    	if(random.nextBoolean()){
    				f2.setDenominator(1);
    			}
    	        char opt = ‘+‘;
    	        switch(random.nextInt(4))  {
    	            case 0 : opt = ‘+‘;    break;
    	            case 1 : opt = ‘-‘;    break;
    	            case 2 : opt = ‘*‘;    break;
    	            case 3 : opt = ‘÷‘;    break;
    
    	            default: break;
    	        };
    
    	        if((expBean1.getExpression()).equals("")) {
    	        	Fraction f1= FractionUtil.CreatFraction(num);
    	        	if(f2.getNumerator()==0&&opt==‘÷‘)
    	        		opt = ‘+‘;
    	        	if(!f1.greater(f2)&&opt==‘-‘) {
    	        		expBean.setExpression( "" + f2 + opt + f1);
    		        	expBean.setFraction(FractionUtil.calculate(f2, f1, opt));
    	        	}else {
    	        		expBean.setExpression( "" + f1 + opt + f2);
    		        	expBean.setFraction(FractionUtil.calculate(f1, f2, opt));
    	        	}
    
    	        }else {
    	        	if(random.nextBoolean()) {
    	        		if(f2.getNumerator()==0&&opt==‘÷‘)
    		        		opt = ‘+‘;
    	        		if(!expBean1.getFraction().greater(f2)&&opt==‘-‘) {
    	        			expBean.setExpression("" + f2 + opt + "(" + expBean1 + ")");
    		        		expBean.setFraction(FractionUtil.calculate(f2, expBean1.getFraction(), opt));
    	        		}else {
    	        			expBean.setExpression( "(" + expBean1 + ")" + opt + f2);
    		        		expBean.setFraction(FractionUtil.calculate(expBean1.getFraction(), f2, opt));
    	        		}
    
    	        	}else {
    	        		if(expBean1.getFraction().getNumerator()==0&&opt==‘÷‘)
    	        			opt = ‘+‘;
    	        		if(expBean1.getFraction().greater(f2)&&opt==‘-‘) {
    	        			expBean.setExpression( "(" + expBean1 + ")" + opt + f2);
    		        		expBean.setFraction(FractionUtil.calculate(expBean1.getFraction(), f2, opt));
    	        		}else {
    	            		expBean.setExpression("" + f2 + opt + "(" + expBean1 + ")");
    		        		expBean.setFraction(FractionUtil.calculate(f2, expBean1.getFraction(), opt));
    	        		}
    
    	        	}
    	        }
    	        return expBean;
    	    }`
    
  • 批改答案方法correctAnswer()
    public static void correctAnswer() throws Exception{
            String lineAns;
            String lineExe;
            int test = 1;
            ArrayList<Integer> listCorrect = new ArrayList<>();
            ArrayList<Integer> listWrong = new ArrayList<>();
    
            BufferedReader brExe = new BufferedReader(new FileReader("exercise.txt"));
            BufferedReader brAns = new BufferedReader(new FileReader("answer.txt"));
            //BufferedWriter bw = new BufferedWriter(new FileWriter("Grade.txt"));
            PrintStream bw = new PrintStream(new FileOutputStream("Grade.txt"));
            while ((lineAns = brAns.readLine()) != null){
                lineAns = lineAns.split(" ")[1];
    
                lineExe = brExe.readLine();
                String [] exerSplit = lineExe.split(":");
                if(exerSplit.length == 3){
                    lineExe = exerSplit[2];
                }
    
                if(lineAns.equals(lineExe)){
                    listCorrect.add(test++);
                }else {
                    listWrong.add(test++);
                }
            }
    
            bw.print("Correct:" + listCorrect.size() + "(");
            if(listCorrect.size() == 0){
                bw.print(")");
            }else{
                for(int i = 0; i < listCorrect.size(); i++){
                    bw.print(listCorrect.get(i));
                    if(i == listCorrect.size()-1){
                        bw.print(")");
                    }else {
                        bw.print(",");
                    }
                }
            }
    
            bw.println();
            bw.print("Wrong:" + listWrong.size() + "(");
            if(listWrong.size() == 0){
                bw.print(")");
            }else {
                for (int i = 0; i < listWrong.size(); i++) {
                    bw.print(listWrong.get(i));
                    if (i == listWrong.size() - 1) {
                        bw.print(")");
                    } else {
                        bw.print(",");
                    }
                }
            }
    
            bw.close();
            brAns.close();
            brExe.close();
    
        }
    

六.功能测试

  • 测试一

    • exercise.txt
    • answer.txt
    • Grade.txt
  • 测试二
    • exercise.txt
    • answer.txt
    • Grade.txt
  • 测试三
    • exercise.txt
    • answer.txt
    • Grade.txt
  • 测试四
    • exercise.txt
    • answer.txt
    • Grade.txt

七.PSP表格(完成)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 15
Estimate 估计这个任务需要多少时间 30 15
Development 开发 1310 1410
Analysis 需求分析 (包括学习新技术) 60 100
Design Spec 生成设计文档 0 0
Design Review 设计复审 (和同事审核设计文档) 0 0
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 30
Design 具体设计 180 210
Coding 具体编码 1000 1020
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 30 20
Reporting 报告 120 145
Test Report 测试报告 60 120
Size Measurement 计算工作量 30 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 15
总计 1460 1570

八.总结

  • 一定要规范。命名规范、分包规范、结构规范。
  • 和他人合作一定要及时讨论好,多交流多沟通。
  • 熟能生巧。打码少了,知识点就生疏了;生疏了,效率便会很低。

原文地址:https://www.cnblogs.com/iamwatershui/p/12609728.html

时间: 2024-10-30 07:20:54

四则运算题目自动生成程序的相关文章

四则运算题目自动生成

 一.程序要求:    1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数. 4. 每道题目中出现的运算符个

个人作业1——四则运算题目生成程序(基于控制台)

No.1 四则运算题目生成程序(基于控制台) 程序代码 需求分析: 能够根据用户自身对题目数量的需求自动生成一定数量的包含分数的四则运算题目的命令行程序. 功能设计: 除了整数以外,还要支持真分数的四则运算,真分数的运算 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数 使用 -n 参数控制生成题目的个数 设计实现: 程序是用c++实现的,主要有四个函数,主函数随机生成整数或者分数算法,divisor(int i, int j)计算最大公约数,zs为计算整数算法,

个人作业1——四则运算题目生成程序

一.题目描述: 实践能力的提高当然就是得多动手了,那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序. 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: (以下参考博客链接:http://www.cnblogs.com/jiel/p/4810756.html 1. 使用 -n 参数控制生成题目的个数,例

第二次结对编程—四则运算自动生成程序

一.题目要求 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 二.任务分配 驾驶员:王旭 领航员:张昊辰 驾驶员负责写代码,浏览文件,还有基础实现方法. 领航员则着眼更长远的考虑并且检查错误.进行代码测试和检查错误. 三.

四则运算题目生成程序

a.需求分析 看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习.练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 =

四则运算题目生成程序(基于控制台)

题目描述: 能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 功能设计: 1.  通过随机数的生成,实现+, ?, ×, ÷的确定 2.  +, ?, ×, ÷分别赋予整

软件工程关于自动生成四则运算题目程序的见解

1.需求分析 一个程序员在编写程序前第一件事就是要知道我要编写的程序是要干什么的,它要那些功能. 题目中要求一个能自动生成小学四则运算题目的程序,分析起来很简单,做起来也很简单. 2.实施 由于是小学四则运算题目 我们设定数字的大小不超过100,运算符号为+ - * /,而这一切要随机生成,不难想到要用到随机函数.首先使用SRAND函数设定随机数种子srand((unsigned)time(NULL)) ,再使用RAND函数控制随机生成我们想要的0-100的数字,至于如何生成加减乘除符号,我们可

自动生成四则运算题目

主要功能:随机生成四则运算题目 设计思想:先通过一个简单的四则运算,再不断完善 源代码 #include"stdio.h" main(){ int a,b,c,d; printf("自动生成四则运算:\n"); printf("%d+%d= \n",a,b); printf("%d-%d= \n",a,b); printf("%d*%d= \n",a,b); printf("%d/%d= \n&q

能自动生成小学四则运算题目的程序

题目要求 能自动生成小学四则运算题目 除了整数外,还要支持真分数的四则运算 支持多个运算符,也就是混合运算 程序支持判断对错,累计分数并倒计时 分析 分为几个函数功能模块:int getChoice() :    功能:用户选择功能 void showMenu():  功能:显示功能的菜单 void doExercise(int n):  功能:计分器 int test(int n);    功能:进行一道题的测试过程 int main();  主函数 源代码转载于李思雨,博客链接:http:/