软件工程课堂训练——结对开发Ⅱ
一、题目及要求:
①要求求出一个二维数组中和值最大的二维子数组。
②结对人员:胡亚宝 焦燕
二、设计思想:
这一次的实验是在以前的基础上做的,是在二维数组中找出行中最大的和,然后再捆绑上下或前后的数。由于可能性太多,时间不够充分。所以没有继续做下去。
在进行加和和比较大小这一模块中,我们遇到了困难。首先我们延续了一维数组的第一种方法,用for循环嵌套,每行每列加和并比出最大值,但是开始我们没有在运算完每一行时,将sum值初始化为0,这样不能保证我们运算的都是矩形,而是单纯的一个一个相加。后来我们发现了这个问题,在内层循环中加了一个sum的初始化,这样就实现了能求出3行3列数组中,3行的每一行的最大子数组,并且求出在这3个中最大的那一个。
在求出行中的最大子数组之后,我们想的是借鉴课上李明同学的思路。确定好行中最大子数组的位置后,遍历它周边的子数组,若它周边的子数组的和值小于零,则它是最大子数组;若周边子数组和值大于等于零,则加上该大于等于零的子数组。但是由于技术原因,我们还没有实现。。
三、部分源代码
1 //结对开发 胡亚宝 焦燕 2 3 #include "stdafx.h" 4 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 int a[3][3]; 9 int i,j,k,m,n; 10 int max,sum; 11 12 int flag1,flag2; //定位行中最大子数组位置 13 14 printf("请输入一个3行3列二维数组:\n"); 15 16 for(m=0;m<3;m++) 17 { 18 for(n=0;n<3;n++) 19 { 20 scanf("%d",&a[m][n]); 21 } 22 //printf("\n"); 23 } 24 max=a[0][0]; 25 for(k=0;k<3;k++) //包含第k列的最大行 26 { 27 28 for(i=0;i<3;i++) //第i行 29 { 30 sum=0; 31 for(j=k;j<3;j++) //第i行的第j个 32 { 33 sum=sum+a[i][j]; 34 if(sum>=max) 35 { 36 max=sum; 37 flag1=i; //定位 38 flag2=j; 39 } 40 } 41 } 42 43 } 44 45 46 return 0; 47 }
四、心得体会:
因为好多原因,包括技术上和自身原因,没有把这个程序做完整。真的是挺遗憾的。在进行的过程中我们也想过很多解决方法,效果却不尽人意。得不到理想的结果。
我们的想法是一行一行一列一列的比较出大小然后求出最大值。但是这样上下或者左右的和就没有考虑进去。后来课上听了几位同学的思路后,我们也决定那样试试,可视情况太多太复杂,两人的能力有限,就没有得到一个完整的程序。
不过这次合作经过上一次后,我感觉越来越默契。知道如何避免冲突,想法也能想到一块去,效率也高了很多。
附合照一张: