一、隊員:
信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]<<"\t";
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("\n");
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("\n");
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("\n最大和%d\n",maxx);
173 return 0;
174 }
五、運算結果截圖


五、心得體會
這一次實驗比上一次增加了一點難度,上一次的邏輯思想就夠混亂的了,這一次在調用上一次的函數的時候就出了邏輯的問題,然後在讀文件的時候還出了問題。這次大部分的功勞都是隊友出的,尤其在邏輯推理上,尤其的比我想的多,感謝有這麼一個好隊友,感謝高揚。
六、結對開發照
