999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

逢N退出的圖形化算法設(shè)計

2014-12-17 01:42:10衛(wèi)洪春蒲國林王安志
四川文理學(xué)院學(xué)報 2014年5期
關(guān)鍵詞:設(shè)計

衛(wèi)洪春,蒲國林,王安志

(四川文理學(xué)院 計算機(jī)學(xué)院,四川 達(dá)州635000)

1 提出問題

問題描述:有n個人圍成一圈,從編號1開始順序排號,一直到n.從第1個人開始,順次以1,2,…,N循環(huán)報數(shù)(從1到N報數(shù)),凡報到數(shù)字N的人退出圈子,問最后留下的人的編號是多少?[1]如圖1所示.

圖1 初始狀態(tài)

2 求解方式

該問題是一個古老而經(jīng)典的游戲,會在很多場合用到.在計算機(jī)環(huán)境下,也可以有很多處理辦法,如數(shù)組,單向循環(huán)鏈表等.例如在C++環(huán)境中以數(shù)組方式實現(xiàn)的代碼如下:

#include<iostream>

#define NUM 13 //總?cè)藬?shù)

using namespace std;

void main(){ int num = NUM,flag=1,numArray[NUM+1];

for(int i=0;i< NUM+1;i++)numArray[i]=i;//初始化一維數(shù)組的元素

while(num !=1){ //若當(dāng)前狀態(tài)下剩余的人數(shù)num大于1.

for(i=1;i< NUM+1;i++){

if(numArray[i]!=0){//若數(shù)組的第i個元素不為零

if(flag==3){flag=0;numArray[i]=0;num--;}

flag++;}} }

for(i=1;i< NUM+1;i++)

if(numArray[i]!=0)cout<<"最后剩下的人的編號是:"<<numArray[i]<<"\n\n";

求解結(jié)果:最后剩下的人的編號是:13

上述算法是利用C++的一維數(shù)組實現(xiàn).由于是n個人圍成一圈,可利用單向鏈表來完成.但在控制臺模式下對該問題的求解過程不直觀.本文探討圖形模式下該問題運(yùn)算過程的動態(tài)演示.在圖形模式下對該算法實現(xiàn)過程,關(guān)鍵是將控制臺下的輸出語句轉(zhuǎn)換為圖形繪制.下面分析利用面向?qū)ο蠹夹g(shù),[2]結(jié)合鏈表的相關(guān)知識[3]實現(xiàn)該問題在圖形模式下的運(yùn)算過程.

3 設(shè)計類

3.1 Cperson人員類的設(shè)計

CPerson類是問題中每個人所共有的屬性和方法.數(shù)據(jù)成員包括人員編號,是否繪制該人員編號的標(biāo)識,人員占位所需的坐標(biāo)與寬度;成員函數(shù)包括構(gòu)造函數(shù)、析構(gòu)函數(shù)、繪制某個人員的繪圖函數(shù)、相關(guān)的設(shè)置函數(shù)等.所有成員均設(shè)計成public,見表1.

類Cperson的實現(xiàn):

CPerson::~CPerson(){ } Person::CPerson(){flag=FALSE;}//所有標(biāo)識為假

CPerson::CPerson(int x,int y,int halfw,int number){//初始化該對象的相關(guān)數(shù)據(jù)成員

this->x=x;this->y=y(tǒng);this->halfw=halfw;his->number=number;flag=TRUE;}

表1 類CPerson的結(jié)構(gòu)

voidCPerson::DrawPerson(bool flg,CDC*pDC){

//繪制占位;標(biāo)識為真則繪制該對象的編號,否則繪不繪制

if(flg){char a[2];itoa(number,a,10);pDC->TextOut(x-8,y-5,a);}

else pDC- >TextOut(x-8,y-5,""); }

voidCPerson::SetFlag(bool flag){this- >flag=flag;}

voidCPerson::setNum(int i){this->number=0;}

3.2 結(jié)點Node類的設(shè)計

節(jié)點類Node中定義了兩個數(shù)據(jù)成員,一個是保存Cperson類的對象數(shù)據(jù)的m_Data,另一個是指向下一節(jié)點的指針域Node*m_Next.對Node類的操作有如下函數(shù)來完成.為操作方便,所有成員均設(shè)計為public,見表2.

表2 類Node的結(jié)構(gòu)

類Node的實現(xiàn):

Node::Node(){m_Next= NULL;}//無參構(gòu)造函數(shù),指針域不指向任何結(jié)點

Node::~Node(){if(m_Next)delete m_Next;}

Node::Node(CPerson data){m_Data=da-ta;m_Next= NULL; }

Node::Node(CPerson data,Node*next){m_Data=data;m_Next=next; }

void Node::setData(CPerson data){m_Data=data;}

CPerson Node::getData(){return m_Data;}

voidNode::setNext(Node*next){m_Next=next;}

Node*Node::getNext(){return m_Next;}

3.3 單向循環(huán)鏈表LinkList類的設(shè)計

鏈表與數(shù)組相似,一個鏈表代表一個線性數(shù)據(jù)序列,但是這兩種數(shù)據(jù)結(jié)構(gòu)存在不同之處.創(chuàng)建數(shù)組是一次性開辟一整塊內(nèi)存空間.創(chuàng)建鏈表則可以先只創(chuàng)建一個鏈表頭,鏈表中的其他結(jié)點可在需要時動態(tài)創(chuàng)建并加入到鏈表中.鏈表是由節(jié)點組成的非連續(xù)的動態(tài)線性數(shù)據(jù)結(jié)構(gòu),適合于處理數(shù)據(jù)序列中數(shù)據(jù)數(shù)目不定,且插入和刪除較多的問題.

由此問題的描述,很自然想到用單向循環(huán)鏈表來實現(xiàn).在結(jié)點類Node的基礎(chǔ)上,設(shè)計單向循環(huán)鏈表類LinkList,其數(shù)據(jù)成員為鏈表的頭結(jié)點m_FirstNode及最后一個結(jié)點m_LastNode.其操作如表3所示.

表3 類LinkList的結(jié)構(gòu)

類LinkList的實現(xiàn):

#define RADIUS 100

LinkList::LinkList(){m_FirstNode =NULL;m_LastNode= NULL;}//建立空鏈表

LinkList::LinkList(CPerson data){m _FirstNode=new Node(data);

m_FirstNode->m_Next=m_FirstNode;m_LastNode=m_FirstNode;

}//建立只有一個節(jié)點的鏈表

LinkList::~LinkList(){//析構(gòu)函數(shù),刪除指向頭、尾結(jié)點的指針

if(m_FirstNode!= NULL){delete m_FirstNode;m_FirstNode= NULL;}

if(m_LastNode!= NULL){delete m_LastNode;delete m_LastNode;} }

voidLinkList::insertAtBegin(CPerson data){//生成數(shù)據(jù)節(jié)點并插到鏈表的開頭

if(m_FirstNode== NULL){//若是空鏈表,直接插入

m_FirstNode= new Node(data);m_First-Node->m_Next= m_FirstNode;

m_LastNode=m_FirstNode; //尾結(jié)點指向第一個生成的結(jié)點

}else{//把新節(jié)點插在第一個節(jié)點前,并指向原來的第一節(jié)點

m_FirstNode= new Node(data,m_First-Node);//生成新的結(jié)點

m_LastNode->m_Next= m_First-Node;//尾結(jié)點的指針域指向頭結(jié)點

} }

