----信1101-2 胡弦琴 20113026
王兵茹 20112917
2014-03-10
15:35:37
這個時間點開始發表這篇博客 。(剛把程序改好,由於胡弦琴要去上課,所以后續的博客由我寫完)。
今天上午最后一節課老師叫我們結組兩個人共同一個小程序的設計,也就是求一個整數數組中所有子數組和的最大值。
我跟胡弦琴拿到這個題目首先想的是我們要把這個程序的實現思路捋清楚,所以就開始在紙上寫寫畫畫。承認一開始的思路確實很亂,但是隨着我們不斷討論,思路也就越來越清楚。我們倆編程基礎都不是怎么好,所以我倆共同的想法是可以使用一個稍微笨拙的方法來實現,但是我們的代碼設計一定要規范,所有的情況要都考慮到。
思路:
分兩層循環,外層的循環用於在數組中的第i個數開始加,內層循環式實現從數組的第i個開始,加到第j個,在加的過程當中,如果max>maxium,那就把max賦給maxium。
我們倆先寫的算法:
int maxSubArray(int *A,int n) { int maxium = -INF; //保存最大子數組之和 for i=0 to n-1 do sum = 0; //sum記錄第i到j的元素之和 for j=i to n-1 do sum += A[j]; if sum>maxium do //更新最大值 maxium = sum; return maxium; }
2014-03-10
上午最后一節課的時間,前20分鍾我們倆一邊相互討論,一邊開始設計我們的程序,我來敲代碼,胡弦琴在旁邊給我指點,哪一行中還需要加哪些細節,就一開始的時候我們是函數中並沒有對如果數組為空怎么處理,我們都想到了,跟上一次的實驗大體是類似的,所以我們就先完成大概最后再加一個if...else語句。20分鍾很快就過去了,我們的函數部分剛剛寫完吧,但還不是很完整。接下來的20分鍾換成她來敲代碼,我在旁邊一邊想一邊看她寫的代碼是不是有什么問題。說實話,在下課之前我們的程序沒有弄完,沒有運行出結果。所以今天下午又開始調試。
也就是在我剛寫博客之前,程序剛剛調試完。
具體代碼如下:
#include<stdio.h> #include<stdlib.h> int maxSubArray(int A[],int n) { if(n<=0) { printf("數組長度不能為空!\n"); return 0; } else { int sum; int maxium=A[0]; //保存最大子數組之和 int i; int j; for(i=0;i<=n-1;i++) { sum=0; //sum記錄第i到j的元素之和 for(j=i;j<=n-1;j++) { sum +=A[j]; if (sum>maxium) { //更新最大值 maxium = sum; } } } return maxium; } } int main() { int *a; int n; int b; int i; int maxium; a=(int *)malloc(sizeof(int)*n); printf("請輸入數組的個數n:\n",n); scanf("%d",&n); if(n>0) { printf("輸入%d個數\n",n); for(i=0;i<n;i++) { scanf("%d",&b); a[i]=b; } maxium=maxSubArray(a,n); printf("maxium=%d\n",maxium); } else { maxSubArray(a,n); } return 0; }
根據老師的要求,我們在課上的時候不斷的討論不斷的做記錄,加上剛剛測試結果的記錄,都在下面,雖然有點亂,但是寫寫畫畫確實可以讓自個明白實現的過程:
心得:
本次的實驗跟上一節課老師給的課堂測試差不多,都是小程序,但是卻要在許多的細節做處理,實現代碼設計的規范性,但是我們的這個代碼時間效率確實不是很好,相對來說是一個很保守的算法。
雖然我倆的編程能力有限,但是還是感覺相互討論對雙方都是一個促進。突然感覺結對開發確實是一個不錯的學習方式。如果做的恰到好處,對雙方都是一個促進。