C語言面向?qū)ο蟪绦蛟O計7_第1頁
C語言面向?qū)ο蟪绦蛟O計7_第2頁
C語言面向?qū)ο蟪绦蛟O計7_第3頁
C語言面向?qū)ο蟪绦蛟O計7_第4頁
C語言面向?qū)ο蟪绦蛟O計7_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

8.MFC類庫及程序框架Windows編程思想:事件驅(qū)動,即靠消息循環(huán)機制實現(xiàn)消息舉例:Word中用戶選擇菜單中的打印,即向該文檔的 的printer對象發(fā)消息程序根據(jù)消息執(zhí)行相應的方法(即成員函數(shù))當啟動一個面向?qū)ο蟪绦驎r,程序?qū)⒆?創(chuàng)建對象;通過消息處理對象,即執(zhí)行對象的方法,刪除對象;Windows應用程序的四種消息來源:1.輸入消息:鼠標鍵盤輸入的消息2.控制消息:用戶改變控制狀態(tài)時的消息3.系統(tǒng)消息:如創(chuàng)建窗口的消息4.用戶消息:用戶定義并在程序中主動發(fā)送的消息消息映射表典型windows應用程序結構:1.控制臺應用程序(ConsoleApplication)2.基于框架窗口的應用程序(Win32Application):

用CFrameWnd派生類產(chǎn)生對象3.基于對話框的應用程序(MFCAppWizard(exe)):

用Cdialog派生類產(chǎn)生對象4.基于文檔/視圖結構的應用程序(MFCAppWizard(exe))兩種類型:單文檔界面;多文檔界面;單文檔界面:例記事本、寫字板、終端仿真界面等多文檔界面:例Word、Powerpoint、Excel、VC++等 多文檔界面有一個當前活動窗口,有窗口菜單特點:將數(shù)據(jù)操作與數(shù)據(jù)顯示分開,數(shù)據(jù)操作在文檔中 數(shù)據(jù)顯示在視圖中;系統(tǒng)支持的功能多;但系統(tǒng)的 輔助代碼也多。程序舉例:第一種已建立過;第二種,見例子test1,test2,test3第三種,見例子第四種,單文檔界面:見例子test4

多文檔界面;見例子所有四種程序結構中,多文檔界面結構最復雜,功能也最強9.面向?qū)ο蟪绦蛟O計(Object-orientedprogramming)

類是一種對事物對象的抽象,并提倡多層次的抽象;

類的組合:

表示事物對象之間的聯(lián)系。面向?qū)ο蠓椒ǖ乃膫€特點:抽象、封裝、繼承、多態(tài)

類的定義是將數(shù)據(jù)與處理數(shù)據(jù)的方法封裝在一起,可以隱藏數(shù)據(jù),并通過對象訪問數(shù)據(jù)

多態(tài):同樣的消息被不同的對象接受時產(chǎn)生不同的方法,如:打印文檔時,打印文本和打印圖像的方法不同。

繼承機制使程序在已有基礎上進行更具體的定義,代碼可以重用,軟件工程Josephus問題:

n個孩子圍成一圈玩游戲,從第i個孩子開始數(shù),數(shù)到m,則該小孩離開,接著繼續(xù)數(shù),找到下一個需離開的孩子,…如此玩下去,圈子只剩下最后一個孩子,該孩子為勝利者。請編一個程序,求Josephus問題的勝利者,已知:共有n個孩子,每次數(shù)m個小孩則離開一個,第一次從第i個孩子開始數(shù)??紤]問題的方法:1.用什么數(shù)據(jù)類型存放n個孩子,如何表示n個孩子;2.在這種存放方式下,用什么算法求解Josephus問題的勝利者。該問題可以用多種方法編寫程序:不同的存放結構,則有不同的實現(xiàn)程序(即算法)。如:數(shù)組方式存放,見教材第140頁;結構鏈表存放,見教材第227頁;main(){

讀初值:小孩總數(shù)、數(shù)小孩間隔數(shù)、第一次數(shù)的位置; 建立小孩結構數(shù)組并初始化; 初始化環(huán)鏈表;

while(當鏈表中有一個以上節(jié)點時){

找下一個應離隊的節(jié)點并輸出;

從鏈表中刪除該節(jié)點; }

輸出最后一個節(jié)點(即勝利者)} 改進鏈表,用結構化的函數(shù)模塊方法實現(xiàn):建立以下幾個函數(shù)模塊:

1.數(shù)據(jù)初始化:孩子總數(shù),數(shù)孩子的間隔數(shù),開始數(shù)的位置

2.環(huán)鏈表初始化,即建立環(huán)鏈表

3.按照間隔數(shù)m在環(huán)鏈表中數(shù)小孩

4.按照離隊順序,輸出所有小孩,并給出勝利者節(jié)點類型定義(即一個小孩):structJose{ intcode; Jose*next;};其函數(shù)聲明如下:1.intassign(int*,int*,int*)

三個參數(shù)分別為指向總數(shù)、間隔數(shù)、開始位置的指針 函數(shù)返回值為1,則初始化成功;為0,則失敗2.Jose*initial(int,Jose*)

兩個參數(shù)分別為總數(shù)和結構指針,指向待初始化的結構數(shù)組 函數(shù)返回值為指向環(huán)鏈表的最后一個節(jié)點的指針123n-1n...3.Jose*count(int,Jose*)

兩個參數(shù)分別為數(shù)小孩的個數(shù)、當前節(jié)點的指針 函數(shù)返回值為數(shù)了小孩個數(shù)后的當前節(jié)點的前一個節(jié)點的指針4.voidprocess(int,int,Jose*)

