zoukankan      html  css  js  c++  java
  • 个人项目终极博客——四则运算题目生成程序分析

    四则运算题目生成程序分析

    13061184 马腾跃

    一、时间分析

    PSP2.1

    Personal Software Process Stages

    Time

    Planning

    计划

     

    · Estimate

    ·估计这个任务需要多少时间

    15h

    Development

    开发

     

    · Analysis

    ·需求分析(包括学习新技术)

     2h

    · Design Spec

    ·生成设计文档

     1h

    · Design Review

    ·设计复审(和同事审核设计文档)

     0.5h

    · Coding Standard

    ·代码规范(为目前的开发制定合适规范)

     1h

    · Design

    ·具体设计

     4h

    · Coding

    ·具体编码

     4h

    · Code Review

    ·代码复审

     1h

    · Test

    ·测试(自我测试,修改代码,提交修改)

     3.5h

    Reporting

    报告

     

    · Test Report

    ·测试报告

     1h

    · Size Measurement

    ·计算工作量

     1h

    · Postmortem & Process Improvement Plan

    ·事后总结,并提出过程改进计划

     0.5h

     

    合计

     19.5h

    二、性能分析和改进

     

    在第一次的程序分析中可以发现,类Expression的使用比例非常之小,而且他的函数作用与program类有所重复,所以在改进时将Expression类进行删除,并且将原先由它实现的功能整合到其它类中进行实现。

     

             经过改进后可以发现,每个函数的均衡性得到了一定的提升。

    三、测试用例和程序正确性分析

             测试用例:在生成数量方面,测试了从1道至10000道的数据,所有数据都能够正常输出,但是在数量很大的时候运行速度会比较缓慢。

             在数值上限方面:程序在运行20以下的四则运算时能够正常输出,但是在数字比较大的时候会出现数字溢出的问题。

             在匹配答案的时候,首先进行生成的题目和答案进行匹配,与其输出结果应当为全部正确,然后再改变某些答案进行匹配,能够测试出答案不正确。

             具体测试用例如下(输入为命令行参数,输出为文件输出,由于输出题目很多,以第一道题目以及答案作为样例):

             -n 10 –r 10

                       1. 8 × 8'1/3 ÷ 7 ÷ 2'1/4

    1. 1. 4'44/189

             -n 100 –r 10

                       1. 3 ÷ 2/9

                       1. 13'1/2

             -n 10000 –r 10

                       1. 1'7/9 × (2'1/6 - 5/7 + 7'2/7)

                       1. 15'101/189

             -n 100 –r 20

                       1. 13'2/9 - 15'1/3 ÷ 11'1/5

                       1. 11'215/252

             -n 10000 –r 20

                       1. 1/4 + 18'15/19 + 19'15/17

                       1. 38'1191/1292

             -n 10000 –r 1000

    1. 36'1/11 × 77'29/65 ÷ 11'61/92 - 2'39/74

    1. 237'195757/1534390

             -e D:Exercises.txt -a D:Answers.txt (输出到Grade.txt)

                       如果两个文件是由程序生成的题目和答案,那么输出结果为:

    Correct: 100 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)

    Wrong: 0

                       如果手动更改答案文件中某几道题目答案的数值,那么输出结果为:

    Correct: 88 (1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100)

    Wrong: 12 (5, 10, 14, 19, 24, 34, 40, 52, 60, 74, 87, 97)

             -n 100 –r 100 –n 100 (参数个数错误):

                       控制台输出:Error: wrong number of arguments

             -n 100 –e 100 (参数个数正确,但是参数名称不正确)

                       控制台输出:Error: invalid arguments

             -n abc –r abc (参数的内容格式不符合要求)

                       控制台输出:Error: 输入字符串的格式不正确。

    四、总结与收获

    1、锻炼了用C#语言的编程能力,对VS编程环境有了更深入的了解;

    2、第一次接触编写一个完整软件的工作流程,迈出了熟悉博客操作流程的第一步;

    3、了解了程序性能分析的方法,随时督促自己进行程序改进;

    4、认识到了了解分析用户需求的重要性,明白了一个软件不必苛求完美,而是要足够好,稳定耐用即可。

    五、根据助教建议补充部分

    性能分析图:

    程序消耗最大的函数:

    由上面的图片可可以进行分析:Main函数中消耗最大的函数为Generate函数,然后Generate函数调用中消耗最大的是Number和Random的构造函数,而Number构造函数消耗最大的是其中调用的Random类的构造函数。由此分析得,整个程序消耗最高的就是Random类的构造函数。

    程序运行缓慢:为了避免生成的随机数重复,以前采用的方法是在每次生成随机数之前将进程暂停一段时间Thread.Sleep(10),这样就会导致程序生成10000道题目的时候运行时间很长。另外,由于性能分析的时候可以发现,Random类的构造方法占用了运行时间的很大部分,所以可以考虑在整个函数运行的过程中只构造一次Random类(设置为static类型变量)用于生成随机数,可以大幅度减少运行时间。

    数字溢出的问题:数字一出的问题主要存在于带分数的运算中:如果整数部分很大的话,一旦进行通分或者乘除法,会导致结果的分子或者分母过大。至于如何解决,可以在Number类的计算方法中,在进行通分或者乘除运算时,预先判断是否会产生溢出的问题,如果产生溢出,则抛出异常。

  • 相关阅读:
    RPC中阻塞队列的作用
    记用tensorflow-ranking时的bugs
    JDK作泛型比较时为什么把逻辑代码写两遍
    Java 不能声明泛型数组
    QuickSort Hoare vs Lomuto
    Java 对数组扩容
    Java交换两对象的问题
    毕业 失业
    dependencyManagement介绍
    web笔记
  • 原文地址:https://www.cnblogs.com/summerMTY/p/4827986.html
Copyright © 2011-2022 走看看