软件工程概论课堂作业3
題目:返回一個(gè)整數(shù)數(shù)組中最大子數(shù)組的和
要求:
輸入一個(gè)一維整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。
一維數(shù)組首尾相接,象個(gè)一條首尾相接帶子一樣。
數(shù)組中連續(xù)的一個(gè)或多個(gè)整數(shù)組成一個(gè)子數(shù)組,每個(gè)子數(shù)組都有一個(gè)和。
求所有子數(shù)組的和的最大值。
?
設(shè)計(jì)思想:
用戶自定義數(shù)組長(zhǎng)度并依次輸入數(shù)組元素,設(shè)一個(gè)全局變量初始化為零的數(shù)組a[N],N=10000;
1.因?yàn)樵摂?shù)組首尾相接可視作一個(gè)環(huán),那么我們需要在一個(gè)合適的位置斷開,把數(shù)組元素展成一條筆直的帶子。
(1).設(shè)用戶自定義數(shù)組長(zhǎng)度為m,輸入數(shù)組各元素值a[1]~a[m],在for循環(huán)中加入代碼a[m+i]=a[i];(即復(fù)制輸入的數(shù)組接在該數(shù)組最后一個(gè)數(shù)后面,其中i為循環(huán)變量)
例:若輸入的數(shù)組為 1,-2,3,-4,5 ? 那么實(shí)際生成的數(shù)組為1,-2,3,-4,5,1,-2,3,-4,5
(2).找出合適的位置斷開,這個(gè)合適的位置即整個(gè)數(shù)組的最小值處,寫一個(gè)函數(shù)找出輸入的數(shù)組的最小值使該數(shù)排在第一位。
例:輸入數(shù)組為?1,-2,3,-4,5 ? 那么找出最小元素-4的位置并使其在第一位,所以實(shí)際生成并計(jì)算的數(shù)組為(下劃線部分):1,-2,3,-4,5,1,-2,3,-4,5
2.在合適位置斷開確定好數(shù)組后,根據(jù)第一次課堂作業(yè)(不考慮首尾相接的情況)計(jì)算
(1).從數(shù)組第一個(gè)不為零的元素累加,設(shè)累加值為S,為判斷數(shù)組第一個(gè)不為負(fù)的元素,S需要初始化為零;
(2).定義另一個(gè)整形變量sum存儲(chǔ)當(dāng)前最大累加值S,sum需與累加值比較,所以sum應(yīng)初始化為零 ?(1)每一次累加獲得一個(gè)S后判斷,若S為負(fù),舍去使累加值為負(fù)的數(shù)組元素,繼續(xù)從下一個(gè)數(shù)組元素開始累加(2)若sum<S,把S賦值給sum,S繼續(xù)累加(3)如此循環(huán)直到數(shù)組元素取盡。
(3).最后輸出的sum為子數(shù)組最大值。
?
出現(xiàn)的問題:
第一次編碼找出的所謂“合適”位置是累加到某個(gè)數(shù)使得累加值為負(fù)的那個(gè)元素,另其在第一位。
但是如果沒有某個(gè)值累加使得累加值小于零,那么結(jié)果出錯(cuò)。
例:1,2,-2,4,5 ? 累加到-2使得前面三個(gè)元素的累加值為1不為零,所以計(jì)算得出的結(jié)果為9,而應(yīng)該得出的結(jié)果為12
?
程序源代碼:
?
//Jiang LingJun, 2016,04,11 //數(shù)組中有正有負(fù),求最大子數(shù)組問題(數(shù)組首尾相接) #include<iostream> using namespace std; int a[10000];//全局變量(初始化數(shù)組a所有元素為零)int Find(int m,int a[])//找出輸入數(shù)組中最小值的下標(biāo)位置c并返回 {int min,c=0,i;//c初始化為零是因?yàn)槿绻斎霐?shù)組的第一個(gè)元素為最小值,將報(bào)錯(cuò)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[])//以數(shù)組中下標(biāo)為c的元素為首接成環(huán),求出最大子數(shù)組的值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];//舍去使子數(shù)組和小于零的數(shù)組元素elses=s+a[i];//臨時(shí)存放數(shù)組元素的累加值if(sum<s)sum=s;//存放當(dāng)前最大子數(shù)組的和 }return sum; } void InputAndDisplay()//輸入數(shù)組元素并輸出子數(shù)組的最大值(首尾相接成環(huán)的數(shù)組) {int i,m;cout<<"請(qǐng)輸入數(shù)組長(zhǎng)度:\n";//自定義數(shù)組長(zhǎng)度cin>>m;for(i=0;i<m;i++){cout<<"請(qǐng)輸入第"<<i+1<<"個(gè)數(shù):";cin>>a[i];a[i+m]=a[i];//復(fù)制輸入的數(shù)組接在該數(shù)組最后一個(gè)數(shù)后面 }cout<<"\n該數(shù)組首尾相接后子數(shù)組和的最大值為:"<<Sum(m,a)<<"\n"; }void main() {InputAndDisplay(); }運(yùn)行結(jié)果截圖:
總結(jié):
拿到一個(gè)問題不要著急寫代碼,仔細(xì)思考解決方法并實(shí)現(xiàn);設(shè)計(jì)思想遠(yuǎn)比代碼重要,一定要清晰準(zhǔn)確,并按照設(shè)計(jì)思路逐步完成局部功能,然后實(shí)現(xiàn)總的需求。
?
轉(zhuǎn)載于:https://www.cnblogs.com/jianglingjun/p/5392907.html
總結(jié)
以上是生活随笔為你收集整理的软件工程概论课堂作业3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到牛和猪预示着什么
- 下一篇: CI框架分页类