软件工程概论课堂作业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<<"请输入数组长度:\n";//自定义数组长度
    cin>>m;
    for(i=0;i<m;i++)
    {
        cout<<"请输入第"<<i+1<<"个数:";
        cin>>a[i];
        a[i+m]=a[i];//复制输入的数组接在该数组最后一个数后面
    }
    cout<<"\n该数组首尾相接后子数组和的最大值为:"<<Sum(m,a)<<"\n";
}

void main()
{
    InputAndDisplay();
}

运行结果截图

总结:拿到一个问题不要着急写代码,仔细思考解决方法并实现;设计思想远比代码重要,一定要清晰准确,并按照设计思路逐步完成局部功能,然后实现总的需求。
时间: 2024-10-12 22:40:22

软件工程概论课堂作业3的相关文章

软件工程概论课堂作业1

1.网站系统开发需要掌握的技术 (1)数据库链接技术 (2)JavaBean技术 (3)Servlet技术 (4)流行框架与流行XML技术 2.本次课堂测试的源程序代码 <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD H

软件工程概论个人作业01

一:设计思路: 1.随机产生2个0到99之间的随机数,用作运算数:随机产生1个0到3之间的数,分别代表运算符+,-,*,/. 2.if....else....语句控制输出的算式,for循环输出30道题. 3.当运算符为“/”号时,需要判断除数是否为0,如果为0,则循环次数加一. 4.为了保证随机种子的不同,需要用到srand(time(NULL))函数. 5.循环遍历已经出过的题,查看是否有重题. 二:源程序: #include<iostream> using namespace std; #

软件工程概论个人作业2

老师有将上次的作业进行了功能上的升级,加入了新的功能,所以我就将我的作业设计再次展示. 程序设计思路:上次的程序设计只是简单的两个数的四则运算,不需要对运算符的种类进行筛选,这次的作业我将上次的程序设计代码,进行了重新封装,设计了一个输入数据的方法,对不同的输入数据进行不同要求的生成式子,并对程序生成的式子进行判断是否符合标准.对符合要求的式子存放在string数组中,然后在数组中的式子输出到结果即可. 程序源代码: 1 package 四则运算; 2 3 import java.util.Sc

软件工程概论-课后作业1

需要网站系统开发需要掌握的技术 1.网页设计:Photoshop.Flash max.Dreamweaver 2.网站程序:Dreamweaver.Visual Studio .NET 会asp.asp.net.php.Jsp等一种编程语言和MSSQL或者MYSQL数据库. 本次课堂测试的源程序代码 运行结果截图 说明课堂测试未按时完成的原因 寒假学习不够认真,消极对待,把精力没有放在学习上. 列出你对这门课的希望和自己的目标,并具体列出你计划每周花多少时间在这门课上 我希望这门课能带给我新的能

软件工程概论—第一次作业

①网站系统开发需要的技术有: 一.前台美工设计:Dreamweaver.Flash.Photoshop 二.网站编程:asp.asp.net.php.Jsp.JavaScript.MYSQL ②源代码程序: 1 <!doctype html> 2 3 <html> 4 5 <head> 6 7 <meta charset="utf-8"> 8 9 <title>登录界面</title> 10 11 </hea

软件工程概论课后作业1

网站系统开发需要掌握的技术:html.jsp技术.css样式技术.php技术: 本次课堂测试源代码: <%@page contentType="text/html" pageEncoding="UTF-8" %> <html> <head> </head> <body> <center> <h1>登陆操作!</h1> </center> <hr>

软件工程概论第一次作业

1.需要网站系统开发需要掌握的技术: (1)lJava语言 (2)面向对象分析设计思想 (3)设计模式和框架结构 (4)XML语言 (5)网页脚本语言 (6)数据库 (7)应用服务器 (8)集成开发环境 下面我们具体地看每个技术. 1.Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet.JDBC.JavaBean(Application)四部分技术. (1).Java Database Connectivity (JDBC)技术 在Java We

软件工程概论课堂测试一————添加新课程(web)

设计思想 三个文件Class_add.java  add.jsp  addInput.jsp Class_add.java : 内封装方法:连接数据库.向数据库添加课程信息.判断非合理的输入情况.判断添加的课程是否重复. addInput.jsp      :  完成显示输入界面,点击保存后跳转到addInput.jsp. add.jsp              :  处理输入的数据,并给出相应的交互提示. 源程序代码 Class_add.java : import java.sql.Conn

软件工程概论-合作作业02-四则运算网页答题

题目:四则运算web版:把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目,并可实现在线答题并评判 四则运算web版的程序设计思想:之前的程序是可以用户自定义生成任意个数四则运算题目的,这次试验是要求写成web版的,用于给用户提供一一个在线答题的平台.这里需要用到Javaweb的方法,Javabean方法,jsp代码编写等方法. 源程序代码: javabean1: package DBBean; import java.sql.*; import java.util.*; public