zoukankan      html  css  js  c++  java
  • 程序开发初体验

    程序开发初体验

    一、预估与实际

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

    二、需求分析

    我通过网上查询的方式了解到:

    (1)小学一年级数学有如下的几个特点:

    • 特点1:掌握100以内加减法

    • 特点2:未学习小数和负数

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

    • 加法和减法使用的数字小于100(加法计算结果也不能超出)

    • 小学还未学习负数(减法计算结果也不能出现负数)

    • 小学一年级尚未学习乘除,所以四则运算暂时不做乘除运算。

    (2)小学二年级数学新增如下的几个特点:

    • 特点1:掌握乘法口诀表

    • 特点2:10以内的除法

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

    • 加法和减法使用的数字小于100(加法计算结果也不能超出)

    • 小学还未学习负数(减法计算结果也不能出现负数)

    • 乘法和除法使用的数字小于10(乘法计算结果可以超出)

    三、设计

    1. 设计思路

    这个程序就一个类,四个函数,main函数接收输入的信息,之后调用check函数检查输入的信息是否有误,有误给出提示,无误则继续调用create函数创建out .txt输出文件。最后调用work函数出题和给出答案。
    

    2. 实现方案

    • 准备工作:先在Github上创建仓库,克隆到本地,在eclipse上编写代码。

    • 技术关键点:梳理一下设计思路,可能遇到哪些技术关键点

      • 命令行参数输入

      • 参数正则匹配

      • 重定向输出到文件

    四、编码

    1. 调试日志

    首先开始构思出大致的框架,在查询百度和API文档了解随机数的生成后,大致框架已经成型。刚开始题目和答案我是用字符串数组存储的,容易出现数组越界问题,所以我换成用字符串存储。至于输出到文件第一反应也是转变为字节流循环输出。后来再温习I/O流代码时,发现以前实验延申有重定向,在上网学习后,文件输出就解决了。最后就是解决参数输入错误的BUG,在众多输入可能都要考虑的情况下,字符正则匹配相对其它容易得多。
    

    2. 关键代码

    /**
     * 检查输入的参数是否合法
     * @param strN:题数
     * @param strGrade:年级
     * @return	合法返回true,否则返回false
     */
    public static boolean check(String strN, String strGrade) {
    	// 若题数不为数字
    	if (!strN.matches("\d*")) {
    		// 若题数为负号+数字(即为负数)
    		if (strN.matches("-\d*")) {
    			System.out.println("输入一个正确的数字哦,不能为负");
    			return false;
    		} else {
    			// 题数为数字外的字符
    			System.out.println("输入的题数必须是数字!");
    			return false;
    		}
    	} else {
    		// 字符串类型的题数转成整型
    		n = Integer.parseInt(strN);
    		if (n > 100) {
    			System.out.println("输入的题数过大,体谅下小学生哦");
    			return false;
    		}
    	}
    	
    	if (!strGrade.matches("[1-2]")) {
    		System.out.println("年级只能是 1 或者 2 哦");
    		return false;
    	} else {
    		grade = Integer.parseInt(strGrade);
    	}
    	return true;
    }
    /**
     * 出题和给出答案至文件
     */
    public static void work() {
    	int num1, num2, op;
    	String str = "", result = "";
    	Random rand = new Random();
    	for (int i = 1; i <= n; i++) {
    		// 随机生成0~100的数
    		num1 = rand.nextInt(101);
    		num2 = rand.nextInt(101);
    		if (grade == 1) {
    			// 一年级只有加减
    			op = rand.nextInt(2);
    		} else
    			// 二年级涉及乘除
    			op = rand.nextInt(4);
    		// op = 0加法,1减法,2乘法。3除法
    		if (op == 0) {
    			// 若两数之和超过100,不合理跳过
    			if ((num1 + num2) > 100) {
    				// 跳过但是不能减少题数,循环变量需要减一
    				i--;
    				continue;
    			}
    			// 字符串更新,需注意windows系统下,换行符为“
    ”
    			str += "(" + i + ") " + num1 + " + " + num2 + "
    ";
    			result += "(" + i + ") " + num1 + " + " + num2 + " = " + (num1 + num2) + "
    ";
    		} else if (op == 1) {
    			// 两数之差出现负数,不合理跳过
    			if ((num1 - num2) < 0) {
    				// 同理,循环变量需要减一
    				i--;
    				continue;
    			}
    			str += "(" + i + ") " + num1 + " - " + num2 + "
    ";
    			result += "(" + i + ") " + num1 + " - " + num2 + " = " + (num1 - num2) + "
    ";
    		} else if (op == 2) {
    			// 乘除数值为0~10
    			num1 = rand.nextInt(11);
    			num2 = rand.nextInt(11);
    			// 同理,两数之积超过100,不合理跳过
    			if ((num1 * num2) > 100) {
    				i--;
    				continue;
    			}
    			str += "(" + i + ") " + num1 + " * " + num2 + "
    ";
    			result += "(" + i + ") " + num1 + " * " + num2 + " = " + (num1 * num2) + "
    ";
    		} else {
    			num1 = rand.nextInt(11);
    			num2 = rand.nextInt(11);
    			// 同理,除数不能为0,不合理跳过
    			if (num2 == 0) {
    				i--;
    				continue;
    			}
    			str += "(" + i + ") " + num1 + " / " + num2 + "
    ";
    			if (num1 % num2 != 0) {
    				result += "(" + i + ") " + num1 + " / " + num2 + " = " + (num1 / num2) + "..." + (num1 % num2)
    						+ "
    ";
    			} else {
    				result += "(" + i + ") " + num1 + " / " + num2 + " = " + (num1 / num2) + "
    ";
    			}
    		}
    	}
    	System.out.println(str);
    	System.out.print(result);
    }
    

    3. 代码规范

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

    • 第一条:代码中的命名均不能以下划线或美元符号开始,也不能一下划线或美元符号结束。

    • 第二条:代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

    • 第三条:注释的双斜线与注释内容之间有且仅有一个空格。

    • 第四条:方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。

    • 第五条:杜绝完全不规范的缩写,避免忘文不知义。

    • 第六条:不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

    • 第七条:大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:左大括号前不换行。左大括号后换行。右大括号前换行。右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

    • 第八条:左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格。详见第5条下面正例提示。

    • 第九条:循环体内,字符串的连接方法,使用StringBuilder的append方法进行扩展。
      并人工检查代码是否符合规范

    五、测试

    测试用例 预期结果 实际结果
    xzh 1 输入的题数必须是数字! 同预期结果
    1000 1 输入的题数过大,体谅下小学生哦 同预期结果
    -123 2 输入一个正确的数字哦,不能为负 同预期结果
    0000000001 2 正确文档输出 同预期结果
    10 56 年级只能是 1 或者 2 哦 同预期结果
    10 -1 年级只能是 1 或者 2 哦 同预期结果
    10 xzh 年级只能是 1 或者 2 哦 同预期结果
    10 2 正确文档输出 同预期结果

    六、总结

     以前都没有整个项目的体验,这次经历了整个小项目的过程,刚开始完全没有头绪,不知到从何处下手。拿到题目就和往常一样开始考虑写代码,以致于需求分析不到位,导致多次修改代码。代码规范是很重要的,要养成良好的编程习惯。感觉这次做的思路不是很清晰,没有规划好第一步做什么,第二步做什么,有点草率。这次吸取教训和经验,相信自己往后会做的更好。
  • 相关阅读:
    [51nod] 1088 最长回文子串 #Hash+二分
    [51nod] 1378 夹克老爷的愤怒 #树形DP
    [BZOJ] 2456: mode #众数计数法
    [51nod] 1199 Money out of Thin Air #线段树+DFS序
    [51nod] 1494 选举拉票 #算法设计策略
    [51nod] 1463 找朋友 #离线+扫描线
    [BZOJ] 2733: [HNOI2012]永无乡 #线段树合并+并查集
    [BZOJ] 1012: [JSOI2008]最大数maxnumber
    [Codeforces] E. Lomsat gelral #DSU on Tree
    [BZOJ] 4756: [Usaco2017 Jan]Promotion Counting #线段树合并+权值线段树
  • 原文地址:https://www.cnblogs.com/xzh0717/p/9631676.html
Copyright © 2011-2022 走看看