20175306 结对编程项目-四则运算 阶段总结

20175205 20175306 结对编程项目-四则运算 阶段总结

一、预估与实际

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
• Estimate• 估计这个任务需要多少时间10001500
Development开发
• Analysis• 需求分析(包括学习新技术)3090
• Design Spec• 生成设计文档3040
• Design Review• 设计复审6060
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)6060
• Design• 具体设计6060
• Coding• 具体编码6001000
• Code Review• 代码复审6060
• Test• 测试(自我测试,修改代码,提交修改)3060
Reporting报告
• Test Repor• 测试报告2020
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划4040
合计10001500

二、需求分析

·特点一:需要随机产生算式
·特点二:可以进行多运算符运算,包括括号
·特点三:需要判断正确和错误
·特点四:需要输出答对的数目和正确率

扩展需求

·特点一:可以进行真分数的运算
·特点二:文件:处理生成题目并输出到文件;完成题目后从文件读入并判题
·特点三:多语言支持:简体中文繁體中文English
·特点四:生成题目去重

三、设计思路(同时输出UML类图)

  1. 首先解决怎么生成随机数,及随机运算符的问题
  2. 怎么产生多个随机运算符
  3. 括号怎么随机插入四则运算中
  4. 如何让计算机计算中缀表达式
    (UML图)
    1591716-20190331202205095-629535912.jpg

四、实现过程中的关键代码解释

  // 将中缀表达式转换为后缀表达式
    public static String infixToSuffix(String exp) {
        Stack<String> s = new Stack<String>();         // 创建操作符堆栈
        String suffix = "";            // 要输出的后缀表达式字符串
        String str[] = exp.split(" ");  //以空格为分界线放到数组里
        int length = str.length; // 输入的中缀表达式的长度
        String temp="";
        for (int i = 0; i < length; i++) {            // 对该中缀表达式的每一个字符并进行判断
            switch (str[i]) {
                case " ":break;           // 忽略空格
                case "(":
                    s.push(str[i]);                  // 如果是左括号直接压入堆栈
                    break;
                case "+":
                case "-":
                    if(s.size() != 0){          // 碰到'+' '-',将栈中的所有运算符全部弹出去,直至碰到左括号为止,输出到队列中去
                        temp = s.pop();
                        if (temp.equals("(")) {     // 将左括号放回堆栈,终止循环
                            s.push(temp);
                            s.push(str[i]);
                            break;
                        }
                        else{
                            s.push(str[i]);
                            suffix = suffix+temp+" ";
                            break;
                        }
                    }
                    else{
                        s.push(str[i]);      // 说明是当前为第一次进入或者其他前面运算都有括号等情况导致栈已经为空,此时需要将符号进栈
                        break;
                    }
                    // 如果是乘号或者除号,则弹出所有序列,直到碰到加好、减号、左括号为止,最后将该操作符压入堆栈
                case "*":
                case "/":
                    if(s.size()!=0){
                        temp = s.pop();
                        if(temp.equals("+")||temp.equals("-")||temp.equals("(")){
                            s.push(temp);
                            s.push(str[i]);
                            break;
                        }
                        else{
                            s.push(str[i]);
                            suffix = suffix+temp+" ";
                            break;
                        }
                    }
                    else {
                        s.push(str[i]);     //当前为第一次进入或者其他前面运算都有括号等情况导致栈已经为空,此时需要将符号进栈
                        break;
                    }
                    // 如果碰到的是右括号,则距离栈顶的第一个左括号上面的所有运算符弹出栈并抛弃左括号
                case ")":
                    while (!s.isEmpty()) {
                        temp = s.pop();
                        if (temp.equals("(")) {
                            break;
                        } else {
                            suffix = suffix+temp+" ";
                        }
                    }
                    break;
                // 默认情况,如果读取到的是数字,则直接送至输出序列
                default:
                    suffix = suffix+str[i]+" ";
                    break;
            }

        }
        // 如果堆栈不为空,则把剩余运算符一次弹出,送至输出序列
        while (s.size() != 0) {
            suffix = suffix+s.pop()+" ";
        }
        //
        return suffix;
    }

注:详细解释请看:>https://blog.csdn.net/coder_dacyuan/article/details/79941743
或>https://www.cnblogs.com/unixfy/p/3192446.html

