程序开发初体验

程序开发初体验

一、预估与实际

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系统下,换行符为“\r\n”
            str += "(" + i + ") " + num1 + " + " + num2 + "\r\n";
            result += "(" + i + ") " + num1 + " + " + num2 + " = " + (num1 + num2) + "\r\n";
        } else if (op == 1) {
            // 两数之差出现负数,不合理跳过
            if ((num1 - num2) < 0) {
                // 同理,循环变量需要减一
                i--;
                continue;
            }
            str += "(" + i + ") " + num1 + " - " + num2 + "\r\n";
            result += "(" + i + ") " + num1 + " - " + num2 + " = " + (num1 - num2) + "\r\n";
        } 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 + "\r\n";
            result += "(" + i + ") " + num1 + " * " + num2 + " = " + (num1 * num2) + "\r\n";
        } else {
            num1 = rand.nextInt(11);
            num2 = rand.nextInt(11);
            // 同理,除数不能为0,不合理跳过
            if (num2 == 0) {
                i--;
                continue;
            }
            str += "(" + i + ") " + num1 + " / " + num2 + "\r\n";
            if (num1 % num2 != 0) {
                result += "(" + i + ") " + num1 + " / " + num2 + " = " + (num1 / num2) + "..." + (num1 % num2)
                        + "\r\n";
            } else {
                result += "(" + i + ") " + num1 + " / " + num2 + " = " + (num1 / num2) + "\r\n";
            }
        }
    }
    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 正确文档输出 同预期结果

六、总结

 以前都没有整个项目的体验,这次经历了整个小项目的过程,刚开始完全没有头绪,不知到从何处下手。拿到题目就和往常一样开始考虑写代码,以致于需求分析不到位,导致多次修改代码。代码规范是很重要的,要养成良好的编程习惯。感觉这次做的思路不是很清晰,没有规划好第一步做什么,第二步做什么,有点草率。这次吸取教训和经验,相信自己往后会做的更好。

猜你喜欢

转载自www.cnblogs.com/xzh0717/p/9631676.html