首页 > 其他分享 >结对项目

结对项目

时间:2024-03-26 14:25:54浏览次数:27  
标签:index 结对 operStack 项目 item fracStack Fraction new

这个作业属于哪个课程 软件工程2024
这个作业要求在哪里 结对项目
这个作业的目标 通过合作完成一个随机生成四则运算程序
姓名 学号
张佳伟 3122004413
韩乐阳 3122004390

我的Gitcode地址

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 30
· Estimate · 估计这个任务需要多少时间 20 920
Development 开发 860 1100
· Analysis · 需求分析 (包括学习新技术) 100 150
· Design Spec · 生成设计文档 20 30
· Design Review · 设计复审 40 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 20
· Design · 具体设计 60 30
· Coding · 具体编码 520 800
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 30 50
Reporting 报告 60 60
· Test Repor · 测试报告 20 25
· Size Measurement · 计算工作量 20 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
· 合计 960 1260

一.设计思路

程序主要有随机生成表达式模块,中缀表达式转为后缀表达式并计算模块,文件的读写等主要模块。分好模块后进行代码设计

程序流程大概如图

二.代码说明

  • 将生成的表达式由中缀表达式转为后缀表达式
    主要运用栈的特性进行转化
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class InfixToPostfix {
    public static String InfixToPostfixExp(String infixExpression) {
        // 将中缀表达式转换成list集合存储,方便对数据遍历和操作
        List<String> infixListExpression = toInfixListExpression(infixExpression);

        // 根据中缀转后缀规则进行转换
        Stack<String> operStack = new Stack<>(); // 符号栈
        List<String> suffixExpression = new ArrayList<>(); // 存储后缀表达式

        // 遍历list集合中的每一个元素
        for(String item : infixListExpression){
            if(item.matches("\\d+")){ // 如果为数字,直接加入到suffixExpression中
                suffixExpression.add(item);
            }else if (item.equals("(")){ // 如果为左括号,直接加入到suffixExpression中
                operStack.push(item);
            }else if (item.equals(")")){ // 如果为右括号,将左括号之前的符号都加入到suffixExpression中
                if(!operStack.peek().equals("(")){
                    suffixExpression.add(operStack.pop());
                }
                operStack.pop(); // 遇到左括号后,将其pop出
            }else if (!operStack.empty() && operStack.peek().equals("(")){
                // 如果栈不为空,并且栈顶是左括号,运算符号直接入栈
                operStack.push(item);
            }else {
                while (true){
                    // 如果符号栈不为空,并且栈顶不是左括号,就比较运算符优先级,
                    // 如果小于等于栈顶优先级,就将符号取出,再次判断栈是否为空,
                    // 新的栈顶是否为左括号
                    if(!operStack.empty()){
                        if (operStack.peek().equals("(")){
                            break;
                        }else if(operationPriority(item) <= operationPriority(operStack.peek()) ){
                            suffixExpression.add(operStack.pop());
                        }else {
                            break;
                        }
                    }else {
                        break;
                    }

                }
                operStack.push(item);
            }
        }

        // 将栈中剩下的符号依次取出,并加入到suffixExpression中
        while (true){
            if(!operStack.empty()){
                suffixExpression.add(operStack.pop());
            }else {
                break;
            }
        }

        System.out.println("中缀表达式:"+infixExpression);
        System.out.println("后缀表达式:"+suffixExpression);
        StringBuilder result=new StringBuilder();
        for(String string:suffixExpression)
            result.append(string).append(" ");
        return result.toString();
    }

    public static List<String> toInfixListExpression(String infix){
        List<String> list = new ArrayList<>();
        int index = 0;
        String val = "";

        while (index < infix.length()){
            val = infix.substring(index,index+1);
            // 如果num是数字,那么就判断下一位是否还是数字,是就继续追加,不是就退出
            while (val.matches("\\d+") && index+1 < infix.length()){
                if(infix.substring(index+1,index+2).matches("\\d+")){
                    val += infix.substring(index+1,index+2);
                    index++;
                }else {
                    break;
                }
            }
            list.add(val);
            index++;
        }

        return list;
    }

    public static int operationPriority(String oper){
        int result;
        switch (oper){
            case "+":
            case "-":
                result = 1;
                break;
            case "*":
            case "÷":
                result = 2;
                break;
            default:
                throw new RuntimeException("运算符有误...");
        }
        return result;
    }
}

  • 后缀表达式的计算
   public static Fraction calculator(String[] rpn){
        //Fraction res = new Fraction(0, 1);
        Stack<Fraction> fracStack = new Stack();

        //Stack<String> stack = new Stack<>();
        // 遍历数组
        for (String item : rpn) {
            // 如果为数字直接入栈,如果为运算符,直接取出栈中元素进行运算
            if(item.matches("\\d+")){
                //stack.push(item);
                Fraction f = new Fraction(Integer.parseInt(item),1);
                fracStack.push(f);
            }else {
                char c = item.charAt(0);
                Fraction f = (Fraction)fracStack.pop();
                Fraction f1 = new Fraction(f.numerator, f.denominator);
                f = (Fraction)fracStack.pop();
                Fraction f2 = new Fraction(f.numerator, f.denominator);

                switch (c){
                    case '+':
                        fracStack.push(f2.add(f1));
                        break;
                    case '-':
                        fracStack.push(f2.subtract(f1));// 注意先出栈为被减数
                        break;
                    case '*':
                        fracStack.push(f2.multiply(f1));
                        break;
                    case '÷':
                        fracStack.push(f2.divide(f1));
                        break;
                    default:
                        throw new RuntimeException("运算符有误...");
                }
               // stack.push(String.valueOf(res));
            }
        }
        //return Integer.parseInt(stack.pop());
        if (!fracStack.isEmpty()) {
            return (Fraction)fracStack.pop();
        }else{
            Fraction f = new Fraction(-1,1);
            return f;
        }
    }
}

