VC++期末考试题及标准答案.docx
- 文档编号:14109604
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:10
- 大小:108.62KB
VC++期末考试题及标准答案.docx
《VC++期末考试题及标准答案.docx》由会员分享,可在线阅读,更多相关《VC++期末考试题及标准答案.docx(10页珍藏版)》请在冰点文库上搜索。
VC++期末考试题及标准答案
武汉大学2009—2010学年上学期
《面向对象的程序设计》试卷(B)
学号:
姓名:
院系:
专业:
得分:
一、名词解释(每题5分,共计25分)
(1)构造函数:
是一种特殊的成员函数,它提供了对成员变量进行初始化的方法,使得在声明对象时能自动的初始化对象(+2);构造函数的名称与类名相同(+1);构造函数不能指定任何返回值类型(+1);构造函数可以重载(+1)。
(2)多态:
多态性是面向对象编程的一个重要特征(+1),主要表现在函数调用时实现“一种接口,多种方法”(+2)。
多态又分为编译时多态和运行时多态两种(+2)。
(3)抽象类:
抽象类是指这样的类,它的一些行为(成员函数)不给出具体的定义(+2),抽象类至少带有一个纯虚函数(+1),抽象类不能用来申明对象,只能作为基类使用,因此它又称为抽象基类(+2)。
(4)文档模板:
在文档/视图结构应用程序中,数据以文档类的对象的形式存在(+1)。
文档对象通过视图对象显示出来,而视图大对象又是框架窗口的一个子窗口,并且涉及文档操作的菜单和工具栏等资源也是建立在框架窗口上(+2)。
这样文档、视图、框架和所涉及的资源形成了一种固定的关系,这种固定关系就成为文档模板(+1)。
也就是说,文档模板描述了对应于每一种类型文档的视图和窗口的类型(+1)。
(5)序列化:
对象的保存和恢复的过程称为序列化(+2)。
即对象具有的保存和加载其状态的能力(+1),对象能够在程序运行结束前将对象当前状态写入永久存储体中,以后在程序运行时通过数据的读取而恢复对象的状态(+2)。
二、简答题(每题10分,共计40分)
1.简述文档、视图和应用程序框架之间如何相互作用?
答:
文档、视图和应用程序包含了一系列复杂的相互作用过程(+1),稳当和视图的交互式通过类的共有数据成员和成员函数实现的(+1)。
一个视图对象只与一个文档对象关联,一个文档可以与多个视图关联,但一个文档对象只反映当前视图变化(+2)。
视图中用GetDocument()获取文档对象进行操作(+1);在文档中利用Invalidate(),UpdateAllViews()或SendMessage(WM_PAINT,a,b)调用视图中的OnDraw()对文档数据进行绘图(+3);在程序任何地方可以调用AfxGetApp()得到程序框架对象的指针,利用框架对象指针可进一步利用GetActiveView()获取程序的视图对象,并对其进行操作(+2)。
2.Windows消息的发送有哪两种方式?
主要区别是什么?
WindowsAPI提供了哪几个函数用于消息的发送?
答:
发送消息的方式有:
传送和寄送两种方式(+3),这两种方式之间的主要区别是消息被接收对象收到后是否立即被处理(+3)。
根据两种方式,Windows提供了多个API函数用于消息的发送,其中常用的函数是SendMessage()、PostMessage()和SendDlgItemMessage()(+4)。
3.何谓DDX和DDV?
编程时如何使用MFC提供的DDX功能?
答:
对话框实现用户数据的输入和输出的一般方法是通过类向导将对话框控件与成员变量相关联,利用对话框数据交换(DDX)和对话框数据校验(DDV)机制实现数据的输入和输出(+3);MFC提供了CDataExchange类实现了对话框类(成员变量)与控件之间的数据交换与数据验证;对话框DDX和DDV功能是由成员函数DoDataExchange()完成的。
DDX实现数据交换,DDV实现数据验证(+3);用户不能直接调用函数DoDataExchange(),而是调用CWnd:
:
UpdateData(BOOL),当调用UpdateData(FALSE)时,MFC通过调用对话框派生类的函数DoDataExchange()将数据从成员变量传递到关联的控件;调用UpdateData(TRUE)时,MFC通过调用对话框派生类的函数DoDataExchange()将数据从控件传递到关联的成员变量(+4)。
4.MFC提供了哪几种设备环境类?
它们各自有什么用途?
答:
MFC提供的设备环境类有CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC,其中CDC为基类,其它都是MFC的派生类(+5);CDC是其它设备环境类的基类,同时也可以作为一般的设备环境类使用。
CDC对所有GDI函数都进行了封装(+1);CPaintDC是OnPaint()函数使用的设备环境类,代表一个窗口的绘图画面。
OnPaint是WM_PAINT消息处理函数,当窗口尺寸改变、或者当窗口恢复了先前被遮盖的部分,应用程序窗口都会收到WM_PAINT消息(+1)。
CClientDC类代表了客户区设备环境。
当在客户区实时绘图时,需要利用CClientDC类定义一个客户区设备环境(+1);CWindowDC类代表整个程序窗口的设备环境。
使用窗口设备环境可以在整个窗口区域绘图(+1);CMetaFileDC是用于创建一个Windows图元文件的设备环境。
Windows图元文件包含了一系列GDI绘图命令(+1)。
三、请简述下面两个for循环的优缺点(5分)。
if(condition){
for(inti=0;i DoSomething(); } else{ for(inti=0;i DoOtherthing(); } 优点: 循环的效率高(+2) 缺点: 程序不简洁(+1) for(inti=0;i if(condition) DoSomething(); else DoOtherthing(); } 优点: 程序简洁(+1) 缺点: 多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 (+1) 四、改错题: 下面两段程序的目的是在屏幕上输出“Hello! ”,但是两段程序中都不能得到正确的运行结果,请简述其错误并改正。 (5分) char*GetMemory(void){ charp[]="Hello! "; returnp; } voidTest(void){ char*str=NULL; str=GetMemory(); printf(str); } voidGetMemory(char*p){ p=newchar[100]; } voidTest(void){ char*str=NULL; GetMemory(str); strcpy(str,"Hello! "); printf(str); } 左边: 在函数GetMemory中,char*p为临时变量(虚参),无法传出地址。 修改方法: voidGetMemory(char**p){ *p=newchar[100]; }(+1) voidtest(void){ char*str=null; GetMemory(&str);(+1) strcpy(str,"hello! "); printf("%s",str);(+0.5) delete[]str;(+0.5) } 右边: 因为GetMemory返回的是指向“栈内存”,的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。 修改方法: char*GetMemory(void){ char*p=newchar[100]; strcpy(p,"Hello! ");(+1) returnp; } voidTest(void){ char*str=NULL; str=GetMemory(); printf("%s",str);(+0.5) delete[]str;(+0.5) } 五、编程题(15分): 以下为基于对话框的应用程序CTestDlgDlg,主要功能是,根据输入的坐标、线宽和颜色,在对话框的自画按钮上绘制矩形,其中颜色信息是通过通用颜色对话框来获取。 必要的信息及相关变量见下表: ID Caption ID 变量 ID Caption IDC_STATIC x1= IDC_EDIT_X1 intm_x1 IDC_BUTN_GETCOLOR 设置颜色 IDC_STATIC y1= IDC_EDIT_Y1 intm_y1 IDC_BUTNDRAW 自画按钮 IDC_STATIC x2= IDC_EDIT_X2 intm_x2 IDC_APPLY 绘制 IDC_STATIC y2= IDC_EDIT_Y2 intm_y2 IDCANCEL 取消 IDC_STATIC 线宽 IDC_EDIT_WIDTH intm_width 另外在CCTestDlgDlg类的头文件中已定义了一个全局变量COLORREFm_color用来保存颜色,颜色的获取通过点击“设置颜色”按钮来完成。 该按钮的消息响应函数如下,请在//TODO: adddrawcodefornativedatahere后面添加你的代码。 (5分) “绘制”按钮的消息响应函数如下,请在//TODO: adddrawcodefornativedatahere后面添加你的代码。 (5分) 为了在“自画按钮”上进行矩形绘制,工程已利用ClassWizard类向导为对话框添加WM_DRAWITEM消息处理函数,要用实现自画按钮的绘制。 请按照要求,在//TODO: addyourmessagehandlercodehere后面添加你的绘制代码。 (5分) 六、编程题(10分): 编写一个单文档画直线的绘图程序MyLine,具体功能: 在利用鼠标画线时,按住鼠标左键并拖曳,可以随鼠标移动动态地画出当前直线,当释放左键后才真正画出一条所需要的直线。 要求实现窗口重绘功能,绘图需采用标准的十字光标。 已在CMyLineView.h文件中定义了相关的变量,如下所示: public: boolm_bDragging;//拖曳标记 HCURSORm_hCross;//光标 CPointm_ptEnd;//直线终点 CPointm_ptOrigin;//直线起点 构造函数中的初始化工作定义如下: CMyLineView: : CMyLineView() { m_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS); m_bDragging=false; } 鼠标消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE的响应函数已在视图类CMyLineView添加,请在//TODO: addyourmessagfehandlercodehere后面添加你的代码,将以下函数补充完整。 voidCMyLineView: : OnMouseMove(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehere if(m_bDragging){ CClientDCdc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOrigin=point; } CView: : OnMouseMove(nFlags,point); } 出卷人 张勇徐景中 教研室负责人审核签字 共4页第4页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 期末 考试题 标准答案