2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計報告</b></p><p>  實驗內(nèi)容: 課程設(shè)計 </p><p>  相關(guān)課程: 信息系統(tǒng)開發(fā)語言(二) </p><p>  學(xué) 期: 2011-2012學(xué)年第2學(xué)期 </p><p>  學(xué)

2、時學(xué)分: 64 學(xué)時 4 學(xué)分 </p><p>  專業(yè)班級: </p><p>  學(xué)  號: </p><p>  姓  名: </p&

3、gt;<p>  指導(dǎo)老師: </p><p>  提交日期: 2012年 6月23日 </p><p>  信息系統(tǒng)開發(fā)語言課程設(shè)計</p><p><b>  一、課程設(shè)計目的</b></p><p>  C++

4、是實踐性很強的課程。課程設(shè)計是加強我們實踐能力的一個強有力手段,要求我們在完成程序設(shè)計的同時能夠?qū)懗霰容^規(guī)范的設(shè)計報告。通過課程設(shè)計要達到兩個目的,一是檢驗和鞏固專業(yè)知識、二是提高綜合素質(zhì)和能力,對于我們基本程序設(shè)計素養(yǎng)的培養(yǎng)和軟件工作者工作作風(fēng)的訓(xùn)練,將起到顯著的促進作用。</p><p>  課程設(shè)計主要是C++語言程序設(shè)計的實現(xiàn)。通過該課程設(shè)計,可以將學(xué)生課堂上掌握的理論知識與處理數(shù)據(jù)的業(yè)務(wù)相結(jié)合,以檢驗我

5、們同學(xué)們掌握知識的寬度、深度及對知識的綜合運用能力,同時提高和加強自己的計算機應(yīng)用與軟件開發(fā)能力,培養(yǎng)自己獨立分析問題、解決問題、查閱資料以及自學(xué)能力,以適應(yīng)計算機產(chǎn)業(yè)日新月異發(fā)展的形勢。</p><p>  學(xué)習(xí)和掌握 C++程序設(shè)計方法以及上機調(diào)試技巧,為今后學(xué)習(xí)其它專業(yè)課程打好堅實的基礎(chǔ),檢測自己在這一學(xué)期對 C++的學(xué)習(xí)及掌握情況。知道自己的不足,及時的彌補。為以后的學(xué)習(xí)打下一定的基礎(chǔ),也為自己以后如何制

6、定學(xué)習(xí)計劃做一鋪墊。</p><p><b>  二、問題描述</b></p><p><b>  題號8乘積最大</b></p><p>  總體需求:編寫一個實現(xiàn)將一個的數(shù)字串,分成K+1個部分,使得這K+1個部分的乘積能夠為最大。</p><p>  功能需求:設(shè)有一個長度為N的數(shù)字串,要

7、求使用K個乘號將它分成K+1個部分,找出一種分法,使得這K+1個部分的乘積能夠為最大。如:有一個數(shù)字串:312,當(dāng)N=3時,K=1時會有以下兩種分法:</p><p>  1)3×12 = 36</p><p>  2)31×2 = 62</p><p>  此時,符合題意的結(jié)果是31×2 = 62</p><p&g

8、t;<b>  用戶界面</b></p><p><b>  輸入: </b></p><p>  1)程序正常運行后,提示用戶輸入一行共有2個自然數(shù)N,K(2≤N≤40,1≤K≤6)。</p><p>  2)第二行是一個長度為N的數(shù)字串。 </p><p><b>  輸出:<

9、/b></p><p>  相對于輸入,應(yīng)輸出所求得的最大乘積(一個自然數(shù))。</p><p><b>  提示與參考</b></p><p><b>  輸入樣例:</b></p><p><b>  4 2</b></p><p><b&

10、gt;  1231</b></p><p><b>  輸出樣例:</b></p><p><b>  62</b></p><p><b>  問題分析</b></p><p>  此程序要求實現(xiàn)將長度為N的數(shù)字串,用K個乘號分成K+1個部分,使得這K+1個部分的

11、乘積能夠為最大。</p><p>  由題,數(shù)字串的順序固定不變,乘號在不同的位置插入,使得數(shù)字乘積發(fā)生變化,并取其最大值輸出。設(shè)num=3456,n=4,k=3,這表示要將4 位的十進制整數(shù)3456 分為3 段。劃分方法為:3×4×56=672,3×45×6=810,34×5×6=1020,而第3 種劃分才是最佳劃分。本問題屬于求最優(yōu)值的一類問題。&l

