java编程四则运算_《java程序设计》结对编程-四则运算整体总结

需求分析(描述自己对需求的理解,以及后续扩展的可能性)

实现一个命令行程序,要求:

自动生成小学四则运算题目(加,减,乘,除)

支持整数

支持多运算符(比如生成包含100个运算符的题目)

支持真分数

统计正确率

设计思路(同时输出UML类图)

首先要输入生成题目的数目m

计算机根据输入的数目生成m道题

每道题生成的数字要随机且在0~10之间,且要生成分数

生成的字符也要随机且字符数在1~100之间,字符不止加减乘除,还有括号,除的时候要考虑除数不能为零

用户输入值和计算机原本结果进行对比

如果正确,则输出正确

如果错误,则输出错误,正确答案为:输出答案,还应包括真分数计算

答题结束后,计算机自动计算答题正确率

实现过程中的关键代码解释

计算生成题目

package CaculateSystem;

import java.util.Random;

public class ProduceProblem {

public int ProduceProblem () {

String s = "";

Random shu = new Random();//每个运算式的随机数

int count = 1; //记录符号;

char[] operator = new char[]{'+', '-', '*', '/'};

int m = 2 + (int) (Math.random() * 6); //每个运算式数目的个数

for (int j = 0; j < m; j++) {

int num = shu.nextInt(10);

s = s +" "+ num;

if (count < m) {

int c = shu.nextInt(4);

s = s +" "+ operator[c];

count++;

}

}

String [] str = s.split(" ");

System.out.println(s + "=");

Translate t = new Translate(str);

return t.flag;

}

}

将中缀转换为后缀

package CaculateSystem;

import java.util.Stack;

public class Translate extends Judge{

int flag;

public Translate (String[] args) {

Stack z = new Stack();

String jieguo = "";

String t = "";

for (int i = 0; i < args.length; i++) {

switch (args[i]) {

case "(":

z.push(args[i]);

break;

case "+":

case "-":

while(z.empty() != true) {

t = z.pop();

if (t.equals("(")) {

z.push(t);

break;

}

jieguo = jieguo + t + " ";

}

z.push(args[i]);

break;

case "*":

case "/":

while(z.empty() != true) {

t = z.pop();

if (t.equals("+") || t.equals("-") || t.equals("(")) {

z.push(t);

break;

}

jieguo = jieguo + t + " ";

}

z.push(args[i]);

break;

case ")":

while (z.empty()== false) {

t = z.pop();

if (t.equals("(")) {

break;

} else {

jieguo = jieguo + t + " ";

}

}

break;

case" ":

break;

default:

jieguo = jieguo + args[i] + " ";

break;

}

}

while (z.empty() == false) {

jieguo = jieguo + z.pop() + " ";

}

String [] str = jieguo.split(" ");

Count py = new Count(str);

int answer = py.answer;

flag = A(answer);

}

public Translate() {

}

}

生成分数

package CaculateSystem;

import java.util.Random;

public class CreatOpNum {

Rational opNum = new Rational();

Random random = new Random();

String opnumFile = "";

String opnumPri = "";

int flag;

CreatOpNum(int flag1) {

flag = flag1;

int a = random.nextInt(9)+1;

opNum.setNumerator(a);

if (flag1 == 1) {//是分数

int b = random.nextInt(9)+1;

while (b == 0) {

b = random.nextInt(9)+1;

}

opNum.setDenominator(b);

} else {//不是分数

opNum.setDenominator(1);

}

}

public void getOpNumFile() {

opnumFile = opNum.getNumerator() + " / " + opNum.getDenominator();

}

public void getOpNumPri() {

if (flag == 0) {

opnumPri = opNum.getNumerator() + "";//输出整数

} else if (opNum.getNumerator() > opNum.getDenominator()) {//假分数

int n = opNum.getNumerator() / opNum.getDenominator();

int m = opNum.getNumerator() % opNum.getDenominator();

opnumPri = n + " + " + m + " / " + opNum.getDenominator();

} else {

opnumPri = opNum.getNumerator() + " / " + opNum.getDenominator();

}

}

}

