是的 我这次的结对开发的人又换了一个女同学~ 是娜姐 曹美娜。
这次的题目要求是在将上次实现的一位数组变成二维数组,然后找到所有子矩阵中各元素和的最大值。
一、设计思路
我们是在上次实现一维数组的基础上做的更改,难点是怎么将所有二维子数组都遍历到,并找到他们和的最大值。所以我们的设计思路如下:
应题目要求首先从“xx.txt”中读取出二维数组比如:
1 2 3
4 5 6
1 2 3
我们将数组第一行取出放到一个新的数组sumarry[][]中,然后第一行和第二行的和取出放到sumarry[][]中,然后是第一、二、三行的和放入,接着将第二行放入,和上次相同将二三行的行放入,最后再将第三行放入sumarry[][]中,形成一个新的数组,如下
1 2 3
5 7 9
6 9 12
4 5 6
5 7 9
1 2 3
然后和上次做的找到一位数组中和的最大值相同,把每一行看成一个一位数组找到最大的和,依次比较每一行的最大值,最后找到他们中的最大值即为我们要找到的二维数组中所有子矩阵中各元素和的最大值。
二、源代码
1 //程序开发者:曹美娜 盖相庚 2 // 开发时间:2015/3/23 3 4 #include "stdafx.h" 5 #include "fstream.h" 6 #include "iostream.h" 7 #include "stdio.h" 8 #define N 50 9 #define M 50 10 11 void readarry(int arry[][N],int &line,int &row) //读取txt文件中的二维数组 12 { 13 ifstream infile("a.txt"); 14 if(!infile) 15 cout<<"读取失败!"<<endl; 16 else 17 { 18 infile>>line>>row; 19 for(int i=0;i<line;i++) 20 { 21 for(int j=0;j<row;j++) 22 { 23 infile>>arry[i][j]; 24 } 25 } 26 } 27 } 28 29 int maxarry(int arry[][N],int line,int row) //找到二维数组中子矩阵中元素和的最大值 30 { 31 int max[N]; 32 printf("以上数组经变形后: "); 33 for(int l=0;l<line;l++) 34 { 35 int max1=-1000; 36 for(int j=0;j<row;j++) 37 { 38 int sum=0; 39 for(int i=j;i<row;i++) 40 { 41 sum=sum+arry[l][i]; 42 if(sum>=max1) 43 { 44 max1=sum; 45 } 46 } 47 48 } 49 max[l]=max1; 50 51 printf("第%d集合所有子数组的和的最大值为:%d ",l+1,max1); 52 } 53 int fmax=max[0]; 54 for(int q=0;q<line;q++) 55 { 56 if(max[q]>fmax) 57 fmax=max[q]; 58 } 59 printf("所以次二位数字中子数组中各元素的和的最大值为:%d ",fmax); 60 61 return 0; 62 } 63 64 void show(int arry[][N],int line,int row) //显示数组 65 { 66 printf("从“a.txt”文件中读取的数组为: "); 67 for(int i=0;i<line;i++) 68 { 69 for(int j=0;j<row;j++) 70 { 71 printf(" %d ",arry[i][j]); 72 } 73 printf(" "); 74 } 75 } 76 77 void reacharry(int arry[][N],int line,int row) //组成一个新数组 78 { 79 int sumarry[M][N]; 80 int sumline,sumrow; 81 int z; 82 for(int r=0;r<row;r++) 83 { 84 z=0; 85 for(int i=0;i<line;i++) 86 { 87 for(int q=line;q>0;q--) 88 { 89 int sum=0; 90 for(int j=i;j<=line-q+i;j++) 91 { 92 sum=sum+arry[j][r]; 93 } 94 sumarry[z][r]=sum; 95 z++; 96 } 97 } 98 } 99 sumline=z-1; 100 sumrow=r; 101 maxarry(sumarry,sumline,sumrow); //将得到的新数组交给maxsrry(),找到最后结果 102 103 } 104 105 106 int main(int argc, char* argv[]) 107 { 108 int arry[M][N]; 109 int line,row; //行,列 110 readarr(arry,line,row); 111 show(arry,line,row); 112 reacharry(arry,line,row); 113 114 return 0; 115 }
三、实验结果截图
四、实验总结
软件编程做得越多就越发现自己的基础的薄弱,此次还是娜姐是主力,我负责跟娜姐一起探讨思路以及后来的理解她的编程。。。因为有的我还不太会用。以后我会努力复习以前学习的知识,向别的同学学习,争取以后自己能够独立的开发编程出一个小的实验。最后 感谢娜姐。
五、合照
等明天吧~~~
哈哈哈 好大的合照!!!!!!!!!!!!