voidLinkList::remove(){//刪除鏈表中的某個節(jié)點

m_FirstNode->m_Next= m_FirstNode->m_Next->m_Next;

m_FirstNode= m_FirstNode->m_Next;

voidLinkList::removeAll(){//刪除所有的節(jié)點,使鏈表為空

if(m_FirstNode!= NULL){delete m_FirstNode;m_FirstNode= NULL;}

if(m_LastNode!= NULL){delete m_LastNode;delete m_LastNode;} }

voidLinkList::Move(CRect rect,CDC *pDC){

int cx,cy,i; int m_PersonNum =13;//待報數(shù)的總?cè)藬?shù)

double theta,radius;//人員占位所需的圓的半徑及單位圓心角

theta= 2*3.1415926/m_PersonNum;//單位角度

radius=RADIUS;int meetN=3;//逢3退出

cx= (rect.right-rect.left)/2;//當(dāng)前客戶區(qū)的中間位置坐標(biāo)

cy= (rect.bottom-rect.top)/2;

for(i= m_PersonNum;i>=1;i--){//向空鏈表中插入m_PersonNum個節(jié)點

CPerson person( //生成編號為i的Cperson對象

cx+int(RADIUS*sin((i-1)*theta)),cy+int(RADIUS*cos((i-1)*theta)),16,i);

insertAtBegin(person);//新生成的對象加入到鏈表中

Node*pn= m_FirstNode;//初始狀態(tài),繪制所有結(jié)點

pn- >getData().DrawPerson(TRUE,pDC);

for(i=0;i< m_PersonNum;i++){pn=pn->m_Next;

pn- >getData().DrawPerson(TRUE,pDC);

}Sleep(2000);

int p= m_PersonNum; //當(dāng)前鏈表中的人數(shù)p

i=0; //計數(shù)器i用于報數(shù)

if(p!=0){ //當(dāng)鏈表中當(dāng)前的人數(shù)p不等于0時

while(p>1){i++;

if(i< meetN ){

if(i==meetN-1){若報數(shù)達(dá)到N,則不繪制該結(jié)點,并刪除它,人數(shù)p減1

m_FirstNode->m_Next->getData().DrawPerson(false,pDC);

remove();p--;i=0;Sleep(1500);}

elsem_FirstNode=m_FirstNode->m_Next;

}}}}

4 集成與實現(xiàn)

在VC6.0環(huán)境下,創(chuàng)建基于單文檔的 MFC工程CMeetNOut_M(jìn)FC,在該工程中加入已設(shè)計的Cperson類、Node類及LinkList類.在菜單上添加標(biāo)識為ID_BEGIN的命令,在視圖類中添加該命令的響應(yīng)函數(shù)OnBegin(),在該函數(shù)中完成對所給問題的處理,[4-5]其過程如下:

voidCMeetNOut_M(jìn)FCView::OnBegin(){ RedrawWindow();

CDC*pDC = GetDC();CRect rect;Get-ClientRect(&rect);

LinkList plist;plist.Move(rect,pDC);ReleaseDC(pDC); }

編譯運(yùn)行后,可在窗口中看到每次報數(shù)過程中被移出的人的編號,從而達(dá)到可視化演示的目的.運(yùn)算過程如圖2-圖4所示,圖4是運(yùn)算的最后結(jié)果.

圖2 退出狀態(tài)1

圖3 退出狀態(tài)2

圖4 結(jié)束

5 結(jié)語

本文探討并實現(xiàn)了“循環(huán)報數(shù)、逢N退出”問題的圖形化求解過程.它綜合運(yùn)用了面向?qū)ο蠹夹g(shù)設(shè)計類,利用數(shù)據(jù)結(jié)構(gòu)的知識設(shè)計單向循環(huán)鏈表,利用VC6.0的MFC技術(shù)對圖形環(huán)境的支持,使實際問題的處理過程以圖形化形式表現(xiàn)出來,達(dá)到了求解過程的可視化效果.

[1]譚浩強(qiáng),張基溫.C語言程序設(shè)計教程:第3版[M].北京:高等教育出版社,2008:188.

[2]鄭 莉,董 淵,何江舟.C++語言程序設(shè)計:第4版[M].北京:清華大學(xué)出版社,2011:98-122.

[3]王曉東.數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計[M].北京:機(jī)械工業(yè)出版社,2012:32-34.

[4]衛(wèi)洪春.掃描線多邊形區(qū)域填充算法研究[J].四川文理學(xué)院學(xué)報,2012(5):77-82.

[5]沈 榮,廖 婷.圖形對象拾取技術(shù)在開發(fā)CAD系統(tǒng)中的應(yīng)用[J].四川文理學(xué)院學(xué)報,2012(5):76-77.

猜你喜歡
設(shè)計
二十四節(jié)氣在平面廣告設(shè)計中的應(yīng)用
河北畫報(2020年8期)2020-10-27 02:54:06
何為設(shè)計的守護(hù)之道?
《豐收的喜悅展示設(shè)計》
流行色(2020年1期)2020-04-28 11:16:38
基于PWM的伺服控制系統(tǒng)設(shè)計
電子制作(2019年19期)2019-11-23 08:41:36
基于89C52的32只三色LED搖搖棒設(shè)計
電子制作(2019年15期)2019-08-27 01:11:50
基于ICL8038的波形發(fā)生器仿真設(shè)計
電子制作(2019年7期)2019-04-25 13:18:16
瞞天過海——仿生設(shè)計萌到家
設(shè)計秀
海峽姐妹(2017年7期)2017-07-31 19:08:17
有種設(shè)計叫而專
Coco薇(2017年5期)2017-06-05 08:53:16
從平面設(shè)計到“設(shè)計健康”
商周刊(2017年26期)2017-04-25 08:13:04
主站蜘蛛池模板: 狠狠亚洲婷婷综合色香| 亚洲国内精品自在自线官| 黄色不卡视频| V一区无码内射国产| 露脸一二三区国语对白| 69av免费视频| 91福利片| 亚洲欧美日韩成人高清在线一区| 国产一在线| 在线精品视频成人网| 国产喷水视频| 欧洲av毛片| AⅤ色综合久久天堂AV色综合| 伊人国产无码高清视频| 日本国产在线| 欧洲欧美人成免费全部视频| 国产永久在线观看| 成人午夜网址| 午夜激情婷婷| 日韩一区二区在线电影| 中文字幕伦视频| 天天干伊人| 国产精品久久自在自2021| 91精品啪在线观看国产91九色| 99久久精品国产麻豆婷婷| 日本午夜影院| 日韩毛片视频| 一级毛片在线免费看| 国产成人三级| 国产亚洲视频在线观看| 热re99久久精品国99热| 亚洲日本一本dvd高清| 國產尤物AV尤物在線觀看| 亚洲AV一二三区无码AV蜜桃| 91啪在线| a国产精品| 亚洲第一网站男人都懂| 一级在线毛片| 亚洲视频无码| 久草视频福利在线观看| a级毛片免费看| 精品久久高清| 亚洲男人的天堂网| 国产成人精品在线1区| 任我操在线视频| 99热这里只有精品国产99| 91亚瑟视频| 久久毛片免费基地| 亚洲综合片| 午夜三级在线| 国产91透明丝袜美腿在线| 成人年鲁鲁在线观看视频| 国产乱人伦精品一区二区| 欧美午夜一区| 免费一级毛片在线观看| 亚洲无码视频一区二区三区 | 欧美a在线看| 首页亚洲国产丝袜长腿综合| 国产精品一线天| 伊人激情综合| 免费观看精品视频999| 9999在线视频| 日本午夜视频在线观看| 亚洲成人一区在线| 亚洲 欧美 日韩综合一区| 亚洲第一综合天堂另类专| 亚洲国产精品无码久久一线| 亚洲一区黄色| 亚洲精品片911| 亚洲精品成人片在线播放| 亚洲最新地址| 国产一级α片| 国产97公开成人免费视频| 美女内射视频WWW网站午夜 | 亚洲成人黄色在线观看| 91青青草视频在线观看的| 国产人免费人成免费视频| 69综合网| 草逼视频国产| 色男人的天堂久久综合| 国产av无码日韩av无码网站| 永久免费无码成人网站|