当前位置: 首页 > news >正文

MathExam小学一二年级计算题生成器V1.0

MathExam小学一二年级计算题生成器v1.0

一、预估与实际

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

二、需求分析

我通过在网络搜索的方式了解到,小学一年级数学有如下的几个特点:

  • 特点1:一年级数学只有加减法。
  • 特点2:只有三位数以下的加减。
  • 特点3:得出的结果不能为负数,因此当式子为减法式子时,前面的数字要小雨后面的数字。
  • 特点4:二年级数学有加减乘除。
  • 特点5:二年级数学有余数。
  • 特点6:二年级数学除法的除数只有个位数。

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

  • 使用的数字应为[0,100)
  • 除数的数字应[1,10)

三、设计

1. 设计思路

  • 根据题目要求,最终需要写入文本out.txt中,因此要先创建文本。
  • 数字需要随机得出,因此需要简历随机数。
  • 随机出来的式子需要写入文本,因此需要多个数组进行存储。
  • 答案需要的格式为“等式+答案”,并且还需要判断符号以及是否有余数,所以需要if{} else if{}进行判断。
    需要写入文本out.txt,所以需要BufferedWriter( )和循环,将数组里的数据一 一写入文本中。
  • 文本末尾需显示当前时间,因此创建Date,提取当前系统时间。

2. 实现方案

  • 准备工作:先在Github上创建仓库,克隆到本地...
  • 技术关键点:
    • 数组会越界,从而导致程序无法正常运行,因此循环时需要注意循环体是否达到要求,是否有问题。
    • 使用随机数Random( )时,需要注意随机数生成范围,比如除数的范围只有【1-9】
    • 当式子为减法时,减数要等于或小于被减数。
    • 使用 BufferedWriter( )将存入数组的数据一一输入文本 out.txt 里面。
    • 使用正则表达式、Pattern、Matcher判断输入参数是否达标,不达标则提示重新输入,并给予格式。
    • 使用 DateFormat( )获取系统当前时间。

四、编码

请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程

1. 调试日志

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

  • 在for循环中,存放数据的数组因为循环体出错,反复循环多次,导致越界,是程序无法正常运行。最后通过system.out.println打印出数组,判断出循环问题。
  • 在写入正则表达式之后,关于Boolean的判定,一开始使用的是 matcher.find(),后来发现只要数据带有相关的数字就会通过检验,因此改换成matcher.matches() ,成功将参数范围以及类型进行限定。
  • 当参数只写入一个的时候,程序出现问题,使用args.length判断输入参数的长度,再传参时,如果args.length==1则默认年级为1年级。

2. 关键代码

