课堂练习----一个整数数组中最大子数组的和(1)

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

要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)

分析:

当我们求出的累加和加上一个正数的时候,整个累加和就会增加,当我们的累加和加上一个负数的时候,整个累加和就会减小,我们用一个变量max保存累加和的最大值,另外,我们的累加和如果为负数的时候,如果继续加数不把累加和清零的话,那么整个和就会减小,因此如果累加和为负,就把累加和清零,最后,起初的max值为0,如果循环完后max的值继续为0,则说明数组里的数,全为负数,全为0,有0有负数。那么只需要求数组最大值即可。

#include<iostream>
using namespace std;
#define N 1000
int main()
{
    int num,value,max=0;
    int val[N];
    int Array[N];
    int firstNum=0,lastNum=0;
    cout<<"输入数的个数:";
    cin>>num;
    for(int i=0;i<num;i++)
    {
        cin>>val[i];
    }
    value=0;
    for(int i=0;i<num;i++)
    {
        value=value+val[i];
        if(value>max)
        {
            max=value;
            lastNum=i;
        }
        if(value<0)
        {
            value=0;
            firstNum=i+1;
        }
    }
    if(max==0)
    {
       max=val[0];
       firstNum=0;
       lastNum=0;
       for(int j=0;j<num;j++)
       {
           if(max<val[j])
           {
               max=val[j];
               firstNum=j;
               lastNum=j;
           }
       }
    }
    cout<<"最大子数组是:";
    for(int i=firstNum;i<=lastNum;i++)
    {
        cout<<val[i]<<" ";
    }
    cout<<endl;
    cout<<"最大子数组的和为:";
    cout<<max<<endl;
}

实验总结:本项目看上去不是太复杂,但是非常讲究算法,两个人结对开发,一起讨论,一起想解决方案,一起网上查找算法,更加锻炼了结对开发的能力。

项目计划总结:

日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料 日总计
周一 100 25 25 15 165
周二   30 35 25 90
周三   60 15 35 110
周四 100 30 30 25 185
周五   180   15 195
周六     60 15 75
周日     15   15
周总计 200 325 180 130 835

时间记录日志

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/21 14:00 15:50 10 100 听课 软件工程上课
  17:10 17:20   10 阅读书籍 《构建之法》《梦断代码》
  21:00 21:25   20 网上查找资料  
3/22 14:00 15:00 10 110 结对编程 编写老师布置的作业
  16:00 17:00 10 110 看书 《构建之法》《梦断代码》
3/23 21:00 21:30   30 结对编程 编写老师布置的作业
3/24 14:00 15:50 10 100 听课 软件工程上课
3/25 16:00 18:00   120 结对编程 编写老师布置的作业
3/26 9:00 9:30   30 看书 《构建之法》《梦断代码》
3/27 9:00 9:30   30 看书 《构建之法》《梦断代码》

缺陷记录日志:

  

日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
3月22日 1   编码 编码 0.2min  
  缺少头文件
  2   编码 运行 3min  
  重复使用变量i,导致无限运行
3月25日 3   编码 编译 1min  
  if条件中用了“=”运算符
  4   编码 编译 1min  
  缺少;
  5   编码 编译 0.2min  
  for的结尾再次使用i++,导致i加了两次

小组成员:杨超群 http://www.cnblogs.com/linumy/

时间: 2024-08-16 06:45:30

课堂练习----一个整数数组中最大子数组的和(1)的相关文章

软件工程课堂练习:返回一个一维整数数组中最大子数组的和

题目:返回一个一维整数数组中最大子数组的和.要求:输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划. 经分析讨论设计思路如下: 1.定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数: 2.设置长度为10的循环依次以前十个数为头进行最大子数组的计算: 3,再设置一个数组用来存储

课堂练习(返回一个环状一维整数数组中最大子数组的和)

设计思路: (1)将循环数组拆为我们熟悉的以为数组 (2)通过每个数组元素在数组中位置前移一位来实现环的拆分(array[i1]=array[i1+1]) (3)在每次拆分后的数组中求出最大子数组和并记录到一个新的数组result[]中 (4)求出result[]中的最大值r作为循环数组的最大值 拆分后数组最大子数组喝的解决: (1)定义整数数组arr[i] (2)定义maxsum为最大子数组和并赋初值为arr[0] (3)定义一个中间变量temp由arr[0]计算子数组(连续的)的和当temp

课堂练习----一个整数数组中最大子数组的和(2)

本次的题目是:返回一个整数数组中最大子数组的和 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 分析: 这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

课堂练习求环整数组中最大子数组之和

设计思路:之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的.运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾.一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来计算最大子数组之和,最后一个用来实现数组的前移.第一个循环中包着另外两个循环.总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值. 程序代码: 1 import

返回一个整数数组中最大子数组的和(2)

题目:返回一个整数数组中最大子数组的和 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 在做前面一道题目时,并没有考虑数组个数的上限及随机数位数问题,以为是要程序不出错,就是完美的.而通过课堂上验证上次程序,发现数组的和超过某一值时,将不会显示,但同样,程序不会报错,在小程序中后果并不严重,但是一旦开发大型

返回一个整数数组中最大子数组的值(程序能处理1000个元素)

课堂练习: 题目:要求返回一个整数数组中最大子数组的值 要求:程序必须能处理1000个元素 每个元素是int32类型的 设计思路: 将数组的大小定义为1000,每个元素定义为int32类型,取数值时对数成2的32次方,这样数值可以越界. 程序: #include <iostream>  #include<stdlib.h>  #include<time.h>  using namespace std;    int main()  {     int i;     in

返回一个整数数组中最大子数组的和4

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二