• 软件工程概论课堂作业3


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

    要求:

    输入一个一维整形数组,数组里有正数也有负数。

    一维数组首尾相接,象个一条首尾相接带子一样。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。

    设计思想

    用户自定义数组长度并依次输入数组元素,设一个全局变量初始化为零的数组a[N],N=10000;

    1.因为该数组首尾相接可视作一个环,那么我们需要在一个合适的位置断开,把数组元素展成一条笔直的带子。

    (1).设用户自定义数组长度为m,输入数组各元素值a[1]~a[m],在for循环中加入代码a[m+i]=a[i];(即复制输入的数组接在该数组最后一个数后面,其中i为循环变量)

    例:若输入的数组为 1,-2,3,-4,5   那么实际生成的数组为1,-2,3,-4,5,1,-2,3,-4,5

    (2).找出合适的位置断开,这个合适的位置即整个数组的最小值处,写一个函数找出输入的数组的最小值使该数排在第一位。

    例:输入数组为 1,-2,3,-4,5   那么找出最小元素-4的位置并使其在第一位,所以实际生成并计算的数组为(下划线部分):1,-2,3,-4,5,1,-2,3,-4,5

    2.在合适位置断开确定好数组后,根据第一次课堂作业(不考虑首尾相接的情况)计算

    (1).从数组第一个不为零的元素累加,设累加值为S,为判断数组第一个不为负的元素,S需要初始化为零;

    (2).定义另一个整形变量sum存储当前最大累加值S,sum需与累加值比较,所以sum应初始化为零  (1)每一次累加获得一个S后判断,若S为负,舍去使累加值为负的数组元素,继续从下一个数组元素开始累加(2)若sum<S,把S赋值给sum,S继续累加(3)如此循环直到数组元素取尽。

    (3).最后输出的sum为子数组最大值。

    出现的问题

    第一次编码找出的所谓“合适”位置是累加到某个数使得累加值为负的那个元素,另其在第一位。

    但是如果没有某个值累加使得累加值小于零,那么结果出错。

    例:1,2,-2,4,5   累加到-2使得前面三个元素的累加值为1不为零,所以计算得出的结果为9,而应该得出的结果为12

    程序源代码

    //Jiang LingJun,   2016,04,11
    //数组中有正有负,求最大子数组问题(数组首尾相接)
    #include<iostream>
    using namespace std;
    int a[10000];//全局变量(初始化数组a所有元素为零)
    
    int Find(int m,int a[])//找出输入数组中最小值的下标位置c并返回
    {
        int min,c=0,i;//c初始化为零是因为如果输入数组的第一个元素为最小值,将报错c未初始化
        min=a[0];
        for(i=0;i<m;i++)
        {
            if(a[i]<min)
            {
                min=a[i];
                c=i;
            }
        }
        return c;
    }
    int Sum(int m,int a[])//以数组中下标为c的元素为首接成环,求出最大子数组的值sum
    {
        int i;
        int s=0;
        int sum=0;
        for(i=Find(m,a);i<m+Find(m,a);i++)
        {
            if(s<0)
                s=a[i];//舍去使子数组和小于零的数组元素
            else
                s=s+a[i];//临时存放数组元素的累加值
            if(sum<s)
                sum=s;//存放当前最大子数组的和
        }
        return sum;
    }
    void InputAndDisplay()//输入数组元素并输出子数组的最大值(首尾相接成环的数组)
    {
        int i,m;
        cout<<"请输入数组长度:
    ";//自定义数组长度
        cin>>m;
        for(i=0;i<m;i++)
        {
            cout<<"请输入第"<<i+1<<"个数:";
            cin>>a[i];
            a[i+m]=a[i];//复制输入的数组接在该数组最后一个数后面
        }
        cout<<"
    该数组首尾相接后子数组和的最大值为:"<<Sum(m,a)<<"
    ";
    }
    
    void main()
    {
        InputAndDisplay();
    }

    运行结果截图


    总结
    拿到一个问题不要着急写代码,仔细思考解决方法并实现;设计思想远比代码重要,一定要清晰准确,并按照设计思路逐步完成局部功能,然后实现总的需求。
  • 相关阅读:
    SQL函数union,union all整理
    Oracle中的having()函数
    SQL函数count(),sum()理解
    Office Online Server 和 SharePoint 2016配置时报错
    Manjaro 黑苹果网卡BCM4360折腾记
    Manjaro安装与基本配置
    在Arch Linux/Manjaro上安装KVM、QEMU和Virt Manager的方法
    Nginx 优化详解
    xargs 使用详解
    Centos7 搭建lnmp环境 (centos7+nginx+MySQL5.7.9+PHP7)
  • 原文地址:https://www.cnblogs.com/jianglingjun/p/5392907.html
Copyright © 2020-2023  润新知