计算开脑题

自己取一个大气又可爱的标题

一、预估与实际

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

二、需求分析

我通过百度和实际问答的方式了解到,小学一年级数学有如下的几个特点:

  • 特点1只有加减法

       2只有正整数运算
      
       3只有20内的正整数
    

我通过百度和实际问答的方式了解到,小学二年级数学有如下的几个特点:
特点1比小学一年级多了乘除法

   2会2位数相加减的运算了

   3会运算100以内的数加减

经过分析,我认为,这个程序应当:
可接接收2个参数:题目数量、年级
会检测出各种输入参数的错误
会根据传入的年级生成对应需求的题目
最后将题目答案输出到out.txt文件
各部分函数代码给注释,有明确的逻辑。
程序运行中、文件输出后要给明确的提示
经过分析,我认为,这个程序应当:

三、设计

1. 设计思路

这个程序有一个类,3个函数,功能如下:
主函数里调用check()函数排除输入参数的各种问题
主函数里调用init()函数初始化题目和答案
主函数里调用OutPutFile()函数将题目和答案输出到out.txt文件中
check()类用来排除输入参数的各种问题,函数流程如下:
检测输入的参数的数量(只能为0、1、2这几种)
检测输入的是否为正整数
检测参数的大小是否符合需求
init()类用来生成题目和答案,函数流程如下:
生成2个可变字符串
生成2个随机数
在循环内将2个随机数用可变字符串拼接成题目和答案,并且保存答案
OutPutFile()函数将题目和答案输出到out.txt文件
函数流程图:
算法的关键:
判断输入的参数是否合法,对于不合法的各种情况需给予提示
生成的数字是否满足大纲要求时的判断逻辑

2. 实现方案

写出具体实现的步骤

准备工作:先在Github上创建仓库,克隆到本地
设计大纲:设置算法分类、多次判断、分类输出
技术关键:年级的选择、分类输出

四、编码

编码过程:
main函数:
创建一个可变字符串str用于拼接题目
创建check()函数专门用于检测输入参数的各种错误
将str和main函数的参数传入init()初始化函数中
创建OutPutFile()用于题目和答案输出到out.txt文件
init()函数:
创建1个可变字符串str1用于拼接答案
创建1个for循环
循环内生成2个随机数
用str拼接题目
用条件判断语句判断当前的运算符并算出答案
str1拼接答案
str1拼接到str尾部

遇到的问题:
如何使用cmd接收的参数
查阅别人的博客发现,用cmd输入的参数的使用方法和字符串数组的使用方法一致。

加减法怎么才能保证是随机的
原先我是用问号表达式来控制加减后面发现这种发放并不适用于2年级的加减乘除的情况。思考了一会儿,我将加减乘除法存入字符串数组当中,然后用随机数随机数组的下标就实现了,1年级随机数范围[0-1],2年级随机数范围[0-3]。

怎么才能实现题目和答案分离输出
原先我打算用字符串来完成,但是后面突然想到,如果要进行大批的字符串拼接可变字符串的拼接效率是最高的,所有我改变使用可变字符串Stringbuffer来进行拼接,我用2个可变字符串分开拼接题目和答案,最后再把题目和答案拼接到一起就解决了这个问题。

如何实现年级判断
我在年级判断的时候卡壳了一会儿,主要是因为1个参数应该默认为1年级,2个参数也可能是1年级也可能是二年级。经过一番思考我加了参数长度的判断就解决了问题。
我在字符串拼接的时候有换行out.txt 文件里面的题目全部显示在一行
百度查阅资料发现记事本里面的换行是'\r\n'

1. 调试日志

记录编码调试的日志,请记录下开发过程中的 debug 历程

除法余数的判断
解决方案:都做余数判断,分为两类输出,有余数按模版输出,无余数省略余数输出。
参数(年级的选择)
解决方案:在整体前做判断。由于我先写的算法,后进行年级选择导致。

输入的参数为英文、特殊符号、参数个数不对、参数数值过大程序意外停止
解决:将判断参数各种错误的代码独立抽出来写成一个check()函数,并且在出现错误的地方增加提示和正确的结束程序,防止程序抛错误。

2. 关键代码

package com.java.Task01;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

/**
*

  • @author 郏敏杰
  • 这是命令行工具MathExam,自动生成一份小学一年级的数学加减计算题。
    */

public class Math1Exam6317 {
public static void main(String[] args) throws IOException {

	//定义答案
	int answer;
	//确定输出的文件
	File file = new File("out.txt");
	//创建指向文件的数据输出流
	DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
	
	@SuppressWarnings("resource")
	Scanner input = new Scanner(System.in);
	System.out.println("小学一年级数学加减计算题");
	System.out.println("请输入题目数量:");
	//获取控制台输入题目数量n
	int n = input.nextInt();

	//生成题目
	for (int i = 1; i <= n; i++) {
		//生成两个随机数
		int num1 = (int)(Math.random()*100+1);
		int num2 = (int)(Math.random()*100+1);
		//生成题序和题目
		if(num1 > num2) {
			//生成减法
			System.out.println("("+ i +") " + num1 +" - "+ num2 + " =");
			String str = ("("+ i +") " + num1 +" - "+ num2 + " = " + (num1-num2));
			//写入数据
			out.writeUTF(str);

// System.out.println(str);
}
else {
//生成加法
System.out.println("("+ i +") " + num1 +" + "+ num2 + " =");
String str = ("("+ i +") " + num1 +" + "+ num2 + " = " + (num1+num2));
//写入数据
out.writeUTF(str);
// System.out.println(str);
}
}
out.close();

	System.out.println("------------------标准答案------------------");
	
	//创建指向文件的数据输入流
	DataInputStream in = new DataInputStream(new FileInputStream(file));
	//读数据
	for (int i = 0; i < n; i++) {
		System.out.println(in.readUTF());
	}
	in.close();
	
}//main

}

3. 代码规范

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

第一条代码中的命名均不以下划线或美元符号开始,也不一下划线或美元符号结束。
第二条代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
第三条类名使用UpperCamelCase风格,但是以下情形例外:DO / DTO / VO / AO / PO 等。
第四条方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
第五条变量和常量的命名方式:非公有(private/protected/default)变量前面要加上小写m;
第六条类型与中括号紧挨相连来定义数组。正例:定义整形数组 int[] arrayDemo;并人工检查代码是否符合规范
第七条杜绝完全不规范的缩写,避免忘文不知义。反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
第八条为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
第九条不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
第十条大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

五、测试

请思考并记录你认为必要的测试点,并记录测试用例与测试结果测试编号
测试编号 具体输入 预期结果 实际结果
1 0 格式错误!请重新输入...... 符合预期
2 10 正常执行,生成10道一年级加减运算题 符合预期
3 10 1 正常执行,生成10道一年级加减运算题 符合预期
4 10 2 正常执行,生成10道二年级乘除运算题 符合预期
5 10 3 格式错误!请重新输入...... 符合预期
6 1000 格式错误!请重新输入...... 符合预期

六、总结

请总结过程中的教训和经验,思考

1 程序不仅仅只是编码,在开始编码前应该还有很多工作要做,要分析需求,设计好文档,才能在完成的时候符合要求
编码前要先构思,有一个大致的方向
2基础知识很重要。在敲代码的时候有时候会发现自己知道要怎么做,但是就是因为不清楚基础知识而花费更多时间

posted @ 2018-09-11 23:39  唧唧复唧唧,木兰当户织  阅读(272)  评论(1编辑  收藏  举报