20165232 2017-2018-2《Java程序设计》结对编程一 第二周总结
结对对象
20165219王彦博
20165232何彦达
需求分析
实现一个程序,要求:
1 支持整数运算
2 支持多运算符运算
3 支持分数运算,支持真分数运算
扩展需求:
1 处理生成题目并输出到文件
2 完成题目后从文件读入并判题
3 多语言支持:简体中文, 繁體中文, English
4 生成题目去重
设计思路
这是一个需要支持复杂运算的程序,不同于简单的单运算符的四则运算,需要设计多个类来实现运算,比如加减乘除以及平方的运算。
nml图(部分)
第一周
第二周
代码进度
整数计算类
public class IntNumber {
private int A;
public int getA(){
return A;
}
public IntNumber(int A){
this.A = A;
}
public int add(IntNumber op1){
int sum = A + op1.A;
System.out.print(A + " + " + op1.A + "=");
return sum;
}
public int subtract(IntNumber op1){
int num = A - op1.A;
System.out.print(A + " - " + op1.A + "=");
return num;
}
public int multiply(IntNumber op1){
int num = A * op1.A;
System.out.print(A + " * " + op1.A + "=");
return num;
}
public static IntNumber obj(){
Random ran = new Random();
return new IntNumber(ran.nextInt(20)-10);
}
public String divide(Score op1){
System.out.print(op1.getNumerator() + " / " + op1.getDenominator() + "=");
return op1.toString();
}
}
分数类运算
import java.util.Random;
public class Score {
private int numerator, denominator;
public Score (int numer, int denom)
{
if(denom == 0 )
denom = 1;
if (denom < 0)
{
numer = numer * -1;
denom = denom * -1;
}
numerator = numer;
denominator = denom;
reduce();
}
public int getNumerator()
{
return numerator;
}
public int getDenominator()
{
return denominator;
}
public Score reciprocal()
{
return new Score (denominator, numerator);
}
public Score add(Score op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int sum = numerator1 + numerator2;
System.out.print("("+this.toString()+")" + " + " + "("+op2.toString()+")" + "=");
return new Score (sum, commonDenominator);
}
public Score subtract(Score op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int difference = numerator1 - numerator2;
System.out.print("("+this.toString()+")" + " - " + "("+op2.toString()+")" + "=");
return new Score(difference,commonDenominator);
}
public Score multiply (Score op2)
{
int numer = numerator * op2.getNumerator();
int denom = denominator * op2.getDenominator();
System.out.print("("+this.toString()+")" + " * " + "("+op2.toString()+")" + "=");
return new Score (numer, denom);
}
public Score divide (Score op2)
{
Score op1 = op2.reciprocal();
int numer = numerator * op1.getNumerator();
int denom = denominator * op1.getDenominator();
System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
return new Score (numer, denom);
}
public boolean isLike (Score op2)
{
return (numerator == op2.getNumerator() &&
denominator == op2.getDenominator());
}
public String toString()
{
String result;
if (numerator == 0)
result = "0";
else
if (denominator == 1)
result = numerator + "";
else
result = numerator + "/" + denominator;
return result;
}
private void reduce()
{
if (numerator != 0)
{
int common = gcd (Math.abs(numerator), denominator);
numerator = numerator / common;
denominator = denominator / common;
}
}
private int gcd (int num1, int num2)
{
while (num1 != num2)
if (num1 > num2)
num1 = num1 - num2;
else
num2 = num2 - num1;
return num1;
}
public static Score obj(){
Random ran = new Random();
return new Score(ran.nextInt(20)-10,ran.nextInt(20)-10);
}
}
正误判断类
public class CorrectJudgment {
private static int trues = 0;
public static void judgment(boolean same, String num1) {
if (same) {
trues++;
System.out.println("正确!"+"\n");
} else {
System.out.println("错误!");
System.out.println("正确结果为:" + num1+"\n");
}
}
public static int getTrues() {
return trues;
}
}
主类
import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.*;
public class NumberCount {
public static void main(String[] args) {
NumberFormat nf = NumberFormat.getPercentInstance();
IntNumber in1, in2;
Score score1, score2,num2;
int num,N;
String Q,num1;
Random ran = new Random();
Scanner scan = new Scanner(System.in);
System.out.print("请输入您所需要的题目数量:");
int A = scan.nextInt();
for (int i = 0; i < A; i++) {
int B = ran.nextInt(2);
int C = ran.nextInt(4);
in1 = IntNumber.obj();
in2 = IntNumber.obj();
score1 = Score.obj();
score2 = Score.obj();
if (B == 0) {
switch (C) {
case 0:
num = in1.add(in2);
num1 = "" + num;
N = scan.nextInt();
CorrectJudgment.judgment(N == num,num1);
break;
case 1:
num = in1.subtract(in2);
num1 = "" + num;
N = scan.nextInt();
CorrectJudgment.judgment(N == num,num1);
break;
case 2:
num = in1.multiply(in2);
num1 = "" + num;
N = scan.nextInt();
CorrectJudgment.judgment(N == num,num1);
break;
case 3:
num1 = in1.divide(score1);
Q = scan.next();
CorrectJudgment.judgment(Q.equals(num1),num1);
break;
}
} else {
switch (C) {
case 0:
num2 = score1.add(score2);
num1 = num2.toString();
Q = scan.next();
CorrectJudgment.judgment(Q.equals(num1),num1);
break;
case 1:
num2 = score1.subtract(score2);
num1 = num2.toString();
Q = scan.next();
CorrectJudgment.judgment(Q.equals(num1),num1);
break;
case 2:
num2 = score1.multiply(score2);
num1 = num2.toString();
Q = scan.next();
CorrectJudgment.judgment(Q.equals(num1),num1);
break;
case 3:
num2 = score1.divide(score2);
num1 = num2.toString();
Q = scan.next();
CorrectJudgment.judgment(Q.equals(num1),num1);
break;
}
}
}
System.out.println("你答对的题目总数:" + CorrectJudgment.getTrues());
double T = (double) CorrectJudgment.getTrues()/A;
System.out.println("您的正确率为:" + nf.format(T));
}
功能截图
正常情况测试
边界情况测试
异常情况测试
结对感受
经过两个周的结对编程,我认为四则运算在思路上看似简单,但是具体操作起来有许多的不足,首先分数类计算的代码是请教同学后完成,其次单元测试类的代码没有完成,并且不能支持多级运算。相信之后的结对学习中可以慢慢完善。
结对互评
王彦博同学在结对编程中给了我很大的帮助,有一些代码的问题我不是很清楚,王彦博同学都耐心为我解答。