小学生恐怖计算题

2023-10-08 02:50
文章标签 小学生 计算题 恐怖

本文主要是介绍小学生恐怖计算题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MathExam—— 在原有的V2.0.0版本上加入三年级四则混合运算题

  • 211606335 吴沂章
  • 211606318 林锃寒

一、预估与实际

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

二、需求分析

  • 特点1

    • 运算符在2~4个
  • 特点2

    • 减法运算的结果不能有负数
  • 特点3

    • 除法运算除数不能为0,不能有余数
  • 特点4

    • 可以加括号

经过分析,我认为,这个程序应当:

  • 一个式子中应要添加多个运算符

  • 计算符号判断,生成随机数

  • 通过调度场和逆波澜算法来实现运算


三、设计

1. 设计思路

  • 第一步实现四则运算题目的生成

  • 第二步实现字符串写入文本

  • 第三步实现从命令行接受参数并传入程序运行

  • 第四步实现 中缀表达式 ------转换------> 后缀表达式

  • 第五步实现对后缀表达式的计算方法

  • 最后修改若干Bug,规范代码名,完善代码,提升质量

  • ...

  • 代码类图
    o_UML%e7%b1%bb%e5%9b%be.png
  • 逆波兰函数流程图:
    timg?image&quality=80&size=b9999_10000&sec=1537306590142&di=ee3d388fe13b37e09fb740e7fb74c5d8&imgtype=0&src=http%3A%2F%2Fpic.chinawenben.com%2Fupload%2F2_dq71qdbkxbaj1d1a3vxj5dv3.jpg

2. 实现方案

  • 准备工作:先在Github上创建仓库,克隆到本地,创建一个Pair文件夹

  • MyEclipse中创建一个类,包含主方法和各函数

  • 准备工作:先在Github上创建仓库,克隆到本地。

  • 技术关键点:

    • 如何令用户在输入 -n n -grade grade 和 -grade grade -n n 的时候都可以成功运行。

    • 如何在运算方法中实现"()"的优先运算

    • 如何在四则运算中添加括号。

    • 如何实现逆波澜算法

    • 如何记录错题。

    • ...

四、编码

  • 本次代码未实现以下功能:
    • 除数为0的错误
    • 差值为负值的错误
    • 四则运算题目的数值的范围为[0,10),不能是2位数

1. 调试日志

  • 日志一:
  • 没有考虑定义的运算符乘号小写字母"x"在入栈时被判定为符合要求的字符,导致判定出错
 private static boolean isOperator(String operator){if (operator.equals("+")||operator.equals("-")||operator.equals("×")||operator.equals("÷")||operator.equals("(")||operator.equals(")")) {return true;}return false;
}
  • 解决方案:将所有乘法中的符号统一定义为输入法中的“×”
    无对应的解决方案代码
  • 日志二:
  • 生成三年级题目时调用i值导致抛异常为空值
for (int j = 0; j < count; j++) {....省略部分代码str_ArithmeticProblem[i] = "( " +n1 + " " + cs[c1] + " " + n2 +" ) " + " " + cs[c2] + " " + n3;....省略部分代码
}
  • 解决方案:将对应的循环值j放入str_ArithmeticProblem[j]中
for (int j = 0; j < count; j++) {....省略部分代码str_ArithmeticProblem[j] = "( " +n1 + " " + cs[c1] + " " + n2 +" ) " + " " + cs[c2] + " " + n3;....省略部分代码
}

2. 关键代码

  • 调度场算法

  • 逆波兰函数
