软件工程课堂作业(六)——结对开发(二)

一、题目及要求:

      ①要求求出一个二维数组中和值最大的二维子数组。

      ②结对人员:焦燕    胡亚宝

二、设计思想:

      首先我们想到的是在我们原来的一维数组基础上进行升级,进行二维数组的运算,在进行设计的过程中,我们出现了几个问题:

      ①输入二维数组。我们没有用老师给的在文件中存放数组的思路,而是让用户直接进行输入,然后进行运算。再输入的过程中,开始没有运用循环,而是一行输入,当我我们发现这样界面不美观,而后进行改进,用了一个for循环,每输入一行就输出一个换行回车,这样可进行每行每列的输入;

      ②在进行加和和比较大小这一模块中,我们遇到了困难。首先我们延续了一维数组的第一种方法,用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列二维数组:
");
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("
");
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 }

四、心得体会:

      首先我们对没有完成这个任务深表遗憾。

      在解决这个问题的时候,我们开始很有自信,计划将一维数组的方法进行扩充,认为很容易。但是在实现的过程中,总会出现这样那样的错误,比如,加的和并不都是矩阵;遍历的顺序和边界值不确定;求和后将行和列统一起来等等。有的我们能够解决,但是有的想不到办法。

      其实,在进行到这个程度上后,我们想到用课上李明同学提供的思路接着解决,可是我们发现,就算确定了最大行数组的位置,还要分情况进行验证,验证它周围的数组是否小于零,但是情况有很多种,如果一一列出来列不完;如果要循环遍历,我们想不出好的办法。

原文地址:https://www.cnblogs.com/huyabaoboke/p/4357240.html