小学生运算神器 ---你们不来试试?

优秀的我还是可以写出代码的嘛

一、预估与实际

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

二、需求分析

我通过网上查询的方式了解到,小学一、二年级数学有如下的几个特点:

特点1

  • 加法运算:和不超过100
  • 减法运算:只进行100以内减法,且被减数比减数大
  • 乘法运算:只进行表内乘除法,即因数都不大于10
  • 除法运算:只在百内进行除法,且除数在10以内
  • 不出现负数

经过分析,我认为,这个程序应当:

  • 使用的数字小于100
  • 被除数比除数大
  • 被减数比减数大
  • 结果要是正数

三、设计

1. 设计思路

说明你如何设计这个程序

  • 程序分为1个类,3个方法。方法分别为运算的,测试参数大小的以及测试参数首位是否为0
  • 整个程序的流程大致如下图:

2. 实现方案

写出具体实现的步骤

  • 准备工作:先在Github上创建仓库,克隆到本地,之后在仓库中创建文件夹,编写代码之后通过git传到github
  • 技术关键点:
    (1)运算代码的实现
    (2)参数如何在命令行输入
    (3)正则表达式判断参数是否为数字
    (4)文件的输入输出
    (5)日期格式的转化

四、编码

请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程

1. 调试日志

  • 对输入的参数进行判断后报错的输出总是出错
    解决方案:对if /else if/else 语句理解还不够透彻,没有灵活使用,后整顿心态慢慢试才成功。
  • 没有输入参数直接运行,结果无任何显示,与预期结果不一致
    解决方案:在还没判断输入的参数是否为数字之前进行判断,如果args的长度为0,则报错

2. 关键代码