请展示一段程序的关键代码,并解释代码的作用

  • 通过main函数中String[] args的参数,进行正则表达式的判断,最后传入create()方法内。
  • count表示要生成的题数,grade表示对应的年级。
  • 使用random()随机生成数字。
   public static void create(int count,int grade) {
   
    Date date = new Date();
    DateFormat dt = DateFormat.getDateTimeInstance();
    dt.format(date);
    
    File file = new File ("out.txt");//创建文本
    FileWriter fw=null;
        try {
            fw = new FileWriter(file);
        
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }   
        BufferedWriter bw = new BufferedWriter(fw);
    int first=0,symbol=0,second=0,mark=0,w=0;
    int [] an=new int[count];//创建数组,用于存储数据,存储答案。
    int [] bn=new int[count];//存储第一个数字,式子的第一个数;
    int [] cn=new int[count];//存储第二个数字,用于判断符号;
    int [] dn=new int[count];//存储第三个数字,式子的第二个数
    int [] en=new int[count];//存储余数;
    Random r =new Random(); 
    while(w <count) {
        
        
        if(mark==0) //判断题号是否需要更新,若需要则输入题号。
        {
            try {
                bw.write(String.valueOf("("+ (w+1) +") "));
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        
    
    for(int i=0;i<4;i++)//循环四次,随机生成三个数。并在第四次进行符号判断,最后在文本输入式子。
    {
        if(i==0)
        {
            int number = (int)Math.floor((r.nextDouble()*100.0));//生成式子的第一个数
            first=number;
            bn[w]=first; //将式子的数字存入数组中,方便之后的提取
        }
        
        
        else if(i==1)
        {
            if(grade==1) 
            {
                int number = (int)Math.floor((r.nextDouble()*2.0));//生成第二个数字,用于判断符号
                symbol=number;
            }
            
            else if(grade==2)
            {
                int number = (int)Math.floor((r.nextDouble()*4.0));//生成第二个数字,用于判断符号
                symbol=number;
            }
            cn[w]=symbol;//将式子的数字存入数组中,方便之后的提取
            
        }
        
        
        else if(i==2)
        {   
            if(symbol==3)
            {
                int number = 1+(int)Math.floor((r.nextDouble()*10.0));//生成第三个数字
                second=number;
            }
            else 
            {
                int number = 1+(int)Math.floor((r.nextDouble()*100.0));//生成第三个数字
                second=number;
            }
            dn[w]=second;//将式子的数字存入数组中,方便之后的提取
        }       
        
        
        else if(i==3)
        {
            en[w]=0;//输入余数
            
            if (symbol==0)//判断符号,0为+号,1为-号,2为×号,3为÷号
            {   
                try {
                    bw.write(String.valueOf(" "+ first+ " + " +second+" = "));//输入式子
                    an[w]=first+second;//将答案存储在数组an中
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            
            }


            else if((symbol==1))
            {
                if(first-second < 0)
                {mark=1;break;}
                try {
                    bw.write(String.valueOf(" "+ first+ " - " +second+" = "));//输入式子
                    an[w]=first-second;//将答案存储在数组an中
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }

            }



            else if((symbol==2)) 
            {
                try {
                    bw.write(String.valueOf(" "+ first+ " × " +second+" = "));//输入式子
                    an[w]=first*second;//将答案存储在数组an中
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }



            else if((symbol==3)) 
            {
                
                
                try {
                    en[w]=first % second;//将余数存入数组en中
                    bw.write(String.valueOf(" "+ first+ " ÷ " +second+" = "));//输入式子
                    an[w]=(int)(first/second);//将答案存储在数组an中
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        mark=0;//证明式子成功写入,题号需要更新。
        w++;
        
        }   
        
            
    }//内循环结束

            
    if(mark==0)//判断式子是否成功写入,如果成果则执行换行。
        try {
            bw.newLine();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
}//while循环结束。

3. 代码规范

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

  • 第一条:代码中的变量名不能以下划线开始也不能以下划线结束。
  • 第二条:代码中的命名严禁使用拼音与英文混合,更不许使用中文命名。
  • 第三条:常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长。
  • 第四条:类型与中括号紧挨相连来定义数组。
  • 第五条:杜绝完全不规范的缩写,避免忘文不知义。
  • 第六条:第四条:不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。并人工检查代码是否符合规范

五、测试

请思考并记录你认为必要的测试点,并记录测试用例与测试结果

参数个数测试用例结果
一个参数java MathExam6360 10运行正常
java MathExam6360 0提示错误,需重新输入
java MathExam6360 00001提示错误,需重新输入
java MathExam6360 a提示错误,需重新输入
java MathExam6360 10000提示错误,需重新输入
java MathExam6360 -1提示错误,需重新输入
java MathExam6360 0.1提示错误,需重新输入
2个参数java MathExam6360 10 2运行正常
java MathExam6360 10 20提示错误,需重新输入
java MathExam6360 10 a提示错误,需重新输入
java MathExam6301 d 2提示错误,需重新输入
java MathExam6301 0001 2提示错误,需重新输入
java MathExam6301 100 0.1提示错误,需重新输入
java MathExam6360 10运行正常

六、总结

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

  • 在写代码的过程中,每功课一次目标,其实内心是很欢喜的,因为这代表着我在攻克这目标之前所用的时间都得到了相应的回报,我的水平并不高,因此可能功课每一步的时间花费的比其他人都要长,不过我也确实在这次的过程中学到了一些东西,严格来说其实不算是学到,而是把上学期所学过的,所用过的进行了一次巩固。当然水平不足的我少不了翻看曾经的PPT、作业以及上网查询某一些函数的用法。
  • 由于水平不足,其实我的代码有着冗余,还是在同学的指导下,发现了其中一些代码冗余的地方。而且刚开始决定敲代码时,并没有程序进行相应规划以及设计,属于想到什么就写什么,因此遇到了问题时,总是手忙脚乱的找错误。倒是养出了给代码注释的习惯,方便之后出错可以迅速查找。
  • 相比于其他人,我确实是自愧不如,敲代码的时间四五天有余,虽然最后敲出来了成果,但是却依然比不得其他同学,还有许多需要改进的地方。使用正则表达式限制了输入参数的类型以及范围,最开始使用的matcher.find()的boolean判断,却总能被判断正确,即使输入参数不对。之后再同学的建议下修改成matcher.matche()的boolean判断,总算成功限定了参数类型和范围。
  • 这一次的作业,让我受益良多,即使代码看多了脑壳会疼,不过在完成目标后,那种可以令人上瘾的感觉,实在是欲罢不能,这或许是我坚持那么久去推敲代码的动力吧。

转载于:https://www.cnblogs.com/Dnyqi/p/9603812.html

相关文章:

  • 建设银行无人银行开业,铁饭碗是属于程序员的
  • Java 集合系列-第八篇-Map架构
  • Redhat7.0下部署NFS服务器
  • 网络,NFS
  • 服务器目录权限
  • LAMP搭建
  • 自动生成指定特征的数独题目(未完待续)
  • 学习python必备的学习网站
  • Linux服务器性能评估
  • Synchronized与Lock的底层实现解析
  • ES6数组的扩展----Array.from()和Array.of()
  • jdk动态代理和cglib动态代理的区别
  • 设计模式-结构型模式,python组合模式
  • webpack4学习笔记
  • 【leetcode】907. Sum of Subarray Minimums
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Angular 2 DI - IoC DI - 1
  • C++类中的特殊成员函数
  • dva中组件的懒加载
  • HTML-表单
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS专题之继承
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • ucore操作系统实验笔记 - 重新理解中断
  • Vim Clutch | 面向脚踏板编程……
  • vuex 学习笔记 01
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 记一次和乔布斯合作最难忘的经历
  • 京东美团研发面经
  • 每天一个设计模式之命令模式
  • 前端工程化(Gulp、Webpack)-webpack
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 学习使用ExpressJS 4.0中的新Router
  • 积累各种好的链接
  • ​​​​​​​​​​​​​​Γ函数
  • ​马来语翻译中文去哪比较好?
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #13 yum、编译安装与sed命令的使用
  • #QT(智能家居界面-界面切换)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • (三)mysql_MYSQL(三)
  • (四)汇编语言——简单程序
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)德国人的记事本
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例