中缀转后缀是核心的计算方法,掌握此计算方法才可以判断正误!!!

 switch (num.RandomNum(2)) {
                case 0:                    //不加括号
                    key = com.stringToArithmetic(s);
                    System.out.print(s + " = ");
                    break;
                case 1:                     //加括号
                    if (choice > 1) {
                        str = s.split(" ");   //字符串转化为字符串数组
                        Stack<String> Z = new Stack<String>();   //定义个栈
                        String temp = new String();      //定义一个临时数组
                        for (int k=0; k!=str.length-2; k++) {                 //遍历前length-2个元素
                            if ((str[k].equals("+") || str[k].equals("-"))) {            //如果是加减
                                int b = k+2;   //可以直接访问数组
                                int a = k+1;
                                if (str[b].equals("*") || str[b].equals("÷")) {             //下一个符号是乘除
                                    temp = Z.pop();
                                    Z.push("(");
                                    Z.push(temp);
                                    Z.push(str[k]);
                                    Z.push(str[a]);
                                    Z.push(")");
                                    k++;
                                } else                                                     //下一个符号是加减
                                    Z.push(str[k]);
                            }
                            else                          //如果是乘除数字就直接入栈
                                Z.push(str[k]);
                        }
                        for(int m=str.length-2;m<str.length;m++)
                            Z.push(str[m]);
                        String[] ZZ = new String[Z.size()];
                        int p = Z.size() - 1;
                        while (Z.size() != 0) {        //将栈中的元素放到数组中
                            temp = Z.pop();
                            ZZ[p] = temp;
                            p--;
                        }
                        String t = new String();
                        t = "";
                        for (int q = 0; q < ZZ.length; q++)
                            t = t + ZZ[q] + " ";
                        key = com.stringToArithmetic(t);
                        System.out.print(t + " = ");
                        ZZ = null;
                        t = "";
                        break;
                    }
                    else{
                        key = com.stringToArithmetic(s);
                        System.out.print(s + " = ");
                        break;
                    }
            }

注:这是在算式中随机插入括号的关键代码,同样运用了堆栈的知识。首先随机产生两个随机数01,如果是0,则不插入括号,如果是1则插入括号;我们接下来解释当随机数为1时的情况,遍历整个算式,第一位是数字,则将数字压入栈,当遇到加号或减号时,记作k,继续遍历,如果k+2是乘号或除号,则需要加括号。此时将第一次压入栈的数字弹出,然后将"(",压入栈,依次将数字、加减号、数字压入,直到碰见")"结束,输出即可。

五、测试方法

1591716-20190331202228522-939140409.png

1591716-20190331202235537-1137466850.png

六、运行过程截图

1591716-20190331202245611-1122804118.png

七、代码托管地址

码云链接:>https://gitee.com/wjs123456/wjs20175306.git

八、遇到的困难及解决方法

  • 问题一:如何产生多运算符算式
    解决过程:首先定义一个choice,表示符号的个数,choice = num.RandomNum(5) + 1;,但是必须+1,因为符号的个数是要从1开始,而不能从0开始。()里的数则表示你想输出题目中符号的个数。
  • 问题二:如何随机加入括号
    解决过程:首先我们打算采用移位的方法,当碰到加(减)号时,设此时加(减)号的位置为k,如果k+2位是乘(除)号,则需要进行移位,分别将数字和符号后移,然后在k-2插入括号。这个方法初次实验是可以的,但是随着后续的进行,发现这个方法行不通。会出现bug。在学习了中缀转后缀后,我们采用了堆栈的知识解决。(详情请见上面关键代码解释!)
  • 问题三:如何判断答案正误
    解决过程:想要判断答案正误就要先计算出正确答案,这里我们学习了老师给我们的建议采用调度场算法(>http://hczhcz.github.io/2014/02/27/shunting-yard-algorithm.html)(>https://en.wikipedia.org/wiki/Shunting-yard_algorithm)。调度场算法的关键是中缀转后缀,于是经过不段的学习,有了最终的算法。(详情请见上面关键代码解释!!!)
  • 问题四:如何计算正确率
    解决过程:有了上面的能够判断答案正误再输出正确率就很简单了,我们直接采用用正确题的个数除以总题数就可以了。但是在输出时出现了问题,输出时为double型,保留的小数过多,int型又不够精确,最终我们采用了float型。由于我们并没有定义变量正确率,所以采用了C语言中学到的方法,将println改为printf,并定义保留两位小数。

九、对结对的小伙伴做出评价

我结对的小伙伴实在是非常优秀!!!非常勤奋刻苦,善于钻研,遇到困难会想尽一切方法进行解决。同时又非常具有创造力,自己会想出很多方法来解决问题,虽然有时候想的办法很难,但是她还是会神奇般的实现出来,别人怎么说都不会换,直到最后出现问题才会改正。(就当我是在夸她~)能跟她结对我感到非常荣幸!!!膜拜!!!

十、总结

本次结对收获颇丰,我们学会了如何产生随机数,产生随机符号,产生多运算符算式,最重要的是我们学会了用调度场算法进行计算,更学会了堆栈的简单使用,可以说是很厉害了!这次结对主要是她负责写代码,我负责提供思路,发现代码问题,解决问题,测试代码等工作,配合的还是非常好的。下周我们的分工将更加明确,我相信我们会实现1+1>2的效果!!!

转载于:https://www.cnblogs.com/wjs123456/p/10632304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值