四则运算练习软件

 

源码可直接克隆的仓库地址 https://git.coding.net/OlinaChenry/Four.git

 

1. 需求分析

  • 支持整数的四则运算
  • 支持多运算符
  • 支持真分数(附加要求)
  • 将学号与生成的练习题及其答案输出到文件“result.txt”中

 

2. 功能设计

  基本功能

  •   能随机生成n道加减乘除练习题,并给出答案

  扩展功能

  •   每道题目中出现的运算符个数不超过3个
  •   不得出现负数与非整数
  •   没有重复题目
  •   能支持真分数的出题与运算

 

3. 设计实现

定义了一个主函数,生成文件;

式子类,生成带括号的式子;

分数相关类   ,进行分数的生成

(类的关系:主类调用另外两个类,式子类调用第三个类)

在式子类中,使用panduan方法,判断优先级并生成带括号的式子;

  在该类中定义了两个实例方法:

  • 第一个是将数列表和符号列表组合成式子的方法
  • 第二个是计算该式子结果的方法

在分数相关类中,定义了随机生成若干个分数和算符组合起来的构造方法;

最后一个类是主类,对文件的操作都放在主类中进行


 

4. 算法详解

  • 优先级的判断

在实现带括号的运算时,我使用了内部类panduan()来判断符号的优先级,以生成合法的式子。

 if (panduan(charArr) < panduan(charArr2))// 优先级判断
                    {
                        if (charArr2 == '÷') {
                            if (b0 == 0)
                                b0++;
                            while (sum % b0 != 0)// 如果不能整除 重新生成随机数
                            {
                                b0 = rand.nextInt(99) + 1;
                            }
                            sum = sum / b0;// 计算
                        }
                        if (charArr2 == '*')
                            sum = sum * b0;
                        brr = "(" + brr + ")" + "" + charArr2 + "" + b0;// 满足条件 生成括号
                    } 

 

 


 

5. 测试运行

 


 

6.代码展示

  • 生成文件

 

public static void main(String[] args) {
        // TODO Auto-generated method stub
        // Scanner input = new Scanner(System.in);
        int n = 0;
        int flag = 1;
        // n=Integer.parseInt(args[0]);
        try {
            n = Integer.parseInt(args[0]);// 命令行输入
            if (file.exists()) { //如果文件已存在,则删除文件
                file.delete();
            }
            if(n>1000||n<1){
                System.out.println("对不起,只允许输入1-1000的数字!");
                return; //结束运行
            }
        }catch (NumberFormatException e){ //输入非数字字符等
            System.out.println("对不起,只允许输入1-1000的数字!");
            return; //结束运行
        }
        try {
            PrintStream ps = new PrintStream("../result.txt");// 生成文件
            System.setOut(ps);
        } catch (Exception e) {
            System.out.println("文件生成错误");// 提示
        }
  •  生成式子(这里只展示除法)
 if (charArr == '÷') {
                    if (a1 == 0)
                        a1++;
                    while (a0 % a1 != 0)// 为了保证整除
                    {
                        a0 = rand.nextInt(100);
                        a1 = rand.nextInt(99) + 1;// 为了保证不出现0
                    }
                    sum = a0 / a1;
                }

 

if (panduan(charArr) < panduan(charArr2))// 优先级判断
                    {
                        if (charArr2 == '÷') {
                            if (b0 == 0)
                                b0++;
                            while (sum % b0 != 0)// 如果不能整除 重新生成随机数
                            {
                                b0 = rand.nextInt(99) + 1;
                            }
                            sum = sum / b0;// 计算
                        }

 

 

7.总结

这次作业共用了四天时间来完成,这个过程是痛苦的,因为基础比较差很多东西都是慢慢的学下来才能做,过程中有些细节导致程序出bug,后面调bug的时间也用了非常长的时间。

然后说说此次作业遇到的一些坑,

一个是文件的写入操作,如果没有使用flush,写入操作是不会进行的,感觉当初学习java时没有太深入得去理解,总是觉得flush和close绑定起来用,没有去注意它主要的作用是什么,

然后是对列表的操作,由于在计算结果的算法中,需要对列表中的值进行添加和删除,会造成列表的下标和长度发生变动,一不注意就容易出现数组越界的异常。

还有git上传文件,惭愧到上交作业的最后一天也还没有搞明白......后续会继续钻研,不过还是希望老师下节课能够演示一遍......

 


 

8.PSP展示

 

posted @ 2018-03-25 20:17  Olina_Chenry  阅读(187)  评论(0编辑  收藏  举报