12、t;/p><p>  假設(shè)第k個乘號插入的位置為p,取出由后n-q個數(shù)字組成的數(shù)字串,可能包含任意個(不多于k個)乘號。若能求出任意子串包含k-1個乘號的最大乘積,則只需窮舉第k個乘號的插入位置q,該乘號將數(shù)字串分成前后兩段,后半段包含k-1個乘號,其最大值根據(jù)假設(shè)已經(jīng)算出,將它與前半段的值相乘得到第k個乘號在位置q時的乘積。取所有的第k個乘號不同插入方案中的最大乘積即為問題“后n-q個數(shù)字組成的數(shù)字串插入k-1個乘

13、號”的解。</p><p>  假設(shè)數(shù)字字符串為aa…a(2<=n<=40),設(shè)f[i,j]表示在后i位數(shù)中插入j個乘號所得的最大值,p(1 , n , k )為從 l 到n加入 k 個乘號的最大乘積值。</p><p> ?。?)K=1時,一個乘號可以插在a1a2…a中的n-1個位置,這樣就得到n-1個子串的乘積:a*a…a , aa* a…a , …, aa…a* a<

14、;/p><p>  此時的最大值p(1 , n , k )= max{ a*a…a , aa* a…a , …,aa…a* a}</p><p> ?。?)K=2時,二個乘號可以插在aa…a中n-1個位置的任兩個地方,這樣總共會產(chǎn)生 個乘積。把這些乘積分個類,便于觀察規(guī)律。</p><p>  Case1: a*a* a…a , a*a

15、a*…a , …, a*a…a* a</p><p>  因后一個乘號位置不變,要使這些乘積最大,就要找出在前n-1個數(shù)中插入一個乘號的最大值。設(shè)符號f[n-1,1]為在后n-1個數(shù)中插入一個乘號的最大值,則 Case1的最大值為a*f[n-1,1]</p><p>  Case2:aa* a*a…a , aa*aa*…a , …, aa*aa…a* a</p>&l

16、t;p>  因后一個乘號位置不變,要使這些乘積最大,就要找出在前n-2個數(shù)中插入一個乘號的最大值。設(shè)符號f[n-2,1]為在后n-2個數(shù)中插入一個乘號的最大值,則</p><p>  Case2的最大值為aa*f[n-2,1]</p><p>  同理,Case3的最大值為aaa*f[n-3,1]</p><p><b>  ……</b>

17、</p><p>  Case(n-2)的最大值為aa…a*f[2,1]</p><p>  此時的最大值p(1 , n , k )= max{ Case1,Case2,…, Case(n-2) }</p><p>  (3)由此得出K=i時,p(1 , n , k )= max{ a*f[n-1,i-1], aa*f[n-2,i-1], aa*f[n-3,i-1]

18、, …,aa…a*f[n-i,i-1] } </p><p>  由上述可知,第k個乘號的插入位置q,p(1 , n , k )為從 l 到n加入 k 個乘號的最大乘積值。</p><p>  又令d (1 ,q)= aa…a</p><p>  則p( l,n,k )=max{ d (1 ,q)* p( n-q , n , k-1 ) } </p>

19、<p>  四、算法分析、設(shè)計與描述</p><p><b>  1.算法分析和設(shè)計</b></p><p><b> ?。?)算法分析</b></p><p>  由于問題的規(guī)模為2≤N≤40,1≤K≤6,且只有乘號插入的位置是變化的,要在長為N的數(shù)字串中插入K個乘號使得乘積最大,自然數(shù)位數(shù)的上限為40,乘號數(shù)

20、的上限為6,最大乘積位數(shù)的上限接近42位,顯然將會超出長整數(shù)的范圍,所以運算要用高精度乘法。若用窮舉法,在長為N的數(shù)字串中插入K個乘號的方案共有C(N-1,K)種,當(dāng)N=40,K=6時,C(N-1,K)=1344904種方案,而高精度乘法運算也較費時間。由此可知,窮舉法將不合適此題。</p><p>  假設(shè)一個長度為N 的數(shù)字串加入K個乘號的最大乘積記為f(n,k),前k段總共是q位,且1<=q<n

21、,則最后一段為n-q位,用d(q,n-q)表示從第q位開始的最后長度為n-q位的字符,則f(n,k)=f(q,k-1)*d(q,n-q)。現(xiàn)在我們假設(shè)前面長度為q位字符串加入K個乘號的最大乘積不是f(q,k-1),而是e(q,k-1),則有e(q,k-1)>f(q,k-1)左右兩邊同時乘以d(q,n-q)得 e(q,k-1)*d(q,n-q)>f(q,k-1)*d(q,n-q)=f(n,k)。即f(n,k)不是一個長度為N

22、的數(shù)字串加入K個乘號的最大乘積與最初的假設(shè)相矛盾。所以f(q,k-1)是前面q位字符串加入k-1乘號的最大乘積,即此問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。</p><p>  由于子問題是在子串中插入k-1,k-2, … ,1,0個乘號,因此,把k作為階段變量。狀態(tài)變量是階段變量的函數(shù),它會隨著階段變量的改變而變化。階段數(shù)J ,表示在子串中插入J個乘號。最少是長度為J+1的子串才能剛好插入這J個乘號。這就是J階段的起始狀態(tài):在

