软件工程概论课堂作业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];//舍去使子数组和小于零的数组元素elses=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();
}

运行结果截图


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

 

转载于:https://www.cnblogs.com/jianglingjun/p/5392907.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android硬件访问服务框架思想初识

Android的硬件访问服务提供了一个APP调用硬件实现的方法模型。我们从上往下来看。应用层面对的都是一个个的服务叫service.比如电源管理服务&#xff0c;震动服务等等。应用层代码首先就需要去查询系统是否存在这么一个服务&#xff0c;或者目前是不是可以被获取的。从这个角度…

Ubuntu更新过程被中断后的问题

From: http://defe.me/os/368.html Ubuntu的更新过程是先下载完源里的文件就开始执行升级&#xff0c;如果涉及到一些因为版权或是其他问题没加入源的文件&#xff0c;在升级安装的中途再从第三方服务器上下载。有时需要下载的文件比较大&#xff0c;而网速又不给力&#xff0c…

机器码和字节码

什么是机器码 机器码 机器码(machine code)&#xff0c;学名机器语言指令&#xff0c;有时也被称为原生码&#xff08;Native Code&#xff09;&#xff0c;是电脑的CPU可直接解读的数据。 通常意义上来理解的话&#xff0c;机器码就是计算机可以直接执行&#xff0c;并且执行速…

shell脚本常用语句用法笔记

脚本基本语句用法笔记 grep -i 查询时不区分大小写 -n打印匹配的行号 -v 打印不匹配的行 -AX包括每次匹配之后X行 -BX包括每次匹配之后X行 cat /etc/passwd |grep student (-i 表示不关心大小写) 正则表达式中 ^代表开始 $代表结束 cat /etc/passwd|grep ^# -v (…

CI框架分页类

分页类1.分页类参数说明 base_url > 指向你的分页所在的控制器类/方法的完整的 URL, total_rows > 数据的总行数, per_page > 每页显示的项目, uri_segment > 自动检测哪一段包含页数, num_links > 放在当前页前后显示的链接数, 2.分页类使用 $this->load-&g…

对象运算符.和[]的用法

相同点&#xff1a;它们的第一个运算数都是对象或者数组。 区别&#xff1a;"."将第二个运算数作为对象的属性读写。第二个运算数只能是合法的标识符 "[]"将第二个运算数作为数组的下标来读写。第二个运算数可以是任何类型的值甚至是undefined&#xff0c;…

Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

在Linux中&#xff0c;内核利用文件描述符&#xff08;File Descriptor&#xff09;即文件句柄&#xff0c;来访问文件。文件描述符是非负整数。打开现存文件或新建文件时&#xff0c;内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。宏FD_ZERO、F…

Host SMBus controller not enabled的解决方法

From: http://blog.csdn.net/starmlk/article/details/7982077 SMBus 目录 SMBus与I2C的差别SMBus 是 System Management Bus 的缩写&#xff0c;是1995年由Intel提出的&#xff0c;应用于移动PC和桌面PC系统中的低速率通讯。它主要是希望通过一条廉价并且功能强大的总线&…

gitlab服务器搭建

搭建教程&#xff1a;http://blog.csdn.net/discoverer100/article/details/51814171#reply

【Bugly干货分享】微信文件微起底Ⅰ

Bugly 技术干货系列内容主要涉及移动开发方向&#xff0c;是由 Bugly 邀请腾讯内部各位技术大咖&#xff0c;通过日常工作经验的总结以及感悟撰写而成&#xff0c;内容均属原创&#xff0c;转载请标明出处 微信大家都在用&#xff0c;但微信的本地文件到底隐藏着什么样的信息呢…

如何使antd中table表格不换行

.ant-table-thead > tr > th{ white-space:nowrap; } .ant-table-row td{ white-space:nowrap; } 在对用的组件style加上上面代码

由旋转矩阵求旋转中心

在图像的复合变化过程中&#xff0c;通常会用到Matrix矩阵&#xff0c;一般的过程是先构造仿射变换矩阵&#xff0c;然后对图像进行仿射变换&#xff0c;如&#xff1a;围绕点&#xff08;100&#xff0c;100&#xff09;旋转30度(sin 30 0.5 &#xff0c;cos 30 0.866)&…

git服务器搭建

本文主要记录在Ubuntu 16.04操作系统中搭建GitLab服务器的操作记录&#xff0c;以下是操作步骤&#xff08;主要参考资料&#xff1a;https://about.gitlab.com/downloads/#ubuntu1604&#xff09;。1.安装依赖包&#xff0c;运行命令sudo apt-get install curl openssh-server…

Ubuntu桌面版网络设置

先来说下我的经验吧&#xff0c;我觉得Ubuntu桌面版中网络配置最好的方法是用Network-Manager这个带界面的软件&#xff0c;因为桌面版中这个软件是自动启动的。理由如下&#xff1a; 1. 如果要把这个软件设置为开机时不启动&#xff0c;得执行&#xff1a;chkconfig network-…

ant-design之form-重置表单多个值

重置form表单中的某一个值或者一次重置多个值 watch: {databaseType: function(curr, old) {this.getMyTableData [];this.form.resetFields([databaseSource,"databaseName","tableName",""]);},},

2016matlab安装

百度云的下载链接&#xff08;永久有效&#xff09;链接&#xff1a;https://pan.baidu.com/s/1dGZB4q9 密码&#xff1a;pfl3Matlab用途&#xff1a;点击打开链接与网盘资源相对应的安装教程1.将网盘中的3个文件下载下来后&#xff0c;解压&#xff08;在当前路径下&#xff0…

C#类、接口、虚方法和抽象方法-抽象类与接口的区别与联系

C#抽象类和接口之间在对于抽象类定义的支持方面具有很大的相似性&#xff0c;甚至可以相互替换&#xff0c;因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意。其实&#xff0c;两者之间还是有很大的区别的。首先&#xff0c;以抽象类的方式定义一个公共的…

Nginx_查看并发连接数

通过查看Nginx的并发连接&#xff0c;我们可以更清除的知道网站的负载情况。Nginx并发查看有两种方法&#xff08;之所以这么说&#xff0c;是因为笔者只知道两种&#xff09;&#xff0c;一种是通过 web界面&#xff0c;一种是通过命令&#xff0c;web查看要比命令查看显示的结…

struct作为map的key时,需要重载该结构体

当结构体作为map中的key时&#xff0c;这个结构体必须重载"<"运算符, 否则将出错&#xff0c;看我完整代码&#xff1a; #ifndef WIN32#include <string.h>#else#include <string>#endif#include <iostream>#include <map>using namespa…

解决vuex中store保存数据,刷新页面会清空得问题

1.在App.vue下加入 mounted() {window.addEventListener("unload", this.saveState);},methods: {saveState() {sessionStorage.setItem("state", JSON.stringify(this.$store.state));}}2.在store下的index.js文件下修改 state:sessionStorage.getItem(…