一、设计思路
先将一个数组赋初值为从零开始按加一递增的子数组的和,之后将求解分为三层,即三个for循环,最里边一层求子数组的和,将各个个数相同的子数组中最大的赋给另一个数组,第二层决定子数组的位置,第三层决定子数组的个数。最后将得到的子数组进行大小比较,输出。
二、代码
1 //刘双渤,2015年3月20日,最大子数组求和 2 #include <iostream> 3 using namespace std; 4 5 void main() 6 { 7 int a[10],b[10],c[10]; 8 int min,max; 9 int i,t,k,S,bmax,bmaxi,C; 10 //输入 11 cout<<"请输入两个数确定数组中值的取值范围(确保前一个整数小于后一个整数):"<<endl; 12 cin>>min>>max; 13 14 for(i=0;i<10;i++) 15 a[i]=min+rand()%(max-min); 16 17 cout<<"此随机大小为10的随机数组为:"<<endl; 18 for(i=0;i<10;i++) 19 cout<<a[i]<<" "; 20 21 cout<<endl; 22 23 for(i=0;i<10;i++) //将b[10]初值均赋为0 24 b[i]=0; 25 26 t=1; 27 for(i=0;i<10;i++) //将b[10]初值按从a[0]开始依次增加的子数组和分别赋值 28 { 29 for(k=0;k<t;k++) 30 b[i]+=a[k]; 31 t++; 32 } 33 34 S=0; 35 for(t=0;t<10;t++) //求出各个数目的子数组中最大值 36 { 37 for(i=0;i<10-t;i++) 38 { 39 for(k=0;k<t+1;k++) 40 S+=a[i+k]; 41 if(b[t]<=S) 42 { 43 b[t]=S; 44 c[t]=i; 45 } 46 S=0; 47 } 48 } 49 50 bmax=b[0]; 51 for(i=0;i<10;i++) //求出最大的子数组和其所在位置 52 { 53 if(bmax<=b[i]) 54 { 55 bmax=b[i]; 56 bmaxi=i; 57 } 58 } 59 //输出 60 cout<<"最大子数组和为:"<<endl; 61 cout<<bmax<<endl; 62 cout<<"最大子数组为:"<<endl; 63 C=c[bmaxi]; 64 for(i=0;i<bmaxi+1;i++) 65 { 66 cout<<a[C+i]<<" "; 67 } 68 cout<<endl; 69 }
三、设计过程
这个代码实现的过程最大时间复杂度为n3,一开始的思路混乱,之后将求最大的子数组的过程按最寻常的思路进行一步步分解,得到了如上的设计思路。初次调试时,无法输出最大数组和和最大子数组,便进行断点调试,发现第35行开始t的变化的错误。解决t的问题后,调试负数范围,发现不能输出最大子数组,却可以输出最大子数组的和,修改53行后解决。在不断用相同值调试中发现,每次产生的数组内的随机数不相同,但每个数组都相同,原来是缺少时间的限制,这样以前的的几个随机数的程序也就犯了相同的错误,以后避免此错误的发生。
四、实验结果
五、进度计划
日期 |
周 |
计划小时数 |
累计小时数 |
实际小时数 |
累计实际小时数 |
PV |
累计PV |
EV |
累计EV |
3/22 |
1 |
2 |
2.3 |
六、时间记录日志
学生 刘** 日期 2015/3/23
教师 王** 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/23 |
4:10 |
6:30 |
140 |
编程 |
七、缺陷记录日志
学生 刘**
日期 2015/3/23
教员 王**
程序号 01
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复阶段 |
修复缺陷 |
3/23 |
1 |
调试 |
编译 |
|||
描述:参数“t”值的变化错误 |
||||||
2 |
调试 |
编译 |
||||
描述:应将“<”改为“<=”以确定值的赋值的正确 |