23、長度為J+1的子串中插入J個乘號。再思考狀態(tài)數(shù)的上界,有k-J個乘號需要插入右子串中,右子串最短剛好容納K-J個乘號的長度為K-J+1,而整個字串的長度為n,故左子串最長允許的長度為n-(k-J+1) = n+J-k-1。總結(jié)起來,狀態(tài)數(shù)I的取值范圍就是J+1 <= I <= n+J-k-1。階段、狀態(tài)確定了,要求解的當(dāng)前問題也就確定了:在長度為I的子串中插入J個乘號的最優(yōu)解是多少?用符號表示就是求F[I,J]的值。前面已經(jīng)

24、分析過,這一問題可以理解為用第J個乘號把長度為I的字串分左、右二個子串,右子串中插有J-1個乘號,求得它的最優(yōu)解,再乘以左子串的問題。由于右子串要插入J-1個乘號,因此右子串的最短長度為J-1+1 = J,這就是決策變量的起始值,也就是下界。又由于第J個乘號一定要分出左右子串來,左子串最短為1,此時右子串最長為I-1</p><p><b>  (2)算法設(shè)計</b></p>

25、<p>  遞歸調(diào)用+回溯+向量容器</p><p>  遞歸調(diào)用Maxproduct(num,n,k),乘號插入第i個數(shù)后,截斷i個數(shù),放到向量容器1里,如果得到一個最大乘積時置一個全局變量為真,則返回上一級遞歸調(diào)用后,將向量容器1存儲的數(shù)字回溯到前一狀。字符移到串的s+i位置,字符串個數(shù)為n-i,還可插入的乘號有k-1個,繼續(xù)調(diào)用Maxproduct(s+i,n-i,k-1)。直至k=0,算出pro

26、duct,與Maxproduct比較,如果大就重新賦值Maxproduct=product,清空容器2,并把字符串截斷的情況存儲容器2中。</p><p>  2.算法描述(可插入流程圖)</p><p>  輸入兩個自然數(shù)n、k和一個字符串num,判斷2≤n≤40&&1≤k≤6,如果2≤n≤40&&1≤k≤6,繼續(xù)判斷n=strlen(num)和n>

27、k,如果這兩個條件都滿足,則調(diào)用函數(shù)Maxproduct(s+i,n-i,k-1),最后輸出最大值,結(jié)束算法。</p><p><b>  五、程序設(shè)計</b></p><p><b>  方法一:</b></p><p><b>  1、程序代碼及說明</b></p><p>

28、;  #include <iostream> </p><p>  #include <vector> </p><p>  #include <string.h> </p><p>  using namespace std; </p><p>  #define BUFFERSIZE 40</p&

29、gt;<p>  char num[BUFFERSIZE]={0};</p><p>  vector<string> result; //將result聲明為一個元素類型為string的向量容器對象</p><p>  vector<string> temp; //將temp聲明為一個元素類型為string的向量容器對象</p>&l

30、t;p>  double maxProduct=0; </p><p>  bool getAmaxproduct=false; </p><p>  void maxproduct(char* s, int n,int k) </p><p><b>  { </b></p><p>  vector<st

31、ring>::iterator p; //將p聲明為string 類型的向量容器迭代器</p><p><b>  if(k==0)</b></p><p><b>  { </b></p><p>  getAmaxproduct=true; </p><p>  temp.push_bac

32、k(s); //將字符串壓入vector</p><p>  double product=1; </p><p>  for (p=temp.begin(); p!=temp.end(); p++) </p><p>  { product *= atoi((*p).c_str()); } </p><p>  if(product >

33、; maxProduct) </p><p><b>  { </b></p><p>  maxProduct = product; </p><p>  result.clear();//將容器result清空 </p><p>  result=temp; </p><p><b>

34、;  } </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  for(int i=1; i<=n-k; i++) </p><p&

35、gt;<b>  { </b></p><p><b>  //釋放空間</b></p><p>  if(getAmaxproduct) </p><p><b>  { </b></p><p>  int poplength=0; </p><p>

36、;  for(p=temp.end()-1; poplength!=n;temp.pop_back(),p=temp.end()-1) </p><p>  {poplength += (*p).size();} </p><p>  getAmaxproduct=false; </p><p><b>  } </b></p>

37、<p>  //聲明一個指針,對其進行分配空間,并初始化</p><p>  char *tmp=new char[BUFFERSIZE]; //新建一個等長度BUFFERSIZE的字符數(shù)組</p><p>  memset(tmp,0,BUFFERSIZE); //為結(jié)構(gòu)體tmp分配BUFFERSIZE大小內(nèi)存空間</p><p>  for(int j

