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

PSP2.1个人软件过程实践
本文详细记录了一次个人软件过程(PSP2.1)实践经历,包括任务预估与实际耗时对比、需求分析、设计思路、编码过程中遇到的问题与解决方法、测试案例及结果,最后进行了总结反思。

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

一、预估与实际

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

二、需求分析

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

特点1

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

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

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

三、设计

1. 设计思路

说明你如何设计这个程序

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

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 1out文件正常存储题目及答案
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 2out文件正常存储题目及答案
java MathExam6301 10out文件正常存储一年级题目及答案
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调整好。我硬是想了想自己花在这个项目上的时间,有四天,当然这还包括了上课。哪里不好自己是最清楚不过的,我虽然花了很多时间,但相比那些大佬们我是自愧不如,所谓的事半功倍是给他们的,我是事倍功半。但是我是不会放弃的。这是之前不好好读书欠下的债,得自己慢慢不回来。

转载于:https://www.cnblogs.com/caizhenyi/p/9630104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值