三.测试运行




总结

在实现要求的刚开试我们两人都不怎么有思路,但是经过合作思考,共同讨论设计思路慢慢的找到了设计方向,在这次项目中我们的都收获很多,知道了如合作去完成一个项目。过程中虽然遇到了困难但是还是合力解决了

标签:index,结对,operStack,项目,item,fracStack,Fraction,new
From: https://www.cnblogs.com/jw30018/p/18096555

相关文章

  • 结对项目
    这个作业属于哪个课程软件工程这个作业要求在哪里四则运算这个作业的目标完成一个小学四则运算题目生成的项目项目成员学号吴炳辉3122004709刘睿3122004697Github地址:项目22、PSP表格PersonalSoftwareProcessStages预估耗时(......
  • 结对项目
    温吞:结对项目这个作业属于哪个课程软件工程4班这个给作业要求在哪里结对项目这个作业的目标实现一个自动生成小学四则运算题目的命令行程序合作人员学号姓名3122004557蔡昱鹏3122004567韩逸朗Github链接结对项目PSS表格PSP2.1Pers......
  • 结对编程--自动生成小学四则运算
    小学四则运算题目生成这个作业属于哪个课程软件工程2024这个作业要求在哪里结对项目这个作业的目标完成结对项目,共同合作实现自动生成小学四则运算题目参与人员温泽坤3122004582、黄浩3122004571作业github地址PSP2.1表格PSP2.1PersonalSoftwareP......
  • 结对项目
    结对项目这个作业属于哪个课程软件工程这个作业要求在哪里结对作业这个作业的目标制作一个自动生成十以内四则运算的项目,熟悉结对项目的开发Github仓库Github姓名郑炜冯可富学号31220045043122004476PSP表PSP2.1PersonalSoftwarePr......
  • javaWeb项目-快捷酒店信息管理系统功能介绍
    开发工具:IDEA、Eclipse编程语言:Java数据库:MySQL5.7+框架:ssm、Springboot前端:Vue、ElementUI关键技术:springboot、SSM、vue、MYSQL、MAVEN数据库工具:Navicat、SQLyog项目关键技术 1、JSP技术JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。Ja......
  • 结对项目
    这个作业属于哪个课程软件工程这个作业要求在哪里结对项目一、合作者姓名学号张楠3222004599周广3122004418github链接二、PSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划4030·Es......
  • 结对项目
    杨宇航3122004498赵军3122004501这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024这个作业要求在哪里结对项目-作业-软件工程2024-班级博客-博客园(cnblogs.com)这个作业的目标1.能够生成包含自然数和真分数的四......
  • 信息系统项目管理师——第7章项目立项管理
    本章考选择题2-3分,案例和论文均有可能作为领域考试。项目建议与立项申请♥♥♥♥♥立项申请的概念立项申请又称为项目建议书,是项目建设单位向上级主管部门提交项目申请时所必须的文件,是该项目建设筹建单位根据国民经济的发展、国家和地方中长期规划、产业政策、生产力......
  • 海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)
    海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)第2集账号微服务和流量包数据库表+索引规范讲解《下》简介:账号微服务和流量包数据库表+索引规范讲解账号和流量包的关系:一对多traffic流量包表思考点海量数据下每天免费次数怎么更新?海量数据付费流量套餐包每天......
  • 使用Go语言开发一个短链接服务:三、项目目录结构设计
    章节 使用Go语言开发一个短链接服务:一、基本原理 使用Go语言开发一个短链接服务:二、架构设计 使用Go语言开发一个短链接服务:三、项目目录结构设计 使用Go语言开发一个短链接服务:四、生成code算法 使用Go语言开发一个短链接服务:五、添加和获取短链接 使用Go语言开......