38、=0; j<i; j++) </p><p><b>  { </b></p><p>  if (tmp[0]==0) </p><p>  tmp[0]=*(s+j); </p><p><b>  else </b></p><p>  tmp[strlen(tm

39、p)] = *(s+j); </p><p><b>  } </b></p><p>  temp.push_back(tmp); //將tmp里的字符串放到temp尾部</p><p>  maxproduct(s+i,n-i,k-1); //遞歸調(diào)用</p><p><b>  } </b>&

40、lt;/p><p><b>  } </b></p><p><b>  } </b></p><p>  void main() </p><p><b>  { </b></p><p><b>  int k,n; </b><

41、;/p><p>  cout<<"Please input n and k (2≤N≤40,1≤K≤6):\n"; </p><p>  cin>>n>>k;</p><p>  cout<<"Please input num:\n";</p><p><

42、;b>  cin>>num;</b></p><p>  if(n>=2&&n<=40&&k>=1&&k<=6)</p><p><b>  {</b></p><p>  if(n !=strlen(num))</p><

43、p><b>  { </b></p><p>  cout<<"請確保輸入的字符串的長度=n\n"; </p><p><b>  return; </b></p><p><b>  } </b></p><p>  if (n<=

44、k) </p><p><b>  { </b></p><p>  cout<<num<<"中輸入"<<k<<"個乘號不能分成 "<<k<<"+1部分\n"; </p><p><b>  return

45、; </b></p><p><b>  } </b></p><p>  maxproduct(num,n,k); </p><p>  cout<<num<<"中輸入"<<k<<"個乘號分成"<<k<<"+1

46、部分的最大乘積= "; </p><p>  for(vector<string>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p><p>  cout<<(*p).c_str(); </p>

47、<p>  if (p==result.end()-1) </p><p>  {cout<<" = "; }</p><p><b>  else </b></p><p>  cout<<"*"; </p><p><b>  } &

48、lt;/b></p><p>  cout<< maxProduct<<endl; </p><p><b>  }</b></p><p><b>  else</b></p><p>  cout<<"請重新輸入n和k(2≤N≤40,1≤K≤6

49、)"<<endl; </p><p><b>  }</b></p><p><b>  方法二:</b></p><p>  1、程序設(shè)計的基本思路</p><p>  class BigDecimal // 高精度整數(shù)</p><p><b&g

50、t;  {</b></p><p>  unsigned char num[100]; // 從低位到高位存放每一位數(shù)字,最高支持100位,修改此數(shù)字可以提高支持精度</p><p>  int len; // 數(shù)字的位數(shù)</p><p><b>  public:</b></p><p>  BigDeci

51、mal() // default constructor, 初始化數(shù)字為0</p><p>  BigDecimal(string s) // 由s初始化整數(shù)</p><p>  BigDecimal operator*(const BigDecimal& a) // 高精度乘法</p><p>  bool operator<(const BigDe

52、cimal& a) const // 比較兩個高精度整數(shù)</p><p>  bool operator>(const BigDecimal& a) const</p><p>  bool operator==(const BigDecimal& a) const</p><p>  void print() const // 從高位

53、開始打印</p><p><b>  };</b></p><p><b>  2.程序代碼及說明</b></p><p>  #include <iostream></p><p>  #include <string></p><p>  #inc

54、lude <cstring></p><p>  using namespace std;</p><p>  class BigDecimal // 高精度整數(shù)</p><p><b>  {</b></p><p>  unsigned char num[100]; // 從低位到高位存放每一位數(shù)字,最高

55、支持100位,修改此數(shù)字可以提高支持精度</p><p>  int len; // 數(shù)字的位數(shù)</p><p><b>  public:</b></p><p>  BigDecimal() // default constructor, 初始化數(shù)字為0</p><p><b>  {</b>&

56、lt;/p><p><b>  len = 1;</b></p><p>  num[0] = 0;</p><p><b>  }</b></p><p>  BigDecimal(string s) // 由s初始化整數(shù)</p><p><b>  {</b&

57、gt;</p><p>  len = s.size(); // 讀取長度</p><p>  for(int i=s.size()-1;i>=0;i--) // 從低位開始讀取</p><p><b>  {</b></p><p>  num[len-i-1] = s[i]-'0';</p

58、><p><b>  }</b></p><p>  while(len>0&&num[len-1]==0) len--; // 去除高位0</p><p>  if(len==0) len = 1;</p><p><b>  }</b></p><p>

59、  BigDecimal operator*(const BigDecimal& a) // 高精度乘法</p><p><b>  {</b></p><p>  BigDecimal c; // 結(jié)果存放變量</p><p>  memset(c.num,0,sizeof(c.num)); // 初始化為0</p>&

