20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

结对伙伴

小组结对编程照片

个人贡献度划分

余坤澎 于欣月 康皓越
个人贡献度 30% 40% 30%

设计思路

  1. 设计一个num类和一个Elements类用于生成数字和String类型的运算符。
  2. 设计一个expression类调用num类和Elements中的方法,利用if语句根据用户输入的题目难度等级和题目个数来生成表达式。
  3. 设计一个Cal类进行计算,先对表达式进行处理,把中缀表达式转换为后缀表达式,在用后缀表达式计算出表达式的值。在该类中添加一个能够判断用户输入答案正否正确的方法。
  4. 设计一个用户测试类选择难度和题目个数,输入用户计算的值与正确答案进行比较,如果正确,返回答案正确;如果错误,返回答案错误并返回正确答案。

关键代码解释


Elements p = new Elements();
Num w = new Num();
w.getNum();
if (count1 != 0 && count2 != 0)
result = result;
else if (count1 == 0) {
Random m = new Random();
int n = m.nextInt(2);
//选择加还是减
if (n == 0) {
p.add();
result += p + w.toString();
} else {
p.sub();
result += p + w.toString();
}
} else {
Random m = new Random();
int n = m.nextInt(2);
//选择乘还是除
if (n == 0) {
p.mul();
result += p + w.toString();
} else {
p.div();
result += p + w.toString();
}
}
}
  • 分别判断是否有无加减或乘除,并进行相应的随机添加加减或者乘除法,以保证达到混合运算的目的。

if (count == 0) {
int iw = a.nextInt(2);
if (iw == 0) {
cd.mul();
b.getNum();
result += cd + b.toString();
} else {
cd.div();
b.getNum();
result += cd + b.toString();
}
} else {
result = result;
}
  • 判断整个式子是否有乘除法,并添加相应的乘除法,以达到混合运算的目的。

public List<String> InfixToPostfix(List<String> list){
List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式
Stack<String> stack = new Stack<String>();//暂存操作符
//stack.push('#');
for(int i=0;i<list.size();i++){ String s = list.get(i);
if(s.equals("(")){
stack.push(s);
}else if(s.equals("*")||s.equals("/")||s.equals("÷")){
stack.push(s);
}else if(s.equals("+")||s.equals("-")){
if(!stack.empty()){
while(!(stack.peek().equals("("))){
Postfixlist.add(stack.pop());
if(stack.empty()){
break;
}
}
stack.push(s);
}else{
stack.push(s);
}
}else if(s.equals(")")){
while(!(stack.peek().equals("("))){
Postfixlist.add(stack.pop());
}
stack.pop();
}else{
Postfixlist.add(s);
}
if(i==list.size()-1){
while(!stack.empty()){
Postfixlist.add(stack.pop());
}
}
}
return Postfixlist;
}
  • 利用栈使中缀表达式转换为后缀表达式。
 public double doCal(List<String> list){
Stack stack = new Stack();
for(int i=0;i<list.size();i++){
String s = list.get(i);
double t=0;
if(!isOp(s)){
Double cd = Double.parseDouble(s);
t = cd;
stack.push(t);
}else{
if(s.equals("+")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2+a1;
stack.push(v);
}else if(s.equals("-")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2-a1;
stack.push(v);
}else if(s.equals("*")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2*a1;
stack.push(v);
}else if(s.equals("/")||s.equals("÷")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2/a1;
stack.push(v);
}
}
}
return (double) stack.pop();
}
  • 利用栈计算后缀表达式的值。
public void torf(List<String> list){
Scanner scan = new Scanner(System.in);
System.out.println("请输入计算结果");
String result = scan.nextLine();
double result2 = Double.parseDouble(result);
if (result2 - doCal( list)<0.001 && result2 - doCal(list)> -0.001)
System.out.println("答案正确");
else
System.out.println("答案错误" + " " + "正确答案为" + doCal(list));
}
  • 在允许一定范围的误差内来判断用户输入的答案是否正确。

遇到的困难及解决方法

  • 问题1:利用随机生成表达式等级三的时候,因为是随机生成的运算符,所以不能保证生成的表达式中乘除都存在。
  • 问题1解决方法:定义这样一个方法,如果随机到乘除,定义一个count变量进行自加,从而使用if语句由count的值来判断缺少什么运算符,如有缺少添加上缺少的相应的运算式。

  • 问题2:一开始的时候除号与分数的分号是一致的,所以生成的表达式中的区分度不够,不能够很好的表示真分数。
  • 问题2解决方法:在生成表达式的时候新加一种情况是字符串型“÷”,在运算的时候,在相应的数组中添加“÷”,并且把“÷”定义成与“/”一样的计算。



  • 问题3:在用户测试类中调用运算类的时候,生成的答案与正确答案有时候会出现不一致。



  • 问题3在当天进行调试的时候尚未解决,在后续的编程中会找出并解决问题,体现在下一次的博客中。

