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程序设计』课程 结对编程练习-四则运算-准备阶段的更多相关文章

  1. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段 如今的编写,进入了一段时间的中坚阶段,小伙伴的思路虽然很一致,但是总是存在着一定问题,这就造成了我们中坚阶 ...

  2. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段 最后的一周,时间越来越紧张,因为之前的拖沓和一些事情的耽误,导致了如今的紧张,这一周应该是我们小组效率最高 ...

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

    相关测试过程截图 测试了由中缀表达式转后缀表达式的Junit测试,分别进行了整数的和分数的,测试成功截图 由于生成问题和计算问题中,问题都是随机产生的,暂时不会进行Junit测试,故没有进行,但应是正 ...

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

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

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

    一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第一周博客地址 二.本周内容 1.程序需求 (1).自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能 ...

  6. 2017-2018-2 20172323 『Java程序设计』课程 结对编程练习_四则运算

    结对编程的好丽友 - 20172323 王禹涵:中缀转后缀 - 20172314 方艺雯:后缀表达式的计算 - 20172305 谭鑫:中缀表达式的输出 需求分析 能随机生成由使用者确定的任意多道四则 ...

  7. 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算

    2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算 经过第一阶段的学习,同学们已经熟悉了这门语言基本的用法.在一次又一次对着电脑编写并提交代码,进行练习的时候,有没有觉 ...

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

    2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决 ...

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

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...

随机推荐

  1. 手把手教你写基于C++ Winsock的图片下载的网络爬虫

    手把手教你写基于C++ Winsock的图片下载的网络爬虫 先来说一下主要的技术点: 1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址) 2. 使用socket套接字 ...

  2. Linux Shell常用技巧(六)

    十二.   行的排序命令sort:   1.  sort命令行选项: 选项 描述 -t 字段之间的分隔符 -f 基于字符排序时忽略大小写 -k 定义排序的域字段,或者是基于域字段的部分数据进行排序 - ...

  3. 逻辑卷管理-LVM(Logical Volume Manager)

    一. 概念与由来 LVM:逻辑卷管理(Logical Volume Manager) 普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某文件时,这个文件因为受上层文件 ...

  4. mac 下安装php7.1 memcache扩展

    1.下载memcache源代码文件 https://github.com/websupport-sk/pecl-memcache/archive/php7.zip 文件夹名为:pecl-memcach ...

  5. POJ 1235 Machine Schedule 【二分图】

    这道题考察对最小点覆盖的理解. 做法: 对于一个作业,它需要A的a模式和B的b模式,那么可以从a模式向b模式连一条边:可以感性的理解为每一条边就是一个作业,需要求得有多少个模式可以覆盖所有的边,也就是 ...

  6. JavaWeb总结(十)

    Filter配置详解 web项目目录示意图 <!-- Filter配置 --> <filter> <display-name>Filter_one</disp ...

  7. 【转载】COM 组件设计与应用(一)——起源及复合文件

    原文:http://vckbase.com/index.php/wv/1201.html COM 组件设计与应用 系列文章:http://vckbase.com/index.php/piwz?& ...

  8. 在CMD 中,如何切换python2.x 版本 和 python3.x版本?

    1.cmd中输入python,启动python2.x版本,如何切换呢? 2.找到python2.x安装路径,修改python.exe名称为:python27.exe 3. 打开cmd,输入python ...

  9. codeblocks一些学习

    codeblocks下,怎样建立工程,进行多文件编译?如下是书上的两个文件. https://ask.csdn.net/questions/204326 codeblocks创建静态库并使用 http ...

  10. Linux日常积累

      1. /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量,写在 /etc/profile 里面的是对所有用户永久 ...