約瑟夫問題有很多變種,我們就選擇其中一種吧,其它都是類似的。
咋一看,這不就是演算法題嘛,搞個環形鍊錶啥的。但是,如果使用物件導向的思維,就很簡單了~~~
廢話不說,我們抽象模型:整體上,這是乙個遊戲,有圍圈人、最大叫號數、開始叫號人編號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的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出...