四则运算

计应192 第五组 陈涯涯:

一、任务概述

使用JAVA编写一个程序,该程序能随机生成n道四则运算题,并且答案不得出现分数与小数,运算符在三到五个之间。
二、我的思路
我知道计算机不能处理中缀表达式,只能处理后缀表达式。于是最开始的想法是写一个算法,创建两个stack,一个用来存放数字,一个用来存放字符,将中缀表达式转化为逆波兰表达式,再进行计算,即可得到结果。但是后来想到这样的算法耗费的时间较长,于是决定用自己在Web开发中学习的javascript中的eval()函数进行四则运算。该函数能直接将字符串进行计算并得到结果。
三、项目结构
我的项目分为两部分,一个是src文件夹下面的Main类,用来生成题目;一个是result.txt,用来存放输出的题目。
四、源代码
import java.util.*;
import  java.lang.String;
import java.io.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.script.*;
public class Main {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要生成的题目数量:");
        int t = scanner.nextInt();
        String path = "E:\\calculat\\result.txt";//输出路径
        String word = "2017010282";
        BufferedWriter out = new BufferedWriter(//将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
                new OutputStreamWriter(new FileOutputStream(path,false)));
        out.write(word+"\r\n");
        out.write("\r\n");
 
        for(int j = 0;j<t;j++) {//循环输出n道题目
            ScriptEngineManager sem = new ScriptEngineManager();
            ScriptEngine engine = sem.getEngineByName("js");
            String sum = "";
            double result1 = -1;
            double result2 = 1;
            int result3;
            while(result2!=0) {//result2为结果的小数部分,只有当其为零的题目才符合输出。
                sum = "";
                for (int i = 0; i < 5 + (int) Math.random() * (3); i++) {//随机运算符
                    int g;
                    String m = "";
                    int x;
                    x = (int) (+Math.random() * (100));
                    String sx = String.valueOf(x);
                    g = (int) (+Math.random() * (4));
                    switch (g) {
                        case 0:
                            m = "+";
                            break;
                        case 1:
                            m = "-";
                            break;
                        case 2:
                            m = "*";
                            break;
                        case 3:
                            m = "/";
                            break;
                    }
                    sum = sum + m + sx;
                }
                sum = sum.substring(1);
                Double result = null;
                try {
                    result = Double.parseDouble(engine.eval(sum).toString());//eval函数
                } catch (ScriptException e) {
                    e.printStackTrace();
                }
                sum = sum.replaceAll("/", "÷");//题目要求的除号为:÷
                result1 = result;
                result2 = result1 - (int) result1;
                if (result2 == 0)
                    result1 = (int) result1;
            }
                if(result1<0){
                    j--;
                    continue;
                }
                result3 = (int)result1;
            System.out.println(sum+"="+result3);
            out.write(sum+"="+result3+"\r\n");
            out.write("\r\n");
        }
        out.close();//关闭输出流
        }
    }
五、负数问题与小数问题
对与小数问题,我的处理方法是,创建一个result2=result1-(int)result1,即运算结果的小数部分,如果小数部分为0,则符合条件,不然就一直进行while循环。
对于负数问题,我的处理方法是,如果result1小于零,则j--,重新进行一次for循环,直到答案为非负数为止。
六、作业感悟
对于本次作业,我最大的感悟就是——作为一个码农,要学会站在巨人的肩膀上处理问题。我知道用逆波兰算法可以实现,但是其耗费的时间会比较多,所以这次决定用eval函数来简化。尤其是在工作以后,公司不会去考虑你用了什么样的方法,他们在意的是最后的呈现与时间。这次项目也成长了许多,自己继续加油吧!

 
posted @ 2021-04-11 22:36  陈十十  阅读(180)  评论(0编辑  收藏  举报