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


    一、题目及要求:

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

          要求(新加):①如果数组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个整数:
    ");
    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
    ",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]	",flag1);
    71             flag1++;
    72             if(flag1>4)
    73                  flag1=0;
    74         }
    75     }
    76     printf("
    ");
    77     return 0;
    78 }

    四、测试及运行结果:

    测试数据:

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

    7 9 3 2 8 (只有正数)

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

    运行结果:

    五、心得体会:

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

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

    工作照:

  • 相关阅读:
    shell练习题4
    shell练习题3
    shell练习题2
    shell练习题1
    Docker入门
    自动化运维之ansible
    自动化运维之Saltstack
    代码管理平台
    非关系统型数据库-mangodb
    2018-08-22 第三十五课
  • 原文地址:https://www.cnblogs.com/123jy/p/4376681.html
Copyright © 2020-2023  润新知