码迷,mamicode.com
首页 > 其他好文 > 详细

计算开脑题

时间:2018-09-12 01:29:39      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:命名方式   类型   condition   文档   局部变量   人工   deb   scanner   算法   

自己取一个大气又可爱的标题

一、预估与实际

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

二、需求分析

我通过百度和实际问答的方式了解到,小学一年级数学有如下的几个特点:

  • 特点1只有加减法

       2只有正整数运算
    
       3只有20内的正整数

    我通过百度和实际问答的方式了解到,小学二年级数学有如下的几个特点:
    特点1比小学一年级多了乘除法

     2会2位数相加减的运算了
    
     3会运算100以内的数加减

经过分析,我认为,这个程序应当:
可接接收2个参数:题目数量、年级
会检测出各种输入参数的错误
会根据传入的年级生成对应需求的题目
最后将题目答案输出到out.txt文件
各部分函数代码给注释,有明确的逻辑。
程序运行中、文件输出后要给明确的提示
经过分析,我认为,这个程序应当:

三、设计

1. 设计思路

这个程序有一个类,3个函数,功能如下:
主函数里调用check()函数排除输入参数的各种问题
主函数里调用init()函数初始化题目和答案
主函数里调用OutPutFile()函数将题目和答案输出到out.txt文件中
check()类用来排除输入参数的各种问题,函数流程如下:
检测输入的参数的数量(只能为0、1、2这几种)
检测输入的是否为正整数
检测参数的大小是否符合需求
init()类用来生成题目和答案,函数流程如下:
生成2个可变字符串
生成2个随机数
在循环内将2个随机数用可变字符串拼接成题目和答案,并且保存答案
OutPutFile()函数将题目和答案输出到out.txt文件
函数流程图:
算法的关键:
判断输入的参数是否合法,对于不合法的各种情况需给予提示
生成的数字是否满足大纲要求时的判断逻辑

2. 实现方案

写出具体实现的步骤

准备工作:先在Github上创建仓库,克隆到本地
设计大纲:设置算法分类、多次判断、分类输出
技术关键:年级的选择、分类输出

四、编码

编码过程:
main函数:
创建一个可变字符串str用于拼接题目
创建check()函数专门用于检测输入参数的各种错误
将str和main函数的参数传入init()初始化函数中
创建OutPutFile()用于题目和答案输出到out.txt文件
init()函数:
创建1个可变字符串str1用于拼接答案
创建1个for循环
循环内生成2个随机数
用str拼接题目
用条件判断语句判断当前的运算符并算出答案
str1拼接答案
str1拼接到str尾部

遇到的问题:
如何使用cmd接收的参数
查阅别人的博客发现,用cmd输入的参数的使用方法和字符串数组的使用方法一致。

加减法怎么才能保证是随机的
原先我是用问号表达式来控制加减后面发现这种发放并不适用于2年级的加减乘除的情况。思考了一会儿,我将加减乘除法存入字符串数组当中,然后用随机数随机数组的下标就实现了,1年级随机数范围[0-1],2年级随机数范围[0-3]。

怎么才能实现题目和答案分离输出
原先我打算用字符串来完成,但是后面突然想到,如果要进行大批的字符串拼接可变字符串的拼接效率是最高的,所有我改变使用可变字符串Stringbuffer来进行拼接,我用2个可变字符串分开拼接题目和答案,最后再把题目和答案拼接到一起就解决了这个问题。

如何实现年级判断
我在年级判断的时候卡壳了一会儿,主要是因为1个参数应该默认为1年级,2个参数也可能是1年级也可能是二年级。经过一番思考我加了参数长度的判断就解决了问题。
我在字符串拼接的时候有换行out.txt 文件里面的题目全部显示在一行
百度查阅资料发现记事本里面的换行是‘\r\n‘

1. 调试日志

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

除法余数的判断
解决方案:都做余数判断,分为两类输出,有余数按模版输出,无余数省略余数输出。
参数(年级的选择)
解决方案:在整体前做判断。由于我先写的算法,后进行年级选择导致。

输入的参数为英文、特殊符号、参数个数不对、参数数值过大程序意外停止
解决:将判断参数各种错误的代码独立抽出来写成一个check()函数,并且在出现错误的地方增加提示和正确的结束程序,防止程序抛错误。

2. 关键代码

package com.java.Task01;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

/**

  • @author 郏敏杰
  • 这是命令行工具MathExam,自动生成一份小学一年级的数学加减计算题。
    */

public class Math1Exam6317 {
public static void main(String[] args) throws IOException {

    //定义答案
    int answer;
    //确定输出的文件
    File file = new File("out.txt");
    //创建指向文件的数据输出流
    DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
    
    @SuppressWarnings("resource")
    Scanner input = new Scanner(System.in);
    System.out.println("小学一年级数学加减计算题");
    System.out.println("请输入题目数量:");
    //获取控制台输入题目数量n
    int n = input.nextInt();

    //生成题目
    for (int i = 1; i <= n; i++) {
        //生成两个随机数
        int num1 = (int)(Math.random()*100+1);
        int num2 = (int)(Math.random()*100+1);
        //生成题序和题目
        if(num1 > num2) {
            //生成减法
            System.out.println("("+ i +") " + num1 +" - "+ num2 + " =");
            String str = ("("+ i +") " + num1 +" - "+ num2 + " = " + (num1-num2));
            //写入数据
            out.writeUTF(str);

// System.out.println(str);
}
else {
//生成加法
System.out.println("("+ i +") " + num1 +" + "+ num2 + " =");
String str = ("("+ i +") " + num1 +" + "+ num2 + " = " + (num1+num2));
//写入数据
out.writeUTF(str);
// System.out.println(str);
}
}
out.close();

    System.out.println("------------------标准答案------------------");
    
    //创建指向文件的数据输入流
    DataInputStream in = new DataInputStream(new FileInputStream(file));
    //读数据
    for (int i = 0; i < n; i++) {
        System.out.println(in.readUTF());
    }
    in.close();
    
}//main

}

3. 代码规范

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

第一条代码中的命名均不以下划线或美元符号开始,也不一下划线或美元符号结束。
第二条代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
第三条类名使用UpperCamelCase风格,但是以下情形例外:DO / DTO / VO / AO / PO 等。
第四条方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
第五条变量和常量的命名方式:非公有(private/protected/default)变量前面要加上小写m;
第六条类型与中括号紧挨相连来定义数组。正例:定义整形数组 int[] arrayDemo;并人工检查代码是否符合规范
第七条杜绝完全不规范的缩写,避免忘文不知义。反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
第八条为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
第九条不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
第十条大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

五、测试

请思考并记录你认为必要的测试点,并记录测试用例与测试结果测试编号
测试编号 具体输入 预期结果 实际结果
1 0 格式错误!请重新输入...... 符合预期
2 10 正常执行,生成10道一年级加减运算题 符合预期
3 10 1 正常执行,生成10道一年级加减运算题 符合预期
4 10 2 正常执行,生成10道二年级乘除运算题 符合预期
5 10 3 格式错误!请重新输入...... 符合预期
6 1000 格式错误!请重新输入...... 符合预期

六、总结

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

1 程序不仅仅只是编码,在开始编码前应该还有很多工作要做,要分析需求,设计好文档,才能在完成的时候符合要求
编码前要先构思,有一个大致的方向
2基础知识很重要。在敲代码的时候有时候会发现自己知道要怎么做,但是就是因为不清楚基础知识而花费更多时间

计算开脑题

标签:命名方式   类型   condition   文档   局部变量   人工   deb   scanner   算法   

原文地址:https://www.cnblogs.com/jmj1/p/9631740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!