




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8. MFC类库及程序框架,Windows编程思想: 事件驱动, 即靠消息循环机制实现,消息举例: Word中用户选择菜单中的打印, 即向该文档的 的printer对象发消息 程序根据消息 执行相应的方法 (即成员函数),当启动一个面向对象程序时, 程序将做: 创建对象; 通过消息处理对象, 即执行对象的方法, 删除对象;,Windows应用程序的四种消息来源: 1. 输入消息: 鼠标键盘输入的消息 2. 控制消息: 用户改变控制状态时的消息 3. 系统消息: 如创建窗口的消息 4. 用户消息: 用户定义并在程序中主动发送的消息,消息映射表,典型windows应用程序结构: 1. 控制台应用程
2、序(Console Application) 2. 基于框架窗口的应用程序(Win32 Application): 用CFrameWnd派生类产生对象 3. 基于对话框的应用程序(MFC AppWizard(exe): 用Cdialog派生类产生对象,4. 基于文档/视图结构的应用程序(MFC AppWizard(exe) 两种类型:单文档界面;多文档界面; 单文档界面:例记事本、写字板、终端仿真界面等 多文档界面:例Word、Powerpoint、Excel、VC+等 多文档界面有一个当前活动窗口,有窗口菜单 特点:将数据操作与数据显示分开,数据操作在文档中 数据显示在视图中;系统支持的功能
3、多;但系统的 辅助代码也多。,程序举例: 第一种已建立过; 第二种,见例子 test1, test2, test3 第三种,见例子 第四种,单文档界面:见例子 test4 多文档界面;见例子 所有四种程序结构中,多文档界面结构最复杂,功能也最强,9. 面向对象程序设计 (Object-oriented programming),类是一种对事物对象的抽象,并提倡多层次的抽象; 类的组合: 表示事物对象之间的联系。,面向对象方法的四个特点: 抽象、封装、 继承、多态,类的定义是将数据与处理数据的方法封装在一起, 可以隐藏数据,并通过对象访问数据,多态:同样的消息被不同的对象接受时产生不同的 方法,
4、如:打印文档时,打印文本和打印图像的方法不同。,继承机制使程序在已有基础上进行更具体的定义, 代码可以重用,,软件工程,Josephus问题:,n个孩子围成一圈玩游戏,从第i个孩子开始数,数到m, 则该小孩离开,接着继续数,找到下一个需离开的孩子, 如此玩下去,圈子只剩下最后一个孩子,该孩子为胜利者。 请编一个程序,求Josephus问题的胜利者,已知: 共有n个孩子,每次数m个小孩则离开一个,第一次从第i个 孩子开始数。,考虑问题的方法: 1. 用什么数据类型存放n个孩子,如何表示n个孩子; 2. 在这种存放方式下,用什么算法求解Josephus问题的胜利者。,该问题可以用多种方法编写程序:
5、 不同的存放结构,则有不同的实现程序(即算法)。如: 数组方式存放,见教材第140页; 结构链表存放,见教材第227页;,main() 读初值: 小孩总数、数小孩间隔数、第一次数的位置; 建立小孩结构数组并初始化; 初始化环链表; while(当链表中有一个以上节点时) 找下一个应离队的节点并输出; 从链表中删除该节点; 输出最后一个节点(即胜利者) ,改进链表,用结构化的函数模块方法实现: 建立以下几个函数模块: 1. 数据初始化: 孩子总数, 数孩子的间隔数, 开始数的位置 2. 环链表初始化, 即建立环链表 3. 按照间隔数m在环链表中数小孩 4. 按照离队顺序, 输出所有小孩, 并给出
6、胜利者 节点类型定义(即一个小孩): struct Jose int code; Jose * next; ; 其函数声明如下: 1. int assign(int *, int *, int *) 三个参数分别为指向总数、间隔数、开始位置的指针 函数返回值为1,则初始化成功;为0,则失败 2. Jose * initial(int , Jose *) 两个参数分别为总数和结构指针, 指向待初始化的结构数组 函数返回值为指向环链表的最后一个节点的指针,3. Jose * count(int, Jose *) 两个参数分别为数小孩的个数、当前节点的指针 函数返回值为数了小孩个数后的当前节点的前一
7、个节点的指针 4. void process(int, int, Jose *) 三个参数分别为小孩总数、间隔数、当前节点的前一个节点 的指针,主函数的定义为: void main() int n, m, begin; if(! assign(/释放n个节点 ,函数定义: int assign(int *np, int *mp, int *bp) int tn, tm, tb; couttntmtb; if( tn tn) /校验间隔数 cerr“间隔数输入要大于0或小于等于”tnendl; return 0; if( tb 0) /校验开始位置 cerr“开始位置输入要大于等于0n”; re
8、turn 0; *np = tn; *mp = tm; *bp = tb; return 1; ,Jose * initial(int n, Jose * jp) int nline=0; Jose * px = jp; for(int i=1; i next = jp + i%n;/初始化环形链表 px -code = i; px = px-next; if (nline + % 10) = 0)/每行输出10个小孩编号 coutendl; coutsetw(4)i; coutendl; return( jp + n -1 );/返回结构数组的最后一个元素 ,Jose *count(int
9、num, Jose * pcur) Jose *ptf; for(int i=0; inext; return ptf;/返回从pcur开始的第num个节点的前一个节点 void process(int n, int m, Jose *pf) int nline=0; Jose *pcur = pf-next; for(int i=1; i next;/第m个节点由pcur指向 if(nline+ % 10) = 0)/每行输出10个小孩编号 coutcode; pf-next = pcur-next;/当前指针所指的节点离队 pcur = pf; coutcodeendl;/输出胜利者 ,用
10、类定义Josephus问题: 首先确定类, 类的属性和操作,定义两个类: Ring类 属性: 链表的始地址; 当前指针; 哨兵指针 操作: 按照间隔数确定当前指针; 输出小孩的编号; 将当前小孩从链表中删除; 构造环链表; 析构环链表; Jose类 属性: 总数; 间隔数; 开始位置 操作: 属性赋初值; 处理所有小孩并找出胜利者,/文件为ring.h struct Boy int code; Boy *next; ; class Ring public: Ring(int); Ring(); void count(int); void putboy(); void clearboy(); p
11、rotected: Boy * pBegin; Boy * pivot; Boy * pCur; ;,/文件为Ring.cpp, 定义Ring类的成员函数 #include #include #include “ring.h” Ring:Ring(int n) pBegin = new Boyn;/分配大小为n的结构数组 pCur = pBegin; for(int i=1; i next = pBegin + i%n; pCur-code = i; putboy(); pCur = pCur-next; coutendl; pCur = pBegin + n -1;/当前指针为结构数组的最后
12、一个元素 Ring:Ring() delete pBegin;/释放结构数组 ,void Ring:count(int m) for(int i = 0; i next; void Ring:putboy() static int nline;/静态局部变量, 纪录当前行输出的小孩个数 if(nline + % 10 ) = 0) coutcode; void Ring:clearboy() pivot-next = pCur-next; pCur = pivot; ,/文件为 jose.h class Jose public: Jose(int n=10, int m=3, int begi
13、n=1) numofBoys = n; interval = m; beginPos = begin; void assign(); void getwinner(); protected: int numofBoys; int interval; int beginPos; ;,/文件为jose.cpp, 定义Jose类的成员函数 #include #include “jose.h” #include “ring.h” void Jose:assign() int tn, tm, tb; couttntmtb; if( tn tn) /校验间隔数 cerr“间隔数输入要大于0或小于等于”tn
14、endl; return ; if( tb 0) /校验开始位置 cerr“开始位置输入要大于等于0n”; return ; numofBoys = tn;/数据输入都合法时, 给Jose类的数据成员赋值 interval = tm; beginPos = tb; ,void Jose:getwinner() Ring x(numofBoys);/定义一个环链表, 大小为numofBoys x.count(beginPos);/环链表的当前位置在beginPos for( int i=1; i numofBoys; i+) /按照规则处理离队小孩 x.count(interval);/找下一个应该离队的小孩 x.putboy();/输出该小孩 x.clearboy();/删除该小孩 cout“nthe winner is “; x.putboy();/输出胜利者 ,/文件为main.cpp #inclu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冬季绿化养护与管理
- 宠物日常护理课件图片
- 二零二五年度新能源电池采购合同协议
- 2025版茶叶品牌重塑与市场拓展合同
- 二零二五年度个人消费贷款借款合同
- 二零二五年度测绘仪器采购与测绘项目验收服务合同
- 2025版跨国公司财务全球税务筹划合同
- 2025版高端医疗器械采购合同作废及供应商变更协议
- 二零二五年度阿拉尔经济技术开发区土地经营权流转合同
- 2025版校园环境整治与保洁服务全面实施合同
- 初中英语跨学科教学的教学方法策略
- GB/T 1634.1-2025塑料负荷变形温度的测定第1部分:通用试验方法
- 肩袖修补术护理
- 政府委托代建合同范本
- 月子中心员工手册管理制度
- DB37-T 1933-2022 氯碱安全生产技术规范
- 2025中考数学专项复习:最值问题之瓜豆原理模型(含答案)
- 2025年浙江宁波北仑热力有限公司招聘笔试参考题库含答案解析
- 人教版英语九年级全一册单词表(合订)-副本
- 2025年浙江丽水景宁畲族自治县交通发展集团有限公司招聘笔试参考题库附带答案详解
- 印章保管责任书
评论
0/150
提交评论