一、队员:
信1201-2班高扬、信1201-1班韩雪东
二、题目要求
这次比上一次增加了一些难度,改为二维数组求和最大的子数组。
三、设计思想
上一次实现的一位数组的,然后就想把二维数组转化为一维数组来做,首先解决第一行的最大子数组问题,方法就和上次一样了,然后第二行,然后第一行和第二行的相加求出两行的,然后分别存放在三个一维数组里,然后对这三个数组里求最大的值。
四、源代码
1 // erweishuzuqiuzuida.cpp : Defines the entry point for the console application. 2 //信1201-2班高扬、信1201-1班韩雪东 3 4 #include "stdafx.h" 5 #include "fstream.h" 6 #include "iostream.h" 7 #include "stdio.h" 8 9 #define MAXSIZE 50 10 11 12 void read(int array[][MAXSIZE],int &len1,int &len2)//读取文件信息,并写入数组 13 { 14 ifstream infile("array.txt"); 15 if(!infile) 16 cout<<"读取失败!"<<endl; 17 else 18 { 19 infile>>len1>>len2; 20 for(int i=0;i<len1;i++) 21 { 22 for(int j=0;j<len2;j++) 23 { 24 infile>>array[i][j]; 25 } 26 } 27 } 28 } 29 void display(int array[][MAXSIZE],int len1,int len2,int size1,int size2)//显示数组信息 30 { 31 for(int i=len1;i<=size1;i++) 32 { 33 for(int j=len2;j<=size2;j++) 34 { 35 cout<<array[i][j]<<" "; 36 } 37 cout<<endl; 38 } 39 } 40 int * shuchu(int m[],int szcdx,int xhy)//m[]表示要测试的数组,szchx表示数组长度,xhy表示循环条件 41 { 42 int t,p; 43 int max,sum; 44 //缓存数组赋值 45 int c[10000]; 46 int v[10000]; 47 int o=2*szcdx; 48 int * temp= new int[o]; 49 50 for(t=szcdx-xhy-1;t<szcdx;t++) 51 { 52 c[t-szcdx+xhy+1]=m[t]; 53 } 54 //循环 55 for(t=xhy;t>=0;t--) 56 { 57 sum=0; 58 for(p=0;p<=t;p++) 59 { 60 sum=sum+c[p]; 61 } 62 v[t]=sum; 63 } 64 //循环输出最大值 65 max=v[0]; 66 for(t=0;t<xhy+1;t++) 67 { 68 if(max<=v[t]) 69 { 70 max=v[t]; 71 } 72 //printf("%d ",v[t]); 73 temp[t]=v[t]; 74 } 75 return temp; 76 } 77 int maxs(int s[],int length)//输出最大值 78 { 79 int d=s[0]; 80 for(int f=0;f<length;f++) 81 { 82 if(d<=s[f]) 83 { 84 d=s[f]; 85 } 86 } 87 return d; 88 } 89 int main(int argc, char* argv[]) 90 { 91 int len1,len2; 92 int x[3]; 93 int y[3]; 94 int *k; 95 int *l; 96 int array[MAXSIZE][MAXSIZE]; 97 read(array,len1,len2); 98 cout<<"矩阵:"<<endl; 99 display(array,0,0,len1-1,len2-1); 100 101 102 103 for(int i=0;i<3;i++) 104 { 105 x[i]=array[0][i]; 106 107 } 108 int e=3; 109 int w[6]; 110 int u[6]; 111 int q=0; 112 printf("数组第一行子数组的和:"); 113 for(i=2;i>=0;i--) 114 { 115 116 k=shuchu(x,3,i); 117 for(int r=0;r<e;r++) 118 { 119 120 w[q]=k[r]; 121 printf("%d ",w[q]); 122 q++; 123 } 124 e--; 125 } 126 for(int j=0;j<3;j++) 127 { 128 y[j]=array[1][j]; 129 } 130 printf(" "); 131 e=3; 132 q=0; 133 printf("数组第二行子数组的和:"); 134 for(i=2;i>=0;i--) 135 { 136 137 l=shuchu(y,3,i); 138 for(int r=0;r<e;r++) 139 { 140 141 u[q]=l[r]; 142 printf("%d ",u[q]); 143 q++; 144 } 145 e--; 146 } 147 148 149 printf(" "); 150 int h[6]; 151 printf("数组包含两行的子数组的和:"); 152 for(int m=0;m<6;m++) 153 { 154 h[m]=w[m]+u[m]; 155 printf("%d ",h[m]); 156 } 157 158 159 int k1=maxs(w,6); 160 int k2=maxs(u,6); 161 int k3=maxs(h,6); 162 163 int maxx=k1; 164 if(maxx<=k2) 165 { 166 maxx=k2; 167 } 168 if(maxx<=k3) 169 { 170 maxx=k3; 171 } 172 printf(" 最大和%d ",maxx); 173 return 0; 174 }
五、运算结果截图
五、心得体会
这一次实验比上一次增加了一点难度,上一次的逻辑思想就够混乱的了,这一次在调用上一次的函数的时候就出了逻辑的问题,然后在读文件的时候还出了问题。这次大部分的功劳都是队友出的,尤其在逻辑推理上,尤其的比我想的多,感谢有这么一个好队友,感谢高扬。
六、结对开发照