小学生双倍快乐

可爱的小学一二年级计算题

一、预估与实际

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

二、需求分析

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

  • 特点1
    都是正整数,范围在0-100以内
  • 特点2
    会100以内加减乘除法
  • 特点3
    相减的差不为0
    经过分析,我认为,这个程序应当:

  • 使用的数字小于100
  • 不能使用负数
  • 除数不能为0

    三、设计

1. 设计思路

说明你如何设计这个程序

比如:

  • 这个程序有x个类,x个函数,函数之间的调用关系是怎样的?
  • 关键函数的流程图是怎样的?
  • 算法的关键的关键是什么?
  • 运用随机数,查阅资料
  • FileOutputStream的write()方法来写入文件。
  • out.txt文本的建立和写入
  • 可以凭自己意愿循环生成想要的题目与答案

    2. 实现方案

写出具体实现的步骤

比如:

  • 准备工作:下载Git管理仓库,并在GitHub上fork亓老师主页的MathExam2018仓库,并clone到本地;
  • 技术关键点:关于文本创建的一系列方法,判断是一年级还是二年级,用两个StringBuffer分别表示题目与答案,用append方法连接起来

    四、编码

    查到math.random()是生成随机数的方法
    第二位随机数根据第一位的值限制范围,即可以不会发生差值为负的情况
    将字符串数组转换成byte,再用FileOutputStream的write()方法来写入文件。

1. 调试日志

  • cmd输入文件的未换行,经过查询知道cmd换行符/r/n

  • 想要循环进程从头开始,问题在于没给再一次输入参数,所以参数一直保持不变,解决方法是加一个控制台输入。

  • 修改了输入“abcd”字符的结果

2. 关键代码

for(i=0;i<n[0];i++) {
int a=(int)(Math.random()10+1);
int b=(int)(Math.random()
10+1); // 保证除数不为0
int c=(int)(Math.random()2);
if(c%2==0) {
System.out.println("("+(i+1)+")"+a+"x"+b+"="); // 乘法运算
qs = new StringBuffer("("+(i+1)+")"+a+"x"+b+"=");
rs = new StringBuffer(" "+(a
b));
as[i]=("("+(i+1)+")"+a+"x"+b+"=");
qs.append(rs);
cs[i]=qs.toString();
}

  • 乘法算法
    for(;;) {
    int flag=4;
    int[] n =new int [args.length] ;
    n[0]=Integer.parseInt(args[0]);
    n[1]=Integer.parseInt(args[1]);
    if(args[0].length()>5 && Integer.parseInt(args[0])>100) {
    System.out.print(" 输入的题目数太大"); // 限制题数过大
    flag=0;
    }
    if(Integer.parseInt(args[1])>2) {
    System.out.print(" 输入的年级数太大"); // 限制年级数过大
    flag=1;
    }
    if(n[0]<=0 && !args[0].matches("\d")) {
    System.out.print(" 输入的题目数不对,应为正整数"); // 限制题数为正整数
    flag=2;
    }
    if(n[1]<=0 && !args[1].matches("\d
    ")) {
    System.out.print(" 输入的年级数不对,应为正整数"); // 限制年级数为正整数
    flag=3;
    }
    if(flag!=4) {
    System.out.println("\n"+"请输入题目数与年级"); args[0]=sc.next();args[1]=sc.next();continue;
    }// 如果输入的两个参数不对 则继续输入 直至正确为止

  • 控制输入参数的规范

  • 3. 代码规范

  • 第一条:注释的双斜线与注释内容之间有且仅有一个空格
  • 第二条:左小括号和字符之间不出现空格;同样的,右小括号和字符之间也不出现空格
  • 第三条:避免类似的名字,或者仅仅是大小写不同的名字
  • 第四条:左大括号后换行
  • 第五条:注释的双斜线与注释内容之间有且仅有一个空格

五、测试

  • 输入 10 0 输出:输入的年级数不对,应为正整数
    请输入题目数与年级
  • 输入 -10 1 输出:输入的题目数不对,应为正整数
    请输入题目数与年级
  • 输入10 -1 输出:输入的年级数不对,应为正整数
    请输入题目数与年级
  • 输入10 3 输出:输入的年级数太大
    请输入题目数与年级
  • 输入-10 -1 输出:输入的年级数太大输入的题目数不对,应为正整数 输入的年级数不对,应为正整数
    请输入题目数与年级
  • 输入10 1输出正常
  • 输入10 2输出正常

六、总结

  • 敲代码前总觉得挺容易的,直到打完之后才发现有许许多多的问题。这种情况我觉得应该从一开始就规范好自己的代码,以便后续的寻找和修改,这对于自己与别人都好。刚开始写的时候真的是举步维艰,一个一个方法的查,一个一个人的问,写到能实现基础运算功能后又发现许许多多的错误,我才意识到思路有了之后一定要好好规划,不然写完了还要花大量的时间补代码。

猜你喜欢

转载自www.cnblogs.com/linzenghan/p/9629422.html