//调度场算法——[中缀表达式转后缀表达式]private void toPostfixExpression(String str_mix){int len = str_mix.length();char c,nextChar;String sc;for (int i = 0 ; i <= len-1 ; i++) {c = str_mix.charAt(i); sc = String.valueOf(c);if(isOperator(sc))  //判断是否是操作符{if(operators.isEmpty()){    //判断为空栈,入栈operators.push(sc);} else {if(priority(operators.peek()) < priority(sc) && !sc.equals(")")){   //栈顶操作符优先级小于当前操作符优先级且操作符不为右括号,入栈operators.push(sc);} else if(priority(operators.peek()) >= priority(sc) && !sc.equals(")")){while(!operators.empty() && !operators.peek().equals("(")   //栈不为空,当前栈顶操作符不为左括号&& priority(operators.peek()) >= priority(sc)){     //操作符优先级小于等于当前栈顶操作符优先级do {operator_Add = operators.pop();postfixExpression.append(operator_Add);operand.push(operator_Add);} while (false);    }   // 栈顶操作符是左括号时停止压栈operators.push(sc);     //否则直接入栈} else if(sc.equals(")")){  //当前扫描到的操作符为右括号(不做入栈操作),依次压栈相匹配的左括号内容do {operator_Add = operators.pop();postfixExpression.append(operator_Add);operand.push(operator_Add);} while (!operators.peek().equals("("));operators.pop();    //弹出栈顶无用操作符左括号}}}else { //非操作符if(!sc.equals(" ")){postfixExpression.append(sc);operand.push(sc);                   }}}while(!operators.empty()){  //结束字符串扫描后操作符的栈不为空则则压栈operator_Add = operators.pop();postfixExpression.append(operator_Add);operand.push(operator_Add);}}//逆波兰函数private int reversePolish() {// TODO Auto-generated method stubchar c;int len = postfixExpression.toString().length();for (int i = 0; i < len; i++) {c = postfixExpression.charAt(i);if(!isOperator(String.valueOf(c))){ //判断非操作符,入栈postfixNumber.push(Integer.parseInt(String.valueOf(c)));} else{int m = postfixNumber.pop();int n = postfixNumber.pop();String operator = String.valueOf(c);postfixNumber.push(Calculation(n, m, operator));    }}return postfixNumber.pop();}

3. 代码规范

本次实验使用的代码规范:

  • 类名使用 UpperCamelCase 风格

  • 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,遵循驼峰形式

  • 变量和常量的命名方式:

    • 非公有(private/protected/default)变量前面要加上小写m
    • 静态变量(static)前面加上小写s
    • 其它变量以小写字母开头
    • 静态常量(static final)全大写
  • 类型与中括号紧挨相连来定义数组

  • 大括号的使用约定。如大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:

    • 左大括号前不换行
    • 左大括号后换行
    • 右大括号前换行
    • 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
  • 左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格

4. 结对编程的过程

  • 我们采取的是Ping-Pong式的结对方式

  • 最初先是一起讨论这次项目的编码流程,研究用何种方式实现效果,并模拟程序运行得出这次的代码难点有哪些

  • 然后针对代码需要实现的功能进行分工,确立两个人的任务

  • 编程过程中互相交换意见,同步进程

  • 最后融合代码,并对代码进行复审

五、测试

序号测试代码预期输出结果实际输出结果
1java MathExam -n 10 -grade 1输出10道一年级算术题和预期结果相符
2java MathExam -n 10 -grade 2输出10道二年级算术题和预期结果相符
3java MathExam -n 10 -grade 3输出10道三年级算术题和预期结果相符
4java MathExam -grade 3 -n 10输出10道三年级算术题和预期结果相符
5java MathExam -grade 2 -n 10输出10道二年级算术题和预期结果相符
6java MathExam -grade 1 -n 10输出10道一年级算术题和预期结果相符
7java MathExam -g 3 -n 10不符合参数类型输入规范,结束程序和预期结果相符
8java MathExam -grade 3 -c 10不符合参数类型输入规范,结束程序和预期结果相符
9java MathExam 10 -grade 1不符合参数类型输入规范,结束程序和预期结果相符
10java MathExam -g 10 -c 1不符合参数类型输入规范,结束程序和预期结果相符

六、总结

  • 随着题目要求难度越来越高,所写的代码也越来越长,一定要多写注释提醒自己
  • 先对本次项目进行需求分析,避免重复修改代码时产生不必要的bug
  • 结对编程的过程中,跟自己的搭档要商量好各自的任务,若是各写各的,一人一个版本,会给后续的代码融合增加很大的难度
  • 结对编程中一个人写完了自己的任务,也不要自顾自的放松,这是两个人的项目,应该帮助自己的搭档
  • 结对编程中与队友一起探讨代码中无数bug也是很快乐的
  • 这次代码难度还是很高的,还好我们彼此之间相互鼓励,相互帮助,总算是能给客户看了

o_TIM%e5%9b%be%e7%89%8720180919020307.jpg

转载于:https://www.cnblogs.com/linzenghan/p/9672383.html

这篇关于小学生恐怖计算题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162191

相关文章

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (8)软串口与SoftwareSerial库使用 在第六节中我们提到了,如果我们Arduino开发板的0、1号引脚接线了,即硬件串口被占用了,想给Arduino下载程序,就需要先

2022年大作业参考报告-使用C++语言开发小学生成绩管理系统、中学生成绩管理系统、大学生成绩管理系统【240621更新】

