C语言面向对象程序设计7_第1页
C语言面向对象程序设计7_第2页
C语言面向对象程序设计7_第3页
C语言面向对象程序设计7_第4页
C语言面向对象程序设计7_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.MFC类库及程序框架Windows编程思想:事件驱动,即靠消息循环机制实现消息举例:Word中用户选择菜单中的打印,即向该文档的 的printer对象发消息程序根据消息执行相应的方法(即成员函数)当启动一个面向对象程序时,程序将做:创建对象;通过消息处理对象,即执行对象的方法,删除对象;Windows应用程序的四种消息来源:1.输入消息:鼠标键盘输入的消息2.控制消息:用户改变控制状态时的消息3.系统消息:如创建窗口的消息4.用户消息:用户定义并在程序中主动发送的消息消息映射表典型windows应用程序结构:1.控制台应用程序(ConsoleApplication)2.基于框架窗口的应用程序(Win32Application):

用CFrameWnd派生类产生对象3.基于对话框的应用程序(MFCAppWizard(exe)):

用Cdialog派生类产生对象4.基于文档/视图结构的应用程序(MFCAppWizard(exe))两种类型:单文档界面;多文档界面;单文档界面:例记事本、写字板、终端仿真界面等多文档界面:例Word、Powerpoint、Excel、VC++等 多文档界面有一个当前活动窗口,有窗口菜单特点:将数据操作与数据显示分开,数据操作在文档中 数据显示在视图中;系统支持的功能多;但系统的 辅助代码也多。程序举例:第一种已建立过;第二种,见例子test1,test2,test3第三种,见例子第四种,单文档界面:见例子test4

多文档界面;见例子所有四种程序结构中,多文档界面结构最复杂,功能也最强9.面向对象程序设计(Object-orientedprogramming)

类是一种对事物对象的抽象,并提倡多层次的抽象;

类的组合:

表示事物对象之间的联系。面向对象方法的四个特点:抽象、封装、继承、多态

类的定义是将数据与处理数据的方法封装在一起,可以隐藏数据,并通过对象访问数据

多态:同样的消息被不同的对象接受时产生不同的方法,如:打印文档时,打印文本和打印图像的方法不同。

继承机制使程序在已有基础上进行更具体的定义,代码可以重用,软件工程Josephus问题:

n个孩子围成一圈玩游戏,从第i个孩子开始数,数到m,则该小孩离开,接着继续数,找到下一个需离开的孩子,…如此玩下去,圈子只剩下最后一个孩子,该孩子为胜利者。请编一个程序,求Josephus问题的胜利者,已知:共有n个孩子,每次数m个小孩则离开一个,第一次从第i个孩子开始数。考虑问题的方法:1.用什么数据类型存放n个孩子,如何表示n个孩子;2.在这种存放方式下,用什么算法求解Josephus问题的胜利者。该问题可以用多种方法编写程序:不同的存放结构,则有不同的实现程序(即算法)。如:数组方式存放,见教材第140页;结构链表存放,见教材第227页;main(){

读初值:小孩总数、数小孩间隔数、第一次数的位置; 建立小孩结构数组并初始化; 初始化环链表;

while(当链表中有一个以上节点时){

找下一个应离队的节点并输出;

从链表中删除该节点; }

输出最后一个节点(即胜利者)} 改进链表,用结构化的函数模块方法实现:建立以下几个函数模块:

1.数据初始化:孩子总数,数孩子的间隔数,开始数的位置

2.环链表初始化,即建立环链表

3.按照间隔数m在环链表中数小孩

4.按照离队顺序,输出所有小孩,并给出胜利者节点类型定义(即一个小孩):structJose{ intcode; Jose*next;};其函数声明如下:1.intassign(int*,int*,int*)

三个参数分别为指向总数、间隔数、开始位置的指针 函数返回值为1,则初始化成功;为0,则失败2.Jose*initial(int,Jose*)

两个参数分别为总数和结构指针,指向待初始化的结构数组 函数返回值为指向环链表的最后一个节点的指针123n-1n...3.Jose*count(int,Jose*)

两个参数分别为数小孩的个数、当前节点的指针 函数返回值为数了小孩个数后的当前节点的前一个节点的指针4.voidprocess(int,int,Jose*)

三个参数分别为小孩总数、间隔数、当前节点的前一个节点 的指针主函数的定义为:voidmain(){ intn,m,begin; if(!assign(&n,&m,&begin)){ //读入总数n,间隔数m,开始位置begin cout<<“Initialdataerror!”<<endl; //数据初始化出错

return; } Jose*pJose=newJose[n],*pCur,*pivot; //分配n个节点

pCur=initial(pJose); //初始化环链表

pivot=count(begin,pCur); //当前指针指向开始位置

process(n,m,pivot); //按照离队顺序,输出n个小孩

delete[]pJose; //释放n个节点}函数定义: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; //初始化环形链表

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个节点的前一个节点}voidprocess(intn,intm,Jose*pf){ intnline=0; Jose*pcur=pf->next; for(inti=1;i<n-1;i++){ pf=count(m,pcur); //数m个节点

pcur=pf->next; //第m个节点由pcur指向

if((nline++%10)==0) //每行输出10个小孩编号

cout<<endl; cout<<setw(4)<<pcur->code; pf->next=pcur->next; //当前指针所指的节点离队

pcur=pf; } cout<<“\nthewinneris“<<pcur->code<<endl; //输出胜利者}......pcurpf用类定义Josephus问题:首先确定类,类的属性和操作定义两个类:Ring类属性:链表的始地址;当前指针;哨兵指针 操作:按照间隔数确定当前指针;

输出小孩的编号;

将当前小孩从链表中删除;

构造环链表;

析构环链表;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++){ //建立环链表并初始化

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; //静态局部变量,纪录当前行输出的小孩个数

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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论