文件扩展

在完成了基本要求之后,考虑实现以下功能。

  1. 实现支持多语言。
  2. 能够实现题目去重。
  3. 对生成的题目和用户输入的结果以及正确结果和正确率进行记录并在txt文本中进行体现。

项目链接

PSP时间统计:

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 1 1.5
Estimate 估计这个任务需要多少时间 1 1
Development 开发 6 10
Analysis 需求分析 (包括学习新技术) 1 3
Coding Standard 代码规范 (为目前的开发制定合适的规范) 1 3
Design UML 设计项目UML类图 1.5 1.5
Coding 具体编码 6
Code Review 代码复审 2 3
Test 测试(自我测试,修改代码,提交修改) 2 2
Size Measurement 计算工作量(实际时间) 2 1
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 1 1
合计 26.5 33

20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结的更多相关文章

  1. 20172332『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172326康皓越 20172313余坤澎 20172332于欣月 小组编程照片 设计思路 设计一个生成符号 ...

  2. 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...

  3. 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址 对结对伙伴的评价:黄宇瑭同学的优势在于能够想出一 ...

  4. 20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172324 姓名 :曾程 伙伴第一周博客地址: 对结对伙伴的评价:一个很优秀的同学,在这次项目中 ...

  5. 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...

  6. 20172302『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    一.结对对象 姓名:周亚杰 学号:20172302 担任角色:驾驶员(周亚杰) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

  7. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  8. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周

    一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

  9. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算——第一周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址:点击这里 1. 需求分析: 可生成题目: - 输入要想生成 ...

随机推荐

  1. GCD死锁,及同步、异步、串行和并行队列组合情形

      一.概述 1)队列用来存储代码任务,线程用来运行代码任务: 2)main()函数作为程序入口,整个程序默认运行在主线程中,程序代码任务默认存放在主队列中: 3)以下所谓阻塞线程是针对主线程而言(子 ...

  2. html5的文档申明为什么是<!DOCTYPE html>?

    首先我们来了解一下什么是文档声明: 文档声明就是文档告诉游览器该以什么样的标准去解析它.游览器可以解析的文档可不止html,还有xhtml,xml...当然在这里我们并不需要知道xhtml.xml是什 ...

  3. 单片机实现简易版shell的方法和原理

    Rt-thread 中有一个完整的finsh(shell )系统,使用串口做命令行输入输出.但是想要用这个炫酷的工具就必须要上rtthread系统,或者花大力气将其移植出来.于是我就自己写了一个类似于 ...

  4. C#框架学习资料集锦

    1.AllEmpty 的[从零开始编写自己的C#框架]系列 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零 ...

  5. 【转载】MSXML应用总结 开发篇(上)

    原文:http://blog.sina.com.cn/s/blog_48f93b530100ejv9.html 本篇是接前文“MSXML应用总结 概念篇”写的,主要总结一下MSXML DOM接口的应用 ...

  6. 2_C语言中的数据类型 (九)逻辑运算符与if语句、switch、条件运算符?、goto语句与标号

    1          条件分支语句 1.1       关系运算符 在C语言中0代表false,非0代表真 1.1.1          < 小于 1.1.2          <= 小于 ...

  7. sublime常用方法

    1.如何打开一个文件夹? project----->Add Folder to Project 2.如何同一个窗口下进行分屏操作? 使用快捷键:shift+Alt+2 3.如何使html代码进行 ...

  8. 用docsify快速构建文档,并用GitHub Pages展示

    什么是docsify 无需构建,写完 markdown 直接发布成文档,写说明文档的极佳选择. 快速上手 安装 npm i docsify-cli -g docsify init docs 创建项目 ...

  9. h5小球走迷宫小游戏源码

    无意中找到的一个挺有意思的小游戏,关键是用h5写的,下面就分享给大家源码 还是先来看小游戏的截图 可以用键盘的三个键去控制它,然后通关 下面是源代码 <!doctype html> < ...

  10. 人工智能AI芯片与Maker创意接轨 (中)

    在人工智能AI芯片与Maker创意接轨(上)这篇文章中,介绍人工智能与深度学习,以及深度学习技术的应用,了解内部真实的作业原理,让我们能够跟上这波AI新浪潮.系列文来到了中篇,将详细介绍目前市面上的各 ...