java安装 1723_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类图

f5e018c6db0ec948ae4990e4a40b7f13.png

4.遇到问题及解决方法

5.代码展示

第一部分:生成题目

import java.util.Stack;

import java.util.Random;

import java.util.ArrayList;

import java.util.Scanner;

class Questions {

ArrayList array = new ArrayList();

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 stack1 = new Stack();

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 | 预估耗时(分钟)| 实际耗时(分钟)|

| -------- | :----------------😐:----------------😐

|Planning| 计划 |60 | 65 |

|Estimate | 估计这个任务需要多少时间 |3 |2|

|Development |开发2000 |3000 |

|Analysis |需求分析 (包括学习新技术)| 350 | 300 |

|Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 10 |

|Design UML |设计项目UML类图 |60 | 60 |

|Coding | 具体编码| 1500 |2000 |

|Code Review| 代码复审 |30 |30|

|Test测试|(自我测试,修改代码,提交修改)|300|300|

|Size Measurement计算工作量(实际时间 )|2 |2|

|Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 |10|

| | 合计 | 4395 | 5229|

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值