带分数的计算

package CaculateSystem;

public class Rational {//有理数

int numerator = 1;//分子

int denominator = 1;//分母

void setNumerator(int a) {//设置分子

int c = f(Math.abs(a), denominator);//计算最大公约数

numerator = a / c;

denominator = denominator / c;

if (numerator < 0 && denominator < 0) {

numerator = -numerator;

denominator = -denominator;

}

}

void setDenominator(int b) {//设置分母

int c = f(numerator, Math.abs(b));//计算最大公约数

numerator = numerator / c;

denominator = b / c;

if (numerator < 0 && denominator < 0) {

numerator = -numerator;

denominator = -denominator;

} else if (numerator > 0 && denominator < 0) {

numerator = -numerator;

denominator = -denominator;

}

}

int getNumerator() {

return numerator;

}

int getDenominator() {

return denominator;

}

int f(int a, int b) {//求a,b的最大公约数

if (a == 0) {

return 1;//c为分母不能为0

}

if (a < b) {//令a>b

int c = a;

a = b;

b = c;

}

int r = a % b;

while (r != 0) {

a = b;

b = r;

r = a % b;

}

return b;

}

Rational add(Rational r) {//加法运算

int a = r.getNumerator();//返回有理数r的分子

int b = r.getDenominator();//返回有理数r的分母

int newNumerator = numerator * b + denominator * a;//计算出新分子

int newDenominator = denominator * b;//计算出新分母

Rational result = new Rational();

result.setNumerator(newNumerator);

result.setDenominator(newDenominator);

return result;

}

Rational sub(Rational r) {//减法运算

int a = r.getNumerator();

int b = r.getDenominator();

int newNumerator = numerator * b - denominator * a;

int newDenominator = denominator * b;

Rational result = new Rational();

result.setNumerator(newNumerator);

result.setDenominator(newDenominator);

return result;

}

Rational muti(Rational r) {//乘法运算

int a = r.getNumerator();

int b = r.getDenominator();

int newNumerator = numerator * a;

int newDenominator = denominator * b;

Rational result = new Rational();

result.setNumerator(newNumerator);

result.setDenominator(newDenominator);

return result;

}

Rational div(Rational r) {//除法运算

int a = r.getNumerator();

int b = r.getDenominator();

Rational result = new Rational();

if (a == 0) {

System.out.println("分母/除数不能为0");

result.setNumerator(0);

System.exit(0);

} else {

int newNumerator = numerator * b;

int newDenominator = denominator * a;

result.setNumerator(newNumerator);

result.setDenominator(newDenominator);

}

return result;

}

}

测试方法

13edfe9ed10420258f9b2cfd91bf98be.png

运行过程截图

aa6da47827b6fb2e146b5c7006db4b21.png

代码托管地址

对结对的小伙伴做出评价(重点指出需要改进的地方)

本周我的小伙伴还是一如既往的给力,大部分的任务还是在他帮助下完成的,对我不懂的地方也认真给我解答,对我的帮助很大。

总结

本周完成了括号和分数的任务,结对真的比一个人有用,而且1+1>2是真的可以实现,虽然有的任务我们还没有完成,但是我们还会继续努力的。

PSP

计划

预估耗时(分钟)

实际耗时(分钟)

估计这个任务需要多少时间

200

200

开发

需求分析 (包括学习新技术)

120

150

生成设计文档

30

30

设计复审 (和同事审核设计文档)

60

75

代码规范 (为目前的开发制定合适的规范)

90

105

具体设计

30

60

具体编码

720

810

代码复审

60

60

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

90

90

报告

测试报告

20

20

计算工作量

10

10

事后总结, 并提出过程改进计划

240

270

合计

1500

1710

参考引用

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值