结对开发之求二维数组的子数组的和的最大值2
2015-03-22 21:44
260 查看
小组成员:信1201-1班 黄亚萍
信1201-1班 袁亚姣
一、题目要求
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。
二、设计思路
在结对开发之体验中一维数组的子数组的和的最大值的基础上加以拓展:
(1)当子数组的维数为1时,在M*N的数组中有M个子数组,直接用一维数组的处理办法求出其最大值;
(2)当子数组的维数不为1时,第i行和第i+1行元素对应求和的方式,重新得到新的数组,重复(1)的操作,直到子数组就是原来的数组本身为止。
三、程序源代码
四、结果截图
五、实验总结
本次实验是在上次结对开发的实验基础上进一步加工完善的,在完成的过程中,和队员一起构思完成设计思路与过程,让我了解到完成一个项目,只有先缕清思路,有一个清晰明白的流程,才能顺利的完成代码的编辑,调试,测试与结尾,才能达到事半功倍的效果;以前学习的过程中,拿到一个题目就开始敲代码,往往忽略了最重要的构思与设计部分,提示我们做事之前一定要有条理,不可盲目。
附件:
信1201-1班 袁亚姣
一、题目要求
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。
二、设计思路
在结对开发之体验中一维数组的子数组的和的最大值的基础上加以拓展:
(1)当子数组的维数为1时,在M*N的数组中有M个子数组,直接用一维数组的处理办法求出其最大值;
(2)当子数组的维数不为1时,第i行和第i+1行元素对应求和的方式,重新得到新的数组,重复(1)的操作,直到子数组就是原来的数组本身为止。
三、程序源代码
#include"stdafx.h" #include <iostream> #include <fstream> using namespace std; # define M 100 # define N 100 int hang1=0; int hang2=0; int lie1=0; int lie2=0; int maxx = -100; int sum1(int k,int a[],int number) //一维数组行数元素求和 { int x=0; for(int i=k;i<=number+k-1;i++) //数组元素的个数为number { x=x+a[i]; } return x; } int sum2(int k,int a[M] ,int number,int num) //二维数组列数元素求和 { int x=0; for(int i=k;i<=number+k-1;i++) { x=x+a[i][num]; } return x; } int Largest1(int list[],int length) //一维数组求数组的子数组的和的最大值 { int sum ; int i,j,max=-100; for(i=1;i<=length;i++) //元素个数为i { for(j=1;j<=length-i+1;j++) //子数组的第j个元素,求最大值 { sum[j]=sum1(j,list,i); if(sum[j]>=max) { max=sum[j]; } } } return max; } void Largest3(int list[],int length) { int sum ; int i,j; for(i=1;i<=length;i++) { for(j=1;j<=length-i+1;j++) { sum[j]=sum1(j,list,i); if(sum[j]>= maxx) { maxx=sum[j]; lie1 = j; lie2 = j+i-1; } } } } int Largest2(int list[M] ,int number_x,int number_y) //二维数组求数组的子数组的和的最大值 { int max,m; int max2 ; int sum[M] ; int max3 ; for(int i=1;i<=number_x;i++) //数组行数为i { cout<<"子数组行数为"<<i<<","<<endl; for(m=1;m<=number_x-i+1;m++) //子数组的第一行为原数组的第m行 { cout<<" 第"<< m <<"行的最大值为:"; for(int j=1;j<=number_y;j++) //子数组第j列元素 { sum[i][j]=sum2(m,list,i,j); } Largest3(sum[i],number_y); max2[m]=Largest1(sum[i],number_y); //数行数为i时子数组第m行的最大值 cout<<max2[m]<<endl; max3[i]=max2[1]; for(int k=1;k<=i;k++) { if(max2[k]>=max3[i]) { max3[i]=max2[k]; hang1=m; } } } } max=max3[1]; for(int n=1;n<=number_x;n++) { if(max3 >=max) { max=max3 ; hang1=m; hang2=n; //子数组的行数为第m行到第m+n行 } } return max; } void show(int arry ,int length1,int length2) //输出矩阵 { for(int i=1;i<=length1;i++) { for(int j=1;j<=length2;j++) { cout<<arry[i][j]<<"\t"; } cout<<endl; } } int main(int argc, char* argv[]) { int i,number_hang,number_lie; int list[M] ; ifstream infile("input.txt"); if(!infile) cout<<"读取失败!"<<endl; else { infile>>number_hang>>number_lie; for(int i=1;i<=number_hang;i++) { for(int j=1;j<=number_lie;j++) { infile>>list[i][j]; } } } cout<<"以矩阵形式展示为:"<<endl; show(list,number_hang,number_lie); cout<<endl; cout<<"最大值为:"<<Largest2(list,number_hang,number_lie)<<endl; cout<<endl; cout<<"对应的最大值的子数组为:"<<endl; for(i=hang1-1;i<hang2+hang1-1;i++) { for(int j=lie1;j<=lie2;j++) { cout<<list[i][j]<<"\t"; } cout<<endl; } cout<<endl; return 0; }
四、结果截图
五、实验总结
本次实验是在上次结对开发的实验基础上进一步加工完善的,在完成的过程中,和队员一起构思完成设计思路与过程,让我了解到完成一个项目,只有先缕清思路,有一个清晰明白的流程,才能顺利的完成代码的编辑,调试,测试与结尾,才能达到事半功倍的效果;以前学习的过程中,拿到一个题目就开始敲代码,往往忽略了最重要的构思与设计部分,提示我们做事之前一定要有条理,不可盲目。
附件:
相关文章推荐
- 2、软件工程结对开发之求二维数组中连续最大子数组之和
- 体验结对开发的乐趣(5)--(首尾相连的二维数组求最大子数组和的问题)
- 结对开发--求二维数组的最大子数组
- 结对开发 二维数组的最大子数组和
- 结对开发求二维数组值最大的子数组(只要连续即可)
- 结对开发 二维数组的最大子数组和
- 结对开发 随机产生二维数组并求最大子数组的和
- 结对开发Ⅱ—利用文本求二维数组最大的子数组的和
- 结对开发5_循环二维数组最大字数组
- 二维数组最大子数组的和 结对开发 溢出问题
- 二维数组最大子数组的和 结对开发
- 软件工程结对开发之求二维数组中连续最大子数组之和
- 结对开发2(求二维数组的最大子数组和)
- 软件工程结对开发之求二维数组中连续最大子数组之和2
- 3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三
- 结对开发之返回一个整数数组中最大子数组的和
- 软件工程结对开发之求一个数组中连续最大子数组之和
- 体验结对开发的乐趣(2)--(二位数组求和最大的子数组)
- 结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)
- 3月17号周二课堂练习:结对开发----返回一个整数数组中最大子数组的和一