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