2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算
一.结对对象
- 姓名:侯泽洋
- 学号:20172308
- 担任角色:驾驶员(侯泽洋)
- 伙伴第一周博客地址
二.本周内容
1.程序需求
(1).自动生成题目
可独立使用(能实现自己编写测试类单独生成题目的功能)
可生成不同等级题目,类似于:
1级题目:2 + 5 = 、10 - 5 = 之类的两个数,一个运算符的题目(2).题目运算(判题)
可独立使用,实现中缀表达式转为后缀表达式并计算;判断用户答题正误,并输出正确结果(3).支持真分数
可独立使用,实现分数算式的计算
(4).扩展需求:题目去重
可独立使用,实现对自动生成表达式的去重:如下若生成:2 + 5 = & 5 + 2 = 为同一题目
2.设计分析
- 1.自动生成题目:这里的题目的难度我是采用操作符的个数来定义的,根据操作符再产生操作符加一的数字(这里暂时没有编写真分数的情况),然后使用循环进行产生,然后以字符串形式输出出来。
- 2.题目运算(判题):
先将生成的表达式转换为后缀表达式:通过写一个方法,如果是操作数则放进栈,如果是操作符则进行判断:加减一级的操作符遇到栈顶操作符为乘除或加减,则输出栈顶操作符,压进加减一级的操作符;乘除一级的操作符遇到栈顶操作符为乘除则栈顶操作符出栈,压进将入栈的操作符,遇到加减一级操作符则直接进栈。
计算后缀表达式:写一个方法:从左向右扫描后缀表达式,遇到操作数进栈,遇到操作符则弹出栈顶的两个元素,将结果计算出来再压进栈,最后栈内剩余一个元素即为最终答案 - 3.支持真分数:暂未完成
3.设计UML类图

