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