----信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("数组长度不能为空! "); 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); scanf("%d",&n); if(n>0) { printf("输入%d个数 ",n); for(i=0;i<n;i++) { scanf("%d",&b); a[i]=b; } maxium=maxSubArray(a,n); printf("maxium=%d ",maxium); } else { maxSubArray(a,n); } return 0; }
根据老师的要求,我们在课上的时候不断的讨论不断的做记录,加上刚刚测试结果的记录,都在下面,虽然有点乱,但是写写画画确实可以让自个明白实现的过程:
心得:
本次的实验跟上一节课老师给的课堂测试差不多,都是小程序,但是却要在许多的细节做处理,实现代码设计的规范性,但是我们的这个代码时间效率确实不是很好,相对来说是一个很保守的算法。
虽然我俩的编程能力有限,但是还是感觉相互讨论对双方都是一个促进。突然感觉结对开发确实是一个不错的学习方式。如果做的恰到好处,对双方都是一个促进。
以上为我们共同讨论得到的结果,我以为我们共同完成一个人发表就可以,现转载补发。