4.遇到问题及解决方法
5.代码展示
第一部分:生成题目
import java.util.Stack;
import java.util.Random;
import java.util.ArrayList;
import java.util.Scanner;
class Questions {
ArrayList<Object> array = new ArrayList<Object>();
Random generator = new Random();
char[] newchar = {'+', '-', '*', '/'};
protected int number;
int NUM;
public Questions() {
number = 0;
}
public Object getQuestion(int num) {
int num1 = num;
while (num > 0) {
int figure = (int) generator.nextInt(9) + 1;
array.add(figure);
number = (int) (Math.random() * 4);
array.add(newchar[number]);
num--;
}
String obj = "";
while (num < 2 * num1) {
obj += array.get(num);
num++;
}
int other = (int) generator.nextInt(9) + 1;
array.add(other);
obj += other + "=";
return obj;
}
}
第二部分:题目运算
//生成后缀表达式
public class Calculations {
public static void main(String[] args) {
Questions questions=new Questions();
Stack stack = new Stack();
Scanner Scan=new Scanner(System.in);
char c;
int count=0,answer;
char[] operation = new char[100];
String str = (String) questions.getQuestion(3);
System.out.println("请回答以下问题:\n"+str);
System.out.println("请输入你的答案:");
answer=Scan.nextInt();
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
if (c >= '0' && c <= '9') {
operation[i] = c;
count++;
}
else {
if (c == '*' || c == '/') {
if (stack.empty()) {
stack.push((char) c);
} else if ((char) stack.peek() == '*' || (char) stack.peek() == '/') {
operation[i] = (char) stack.pop();
stack.push(c);
} else
stack.push(c);
} else if (c == '+' || c == '-') {
if (stack.empty()) {
stack.push(c);
} else if ((char) stack.peek() == '+' || (char) stack.peek() == '-') {
operation[i] = (char) stack.pop();
stack.push(c);
} else {
operation[i] = (char) stack.pop();
stack.push(c);
}
} else
stack.push(c);
}
}
int num = stack.size();
for (int a = 0; a < num; a++) {
operation[str.length() + a] = (char) stack.pop();
}
//后缀表达式计算
Stack<Integer> stack1 = new Stack<Integer>();
int m, n, sum,num1=str.length()+(str.length()-count);
for (int b = 0; b <= num1; b++) {
if (operation[b] >= '0' && operation[b] <= '9')
stack1.push((int) operation[b]-48);
else {
if (operation[b] == '+') {
m = stack1.pop();
n = stack1.pop();
sum = n + m;
stack1.push(sum);
} else if (operation[b] == '-') {
m = stack1.pop();
n = stack1.pop();
sum = n- m;
stack1.push(sum);
} else if (operation[b] == '*') {
m = stack1.pop();
n = stack1.pop();
sum = n * m;
stack1.push(sum);
} else if (operation[b] == '/') {
m = stack1.pop();
n = stack1.pop();
sum = n / m;
stack1.push(sum);
}
else if (operation[b] == ' ')
continue;
}
}
if ((int)stack1.peek()==answer)
System.out.println("恭喜你答对了!");
else
System.out.println("很遗憾,答错了!答案是:"+stack1.peek());
}
}
三.PSP分析
|PSP2.1 | Personal Software Process Stages | 预估耗时(分钟)| 实际耗时(分钟)|
| -------- | :----------------
2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算的更多相关文章
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算第三周总结
相关测试过程截图 测试了由中缀表达式转后缀表达式的Junit测试,分别进行了整数的和分数的,测试成功截图 由于生成问题和计算问题中,问题都是随机产生的,暂时不会进行Junit测试,故没有进行,但应是正 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周
一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...
- 2017-2018-2 20172323 『Java程序设计』课程 结对编程练习_四则运算
结对编程的好丽友 - 20172323 王禹涵:中缀转后缀 - 20172314 方艺雯:后缀表达式的计算 - 20172305 谭鑫:中缀表达式的输出 需求分析 能随机生成由使用者确定的任意多道四则 ...
- 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算 经过第一阶段的学习,同学们已经熟悉了这门语言基本的用法.在一次又一次对着电脑编写并提交代码,进行练习的时候,有没有觉 ...
- 2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周
2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决 ...
- 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周
2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...
- 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算——第一周
2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址:点击这里 1. 需求分析: 可生成题目: - 输入要想生成 ...
- 2017-2018-2 20165225『Java程序设计』课程 结对编程练习_四则运算
2017-2018-2 20165225『Java程序设计』课程 结对编程练习_四则运算 需求分析: 支持整数,可进行多运算符运算,有优先级. 设计思路: 在有括号的情况下,先计算得出括号中的结果,如 ...
- 20172325『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结
20172325『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 在这次项目的完成过程中刘辰同学付出了很多,在代码的实践上完成的很出色,在技 ...
随机推荐
- 新手搭建 x-boot 编译环境笔记
1.需要先搭建交叉编译环境,即制作交叉编译工具链,这个过程比较复杂,所以我在这里使用别人做好的交叉编译工具链. 2018年8月27日15:03:37 2.X-boot 源码github地址:htt ...
- Log4J日志配置与Juit测试
一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器).Appenders(输出源)和Layouts(布局). 这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...
- C#引用比较和内容比较
1.静态方法Object.ReferenceEqual,实际实现为引用比较. 2.静态方法Object.Equal, 实际实现为引用比较.(实际调用了实例方法Equal) 3.Object实例 ...
- JS实现图片的淡入和淡出的两种方法,如有不足,还请前辈多多指导^-^~
今天下午练习了下这个图片的淡入淡出小demo,如有不足,还请前辈多多指导^-^~ 总结如下: 第一种方法: 个人觉得第一种方法比较好,同时兼容IE8以下浏览器,但是如下代码中,不知可不可以将timer ...
- c语言指针篇
不保证绝对正确,学习中所记录的一些笔记罢了,可能随着经历的增多,逐渐的完善, 不要完全相信我所记录的内容,可能因为编译协议版本的不同出现不同的结果. 也可能我写的根本就是错的,请相信自己动手得出来的结 ...
- 《The C Programming Language》读书笔记(一)
1. 对这本书的印象 2011年进入大学本科,C语言入门书籍如果我没记错的话应该是谭浩强的<C程序设计>,而用现在的眼光来看,这本书只能算是一本可用的教材,并不能说是一本好书.在自学操作系 ...
- 2017-2018-1 20155336 《信息安全系统设计基础》加分作业:实现mypwd
2017-2018-1 20155336 <信息安全系统设计基础>加分作业:实现mypwd 什么是PWD? 用man pwd查看: 用于打印当前工作目录的工作路径 1.命令格式:pwd[选 ...
- java中package import区别
他们两个是互逆过程package freedom.bean;将你这个类放在了/freedom/bean/这个文件夹下面要使用的话import freedom.bean.*;导入这个类
- BZOJ1084_最大子矩阵_KEY
题目传送门 DP. 但要分类讨论,对于M=1和M=2的情况分别讨论. 1>M=1 设f[i][j]表示选了i个矩阵,到第j位.N^3转移.(前缀和) 2>M=2 设f[i][j][k]表示 ...
- mfc 控制台程序
自动生成的C++控制台程序 认识预编译头 认识_tmain 一 .自动生成的控制台程序 二 .认识预编译头 StdAfx 所谓的预编译头就是把一个工程中的某一部分代码,预先编译好放在一个文 ...