60、lt;p>  for(int i=0;i<len;i++) // 模擬豎式乘法</p><p><b>  {</b></p><p>  for(int j=0;j<a.len;j++)</p><p><b>  {</b></p><p>  c.num[i+j]+=num[

61、i]*a.num[j]; // 對本數(shù)字的第i位和a的第j位相乘, 存放在結(jié)果的i+j位</p><p>  c.num[i+j+1] += c.num[i+j]/10; // 模擬進位</p><p>  c.num[i+j]%=10;</p><p><b>  }</b></p><p><b>

62、  }</b></p><p>  c.len = a.len+len;</p><p>  while(c.len>0&&c.num[c.len-1]==0) c.len--; // 去掉高位0</p><p>  if(c.len==0) c.len = 1;</p><p><b>  ret

63、urn c;</b></p><p><b>  }</b></p><p>  bool operator<(const BigDecimal& a) const // 比較兩個高精度整數(shù)</p><p><b>  {</b></p><p>  if(len <

64、 a.len)</p><p>  return true;</p><p>  else if(len > a.len)</p><p>  return false;</p><p>  for(int i=len-1;i>=0;i--)</p><p><b>  {</b>&l

65、t;/p><p>  if(num[i]<a.num[i])</p><p>  return true;</p><p>  else if(num[i]>a.num[i])</p><p>  return false;</p><p><b>  }</b></p>&

66、lt;p>  return false;</p><p><b>  }</b></p><p>  bool operator>(const BigDecimal& a) const</p><p><b>  {</b></p><p>  return a<(*thi

67、s);</p><p><b>  }</b></p><p>  bool operator==(const BigDecimal& a) const</p><p><b>  {</b></p><p>  return !((*this)<a||a<(*this));&l

68、t;/p><p><b>  }</b></p><p>  void print() const // 從高位開始打印</p><p><b>  {</b></p><p>  for(int i=len-1;i>=0;i--)</p><p>  cout <&

69、lt; ((int)num[i]);</p><p>  cout << endl;</p><p><b>  }</b></p><p><b>  };</b></p><p>  string str;</p><p>  bool cal[41][41]

70、[7]; // DP標(biāo)記, true表示dp[i][j][k]已算過, false表示沒有算過</p><p>  BigDecimal dp[41][41][7]; // 存放DP(i,j,k)的結(jié)果</p><p>  int mark[41][41][7]; // 回溯標(biāo)記</p><p>  BigDecimal DP(int i, int j, int k

71、) // 函數(shù)計算輸入從i到j(luò)-1中間插入k個乘號的最大值</p><p><b>  {</b></p><p>  if(cal[i][j][k]) // 如果DP(i,j,k)已經(jīng)算過</p><p>  return dp[i][j][k]; // 返回之前記錄的數(shù)據(jù)</p><p>  cal[i][j][k]

72、 = true; // 標(biāo)記cal[i][j][k]為true,避免以后重復(fù)計算</p><p>  if(j-i<=k) // 如果長度不夠k+1,就塞不下k個乘號,返回0</p><p><b>  {</b></p><p>  dp[i][j][k] = BigDecimal();</p><p>  re

73、turn dp[i][j][k];</p><p><b>  }</b></p><p>  if(k==0) // 如果不需要插入任何乘號</p><p><b>  {</b></p><p>  dp[i][j][k] = BigDecimal(str.substr(i,j-i)); //

74、返回 i到j(luò)-1這個數(shù)</p><p>  return dp[i][j][k];</p><p><b>  }</b></p><p>  BigDecimal temp; // 最后結(jié)果初始化為0</p><p>  mark[i][j][k] = i+1; // 回溯標(biāo)記, 記錄乘號在哪個位置之前</p&g

75、t;<p>  for(int t=i+1;t<j;t++) // 枚舉下一個乘號所有的位置,從i+1到j(luò)-1</p><p><b>  {</b></p><p>  BigDecimal temp2 = DP(i,t,0)*DP(t,j,k-1); // dp遞推式,算式值等于i到t-1的值 * t到j(luò)中間插入k-1個乘號的最大值</p

76、><p>  if(temp < temp2) // 更新temp為較大值</p><p><b>  {</b></p><p>  mark[i][j][k] = t; // 更新回溯標(biāo)記</p><p>  temp = temp2;</p><p><b>  }</b&

77、gt;</p><p><b>  }</b></p><p>  dp[i][j][k] = temp; // 記錄到dp數(shù)組,以后可以直接返回</p><p>  return temp;</p><p><b>  }</b></p><p>  int main()&