请展示一段程序的关键代码,并解释代码的作用
/**

  • 代码的作用:生成题目后将答案存入文档,显示当前时间

  • n : 生成的题目数量

  • m : 年级

    public static void operation(int n,int m){
        File file = new File("out.txt");
        OutputStream out;
        try {
    	    out = new FileOutputStream(file);
    	    int[] an= new int[n];
    	    int bn[] = new int[n];
    	    String random = "";
    	    String[] Symbol1= {"+","-"};
    	    String[] Symbol2= {"*","/"};
    
    	if(m==1) { //判断年级
    		for(int i=0;i<n;i++) {
    			int index = (int)(Math.random()*(Symbol1.length));
    			random = Symbol1[index];   //随机调用Symbol1中的元素
    			if(random.equals("+")) {
    				int a = (int)(Math.random()*(50+1));//随机选择0~50之间的数
    				int b = (int)(Math.random()*(50+1));
    				System.out.printf("("+(i+1)+") "+a+" + "+b+" = "+"\n");
    				an[i]=a+b;
    				String output = "("+(i+1)+") "+a+" + "+b+" = "+"\n";
    				out.write(output.getBytes());
    	
    			}
    		
    			else{
    				int a = (int)(Math.random()*(100+1));
    				int b = (int)(Math.random()*a);
    				System.out.printf("("+(i+1)+") "+a+" - "+b+" = "+"\n");
    				an[i]=a-b;
    				String output = "("+(i+1)+") "+a+" - "+b+" = "+"\n";
    				out.write(output.getBytes());
    	
    				}
    		}
    	}
    	if(m==2) {
    		for(int i=0;i<n;i++) {
    			int index = (int)(Math.random()*(Symbol2.length));
    			random = Symbol2[index];
    			if(random.equals("*")) {
    				int a = (int)(Math.random()*10);
    				int b = (int)(Math.random()*10);
    				System.out.printf("("+(i+1)+") "+a+" * "+b+" = "+"\n");
    				an[i]=a*b;
    				String output = "("+(i+1)+") "+a+" * "+b+" = "+"\n";
    				out.write(output.getBytes());
    	
    			}
    			if(random.equals("/")) {
    				int a = (int)(Math.random()*(100+1));
    				int b = 1+(int)(Math.random()*9);
    				System.out.printf("("+(i+1)+") "+a+" / "+b+" = "+"\n");
    				an[i]=a/b;
    				bn[i]=a%b;
    				String output = "("+(i+1)+") "+a+" / "+b+" = "+"\n";
    				out.write(output.getBytes());
    	}
    	}
    	}
    	String flag = "\n";
    	out.write(flag.getBytes());
    	//输入答案
    	Scanner in = new Scanner(file);
    	int j=0;
    	while(in.hasNextLine()&&j!=n) {
    		if(bn[j]==0) {
    			String s = in.nextLine()+an[j]+"\n";
    			out.write(s.getBytes());
    		}
    		else {
    		String s = in.nextLine()+an[j]+"..."+bn[j]+"\n";
    		out.write(s.getBytes());
    		}
    		j++;
    	}
    	//时间
    	Date date = new Date();
    	String time = "yyyy年MM月 dd日  HH:mm";
    	SimpleDateFormat sdf = new SimpleDateFormat(time);
    	String now = "			211606301   蔡振翼    "+sdf.format(date)+"\n";
    	out.write(now.getBytes());
    	out.close();
    } catch (IOException e) {
    	System.out.println("抛异常");
    }
    

    }

3. 代码规范

请给出本次实验使用的代码规范:

  • 第一条:常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长。
  • 第二条:类型与中括号紧挨相连来定义数组。
  • 第三条:不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
  • 第四条:不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。
  • 第五条:如果变量值尽在一个固定范围内变化用enum类型来定义
  • 第六条:左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格。详见第5条下面正例提示。
  • 第七条: if/for/while/switch/do等保留字与括号之间都必须加空格。
  • 第八条:采用4个空格缩进,禁止使用tab字符

五、测试

请思考并记录你认为必要的测试点,并记录测试用例与测试结果

参数个数 测试用例 结果
1个参数 java MathExam6301 1 out文件正常存储题目及答案
java MathExam6301 0 题数首位不可为0!
java MathExam6301 1 2 只可输入一个参数!
java MathExam6301 a 题数需为正整数!
java MathExam6301 100000 题数输入的数字太大!
java MathExam6301 00001 题数首位不可为0!
java MathExam6301 -1 题数需为正整数!
java MathExam6301 请输入参数!
2个参数 java MathExam6301 10 2 out文件正常存储题目及答案
java MathExam6301 10 out文件正常存储一年级题目及答案
java MathExam6301 2 2 5 只可输入两个参数!
java MathExam6301 5 d 年级需为正整数!
java MathExam6301 d 2 题数需为正整数!
java MathExam6301 d d 题数需为正整数!
java MathExam6301 001 2 年级和题数首位任何一个都不可为0!
java MathExam6301 4 0001 年级和题数首位任何一个都不可为0!
java MathExam6301 0001 00002 年级和题数首位不可为0!
java MathExam6301 请输入参数!

六、总结

	写完代码的感觉很棒,但是有自知之明,我的代码并不算好,有过多的代码冗余,完全可以用更好的方法来写但是我不会。
    在写代码初期的时候自己并没有规划好怎么进行,就按着思路去做,结果一卡就卡死了,总要想很久才能有所突破,好几次测试的时候要改动代码头脑就像开花一样什么懂不清楚,浑浑噩噩的,硬是花了将近一天的时间才把bug调整好。我硬是想了想自己花在这个项目上的时间,有四天,当然这还包括了上课。哪里不好自己是最清楚不过的,我虽然花了很多时间,但相比那些大佬们我是自愧不如,所谓的事半功倍是给他们的,我是事倍功半。但是我是不会放弃的。这是之前不好好读书欠下的债,得自己慢慢不回来。
posted @ 2018-09-11 20:29  抬望  阅读(320)  评论(2编辑  收藏  举报