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

一、题目及要求:

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

要求(新加):①如果数组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循环将第一个数值放到最后一个,排成新的一趟,以此类推,直到遍历完成,求出最大环子数组;但是在定位时,我们遇到了困难,胡亚宝和我在周六试了一下午才实现。当时特别有成就感,虽然方法是胡亚宝想出来的,但当时特别有成就感。

工作照:

时间: 2024-10-05 09:13:49

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

软件工程课堂训练——结对开发之环状二维数组

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①输入一个二维整形数组,数组里有正数也有负数:②二维数组首尾相接,像一条首尾相接的带子一样. 结对人员:胡亚宝  焦燕 二.设计思路: 这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可. 首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组. 三.部分源代码: 1 for (m=0;m<5;

软件工程课堂训练——结对开发

一.题目及要求: 1.题目:返回一个整数数组中最大子数组的和. 2.要求: ①输入一个整形数组,数组里有正数也有负数:数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和:求所有子数组的和的最大值:要求时间复杂度为O(n). ②两人结对完成编程任务:一人主要负责程序分析,代码编程,一人负责代码复审和代码测试计划. 3.结对人员:胡亚宝  焦燕 二.设计思路: ①第一个方法,定义一个数组,将所有的子数组都列出来,再将它们的和都求出来放到该数组中,再求最大值,输出.但是在编写过程中,我们发

软件工程课堂练习--结对开发

一.题目及要求: 题目:返回一个整数数组中最大子数组的和. 要求(新加):①要求程序必须能处理1000个元素:②每个元素都是int32类型的. 二.设计思路 这次练习依然是在之前一维数组的基础上完成的,此次的首要问题是要求程序能处理1000个数据并要求元素是int32型,所以会存在大数溢出问题,我们的想法就是将它找出并做 出警告 三.源程序 1 //结对人员 盖相庚 曹美娜 2 3 #include "stdafx.h" 4 #include "stdio.h" 5

软件工程课堂训练——数组之大数溢出

一.题目及要求: 题目:返回一个整数数组中最大子数组的和. 要求(新加):①要求程序必须能处理1000个元素:②每个元素都是int32类型的. 结对人员:胡亚宝  焦燕 二.设计思路: ①处理1000个元素的问题,我们将数组的长度设为1000,其中的每一个元素都是随机生成,因为这道题目重点是溢出问题,所以我们将它们设的值都比较大: ②现阶段我们将它们都设为int型,超过表示范围时,系统会自动转化成负值,判断后将显示溢出. 1 // 结对开发— 胡亚宝 焦燕 2 3 #include "stdaf

结对开发——一维数组最大子数组判断溢出

一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧

结对开发——循环数组的最大值

一 题目要求: 返回一维数组中最大子数组的和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 要求时间复杂度为O(n) 二 设计思路:(结对思考以及参考于其他同学) 考虑到数组需要首尾相连,采取把数组的长度增加两倍,并把复制的数组写在在最后一个数的后面,这样在循环

软件工程课堂练习--结对初体验

结队人员 信1201-1班 曹美娜 袁亚姣 一.题目要求与结对开发要求 1.题目: 返回一个整数数组中最大子数组的和. 2.要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 3.结对开发要求 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 二.程序设计

软件工程——结对开发环形数组

一.题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如 果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 开始想的是用链表实现数组首尾相连,可是由于链表用着不太熟悉,便想了另一种算法: 当最大值未出现跨域是就按常规方法计算找

结对开发-- 一维数组求和最大的子数组的大数溢出问题

结对人员:韩雪东,高扬 一.设计思路 对于大数溢出问题开始很迷茫,不大懂该干什么,思路匮乏.因为只要溢出这个数就不会被存储被改变,这样导致很难去判断溢出后该怎样做,但后来我们改变了一下思路,采用逆向思维,首先找到能存储的最大数,用它来减去将要运行的数,从而与即将要加的数比较,如果小了咋说明相加后会产生溢出,直接结束程序. 二.源代码 // ceshi.cpp : Defines the entry point for the console application. //作者:韩雪东,高扬 //