78、lt;/p><p><b>  {</b></p><p><b>  int N,K;</b></p><p>  cout << "Please input N and K (2≤N≤40,1≤K≤6):" << endl;</p><p>  cin

79、>> N >> K;</p><p>  cout << "請輸入一個長度為" << N << "的數(shù)字串str:" << endl;</p><p>  cin >> str;</p><p>  if(N>=2&&N&

80、lt;=40&&K>=1&&K<=6)</p><p><b>  {</b></p><p>  if(N!=str.size())</p><p><b>  { </b></p><p>  cout<<"請確保輸入的數(shù)符串的長

81、度=N\n"; </p><p>  return 0; </p><p><b>  } </b></p><p>  if (N<=K) </p><p><b>  { </b></p><p>  cout<<str<<&quo

82、t;中輸入"<<K<<"個乘號不能分成 "<<K<<"+1部分\n"; </p><p>  return 0; </p><p><b>  } </b></p><p>  memset(cal,0,sizeof(cal));</p>

83、;<p>  cout << "所求得的最大乘積:" ;</p><p>  BigDecimal ans = DP(0,str.size(),K);</p><p>  int temp = K;</p><p>  int tempstart = 0;</p><p>  while(temp

84、)</p><p><b>  {</b></p><p>  cout << str.substr(tempstart,mark[tempstart][str.size()][temp]-tempstart) << " * ";</p><p>  tempstart = mark[tempstar

85、t][str.size()][temp];</p><p><b>  temp--;</b></p><p><b>  }</b></p><p>  cout << str.substr(tempstart,str.size()-tempstart) << " = ";&l

86、t;/p><p>  ans.print();</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  cout<<"請重新輸入N

87、和K(2≤N≤40,1≤K≤6)"<<endl; </p><p><b>  }</b></p><p>  六、程序運行、調(diào)試和結(jié)果分析</p><p>  1.程序運行中出現(xiàn)的問題及調(diào)試手段(包括異常處理)</p><p>  本次程序設(shè)計以方法一為主,程序的開始的輸入運行過程,會有很多的錯誤

88、,像大小寫輸入錯誤,”{}”忘記輸入等,還有一些語句上的錯誤導(dǎo)致程序運行不出結(jié)果,經(jīng)過多次的調(diào)試,本程序基本上可以實現(xiàn)計算要求。以下列舉出程序調(diào)試過程中出現(xiàn)的部分錯誤:</p><p><b>  (1)</b></p><p><b>  程序報錯:</b></p><p><b>  {</b>&

89、lt;/p><p>  maxproduct(num,n,k); </p><p>  cout<<num<<"中輸入"<<k<<"個乘號分成"<<k<<"+1部分的最大乘積= \n"; </p><p>  for(vector<s

90、tring>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p><p>  cout<<(*p).c_str(); </p><p>  if (p==result.end()-1) </p><p>

91、  {cout<<" = "; </p><p><b>  }</b></p><p><b>  else </b></p><p>  cout<<"*"; </p><p><b>  } </b><

92、/p><p>  cout<< maxProduct<<endl; </p><p><b>  }</b></p><p>  程序修改:刪除第一行maxproduct前面的“{”;</p><p><b>  (2)</b></p><p>  沒有n

93、的輸入語句,直接要求輸入數(shù)字,不符合題目要求。程序修改如下:</p><p>  void main() </p><p><b>  { </b></p><p><b>  int k,n; </b></p><p>  cout<<"Please input num an

94、d k:\n"; </p><p>  cin>>num>>k; </p><p>  if (num[0]=='0') </p><p><b>  { </b></p><p>  cout<<"Be sure a number should b

95、egin with non 0\n"; </p><p><b>  return; </b></p><p><b>  } </b></p><p>  n = strlen(num); </p><p>  if (n < k) </p><p><

96、;b>  { </b></p><p>  cout<<num<<" does not have a "<<k<<" product!"; </p><p><b>  return; </b></p><p><b>  } &

97、lt;/b></p><p>  if(n > BUFFERSIZE) </p><p><b>  { </b></p><p>  cout<<"Buffer overload,size="<<BUFFERSIZE<<endl; </p><p>&

98、lt;b>  return; </b></p><p><b>  } </b></p><p>  kproduct(num,n,k); </p><p>  cout<<num<<"'s max K product is "; </p><p> 

99、 for(vector<string>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p><p>  cout<<(*p).c_str(); </p><p>  if (p==result.end()-1) </

100、p><p>  cout<<" = "; </p><p><b>  else </b></p><p>  cout<<"*"; </p><p><b>  } </b></p><p>  cout<&

101、lt;KProduct<<endl; </p><p><b>  }</b></p><p><b>  修改為:</b></p><p>  void main() </p><p><b>  { </b></p><p><b&

102、gt;  int k,n; </b></p><p>  cout<<"Please input n and k (2≤N≤40,1≤K≤6):\n"; </p><p>  cin>>n>>k;</p><p>  cout<<"Please input num:\n&quo

103、t;;</p><p><b>  cin>>num;</b></p><p>  if(n>=2&&n<=40&&k>=1&&k<=6)</p><p><b>  {</b></p><p>  if(n !=s

104、trlen(num))</p><p><b>  { </b></p><p>  cout<<"請確保輸入的字符串的長度=n\n"; </p><p><b>  return; </b></p><p><b>  } </b></p

105、><p>  if (n<=k) </p><p><b>  { </b></p><p>  cout<<num<<"中輸入"<<k<<"個乘號不能分成 "<<k<<"+1部分\n"; </p>

106、<p><b>  return; </b></p><p><b>  } </b></p><p>  maxproduct(num,n,k); </p><p>  cout<<num<<"中輸入"<<k<<"個乘號分成&quo

107、t;<<k<<"+1部分的最大乘積= \n"; </p><p>  for(vector<string>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p><p>  cout<&

108、lt;(*p).c_str(); </p><p>  if (p==result.end()-1) </p><p>  {cout<<" = "; </p><p><b>  }</b></p><p><b>  else </b></p>&l

109、t;p>  cout<<"*"; </p><p><b>  } </b></p><p>  cout<< maxProduct<<endl; </p><p><b>  }</b></p><p><b>  else&

110、lt;/b></p><p>  cout<<"請重新輸入n和k(2≤N≤40,1≤K≤6)"; </p><p><b>  }</b></p><p><b>  (3)</b></p><p>  未考慮到n和k的取值范圍:</p><

111、p><b>  程序修改如下: </b></p><p>  void main() </p><p><b>  { </b></p><p><b>  int k,n; </b></p><p>  cout<<"Please input n

112、and k:\n"; </p><p>  cin>>n>>k;</p><p>  cout<<"Please input num:\n";</p><p><b>  cin>>num;</b></p><p>  if(n !=strle

113、n(num))</p><p><b>  { </b></p><p>  cout<<"請確保輸入的字符串的長度=n\n"; </p><p><b>  return; </b></p><p><b>  } </b></p>

114、<p>  if (n ==k) </p><p><b>  { </b></p><p>  cout<<num<<" 不能分成 "<<k<<"+1部分"; </p><p><b>  return; </b><

115、;/p><p><b>  } </b></p><p>  Maxproduct(num,n,k); </p><p>  cout<<num<<"中輸入"<<k<<"個乘號分成"<<k<<"+1的最大乘積= ";

116、</p><p>  for(vector<string>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p><p>  cout<<(*p).c_str(); </p><p>  if (p=

117、=result.end()-1) </p><p>  cout<<" = "; </p><p><b>  else </b></p><p>  cout<<"*"; </p><p><b>  } </b></p>

118、<p>  cout<<MaxProduct<<endl; </p><p><b>  }</b></p><p><b>  修改為:</b></p><p>  void main() </p><p><b>  { </b><

119、;/p><p><b>  int k,n; </b></p><p>  cout<"Please input n and k (2≤N≤40,1≤K≤6):\n"; </p><p>  cin>>n>>k;</p><p>  cout<<"Ple

120、ase input num:\n";</p><p><b>  cin>>num;</b></p><p>  if(n>=2&&n<=40&&k>=1&&k<=6)</p><p><b>  {</b></p>

121、<p>  if(n !=strlen(num))</p><p><b>  { </b></p><p>  cout<<"請確保輸入的字符串的長度=n\n"; </p><p><b>  return; </b></p><p><b>

122、  } </b></p><p>  if (n<=k) </p><p><b>  { </b></p><p>  cout<<num<<"中輸入"<<k<<"個乘號不能分成 "<<k<<"+1部分\

123、n"; </p><p><b>  return; </b></p><p><b>  } </b></p><p>  maxproduct(num,n,k); </p><p>  cout<<num<<"中輸入"<<k<

124、;<"個乘號分成"<<k<<"+1部分的最大乘積= \n"; </p><p>  for(vector<string>::iterator p=result.begin(); p!=result.end(); p++) </p><p><b>  { </b></p>

125、<p>  cout<<(*p).c_str(); </p><p>  if (p==result.end()-1) </p><p>  {cout<<" = "; </p><p><b>  }</b></p><p><b>  else <

126、/b></p><p>  cout<<"*"; </p><p><b>  } </b></p><p>  cout<< maxProduct<<endl; </p><p><b>  }</b></p><p

127、><b>  else</b></p><p>  cout<<"請重新輸入n和k(2≤N≤40,1≤K≤6)"; </p><p><b>  }</b></p><p>  2.程序運行結(jié)果分析(多組數(shù)據(jù)測試)</p><p>  本次程序設(shè)計以方法一為主,

128、一下測試數(shù)據(jù)與結(jié)果分析均為方法一測試結(jié)果。</p><p> ?。?)輸入一串字符串和兩個自然數(shù)n、k(2≤n≤40,1≤k≤6)時的運行結(jié)果如下:</p><p>  分別輸入n和k,使n和k在限定范圍內(nèi),程序正常運行,輸入三個數(shù)1、2、3,插入一個乘號,一共有兩種插入方法:1*23=23</p><p><b>  12*3=36</b>&

129、lt;/p><p>  由題目要求,輸出結(jié)果應(yīng)為12*3=36,與實際輸出結(jié)果相同,程序運行結(jié)果正確,運行正常。</p><p> ?。?)輸入一串字符串和兩個自然數(shù)n、k,且(n<2‖n>40‖k>6)時的運行結(jié)果如下:</p><p>  分別輸入n和k,使 n=k,輸入不符合題目要求,按照程序設(shè)定,應(yīng)當(dāng)輸出“請重新輸入n和k(2≤N≤40,1≤k

130、≤6)”,程序?qū)嶋H運行結(jié)果正確,運行正常。</p><p> ?。?)輸入一串字符串和兩個自然數(shù)n、k(2≤kn≤40,1≤k≤6),當(dāng)字符串的長度不等于n時的運行結(jié)果:</p><p>  分別輸入n和k,使n不等于字符串的長度,輸入不符合題目要求,按照程序設(shè)定,應(yīng)當(dāng)輸出“請確保輸入的字符串長度=n”,程序?qū)嶋H運行結(jié)果正確,運行正常。</p><p> ?。?)輸

