正在閱讀:理解C++面向?qū)ο蟪绦蛟O(shè)計(jì)中的抽象理論理解C++面向?qū)ο蟪绦蛟O(shè)計(jì)中的抽象理論

2005-03-09 16:44 出處:PConline 作者:管寧 責(zé)任編輯:xietaoming

  很多書在一開(kāi)始就開(kāi)始學(xué)習(xí)josephus問(wèn)題,為了讓大家前面學(xué)起來(lái)較為容易我把前面涉及到此問(wèn)題的地方都故意去掉了,現(xiàn)在我們已經(jīng)學(xué)習(xí)過(guò)了結(jié)構(gòu)體和類,所以放在這里學(xué)習(xí)可能更合適一些。

  在正式開(kāi)始學(xué)習(xí)之前我們先回顧一下如何利用數(shù)組和結(jié)構(gòu)體的方式來(lái)解決,最后我們?cè)倏匆幌氯绾卫妹嫦驅(qū)ο蟮某橄罄砟钸M(jìn)行解決此問(wèn)題的程序設(shè)計(jì),相互對(duì)比,找出效率最高,最容易理解,最方便維護(hù)的程序來(lái),說(shuō)明利用面向?qū)ο蟮某橄罄砟钸M(jìn)行程序設(shè)計(jì)的好處。   josephus問(wèn)題其實(shí)就是一個(gè)游戲,一群小孩圍成一個(gè)圈,設(shè)置一個(gè)數(shù),這個(gè)數(shù)是個(gè)小于小孩總數(shù)大于0的一個(gè)整數(shù),從第一個(gè)小孩開(kāi)始報(bào)數(shù),當(dāng)其中一個(gè)小孩報(bào)到你設(shè)置的那個(gè)數(shù)的時(shí)候離開(kāi)那個(gè)圈,這樣一來(lái)反復(fù)報(bào)下去,直到只剩下最后一個(gè)小孩的時(shí)候那個(gè)小孩就是勝利者,寫程序來(lái)找出這個(gè)小孩。

  以下是數(shù)組方法:

  由于數(shù)組的限制我們必須預(yù)先假設(shè)好有多少個(gè)小孩,離開(kāi)的小孩他自身設(shè)置為0來(lái)標(biāo)記離開(kāi)狀態(tài)。

  代碼如下:

#include <iostream
using namespace std; 
void main() 

  const int num=10; 
  int interval; 
  int a[num]; 
  for(int i=0; i<num; i++) 
  { 
    a[i]=i+1; 
  }  
    cout <<"please input the interval: "; 
  cin >>interval; 
  for(int i=0; i<num; i++) 
  { 
    cout <<a[i] <<","; 
  } 
    cout <<endl; 
 
int k=1; 
int p=-1; 
 
while(1) 

    for(int j=0;j<interval;) 
    { 
        p=(p+1)%num; 
        if(a[p]!=0) 
        { 
            j++; 
        } 
    } 
    if(k==num) 
    { 
        break
    } 
    cout<<a[p]<<","; 
    a[p]=0; 
    k++; 

cout <<"\nNo." <<a[p] <<" boy've won.\n"; 
cin.get(); 
cin.get(); 
}

  就數(shù)組解決來(lái)看,程序簡(jiǎn)短但效率不高可讀性也不好,此代碼沒(méi)有什么特別之處主要依靠一個(gè)加1取模的方式來(lái)回到首位置,形成環(huán)鏈:p=(p+1)%num;。

鍵盤也能翻頁(yè),試試“← →”鍵
302 Found

302 Found


Powered by Tengine
tengine