结对开发-返回一个整数数组中最大子数组的和(首尾相接版)
一、题目及题目要求
题目:返回一个整数数组中最大子数组的和。 要求: (1)输入一个整形数组,数组里有正数也有负数。 (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 (3)如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 (4)同时返回最大子数组的位置。
二、设计思路
这次的编程开发是基于上次的返回一个整数数组中最大子数组的和(http://www.cnblogs.com/qizhonh/p/5322490.html),我和我的搭档开始了认真的讨论,再结合课堂上的同学讨论,如何能在一维数组原有的基础上,加上首尾相连这个条件,最后得到的方法大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。
三、代码
/*2016.3.24 weilihua fengyutong*/ #include <iostream> #include<ctime> #define Num 10000 using namespace std; int DTGH_Sum(int a[],int n) //动态规划法求子段和函数 { int sum = 0; int *b = (int *) malloc(n * sizeof(int)); //动态为数组分配空间 b[0] = a[0]; for(int i = 1; i < n; i++) { if(b[i-1] > 0) b[i] = b[i - 1] + a[i]; else b[i] = a[i]; } for(int j = 0; j < n; j++) { if(b[j] > sum) sum = b[j]; } delete []b; //释放内存 return sum; } int main() { int temp,b; int sum=0; int i; int a1,a2; int a[Num]; int length=0; while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入 { cout<<"请输入数组长度:"; cin>>length; } cout<<"生成随机序列: "<<endl; srand((unsigned)time(NULL)); for(i=0;i<length;i++)//产生随机序列 { if(rand()%2==0) { a[i]=rand()%100; } else { a[i]=(-1)*rand()%100; } cout<<a[i]<<" "; } cout<<endl; cout<<"此首尾相连的数组中最大子数组的和有以下几种可能:"<<endl; cout<<"第1种排列方式:"<<endl; for( i=0;i<length;i++) { cout<<a[i]<<" "; } cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl; a1=DTGH_Sum(a,length); for(b=1;b<length;b++) { temp=a[0]; for(i=1;i<=length;i++) { a[i-1]=a[i]; //将第一个数变为最后一个数 } a[length-1]=temp; cout<<"第"<<b+1<<"种排列方式:"<<endl; for( i=0;i<length;i++) { cout<<a[i]<<" "; } cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl; if(DTGH_Sum(a,length)>=sum) { sum=DTGH_Sum(a,length); } } a2=sum; cout<<endl; if(a1>=a2) { cout<<"综上,最大的子数组和为:"<<a1<<endl; } else { cout<<"综上,最大的子数组和为:"<<a2<<endl; } return 0; }
四、运行截图
当数组长度为1000时:
五、项目计划日志
日期&&任务 |
听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 100 | 30 | 30 | 160 | |
周二 | 120 | 30 | 30 | 180 | |
周三 | 30 | 30 | 10 | 70 | |
周四 | 100 | 20 | 30 | 150 | |
周五 | 120 | 30 | 30 | 180 | |
周六 | 45 | 30 | 10 | 85 | |
周日 | 200 | 30 | |||
周总计 | 200 | 535 | 210 | 110 |
1055 |
时间记录日志
3/21
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/21 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
21:04 | 21: 34 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:10 | 22: 40 | 0 | 30 | 网上查找资料 | ||
3/22 | 18:00 | 18:30 | 0 | 30 | 阅读书籍 | 《构建之法》 |
19:00 | 21:30 | 20 | 120 | 编写程序 | 结对开发- 子数组之和 | |
22: 15 | 22: 45 | 0 | 30 | 网上查找资料 | ||
3/23 | 19: 25 | 20: 00 | 5 | 30 | 编写程序 | 结对开发- 子数组之和 |
22:00 | 22: 30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
22:40 | 22: 50 | 0 | 10 | 查找资料 | ||
3/24 | 14:00 | 15: 50 | 10 | 100 | 上课 | 软件工程上课 |
18:26 | 18: 50 | 4 | 20 | 编写程序 | 结对开发- 子数组之和 | |
22:00 | 22:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
3/25 | 14: 00 | 16: 20 | 20 | 120 | 编写程序 | 结对开发- 子数组之和 |
11:23 | 12: 00 | 7 | 30 | 网上查找资料 | ||
21:00 | 21:30 | 0 | 30 | 阅读书籍 | 《构建之法》 | |
3/26 | 7: 00 | 7: 30 | 0 | 30 | 阅读书籍 | 阅读《构建之法》 |
10: 00 | 11: 00 | 15 | 45 | 编写程序 | 结对开发- 子数组之和 | |
9: 45 | 9: 55 | 0 | 10 | 网上查找资料 | ||
3/27 | 8:20 | 12: 00 | 20 | 200 | 编写程序 | 结对开发-首尾相接版 |
15: 23 | 16: 00 | 7 | 30 | 阅读书籍 | 构建之法 |
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 备注 |
3/24 | 1 | 20 | 编码 | 编译 | 4 | 实参与形参类型对应问题 |
3/24 | 2 | 20 | 编码 | 编译 | 1 | 申请了动态空间未释放 |
3/25 | 3 | 20 | 编码 | 编译 | 7 | 当数组长度为0时,无法正常跳出 |
3/27 | 4 | 20 | 编码 | 编译 | 20 | 逻辑有问题,会突然中止 |
3/27 | 5 | 20 | 编码 | 编译 | 1 | 变量未初始化 |