131、入一串字符串和兩個自然數(shù)n、k(2≤n≤40,1≤k≤6),當(dāng)n≤k時的運行結(jié)果:</p><p>  分別輸入n和k,使n≤k,輸入不符合題目要求,按照程序設(shè)定,應(yīng)當(dāng)輸出“***(num)中輸入*(k)個乘號不能分成**(k+1)個部分”,程序?qū)嶋H運行結(jié)果正確,運行正常。</p><p><b>  七、總結(jié)與體會</b></p><p> 

132、 本次C++程序設(shè)計為編寫一個程序,實現(xiàn)將一個的數(shù)字串,分成K+1個部分,使得這K+1個部分的乘積能夠為最大,主要運用的思想是遞歸調(diào)用+回溯+向量容器。</p><p>  第一次使用C++進行程序設(shè)計,從重新了解熟悉面向?qū)ο蟮幕靖拍?,研究面向?qū)ο蟮能浖ちP的流程,從問題分析到程序設(shè)計,編寫程序段,最后調(diào)試程序,編寫文檔,歷時約半個月。從實踐中學(xué)習(xí)從來都是最好的學(xué)習(xí)方式,從本次程序編寫過程中,我們才發(fā)現(xiàn)了日常學(xué)

133、習(xí)中,我們所存在的大量問題,比如知識掌握不牢靠,能看不能寫,眼高手低,不能很好的運用面向?qū)ο蟮乃枷?,很容易受面向過程的思想左右,編程缺少面向?qū)ο笏枷胍蛴械膸状笠?。通過此次課程設(shè)計,我們對面向?qū)ο笏枷胗辛诉M一步的了解,明白了面向?qū)ο笾蓄?、對象、封裝、繼承、多態(tài)性等特點,并將這些必要環(huán)節(jié)應(yīng)用于我們的程序編寫當(dāng)中。同時我發(fā)現(xiàn),我的分析問題解決問題的能力亟待提高。</p><p>  程序設(shè)計的過程中,我通過查閱書籍,

