程式設計題 約瑟夫問題 物件導向版

2021-10-14 17:37:49 字數 2207 閱讀 9180

約瑟夫問題有很多變種,我們就選擇其中一種吧,其它都是類似的。

咋一看,這不就是演算法題嘛,搞個環形鍊錶啥的。但是,如果使用物件導向的思維,就很簡單了~~~ 

廢話不說,我們抽象模型:整體上,這是乙個遊戲,有圍圈人、最大叫號數、開始叫號人編號3個屬性和開始遊戲的行為。具體上,每個人有編號、左邊的人、右邊的人3個屬性和叫號的行為。

先看圍圈的人,有編號、左邊的人和右邊的人三個屬性,還有乙個叫號的行為。重點是叫號,入參是叫號數和最大叫號數。邏輯是:

/**

* 圍圈人

*/static class person

if (callnum == maxcallnum) else

}public void setno(int no)

public void setleftperson(person leftperson)

public void setrightperson(person rightperson)

}

現在來看遊戲,屬性有圍圈人陣列、最大叫號數int值、開始叫號人編號int值,並提供乙個全參構造器。

此外,還有乙個開始遊戲的行為,執行時讓指定編號的人叫1。

/**

* 遊戲

*/static class game

/*** 開始遊戲

*/public void start()

}

當然,這只是乙個遊戲模型,怎麼新建乙個遊戲呢?我們提供乙個遊戲工廠,由它來負責建立遊戲,很合理吧?

擁有乙個建立遊戲的行為大家沒有意見吧。傳入幾個遊戲引數,然後校驗、構造圍圈人並且維護環形的關係。

/**

* 遊戲工廠

*/static class gamefactory

// 建立圍圈人陣列

person people = new person[personcount];

for (int i = 0; i < personcount; i++)

// 設定圍圈人關係

for (int i = 0; i < personcount; i++)

return new game(people, maxcallnum, beginperson);}}

來到最興奮的環節了,就用文章開頭那個例子吧,走你!

/**

* 約瑟夫問題是個有名的問題:

結果是對的。唉,就很舒服。

下面附上乙個類裝下的全部**,當然實際別這麼幹?

/**

* 約瑟夫問題是個有名的問題:

*/public class josephus

/*** 遊戲

*/static class game

/*** 開始遊戲

*/public void start()

}/**

* 遊戲工廠

*/static class gamefactory

// 建立圍圈人陣列

person people = new person[personcount];

for (int i = 0; i < personcount; i++)

// 設定圍圈人關係

for (int i = 0; i < personcount; i++)

return new game(people, maxcallnum, beginperson);}}

/*** 圍圈人

*/static class person

if (callnum == maxcallnum) else

}public void setno(int no)

public void setleftperson(person leftperson)

public void setrightperson(person rightperson) }}

物件導向程式設計與面向過程程式設計的區別(翻譯版

應對複雜性的能力不同。我們知道現在存在著兩種不同的程式設計方式 1 面向過程程式設計 pop 以及2 物件導向程式設計。我們可以任意選擇一種方式來編寫程式,但是我們得知道這兩種程式設計方式的區別。這兩種程式設計方式是軟體開發歷經幾十年發展的結果。從計算機被發明起,人們嘗試了很多方法來編寫程式,例如a...

物件導向程式設計2018上機題(1)

從鍵盤輸入r行c列二維整型陣列,找出每一行的次最大值並顯示出來。要求 1 r和c為符號常量 2 二維陣列是動態申請生成的 3 每一行的次最大值是利用單獨的函式呼叫獲得的 4 對陣列元素的訪問以及函式引數宣告等都是利用指標實現的。include includeusing namespace std v...

C 物件導向方法求解約瑟夫環問題

約瑟夫問題有很多種解法及其變種,這裡的約瑟夫環問題是這樣的 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出...