Java实现小学四则运算练习系统(UI)

时间:2023-03-08 20:42:47

github项目地址 :https://github.com/feser-xuan/Arithmetic_test3_UI

小伙伴的博客链接:http://www.cnblogs.com/fukang/p/8711021.html

我的学号:201571030104

小伙伴的学号:201571030109

实验要求

软件基本功能要求如下:
  •  在《实验二 软件工程个人项目》中,同学们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:

  • (1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;

  • (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:Java实现小学四则运算练习系统(UI)

  • (3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

  • (4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:

Java实现小学四则运算练习系统(UI)

  • (5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;

  • (6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。

  • (7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。

1、需求分析

  该项目要求程序有人机交互界面,且可评判成绩。可为用户提供百以内整数算式、带括号算式、真分数算式三种练习,可为进行多轮测试并记录成绩生成柱状图并且记录用户消耗的时间。

2、功能分析

  • 可实现基本要求,即可生成数字在 0 和 100 之间,运算符在3个到5个之间的计算表达式,并计算出表达式的结果
  • 随机可生成带括号的运算式,括号不会超过运算符的个数
  • 生成真分数的四则运算
  • 有用户界面,可进行多轮测试
  • 记录测试结果,并将以往成绩以柱状图展示
  • 测试时,记录用户的测试用时

3、设计实现

4、运行测试

  • 设计交互界面,首页登陆,登录用户名“admin”,密码123456。

Java实现小学四则运算练习系统(UI)Java实现小学四则运算练习系统(UI)Java实现小学四则运算练习系统(UI)

  • 答题界面 

Java实现小学四则运算练习系统(UI)Java实现小学四则运算练习系统(UI)

Java实现小学四则运算练习系统(UI)

  • 答题完毕后,可以点击保存练习过的题目(包括自己答题的答案)

  Java实现小学四则运算练习系统(UI)Java实现小学四则运算练习系统(UI)

  • 答题结束后,可以查看自己得分情况(具体的用一个柱状统计图展示)

  Java实现小学四则运算练习系统(UI)

5、核心代码

  • 登录界面
 public class Login {

     public Login()
{
JFrame f=new JFrame();
f.setTitle("小学生四则运算答题系统");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true); //设置窗口的大小和位置
f.setSize(500,500);
f.setLocation(200,200); Container con=f.getContentPane();//生成一个容器
con.setLayout(new GridLayout(7,1)); JPanel pan1 =new JPanel();
JLabel title=new JLabel("欢迎登陆小学生四则运算答题系统");
title.setFont(new Font("宋体",Font.BOLD, 20));
pan1.add(title);
con.add(pan1);
//生成一个新的版
JPanel pan2 = new JPanel();
JPanel pan3 = new JPanel();
JPanel pan4 = new JPanel();
JPanel pan5 = new JPanel(); con.add(pan2);
con.add(pan3);
con.add(pan4);
con.add(pan5); JLabel name=new JLabel("用户名");
pan2.add(name);
TextField tf_name=new TextField(20);
pan2.add(tf_name); JLabel pass = new JLabel("密码");
pan3.add(pass);
TextField password=new TextField(20);
password.setEchoChar('*');
pan3.add(password); JButton b_log=new JButton("登陆");
b_log.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取用户名和密码,进行校验
String myUsername=tf_name.getText();
String myPassword=password.getText();
if(myUsername.equals("admin")&& myPassword.equals("123456")){
JOptionPane.showMessageDialog(null, "登陆成功!");
f.dispose();
MyExGUI ui = new MyExGUI(); }
else{
JOptionPane.showMessageDialog(null, "账号或密码错误!");
name.setText( "");
password.setText( "");
} }
});
pan4.add(b_log); JButton b_exit=new JButton("退出");
b_exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null, "谢谢使用!");
f.setVisible(false);//隐藏窗体
System.exit(0);//退出程序
}
});
pan5.add(b_exit);
//登陆和退出这两个按钮放在第四个版面上 } }
  • 练习界面
 package ui_test;

 import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; import javax.swing.*; public class MyExGUI extends JFrame{
ArrayList<String> user_zongti = new ArrayList<String>();
ArrayList<String> user_zonganswer = new ArrayList<String>();
ArrayList<String> user_answer = new ArrayList<String>();
ArrayList<String> true_answer = new ArrayList<String>();
ArrayList<String> jta_timu = new ArrayList<String>();
ArrayList<String> jta_zong = new ArrayList<String>();
ArrayList<Integer> user_fenshu = new ArrayList<Integer>();
JMenuBar jmb; //菜单条组件
JMenu menu1, menu2, menu3, menu4, menu5;//菜单
JMenuItem item1, item2, item3, item4, item5, item6;//菜单项
JMenu build; //二级菜单
JMenuItem file, project;
TextArea answer_all = new TextArea();
TextField jta = new TextField();
TextField jta_answer = new TextField();
JLabel num_answer = new JLabel();
JLabel answer1;
JToolBar jtb;//工具条
JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7,jb_next;
int answer_count;
int answer_fenshu;
public MyExGUI()
{
//创建菜单
jmb = new JMenuBar(); menu1 = new JMenu("文件(F)");
menu1.setMnemonic('f'); //助记符
menu2 = new JMenu("编辑");
menu2.setMnemonic('E');
menu3 = new JMenu("格式");
menu4 = new JMenu("查看");
menu5 = new JMenu("帮助"); build = new JMenu("新建"); file = new JMenuItem("文件");
project = new JMenuItem("答题");
item1 = new JMenuItem("打开");
item2 = new JMenuItem("保存(S)");
item3 = new JMenuItem("另存为");
item4 = new JMenuItem("页面设置");
item5 = new JMenuItem("打印");
item6 = new JMenuItem("退出"); answer1 = new JLabel("第 1 题"); //添加菜单项至菜单上
build.add(file);
build.add(project); menu1.add(build);
menu1.add(item1);
menu1.add(item2);
menu1.add(item3);
menu1.addSeparator();
menu1.add(item4);
menu1.add(item5);
menu1.add(item6);
//将菜单加入至菜单栏
jmb.add(menu1);
jmb.add(menu2);
jmb.add(menu3);
jmb.add(menu4);
jmb.add(menu5); JPanel contentPanel = new JPanel();
contentPanel.setLayout(null);
JLabel daan = new JLabel("答案");
JLabel dengyu = new JLabel("=");
num_answer=answer1;
num_answer.setFont(new Font("宋体",Font.BOLD, 22));
jb_next = new JButton("下一题");
jta.setFont(new Font("宋体",Font.BOLD, 22));
jta_answer.setFont(new Font("宋体",Font.BOLD, 22));
jb_next.setFont(new Font("宋体",Font.BOLD, 22));
daan.setFont(new Font("宋体",Font.BOLD, 22));
dengyu.setFont(new Font("宋体",Font.BOLD, 22)); contentPanel.add(num_answer);
contentPanel.add(daan);
contentPanel.add(dengyu);
contentPanel.add(jta); contentPanel.add(jta_answer);
contentPanel.add(answer_all);
contentPanel.add(jb_next); num_answer.setBounds(90, 20, 130, 50);
daan.setBounds(250, 20, 90, 50);
jta.setBounds(50, 70, 150, 30);
dengyu.setBounds(205, 70, 20, 20);
jta_answer.setBounds(230, 70, 100, 30);
jb_next.setBounds(350, 70, 110, 30);
answer_all.setBounds(50, 120, 400, 300); this.setJMenuBar(jmb); //添加菜单栏,不能设定位置,会自动放在最上部
this.add(contentPanel); this.setTitle("在线答题系统");
this.setSize(600, 500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
item1.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JFileChooser jfc=new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
jfc.showDialog(new JLabel(), "选择");
File file=jfc.getSelectedFile();
if(file.isDirectory()){
// System.out.println("文件夹:"+file.getAbsolutePath());
}else if(file.isFile()){
String s=file.getAbsolutePath();
}
}
});
item2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
boolean flag = true;
File file;
//String test ;
do{
//test = "test"+count; String inputValue = JOptionPane.showInputDialog("Please input file name");
file = new File(inputValue+".txt");
if (!file.exists()) {
// 创建文件
try { flag=file.createNewFile(); } catch (IOException e) {
e.printStackTrace(); }
flag=false;
}
else{ JOptionPane.showMessageDialog(null, "该文件名已存在,请重新输入", "ERROR", JOptionPane.ERROR_MESSAGE);
flag=true;
}
}while(flag);
//写入文件
String u_answer;
try {
outSTr = new FileOutputStream(file);
Buff = new BufferedOutputStream(outSTr);
System.out.println("选择是后执行的代码"+user_zongti.size()+user_answer.size());
for (int i = 0; i < user_zongti.size(); i++)
{
try {
Buff.write(user_zongti.get(i).getBytes());
Buff.write(" ".getBytes());
u_answer = user_answer.get(i);
if(u_answer.equals(""))
u_answer ="没有作答"; Buff.write(u_answer.getBytes());
Buff.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
i--;
}
}
Buff.flush();
Buff.close(); } catch (IOException e) {
e.printStackTrace();
}
//Buff.close();
try {
outSTr.close();
} catch (IOException e) {
e.printStackTrace();
}
user_zongti.clear();
user_answer.clear();
}
}); project.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
arithmetic art = new arithmetic();
true_answer=art.list_answer;
jta_timu = art.list_timu;
jta_zong = art.list;
answer_count=1;
answer_all.setText("");
for (int i = 0; i < art.list_timu.size(); i++)
{
user_zongti.add(jta_zong.get(i));
answer_all.append(jta_timu.get(i));
answer_all.append("\r\n");
}
num_answer.setText("第 "+answer_count+" 题");
jta.setText(jta_timu.get(answer_count-1));
answer_count++; }
});
jb_next.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
String temp;
temp = jta_answer.getText(); if(jta.getText().equals(""))
{
JOptionPane.showMessageDialog(null, "错误,请导入题库", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
jta_answer.setText("");
if(answer_count<=20)
{
if(isInteger(temp))
{ user_answer.add(temp);
System.out.println("选择否后执行的代码"+temp+"user_size"+user_answer.size());
num_answer.setText("第 "+answer_count+" 题");
jta.setText(jta_timu.get(answer_count-1));
answer_count++;
}
else{
JOptionPane.showMessageDialog(null, "错误", "请输入数字", JOptionPane.ERROR_MESSAGE);
}
}
else{
user_answer.add(temp);
System.out.println("选择否后执行的代码"+temp+"user_size"+user_answer.size());
answer_fenshu=0;
for(int i=0;i<user_answer.size();i++)
{
if(user_answer.get(i).equals(true_answer.get(i)))
answer_fenshu+=5;
}
user_fenshu.add(answer_fenshu);
Object[] options = { "是", "取消" };
int res=JOptionPane.showOptionDialog(null, "点击以继续 查看成绩", "答题完毕",
JOptionPane.DEFAULT_OPTION, JOptionPane.YES_NO_OPTION,
null, options, options[0]);
if(res==JOptionPane.YES_OPTION){
chart ct =new chart(user_fenshu);
ct.setVisible(true); }else{
Object[] option = { "是", "取消" };
int res1=JOptionPane.showOptionDialog(null, "继续新一轮答题", "新一轮答题",
JOptionPane.DEFAULT_OPTION, JOptionPane.YES_NO_OPTION,
null, option, option[0]); if(res1==JOptionPane.YES_OPTION){
arithmetic art = new arithmetic();
true_answer=art.list_answer; jta_timu = art.list;
answer_count=1;
answer_all.setText("");
jta_answer.setText("");
for (int i = 0; i < art.list_timu.size(); i++)
{
user_zongti.add(jta_timu.get(i));
answer_all.append(jta_timu.get(i));
answer_all.append("\r\n");
}
num_answer.setText("第 "+answer_count+" 题");
jta.setText(jta_timu.get(answer_count-1));
answer_count++; }else{ } } } }
}); } public static boolean isInteger(String str) {
for (int i = str.length();--i>=0;){
if (!Character.isDigit(str.charAt(i))){
return false;
}
}
return true;
} }
  • 绘图界面
 package ui_test;

 import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Random; import javax.swing.JFrame; public class chart extends JFrame{
//绘制柱形统计图
ArrayList<Integer> ran=new ArrayList<Integer>();
public chart(ArrayList<Integer> scores)
{
super();
getContentPane().setForeground(Color.CYAN);
setForeground(Color.CYAN);
setBackground(Color.CYAN);
for(int i=0;i<scores.size();i++)
{
ran.add(scores.get(i));
System.out.println(scores.get(i));
} setTitle("绘制柱形图");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g){
int Width = getWidth();
int Height = getHeight();
int leftMargin = 20;//柱形图左边界
int topMargin = 50;//柱形图上边界
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);//绘制白色背景
g2.fillRect(0, 0, Width, Height-100);//绘制矩形图
g2.setColor(Color.black);
for(int i=0;i<=10;i++)
{
//绘制灰色横线和百分比
g2.drawString((100-10*i)+"", 15, topMargin+30*i);
g2.drawLine(5, topMargin+30*i, Width, topMargin+30*i);//绘制灰色横线
}
g2.setColor(Color.YELLOW);
for(int i=0;i<=ran.size();i++)
{
//绘制柱形图
int step = (i+1)*40;//设置每个柱形图的水平间隔为40
//绘制矩形
g2.fillRoundRect(leftMargin+step*2-5,(100-ran.get(i))*3+50, 40, 300-(100-ran.get(i))*3, 40, 10);
//列出测试轮数
g2.drawString("第"+(i+1)+"轮", leftMargin+step*2, 380);
}
} }
  • 随机产生四则远算式
 package ui_test;

 import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner; public class arithmetic
{
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list_timu = new ArrayList<String>();
ArrayList<String> list_answer = new ArrayList<String>();
public arithmetic()
{
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
int number_n=20,count; ArrayList<String> list_temp = new ArrayList<String>();
String[] operator = new String[]{"+","-","*","/"}; Random rand = new Random();
File file1 = new File("result.txt");
if (file1.exists()) {
// 创建文件
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} while(number_n>0)
{
int[] number_temp = new int[rand.nextInt(2)+3];
String[] str_temp = new String[number_temp.length-1];
for(int i=0;i<number_temp.length;i++)
{
if(i<number_temp.length-1)
{
number_temp[i]=rand.nextInt(100);
list_temp.add(String.valueOf(number_temp[i]));
str_temp[i]=operator[rand.nextInt(4)];
list_temp.add(str_temp[i]); } else
{
number_temp[i]=rand.nextInt(100);
list_temp.add(String.valueOf(number_temp[i]));
}
} count=calculate_RPN(produce_RPN(list_temp));
if(count !=-1)
{
list_timu.add(transform_string(list_temp));
list_answer.add(String.valueOf(count));
list_temp.add(" = "+count);
list.add(transform_string(list_temp));
number_n--;
list_temp.clear();
}
else
list_temp.clear();
System.out.println(number_n); }
try {
outSTr = new FileOutputStream(file1);
Buff = new BufferedOutputStream(outSTr);
try {
Buff.write("201571030104 丁炜轩".getBytes());
Buff.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < list.size(); i++)
{
try {
Buff.write(list.get(i).getBytes());
Buff.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
i--;
}
}
Buff.flush();
Buff.close(); } catch (IOException e) {
e.printStackTrace();
}
//Buff.close();
try {
outSTr.close();
} catch (IOException e) {
e.printStackTrace();
} for (int i = 0; i < list.size(); i++)
{
System.out.print(list.get(i));
System.out.println();
}
System.out.print("计算完毕!"); } public static int calculate_RPN(ArrayList<String> list_temp)
{
int i=0,t;
double a=0,b=0;
String l_temp;
Stack sk=new Stack(20);
for(t=0;t<list_temp.size();t++)
{
l_temp = list_temp.get(i++);
if(!isInteger(l_temp))
{
b = sk.mypop();
a = sk.mypop();
switch(l_temp)
{
case "+":sk.mypush(a+b);break;
case "-":sk.mypush(a-b);break;
case "*":sk.mypush(a*b);break;
case "/":
if(b==0)
return -1;
sk.mypush(a/b);break;
}
System.out.println("st.mytop: "+sk.mypeek());
}
else{
sk.mypush((double)Integer.parseInt(l_temp));
} }
if(!sk.myisempty())
{
a = sk.mypop();
b = a-(int)a;
System.out.println("a: "+a);
if(a>0 && b==0 )
{
return (int)a;
}
else
return -1;
}
else
return -1; } public static ArrayList<String> produce_RPN(ArrayList<String> list_temp)
{
int t=0,i=0;
String tmp;
Tack mytack = new Tack(20);
ArrayList<String> lt_temp = new ArrayList<String>();
while(true)
{
tmp = list_temp.get(i++);
if(isInteger(tmp))
{
lt_temp.add(tmp);
}
else{
if(mytack.myisempty())
{
mytack.mypush(tmp);
} else{
if(isCPriority(tmp, mytack.mypeek()))
mytack.mypush(tmp);
else{
lt_temp.add(mytack.mypop());
mytack.mypush(tmp);
} }
}
if(i>=list_temp.size())
{
while(!mytack.myisempty())
lt_temp.add(mytack.mypop());
System.out.println(transform_string(list_temp));
list_temp = lt_temp;
System.out.println(list_temp);
return list_temp;
}
} } public static boolean isInteger(String str) {
for (int i = str.length();--i>=0;){
if (!Character.isDigit(str.charAt(i))){
return false;
}
}
return true;
}
public static boolean isCPriority(String str,String s) {
if((str+s).equals("*+") || (str+s).equals("*-") || (str+s).equals("/+") || (str+s).equals("/-"))
return true;
else
return false;
}
public static String transform_string(ArrayList<String> list_temp)
{
String s="";
for(int i=0;i<list_temp.size();i++)
{
s+=list_temp.get(i);
}
return s; } static class Stack
{
int mytop;
double stk[]; public Stack(int num) {
mytop=-1;
stk=new double[num];
}
/*出栈*/
double mypop()
{
double peek=stk[mytop];
mytop--;
return peek;
}
/*入栈*/
void mypush(double x)
{
mytop++;
stk[mytop]=x; }
/*判空*/
Boolean myisempty()
{
if(mytop==-1)
return true;
else
return false;
}
/*取栈顶元素*/
double mypeek()
{
double peek=stk[mytop];
return peek;
}
/*栈大小*/
int mysize()
{
return mytop+1;
}
} static class Tack
{
int mytop;
String tk[]; public Tack(int num) {
mytop=-1;
tk=new String[num];
}
/*出栈*/
String mypop()
{
String peek=tk[mytop];
mytop--;
return peek;
}
/*入栈*/
void mypush(String x)
{
mytop++;
tk[mytop]=x; }
/*判空*/
Boolean myisempty()
{
if(mytop==-1)
return true;
else
return false;
}
/*取栈顶元素*/
String mypeek()
{
String peek=tk[mytop];
return peek;
}
/*栈大小*/
int mysize()
{
return mytop+1;
} } }
  • main函数
 package ui_test;

 public class Main {

     public static void main(String[] args) {
Login lg = new Login();
//new MyExGUI(); } }

6、总结

  通过本次实验,对于结对编程有了非常浓厚的兴趣,也体会到了结对编程对于项目的重要意义,总之收获很多。

在项目的设计、编写、调试、优化中,遇到了很多熟悉而又陌生的问题,花费的时间也比较多。由于对于计算机语言的偏好,对于有些语言,我选择舍弃,注重计算机的一门语言,努力做到最好。闻道有先后,术业有专攻。

7、结对编程(照片)

Java实现小学四则运算练习系统(UI)

8、展示PSP

PSP2.1

任务内容

计划完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

30

30

Estimate

估计这个任务需要多少时间,并规划大致工作步骤

30

30

Development

开发

360

300

Analysis

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

100

60

Design Spec

生成设计文档

10

10

Design Review

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

20

10

Coding Standard

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

10

5

Design

具体设计

60

35

Coding

具体编码

120

130

Code Review

代码复审

10

10

est

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

30

40

Reporting

报告

30

43

Test Report

测试报告

25

30

Size Measurement

计算工作量

2

3

Postmortem & Process

Improvement Plan

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

3

10

9、请使用汉堡评价法给你的小伙伴一些点评。

我的小伙伴是傅康,他很认真,对待每一件事都有一个积极的态度,在这次结对编程中,承担主要的工作量,如果他是赛车手,我就是导航员,如果他是狙击手,我就是观察员,如果他是机长,我就是副机长,我们相辅相成,缺一不可。在生活中,我的小伙伴是我的室友,我对他也有一个比较全面的了解,他的工作能力强,有责任心,对待事物和热情。在这次编程中,我们两个都提出了建设性的意见。在这次编程中,我们两个都提出了建设性的意见,互相修改代码,虽然有些争执,但是还是很好的解决了,完成了这次编程任务。

10、 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。

结对编程,在每一时刻都是一个程序员在编程,说效率如何高,也只是1+1>1,但是否大于2呢?答案是肯定的。首先,一个人的编程,平均很难实现1>80%×1的工作效力。但是在和同伴一起工作时,必须保持思维一直高度集中,所以平均都可以达到1>80%×1的个人效力,同时有了一遍代码评审,使得出错几率就降低,减少了bug的产生。也由于两个人的思想汇集,能创造了很多新编程算法或结构重用等。所以着眼于整个项目来看,这个实践确实大大提高了效率。本次结对编程,就很好的证明了1+1>2这一点。