实现一个自动生成小学四则运算题目的命令行程序

一、作业要求

这个作业属于那个课程 广工20203软件工程
这个作业的要求 小学四则运算
Gitcode地址 仓库
完成人员 学号
李昊旃 3121005090

二、设计实现

2.1 类

  • Calculate
  • Expression
  • FileIO
  • Fraction
  • Grade
  • Save

2.2 关系图

在这里插入图片描述


三、代码说明

3.1 Calculate类

Calculate类通过将中缀表达式转化为后缀表达式,再求值。

  • 中缀转后缀时,采用一个队列和一个栈,数字输入到队列,运算符压入栈。在压入栈时,检查栈顶元素的优先级,要保证压入栈的元素的优先级最高。若栈顶元素大于等于想压入栈的元素,则把栈顶元素弹出,继续检查,直到被压入栈的元素的优先级是最高的。遇到"(“先入栈,遇到”)“把”("之后的元素弹出到队列,括号不输出到队列。
  • 后缀表达式求值时,遇到数字就压入栈,遇到运算符就弹出两个数字进行运算。因为最后的结果是分数,所以从一开始运算就把运算数全部转换为分数进行计算最后化简。
  • 主要代码:
public Fraction calculate(Queue<String> queue) {
   //考虑分数的计算,直接把数字转化为fraction对象,再压入fraction栈
    Stack<Fraction> fracStack = new Stack<>();

    String str = "";//中间结果字符串
    Save.string = "";//每一次操作开始就把string置为空

    while (!queue.isEmpty() ) {
   

        // 从队列中出队
        String s = queue.remove();
       // Save.save(s);//保存结果

        // 如果是数字,就压入栈中
        if (isDigital(s.charAt(0))) {
   
            //parseInt(String s): 返回用十进制参数表示的整数值。
            Fraction f = new Fraction(Integer.parseInt(s));
            fracStack.push(f);
         //   System.out.println("压入栈的f:"+f.getNumerator()+"/"+f.getDenominator());

            // 如果是运算符,就从栈中弹出两个元素
        } else if (isOperator(s.charAt(0))) {
   
            char c = s.charAt(0);

           // System.out.println("当前的运算符"+c);
            Fraction f = fracStack.pop();//操作数
            Fraction f1 = new Fraction(f.getNumerator(),f.getDenominator());
            f = fracStack.pop();//被操作数
            Fraction f2 = new Fraction(f.getNumerator(),f.getDenominator());
            /*
            * 表达式合法性检验
            * */
            if ( c == '-' ) {
   
                f = f2.sub(f1);//若结果为负,break;返回-1,用以标记表达式不合法
                f.Appointment();//简单约分
                if (f.getDenominator() < 0 || f.getNumerator() < 0  ) {
   //分母小于零出现负数
                    fracStack.push(new Fraction(100000));
                    break;

                }
            }
            if ( c == '/'){
   
                f2.Appointment();
                if(f1.getDenominator()==0 || f1.getNumerator() ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值