软工实践——第2次作业:结对编程——四则运算
班级:软工2班
姓名:1759201赵祖安 与 1759206王钰
(以下文章依次简称zza 与 wy)
题目:小学老师要每周给同学出四则运算练习题。
两个运算符,100以内的数字,不需要写答案。【估计时间1】
现在估计写这个程序需要的时间。
需要写答案【估计时间2】
//之后扩展开,加括号,限制数值范围,乘除法,支持分数等
//估计做好这个软件需要多长时间
要求: 两人一篇,写出编程流程,分析讨论(矛盾)的过程,编程所用时间
一.结对编程过程中遇到的矛盾与解决:
1.矛盾:编程语言分歧
我们一开始就在选择哪种编程语言上有了分歧。wy比较习惯使用java,而zza喜欢使用c++。然而一个程序肯定要使用同一种语言。
解决:在我们商量之后,出于程序的易维护与可读性,还是决定使用java来编写这段程序。
2.矛盾:工作时间安排
两个人在一起工作时间上不是很合得来。wy周六下午想写代码,但zza有事;zza当天晚上有空,但wy又想休息。所以最后我们约定 了周日下午来学校实验楼开放机房,来共同完成这次的作业。
3.矛盾:一个人在coding,另一个人感觉无所事事
解决:整体coding 与分块测试同步进行,每个人都有事做。有问题了再互相交流。
4.矛盾:编码风格不太一样,而且也没有事先约定。
zza偏向c++的编码风格,而且会非常“夸张”地空格、换行、分多文件……而wy比较偏c,代码写得比较紧凑。所以我们一开始 的合作花了很多力气纠结风格的不一致,而非好好工作。
解决:很多东西一定要事先约定好。确实存在的矛盾就是确实存在的,不可能写着写着就消失,如果一开始不约定好肯定会浪费后面的时间。
二.结对编码的coding过程
1.程序1:不需要输出答案【估计用时:60min】
【实际用时:75min】
import java.util.Random;
import java.util.Scanner;
public class Calculate {
private static Scanner input = new Scanner(System.in);
public static void main(String[] agrs) {
int choose;
int right = 0;
int first = 0;
int last = 0;
int[] error = new int[30];
int[] errorId = new int[30];
int oper, j = 0, k = 0;
int result1 = 0;
int result2 = 0;
Random random = new Random();
while (true) {
System.out.print("是否进行运算: 1.是 2.否\n");
choose = input.nextInt();
if (choose == 1) {
System.out.println("请输入做题数目:");
int number = 0;
number = input.nextInt();
for (int i = 0; i < number; i++) {
Scanner input = new Scanner(System.in);
first = random.nextInt(100);
last = random.nextInt(100);
oper = random.nextInt(4);
switch (oper) {
case 0:
{
System.out.print(i + 1 + ". " + first + "+" + last + "=");
result1 = input.nextInt();
result2 = first + last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 1:
{
while (first < last) {
first = random.nextInt(100);
last = random.nextInt(100);
}
System.out.print(i + 1 + ". " + first + "-" + last + "=");
result1 = input.nextInt();
result2 = first - last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 2:
{
System.out.print(i + 1 + ". " + first + "*" + last + "=");
result1 = input.nextInt();
result2 = first * last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 3:
{
if (last == 0) {
last = random.nextInt(99) + 1;
}
while (first % last != 0) {
first = random.nextInt(100);
last = random.nextInt(99) + 1;
}
System.out.print(i + 1 + ". " + first + "/" + last + "=");
result1 = input.nextInt();
result2 = first / last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
}
}
}
}
}
}
结果截图:
二、程序2:可以选择是否输出答案【估计用时:10min】
【实际用时:18min】
代码段:
import java.util.Random;
import java.util.Scanner;
public class Calculate {
private static Scanner input = new Scanner(System.in);
public static void main(String[] agrs) {
int choose;
int right = 0;
int first = 0;
int last = 0;
int[] error = new int[30];
int[] errorId = new int[30];
int oper, j = 0, k = 0;
int result1 = 0;
int result2 = 0;
Random random = new Random();
while (true) {
System.out.print("是否进行运算: 1.是 2.否\n");
choose = input.nextInt();
if (choose == 1) {
System.out.println("请输入做题数目:");
int number = 0;
number = input.nextInt();
for (int i = 0; i < number; i++) {
Scanner input = new Scanner(System.in);
first = random.nextInt(100);
last = random.nextInt(100);
oper = random.nextInt(4);
switch (oper) {
case 0:
{
System.out.print(i + 1 + ". " + first + "+" + last + "=");
result1 = input.nextInt();
result2 = first + last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 1:
{
while (first < last) {
first = random.nextInt(100);
last = random.nextInt(100);
}
System.out.print(i + 1 + ". " + first + "-" + last + "=");
result1 = input.nextInt();
result2 = first - last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 2:
{
System.out.print(i + 1 + ". " + first + "*" + last + "=");
result1 = input.nextInt();
result2 = first * last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
case 3:
{
if (last == 0) {
last = random.nextInt(99) + 1;
}
while (first % last != 0) {
first = random.nextInt(100);
last = random.nextInt(99) + 1;
}
System.out.print(i + 1 + ". " + first + "/" + last + "=");
result1 = input.nextInt();
result2 = first / last;
if (result1 == result2)
right++;
else {
error[j] = result2;
errorId[k] = i + 1;
j++;
k++;
}
break;
}
}
}
System.out.print("你一共答对了" + right + "道题\n" + "其中错误的题和其正确答案为:\n");
for (int m = 0; m < j; m++) {
System.out.print(errorId[m] + ". " + error[m] + " ");
System.out.print("\n");
}
}
}
}
}
结果截图:
三.心得体会
赵祖安zza心得体会:
这次结对编程是一种全新的体验。编码不再是私人的工作,而是一种公开的“表演”。程序员的代码,工作方式,技术水平都变得公开和透明。在coding时不能再开开小差,刷刷网页——只能专心致志的coding!尽管自己一个人编程时也能专著而紧凑的工作,但连续度并不高。而在结对coding时,不知不觉中,一个模块接着一个模块就写完了。——连续度有了显著的提高!我觉得,这是因为出于人性的“虚荣”——比一个人的时候更勤奋和更聪明的工作,因为不想让自己的partner失望。完成作业后,我们也对自己的工作更有信心和成就感。
这次经历很愉快,很愿意很partner一起工作。期待下一次合作~
王钰wy心得体会:
大家的水平有所差异和编程风格不同,其中代码的签入,我和她两个人仔细审核编译运行的错误一起寻找错误,其中最重要的两人的沟通问题和协调问题,遇到问题我们两个首先是冷静下来分析问题,大家发表自己的意见,试着从对方的角度来看待问题,换位思考。沟通协调才能提高我们的开发效率。结对编程需要两个人精诚协作,人有不同的水平,有的方面擅长,有的方面弱,应该避免个人主义的发生,共同协调解决开发过程中发生的问题。