合作项目4

结组成员:信1201-1柴珏辉 信1201-2邓锐

一、要求

1、题目:

返回一个二维数组中最大子数组的和。

2、要求:

输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
3、结对开发要求: 
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。   

二、设计思路

我们合作项目3中的代码中已实现子数组定位。首尾相邻方面,在这个数组最后一个元素后面重复一遍数组以实现环状数组,计算求和时,数组长度为n,子数组第一个数的位置为a(a<=n),第二个数的位置为b(a<=b<a+n),以实现不重复。

三、程序代码

复制代码
 1 #include<iostream.h>
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<time.h>
 5 #define N 30
 6 int qiuhe(int a[],int i,int j) //数组求和
 7 {
 8     int he=0,b;
 9     for(b=i;b<=j;b++)
10     {
11         he=he+a[b];
12     }
13     return he;
14 }
15 void show(int a[],int i,int j )//显示方式
16 {
17     int b;
18     for(b=i;b<=j;b++)
19     {
20         if(b%20==0)
21         {cout<<endl;}
22         cout<<a[b]<<" ";
23     }
24     cout<<endl;
25 }
26 void main()
27 {
28     int yuan[N*2];  
29     int i,j,ra,p=0,shu1,shu2,max;
30     srand((unsigned)time(NULL));
31     for(i=0;i<N;i++)
32     {
33         yuan[i]=(rand()%20)-10;
34         yuan[i+N]=yuan[i];      //重复生成一遍数组
35     }
36     i=0;
37     j=0;
38     max=yuan[0];
39     shu1=0;
40     shu2=0;
41     for(i=0;i<N;i++)             //找最大值
42     {
43         for(j=i;j<i+N;j++)
44         {
45             if(qiuhe(yuan,i,j)>max)
46             {
47                 max=qiuhe(yuan,i,j);
48                 shu1=i;
49                 shu2=j;
50             }
51         }
52     }
53     cout<<"原数组:";
54     show(yuan,0,N-1);
55     cout<<"最大子数组:";
56     show(yuan,shu1,shu2);
57     cout<<"从第"<<shu1+1<<"个数到第";
58     if(shu2>N-1)
59     {
60         cout<<shu2+1-N;
61     }
62     else
63     {
64         cout<<shu2+1;
65     }
66     cout<<"个数,形成的子数组和最大"<<endl;
67     cout<<"最大值:";
68     cout<<max<<endl;
69 
70 }
复制代码

截图:

四、测试

1.数组数量 1000

2.数据大小yuan[i]=(rand()%2000)-1000

五、心得体会

因为项目3实现了定位,这次就容易些。合作越来越默契。

结组成员照片:

posted on 2015-03-29 21:41  菠萝吃么  阅读(172)  评论(1编辑  收藏  举报

导航