背景: 目录 第一章 需求分析    2 1.1    问题描述    2 6.1    功能需求    2 6.2    开发环境    2 6.3    开发过程    2 第二章 概要设计    3 2.1    总体设计    3 2.2    类的定义    3 2.3    接口设计    5 2.4    运行界面设计    6 第三章 详细设计    7 3.1    输入模块

【深海王国】小学生都能做的APP?AppInventor、BLE蓝牙、Arduino联合开发你的第一个手机远程控制程序(7)

Hi~ (o^^o)♪, 各位深海王国的同志们,早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督依旧为大家带来小学生都能学会的APP制作教程,帮你一周内快速开发一款可以和单片机无线通讯的手机蓝牙APP,let’s go! (7)完结篇:APP最终美化、配色、logo一应俱全 不知不觉,本系列已经来到了最后一节,大都督看好你!继续加油!最后一节,我们将完成整个手机远程控制

HumbleBundle捆绑包6月18号推出38件Unity和Unreal的3D模型捆绑包美术工具道具环境模块化恐怖FPS和RPG赛博20240618

HumbleBundle今天更新了新的捆绑包,Unity和Unreal的无限创作主题, 主要是场景环境模型、工具、道具等合集,质量挺高。 非常适合FPS、模拟经营、RPG等类型游戏。 HumbleBundle捆绑包6月18号推出38件Unity和Unreal的3D模型捆绑包美术工具道具环境模块化恐怖FPS和RPG赛博202406181505 分三档: 第一档位只有1个场景模型

安卓开发GitHub的入门使用流程---》适合小学生

http://blog.csdn.net/u013278099/article/details/51207948  安卓开发GitHub的入门使用流程---》适合小学生 标签: github 2016-04-21 14:41  1174人阅读  评论(1)  收藏  举报   分类:   android(71)  版权声明:本文为博

小学生作文辅导杂志小学生作文辅导杂志社小学生作文辅导编辑部2024年第2期目录

写法导引     创意引航,笔墨生辉——小学语文习作教学中的创新思维训练     杜娟; 3-5     陶行知“小先生制”教育思想在小学作文练习中的应用探索     张淑勤; 6-8     新课程标准视域下小学语文习作教学策略探析     任真真; 9-11     即时作文:开辟小学习作教学的新路径     王雯雯; 12-14     指向语文核心素养的小学习作教学实践研究

小学生都能懂的阈值分割说明

小学生都能懂的阈值分割说明 1. 什么是阈值分割?2. 阈值分割怎么用在GMM中?3. 示例解释3-1. 故事:分类动物 4. 简单代码示例5. 解释 1. 什么是阈值分割? 阈值分割是一种方法,用来决定一个数据点属于哪个组(或者说哪个簇)。这个方法常常和高斯混合模型(GMM)一起使用,帮助我们根据概率来分配数据点到一个或多个簇。 2. 阈值分割怎么用在GMM中? 高斯混合模

小学生都能懂的局部和全局聚类说明

小学生都能懂的局部和全局聚类说明 1. 什么是聚类?2. 什么是局部和全局聚类?3. 为什么要同时使用局部和全局聚类?4. 示例解释4-1. 故事:珠子分类 5. 简单代码示例6. 解释 1. 什么是聚类? 聚类就是把一大堆东西(数据点)分成几组,每组里面的东西都很相似。比如,我们有很多不同颜色的珠子,想把它们按照颜色分成不同的组。 2. 什么是局部和全局聚类? 全局聚类:把

小学生都能懂的 UMAP(Uniform Manifold Approximation and Projection)说明

小学生都能懂的 UMAP(Uniform Manifold Approximation and Projection)说明 1. 什么是UMAP?2. UMAP有什么用?3. 示例解释3-1. 故事:给颜色分类 4. 简单代码示例4-1. 解释 1. 什么是UMAP? UMAP(Uniform Manifold Approximation and Projection)是一种数

小学生都能懂的 RRF(Reciprocal Rank Fusion)说明

小学生都能懂的 RRF(Reciprocal Rank Fusion)说明 让我们用一个简单的例子来解释RRF(Reciprocal Rank Fusion)公式。 想象一下,你和你的朋友们都在寻找一本丢失的书。你们每个人都列出了自己认为最有可能藏书的地方,并且按照可能性从高到低排序。RRF公式就是用来结合所有人的列表,找出最有可能的地方。 假设有三个朋友,他们的列表如下: