C語言面向對象程序設計7_第1頁
C語言面向對象程序設計7_第2頁
C語言面向對象程序設計7_第3頁
C語言面向對象程序設計7_第4頁
C語言面向對象程序設計7_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

多文檔界面;見例子所有四種程序結構中,多文檔界面結構最復雜,功能也最強9.面向對象程序設計(Object-orientedprogramming)

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

類的組合:

表示事物對象之間的聯系。面向對象方法的四個特點:抽象、封裝、繼承、多態(tài)

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

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

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

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

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

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

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

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

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

1.數據初始化:孩子總數,數孩子的間隔數,開始數的位置

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

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

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

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

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

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

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

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é)點}函數定義:intassign(int*np,int*mp,int*bp){ inttn,tm,tb; cout<<“請輸入小孩的總數,數的間隔數以及開始數的位置:\n”; cin>>tn>>tm>>tb; if(tn<2){ //校驗小孩總數

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

cerr<<“間隔數輸入要大于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); //返回結構數組的最后一個元素}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); //數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類屬性:鏈表的始地址;當前指針;哨兵指針 操作:按照間隔數確定當前指針;

輸出小孩的編號;

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

構造環(huán)鏈表;

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

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

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類的成員函數#include<iostream.h>#include“jose.h”#include“ring.h”voidJose::assign(){ inttn,tm,tb; cout<<“請輸入小孩的總數,數的間隔數以及開始數的位置:\n”; cin>>tn>>tm>>tb; if(tn<2){ //校驗小孩總數

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

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

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

溫馨提示

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

評論

0/150

提交評論