软件工程课堂训练——结对开发之环数组最大和

一、题目及要求:

      题目:返回一个整数数组中最大子数组的和

      要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大;②同时返回最大子数组的位置。

      结对人员:胡亚宝  焦燕

二、设计思路:

      我们要解决两个问题:求出环数组中最大的子数组;并且定位出该子数组的位置,把它们的名称输出来。要解决这两个问题,我们从以下两个方面入手:

      ①求出最大子数组:将数组数值按顺序排好称为“一趟”,每求出一趟的最大子数组后,将第一个数值放到最后一个,排成新的一趟,以此类推,直到遍历完成,求出最大环子数组。

      ②定位子数组:判断出当前求的和值为负数时,将之舍去,并将该数的下一个数的位置存起来作为最大子数组的头。当求出最大值后,该数的位置存起来作为子数组的尾。最后输出将子数组的名称。

三、源代码:

1 //结对开发——胡亚宝 焦燕 
 2 
 3 #include "stdafx.h"
 4 
 5 
 6 int _tmain(int argc, _TCHAR* argv[])
 7 {
 8     int i,j,k,m,n,o,a[5]; 
 9     int Sum,Max,flag,flag1=0,flag2,flag4;
10     
11     printf("请输入5个整数:\n");
12     for(k=0;k<5;k++)
13     {
14         scanf("%d",&a[k]);
15     }
16     Max = a[0];
17     for (m=0;m<5;m++)
18     {
19         for(i=0;i<5;i++)  
20         {  
21             Sum = 0;             
22             for(j=i;j<5;j++)  
23             {  
24                 Sum =Sum+ a[j];
25                 if(Sum<=0)
26                 {
27                     Sum=0;
28                     flag1=(j+1+m)%5;
29                 }
30                 if(Sum > Max)  
31                 {
32                     Max =Sum;  
33                     flag2=j+m;    
34                 }
35             }  
36         }  
37         flag=a[0];
38         for(n=0;n<5;n++)
39         {
40             a[n]=a[n+1];
41         }
42         a[4]=flag;
43     }
44     if(Sum==0)
45     {
46         
47         Max=a[0];
48         for(int e=0;e<5;e++)
49         {
50             if(a[e]>=Max)
51             {
52                 Max=a[e];
53                 flag4=e;
54             }
55         }
56         
57     }
58     printf("最大连续环子数组的和为:%d\n",Max);
59     printf("该最大连续环子数组为:");
60 
61     if(Sum==0)
62     {
63         printf("a[%d]",flag4);
64     }
65     else
66     {
67         int flag3=flag2-flag1;
68         for(o=0;o<=flag3;o++)
69         {
70             printf("a[%d]\t",flag1);
71             flag1++;
72             if(flag1>4)
73                  flag1=0;
74         }
75     }
76     printf("\n");
77     return 0;
78 }

四、测试及运行结果:

测试数据:

3 6 -9 0 7(有正数、负数、零)

7 9 3 2 8 (只有正数)

-3 -6 -9 -2 -5(只有负数)

运行结果:

技术分享

技术分享

技术分享

五、心得体会:

      这次实验我们听了老师的要求后,两个人都各自想实现的方法,然后各自说出自己的方法给对方听,结果两人说着说着就知道自己的算法错误在哪,缺点在哪。最后我们决定采用张世通同学的方法。

     利用原来的代码使每求出一趟的最大子数组后,利用for循环将第一个数值放到最后一个,排成新的一趟,以此类推,直到遍历完成,求出最大环子数组;但是在定位时,我们遇到了困难,胡亚宝和我在周六试了一下午才实现。当时特别有成就感,虽然方法是胡亚宝想出来的,但当时特别有成就感。

工作照:

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。