134、網(wǎng)絡(luò)資源檢索,與朱珍珍同學(xué)積極的討論,相互交流思想,來解本次設(shè)計中所面臨的問題,合作完成本次課程設(shè)計。在課程設(shè)計完成之際,我依舊感覺到這次課程設(shè)計的困難,感覺力不從心,但通過老師的悉心教導(dǎo)、書籍查閱、跟同學(xué)們之間的溝通與交流后,確實學(xué)會了很多東西。從頭文件、變量設(shè)計、表達式、算法、語句、函數(shù)到繁星程序設(shè)計與C++標(biāo)準(zhǔn)模板庫,雖然說了解都不很深入,應(yīng)用也不熟練,考慮問題也不夠成熟,但是有不足才會有進步,有不懂才會去有求知的欲望,當(dāng)問題擺在

135、我們面前的時候,我們不得不逼自己去面對,在面對之后,自我強迫之后,才發(fā)現(xiàn)其實并沒有自己想象的那么困難。 </p><p>  在網(wǎng)上搜索了很多相似的語句,但是都不符合題意,同時也存在大量的問題和錯誤,為了解決這些問題,完善程序,我花了大量的時間去搞懂每一個語句的意思,主函數(shù)和調(diào)用函數(shù)的編寫,這不僅僅是在課程上、知識上對自己的強化和鍛煉,更是一種心理上的考驗,充分的鍛煉了我的耐心、細心。</p>&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論