2018102992小学四则运算练习软件项目报告

代码地址:https://coding.net/u/bow1024/p/testBybrm/git

1.需求分析

设计一个四则运算随机生成器,要求:

  • 生成的运算符在3-5个(等号属于运算符),运算数为0-100的整数
  • 每个式子至少有两种不同运算符(不包括等号)
  • 运算存储在result.txt文件中,第一行是学号,后面存储运算式
  • 程序输入仅有生成式子个数n

2.功能设计

实现基本运算功能:

  • 运算式中不出现负数和非整数,结果中小数保留两位
  • 命令行输入n(进行合法性控制),生成结果写入result.txt文件

3.设计实现

程序结构如下:
图1.程序结构

1.接收命令行输入正整数n,用正则表达式判断其合法性
2.循环n次,每次生成一个式子,当随机生成的式子不符合条件时(有两点,1所有运算符都一样,2除号后面是零)跳出此次循环,循环计数减一,重新生成式子。
3.生成的符合条件的式子进行计算,运算结果写入到result.txt文件中。

该部分重点建立程序整体结构,其核心部分为运算部分,在下一节中说明。

4.算法详解

运算过程从左向右一次读取随机生成的运算数和运算式,举例"2+3* 5-1="中有四个运算数[2,3,5,1]和四个运算符[+,*,-,=],其中乘除的优先级高,加减和等于的优先级低,则根据运算数前后的运算符决定其几种不同情况:
1.加(减)在结果中;
2.乘(除)在暂存数中;
3.乘(除)结束,暂存数加(减)在结果中。根据判断运算数前后的运算符进行不同运算。

//运算
//sum为最终结果,pro为乘积暂存,lastOp表示上一个运算符
double sum = 0.00, pro=1;
int lastOp = 0;
for (int j = 0; j < x; j++) {
    int ysf = yunSuanFu.get(j);			//取出此轮循环的数字和运算符
    int sz = shuZi.get(j);
    //乘除的情况全部暂乘(除)在pro里
    if (ysf == 2 || ysf == 3) {			
        switch (lastOp) {
        case 0:		
            pro *= sz;
            break;
        case 1:
            pro *= -sz;
            break;
        case 2:
            pro *= sz;
            break;
        case 3:
            pro /= sz;
            break;
        default:
            break;
        }
    }
    //加减等于的情况
    else {
        if(lastOp == 0) sum += sz;			//直接加减
        else if(lastOp == 1) sum -= sz;
        else if(lastOp == 2){
            pro *= sz;
            sum += pro;
            pro = 1;			//完成连乘(除)运算,pro清空为1
        }else{
            pro /= sz;
            sum += pro;
            pro = 1;			//同上
        }
    }
    lastOp = ysf;
    System.out.print(sz+op[ysf]);
    data.append(sz);
    data.append(op[ysf]);
}

变量ysf为当前运算数后面的运算符对应的数组["+","-","*",“÷”,"="]下标,分两种情况进行讨论:
1.运算符为乘除,该数乘(除)在暂存数pro上
2.运算符为加减等于,当前面是加(减)时,该数加(减)在结果sum上;前面是乘(除)时,该数乘(除)在暂存数pro上,同时乘(除)结束,暂存数pro加(减)在结果中。
注:实现仅为加减乘除,未考虑实现扩展功能:带括号的算式,若考虑带括号的算式,该算法的逻辑变得太复杂,需选用堆栈进行计算。

5.代码测试

进行合法和非法输入测试,此处仅展示部分测试
图2命令行输出
打印到屏幕上与写入的文件进行对比
图3记事本结果
在此执行的结果会追加在该文件的内容后面

6.代码展示

接收命令行输入

String input = sc.nextLine();
//合法性控制
while(!isPositiveInteger(input)){
    System.out.println("please input a positiveInteger n:");
    input = sc.nextLine();
}
Integer n = Integer.parseInt(input);		

随机生成一个3-5的数

//运算数字个数(3-5)
Integer x = (int)(Math.random() * 100) % 3 + 3;	

生成式子

//生成式子
shuZi.add((int)(Math.random() * 100));
for (int j = 0; j < x-1; j++) {
    //加一个运算符
    int index = (int)(Math.random() * 100) % 4;
    yunSuanFu.add(index);
    judge.add(index);
    //加一个数字
    int num = (int)(Math.random() * 100);
    shuZi.add(num);
    //判断除零
    if(index == 3 && num == 0){
        judge_0 = 1;
        break;
    }
}

写入文件

//写入文件
FileWriter fileWritter = new FileWriter(file.getName(),true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
bufferWritter.write(data.toString());		//写入文件(StringBuffer转String)
bufferWritter.newLine();
bufferWritter.close();

7.结果

通过这个程序的设计及编写,在程序设计阶段,可以把功能切分,把涉及到相同变量的部分小功能模块化开发。
虽然在设计阶段把很多问题在大脑中形成了实际的解决方向,但开发过程中,查阅资料依然用去了很多时间,尤其是之前《构建之法》中提到的"解决小问题",消耗了大量时间,对编程语言的熟练度太低,需要更多地实践提升编码能力。
关于变量命名问题依然没有形成较好的习惯,由于英语水平限制,很多变量命名时都需要翻译工具辅助,由此很多变量偷懒用了汉语拼音甚至缩写。

8.PSP

任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
计划 10 10
估计所需时间并规划大概步骤 10 10
开发 348 475
需求分析 5 5
生成设计文档 5 8
设计复审 3 6
代码规范 5 6
具体设计 60 90
具体编码 150 180
代码复审 60 90
测试 60 90
报告 15 28
测试报告 5 10
计算工作量 5 8
事后总结 5 10

猜你喜欢

转载自blog.csdn.net/boRMing/article/details/83039648
今日推荐