2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段
2017-2018-2 1723 『Java程序设计』课程
结对编程练习-四则运算-准备阶段
在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练习——四则运算。显然,他是考验我们对于之前知识的掌握程度,而且考验我们的能力,既然已经是一个结对编程练习,肯定存在着困难,但我们会迎难而上,一起解决问题,因为“团结就是力量!!!”
结对编程的战友
20172316 赵乾宸:负责对于整数出题的编程;
20172319 唐才铭:负责对于分数出题的编程;
我:20172329 王文彬:负责对于计算和题目去重的编写;
测试为分别进行测试,最后由赵乾宸进行集体测试。
每个人都是驾驶员,是彼此的引航员,团队,分工明确是一部分,但是集体力量的结晶才是最伟大的!!!
看到题目的构思
1、计算的最开始构思:
首先,当第一次拿到这个题目的时候,首先进行思考的是加减乘除的整个运算逻辑,因为当时没有了解过有后缀表示法,所以一直在想如何用中缀表达式开始计算; 一方面,思考的是输出的题目应该是字符串类型还是数据类型,后来想了想,各有各自的优点和缺点,比如,计算的时候的确,数字是很方便的,但是当涉及到计算的时候,遇到的“+”、“-”、“*”、“/”,几个符号就我现在的水平,没有办法去很好的解决,之后就想到了,假如将这几个运算符号进行改变,将其变为几个数字代表他们,不就可以了,最后有这样一个问题,如果用“0”来代表“+”,有一个问题,因为“+”是一个字符串,对其赋值还得进行强制转化,对于程本身这样其实是不利的,存在着一定的问题,所以,就先将计算问题放了放,开始想,如何出题;
2、开始出题:
最开始,还是以出题为主,考虑到“if-else”语句的复杂性,我们选择了“swich语句“,因为,这样可以进行人机互动,一方面可以实现我们所需要的输入一个阶数,可以完成对于该阶数的出题;构思是这样的,先利用对于符号的赋值,对于加减乘除四个符号进行对0123的赋值,以便于通过对于产生一个0~4(左闭右开)的一个随机数取值实现对于字符串的出题的随机性,将输出的符号给一个字符对象进行赋值,之后,开始在里面加入数字,如何解决阶数的控制,一方面,利用swich语句的方便,其次,利用了累加“+=”进行输出,就会产生按照我们需求的题目;另一方面,需要输出按照我们所敲入的数字进行题目个数的输出,我们想到了运用数组和while语句,这样,按照条件,输出数组,就可以达到我们想要的一个结果,也就是一个理想的出题模型。
protected int a;
protected String s1 = "", str = "";
public Compute2() {
Scanner scan = new Scanner(System.in);
System.out.println("几级运算?");
int n = scan.nextInt();
Scanner qqq = new Scanner(System.in);
System.out.println("生成几个题目?");
int q = qqq.nextInt();
Object[] p = new Object[q] ;
for (int index = 0; index < q; index++) {
int a1 = (int) (Math.random() * 100);
int a2 = (int) (Math.random() * 100);
int t1 = (int) (Math.random() * 4);
switch (t1) {
case 0: {
s1 = " + ";
break;
}
case 1: {
s1 = " - ";
break;
}
case 2: {
s1 = " * ";
break;
}
case 3: {
s1 = " / ";
}
}
for (int i = 0; i < n - 1; i++) {
int a = (int) (Math.random() * 100);
int t = (int) (Math.random() * 4);
String s = "";
switch (t) {
case 0: {
s = " + ";
break;
}
case 1: {
s = " - ";
break;
}
case 2: {
s = " * ";
break;
}
case 3: {
s = " / ";
}
}
str += a + s;
}
str += a1 + s1 + a2;
p[index]=str;
3、学习从中缀表达式到后缀表达式的变化:
在课上,学习了解了后缀表达式,这个表达式方便了我们进行计算代码的编写,利用了“栈”这个概念,在思考运算的过程中简化了很多步骤;
在利用栈解决问题的时候有一个问题:就是假如是两位数,如何去解决,这个问题在某一天的晚自习里,学长给我们就这个问题进行了讲解,利用StringTokenzer的方法进行对于字符串的分隔,这个方法可以将两个数字或者三个乃至三个以上的字符进行划分,让他们单独成为整体,这样就方便了我们的计算,就可以解决1234+不是123+4而是12+34的问题,感谢学长。
public String infixToSuffix() {
Stack<Character> s = new Stack<Character>();
String suffix = "";
int length = str.length(); for (int i = 0; i < length; i++) {
char temp;// 临时字符变量
char ch = str.charAt(i);
switch (ch) {
case ' ':
break;
case '(':
s.push(ch);
break;
case '+':
case '-':
while (s.size() != 0) {
temp = s.pop();
if (temp == '(') {
s.push('(');
break;
}
suffix += temp;
}
s.push(ch);
break;
case '*':
case '/':
while (s.size() != 0) {
temp = s.pop();
if (temp == '+' || temp == '-' || temp == '(') {
s.push(temp);
break;
} else {
suffix += temp;
}
}
s.push(ch);
break;
case ')':
while (!s.isEmpty()) {
temp = s.pop();
if (temp == '(') {
break;
} else {
suffix += temp;
}
}
break;
default:
suffix += ch;
break;
}
}
while (s.size() != 0) {
suffix += s.pop();
} return suffix;
4、在出题过程中去重问题上的思考:
如何去重,一方面,我们想到的是只要是结果相同的就是相同的,后来,发现并不是这样简单的,因为,在看了老师的博客中所介绍的:
程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。例如,23 + 45 = 和45 + 23 = 是重复的题目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
看到了如此的要求,就开始进行思考;
5、计算问题:(我是负责这里部分编写的)
在遇见计算的时候,主要靠的就运用后缀表达式的方法,利用栈进行计算,大概思路如下:
public Integer suffixToArithmetic() {
Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)");
String[] strings = str.split("");
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < strings.length; i++) {
if (strings[i].equals("")) {
continue;
}
if (pattern.matcher(strings[i]).matches()) {
stack.push((int) Double.parseDouble(strings[i]));
}
else {
double y = stack.pop();
double x = stack.pop();
stack.push((int) calculate(x, y, strings[i]));
}
}
return stack.pop();
}
private double calculate(double x, double y, String string) {
if (string.trim().equals("+")) {
return x + y;
}
if (string.trim().equals("-")) {
return x - y;
}
if (string.trim().equals("*")) {
return x * y;
}
if (string.trim().equals("/")) {
return x / y;
}
return (double) 0;
}
测试结果
转后缀:
遇到的一些问题
第一个问题:
如何去解决出题过程中如何去添加括号,因为括号的位置的不确定性就限制了我们如何去选择,比如,假如出现像加法和乘法混在一起,括号应该选择加在加法位置?
解决方案:
我们想要将加法和括号绑定在一起,之后利用swich语句判断,什么时候不需要在加法减法周围加括号,什么时候不需要加。
第二个问题:
因为我们是先进行了代码的编写,然后通过对于代码画UML图,所以现在就有以一个问题,因为一些代码命名不同,使得存在一些问题,(这个是我们组的失误,下次会纠正的)
解决方案:
现在正在汇总,之后打算统一为UML图的编码格式,然后对各自的代码进行修改。
互评
20172316赵乾宸
小赵同学担起了开始编写代码的大任,在发布任务的第二天,因为我和老唐同学在连续的两天都有晚课,所以一开始,小赵同学的功劳功不可没,而且他是我们团队编程能力最强的,所以,我们都会向他看齐。
20172319唐才铭
老唐同学分配了我们的任务,并且也担起了团队的一遍大旗,为彼此加油鼓劲。
大家加油!!
UML图
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 100 | 100 |
Development | 开发 | 800 | |
Analysis | 需求分析 (包括学习新技术) | 100 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
Design UML | 设计项目UML类图 | 50 | 30 |
Coding | 具体编码 | 30 | |
Code Review | 代码复审 | 50 | |
Test | 测试(自我测试,修改代码,提交修改) | 30 | |
Size Measurement | 计算工作量(实际时间 | 30 | |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | |
合计 | 1240 |
参考
Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
用java实现复数的加减乘除运算
逆波兰表达式
表达式计算 java 后缀表达式
Java实现中缀表达式转后缀表达式并计算结果
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段的更多相关文章
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段 如今的编写,进入了一段时间的中坚阶段,小伙伴的思路虽然很一致,但是总是存在着一定问题,这就造成了我们中坚阶 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段 最后的一周,时间越来越紧张,因为之前的拖沓和一些事情的耽误,导致了如今的紧张,这一周应该是我们小组效率最高 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算第三周总结
相关测试过程截图 测试了由中缀表达式转后缀表达式的Junit测试,分别进行了整数的和分数的,测试成功截图 由于生成问题和计算问题中,问题都是随机产生的,暂时不会进行Junit测试,故没有进行,但应是正 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周
一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算
一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第一周博客地址 二.本周内容 1.程序需求 (1).自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能 ...
- 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 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...
随机推荐
- 手把手教你写基于C++ Winsock的图片下载的网络爬虫
手把手教你写基于C++ Winsock的图片下载的网络爬虫 先来说一下主要的技术点: 1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址) 2. 使用socket套接字 ...
- Linux Shell常用技巧(六)
十二. 行的排序命令sort: 1. sort命令行选项: 选项 描述 -t 字段之间的分隔符 -f 基于字符排序时忽略大小写 -k 定义排序的域字段,或者是基于域字段的部分数据进行排序 - ...
- 逻辑卷管理-LVM(Logical Volume Manager)
一. 概念与由来 LVM:逻辑卷管理(Logical Volume Manager) 普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某文件时,这个文件因为受上层文件 ...
- mac 下安装php7.1 memcache扩展
1.下载memcache源代码文件 https://github.com/websupport-sk/pecl-memcache/archive/php7.zip 文件夹名为:pecl-memcach ...
- POJ 1235 Machine Schedule 【二分图】
这道题考察对最小点覆盖的理解. 做法: 对于一个作业,它需要A的a模式和B的b模式,那么可以从a模式向b模式连一条边:可以感性的理解为每一条边就是一个作业,需要求得有多少个模式可以覆盖所有的边,也就是 ...
- JavaWeb总结(十)
Filter配置详解 web项目目录示意图 <!-- Filter配置 --> <filter> <display-name>Filter_one</disp ...
- 【转载】COM 组件设计与应用(一)——起源及复合文件
原文:http://vckbase.com/index.php/wv/1201.html COM 组件设计与应用 系列文章:http://vckbase.com/index.php/piwz?& ...
- 在CMD 中,如何切换python2.x 版本 和 python3.x版本?
1.cmd中输入python,启动python2.x版本,如何切换呢? 2.找到python2.x安装路径,修改python.exe名称为:python27.exe 3. 打开cmd,输入python ...
- codeblocks一些学习
codeblocks下,怎样建立工程,进行多文件编译?如下是书上的两个文件. https://ask.csdn.net/questions/204326 codeblocks创建静态库并使用 http ...
- Linux日常积累
1. /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量,写在 /etc/profile 里面的是对所有用户永久 ...