三個參數(shù)分別為小孩總數(shù)、間隔數(shù)、當前節(jié)點的前一個節(jié)點 的指針主函數(shù)的定義為:voidmain(){ intn,m,begin; if(!assign(&n,&m,&begin)){ //讀入總數(shù)n,間隔數(shù)m,開始位置begin cout<<“Initialdataerror!”<<endl; //數(shù)據(jù)初始化出錯

return; } Jose*pJose=newJose[n],*pCur,*pivot; //分配n個節(jié)點

pCur=initial(pJose); //初始化環(huán)鏈表

pivot=count(begin,pCur); //當前指針指向開始位置

process(n,m,pivot); //按照離隊順序,輸出n個小孩

delete[]pJose; //釋放n個節(jié)點}函數(shù)定義:intassign(int*np,int*mp,int*bp){ inttn,tm,tb; cout<<“請輸入小孩的總數(shù),數(shù)的間隔數(shù)以及開始數(shù)的位置:\n”; cin>>tn>>tm>>tb; if(tn<2){ //校驗小孩總數(shù)

cerr<<“總數(shù)輸入要大于1,\n”; return0; } if(tm<1||tm>tn){ //校驗間隔數(shù)

cerr<<“間隔數(shù)輸入要大于0或小于等于”<<tn<<endl; return0; } if(tb<0){ //校驗開始位置

cerr<<“開始位置輸入要大于等于0\n”; return0; } *np=tn;*mp=tm;*bp=tb; return1;}Jose*initial(intn,Jose*jp){ intnline=0; Jose*px=jp; for(inti=1;i<=n;i++){ px->next=jp+i%n; //初始化環(huán)形鏈表

px->code=i; px=px->next; if((nline++%10)==0) //每行輸出10個小孩編號

cout<<endl; cout<<setw(4)<<i; } cout<<endl; return(jp+n-1); //返回結構數(shù)組的最后一個元素}jppxJose*count(intnum,Jose*pcur){ Jose*ptf; for(inti=0;i<num;i++){ ptf=pcur; pcur=ptf->next; } returnptf; //返回從pcur開始的第num個節(jié)點的前一個節(jié)點}voidprocess(intn,intm,Jose*pf){ intnline=0; Jose*pcur=pf->next; for(inti=1;i<n-1;i++){ pf=count(m,pcur); //數(shù)m個節(jié)點

pcur=pf->next; //第m個節(jié)點由pcur指向

if((nline++%10)==0) //每行輸出10個小孩編號

cout<<endl; cout<<setw(4)<<pcur->code; pf->next=pcur->next; //當前指針所指的節(jié)點離隊

pcur=pf; } cout<<“\nthewinneris“<<pcur->code<<endl; //輸出勝利者}......pcurpf用類定義Josephus問題:首先確定類,類的屬性和操作定義兩個類:Ring類屬性:鏈表的始地址;當前指針;哨兵指針 操作:按照間隔數(shù)確定當前指針;

輸出小孩的編號;

將當前小孩從鏈表中刪除;

構造環(huán)鏈表;

析構環(huán)鏈表;Jose類屬性:總數(shù);間隔數(shù);開始位置 操作:屬性賦初值;處理所有小孩并找出勝利者//文件為ring.hstructBoy{ intcode; Boy*next;};classRing{public: Ring(int); ~Ring(); voidcount(int); voidputboy(); voidclearboy();protected: Boy*pBegin; Boy*pivot; Boy*pCur;};//文件為Ring.cpp,定義Ring類的成員函數(shù)#include<iostream.h>#include<iomanip.h>#include“ring.h”Ring::Ring(intn){ pBegin=newBoy[n]; //分配大小為n的結構數(shù)組

pCur=pBegin; for(inti=1;i<=n;i++){ //建立環(huán)鏈表并初始化

pCur->next=pBegin+i%n; pCur->code=i; putboy(); pCur=pCur->next; } cout<<endl; pCur=pBegin+n-1; //當前指針為結構數(shù)組的最后一個元素}Ring::~Ring(){ delete[]pBegin; //釋放結構數(shù)組}pBeginpCurvoidRing::count(intm){ for(inti=0;i<m;i++){ pivot=pCur; pCur=pivot->next; }}voidRing::putboy(){ staticintnline; //靜態(tài)局部變量,紀錄當前行輸出的小孩個數(shù)

if((nline++%10)==0) cout<<endl; cout<<setw(4)<<pCur->code;}voidRing::clearboy(){ pivot->next=pCur->next; pCur=pivot;}......pcurpivot//文件為jose.hclassJose{public: Jose(intn=10,intm=3,intbegin=1){ numofBoys=n; interval=m; beginPos=begin; } voidassign(); voidgetwinner();protected: intnumofBoys; intinterval; intbeginPos;};//文件為jose.cpp,定義Jose類的成員函數(shù)#include<iostream.h>#include“jose.h”#include“ring.h”voidJose::assign(){ inttn,tm,tb; cout<<“請輸入小孩的總數(shù),數(shù)的間隔數(shù)以及開始數(shù)的位置:\n”; cin>>tn>>tm>>tb; if(tn<2){ //校驗小孩總數(shù)

cerr<<“總數(shù)輸入要大于1,\n”; return; } if(tm<1||tm>tn){ //校驗間隔數(shù)

cerr<<“間隔數(shù)輸入要大于0或小于等于”<<tn<<endl; return; } if(tb<0){ //校驗開始位置

cerr<<“開始位置輸入要大于等于0\n”; return; } numofBoys=tn; //數(shù)據(jù)輸入都合法時

溫馨提示

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

評論

0/150

提交評論