结对开发Ⅱ——二维数组求和最大的子数组

一、设计思路

(1)用输入输出流来读取.txt中的数据;

(2)用两个数来遍历要求和的子数组;

如该3x4数组中的ab两个数,可以确定一个3x3的子数组。

  a . .
  . . .
  . . b

 

 

 

(3)GetSum函数来返回子数组的和;

(4)比较输出最大子数组和该数组的和。

二、源代码

 1 // 最大值2.cpp : Defines the entry point for the console application.
 2 // 袁佩佩 于海洋 信1201-1班
 3 
 4 #include "stdafx.h"
 5 #include "fstream.h"
 6 #include "iostream.h"
 7 #define MAXSIZE 50
 8 
 9 //*****读取数组信息*****
10 void ReadArr(int arr[][MAXSIZE],int &len1,int &len2)
11 {
12     ifstream infile("Arr.txt");
13     if(!infile)
14         cout<<"读取失败!"<<endl;
15     else
16     {
17         infile>>len1>>len2;
18         for(int i=0;i<len1;i++)
19         {
20             for(int j=0;j<len2;j++)
21             {
22                 infile>>arr[i][j];
23             }
24         }
25     }
26 }
27 //*****显示矩阵*****
28 void ShowArr(int arr[][MAXSIZE],int len1,int len2,int size1,int size2)
29 {
30     for(int i=len1;i<=size1;i++)
31     {
32         for(int j=len2;j<=size2;j++)
33         {
34             cout<<arr[i][j]<<"\t";
35         }
36         cout<<endl;
37     }
38 }
39 //*****求和公式*****
40 int GetSum(int arr[][MAXSIZE],int len1,int len2,int size1,int size2)
41 {
42     int sum=0;
43     for(int i=len1;i<=size1;i++)
44     {
45         for(int j=len2;j<=size2;j++)
46         {
47             sum+=arr[i][j];
48         }
49     }
50     return sum;
51 }
52 
53 int main(int argc, char* argv[])
54 {
55     int len1,len2,max,sum;                        //len1是行数,len2是列数
56     int line1,line2,row1,row2;                    //和最大的矩阵的两个坐标
57     int arr[MAXSIZE][MAXSIZE];
58     ReadArr(arr,len1,len2);
59     cout<<"矩阵:"<<endl;
60     ShowArr(arr,0,0,len1-1,len2-1);
61     cout<<endl;
62     line1=0;
63     line2=0;
64     row1=0;
65     row2=0;
66     sum=0;
67     max=arr[0][0];
68     for(int i=0;i<len1;i++)                        //第一个数的行数
69     {
70         for(int j=0;j<len2;j++)                    //第一个数的列数
71         {
72             for(int m=i;m<len1;m++)                //第二个数的行数
73             {
74                 for(int n=j;n<len2;n++)
75                 {                                //第二个数的列数
76                     sum=GetSum(arr,i,j,m,n);    //求出这两个数构成的矩阵的和
77                     if(sum>max)
78                     {
79                         max=sum;
80                         line1=i;                //保存第一个数的行
81                         line2=m;                //保存第二个数的行
82                         row1=j;                    //保存第一个数的列
83                         row2=n;                    //保存第二个数的列
84                     }
85                 }
86             }
87         }
88     }
89     cout<<"和最大的子矩阵:"<<endl;
90     ShowArr(arr,line1,row1,line2,row2);
91     cout<<"最大的和:"<<max<<endl;
92     return 0;
93 }

 

三、结果截图

四、心得体会

  这次也是和上次一样,我们在课上讨论好算法的实现和程序的大致框架,然后课下再具体操作。我们讨论出来的是最保守最笨的算法,但却是最万无一失的方法。本来还想上去讲一讲呢,但是同学们分享的思路都比我们的高大上,于是就此作罢。我们还自我安慰道,他们的算法比较难实现。哈哈哈。

  这次是我主要敲代码,他在旁边进行代码复审,程序的格式规范了许多。我相信很多同学都有自己的编程习惯,有些习惯比较好,有些是坏习惯,有些看起来根本不会影响大局,但其实是致命的。以后工作不可能自己写出来的程序是只经自己手的,是和自己的团队一起开发。与人合作,做起码得让别人看得懂程序或者看着舒服吧。所以还是最好写成最规范最标准的。

  还有就是有别人在旁边做代码复审真的挺高效的。相信大家都深有体会,自己做的题目再检查三遍,也还是可能会有错误,但是旁人检查两边可能就把所有错误都找出来了。古人说得好啊:“当局者迷旁观者清。”我们两个在写这个程序的时候出现了两个大错误:一是函数在传二维数组的时候,形参的形式不对;而是计算并比较子数组和的时候,判断条件和初始值写错了。由于是我主笔啊,我调试了两次都没完全改正确,于海洋用笔写着在纸上过了一遍,就找出了最后的错误。

  我觉得结对开发吧,还是重在实行,如果两个人没有全神贯注专心致志投入到这个过程中的话,效果是不大的。两个人出全力干的活,只要有一个人没出全力,那就无法最好的实现,也就无法得到最好的体验。

五、工作照

posted @ 2015-03-22 22:10  JJJanepp  阅读(497)  评论(3编辑  收藏  举报