VC++期末考试题及标准答案

2018-12-29 22:51

武汉大学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消息的发送有哪两种方式?主要区别是什么?Windows API提供了哪

几个函数用于消息的发送?

答:发送消息的方式有:传送和寄送两种方式(+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分)。

for (int i=0; i

四、改错题:下面两段程序的目的是在屏幕上输出“Hello!”,但是两段程序中都不能得到正确的运行结果,请简述其错误并改正。(5分)

void GetMemory(char *p){ p = new char[100]; } void Test(void){ char *str = NULL; GetMemory(str); strcpy(str, \ printf(str); } char* GetMemory(void){ char p[] = \ return p; } void Test(void){ char *str = NULL; str = GetMemory(); printf(str); } 左边: 在函数GetMemory中,char* p为临时变量(虚参),无法传出地址。 修改方法:

void GetMemory(char** p){ *p = new char[100];

} (+1)

void test(void){

char *str = null;

GetMemory(&str); (+1) strcpy(str, \

printf(\ delete[] str; (+0.5) }

右边:因为GetMemory 返回的是指向“栈内存”,的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。修改方法:

char* GetMemory(void){

char* p = new char[100];

strcpy(p, \ return p; }

void Test(void){

char *str = NULL; str = GetMemory();

printf(\ delete[] str; (+0.5) }

五、编程题(15分):以下为基于对话框的应用程序CTestDlgDlg,主要功能是,根据输入的坐标、线宽和颜色,在对话框的自画按钮上绘制矩形,其中颜色信息是通过通用颜色对话框来获取。

必要的信息及相关变量见下表: ID Caption ID IDC_EDIT_X1 IDC_EDIT_Y1 IDC_EDIT_X2 IDC_EDIT_Y2 IDC_EDIT_WIDTH 变量 int m_x1 int m_y1 int m_x2 int m_y2 ID IDC_BUTNDRAW IDC_APPLY IDCANCEL Caption 自画按钮 绘制 取消 IDC_STATIC x1= IDC_STATIC y1= IDC_STATIC x2= IDC_STATIC y2= IDC_STATIC 线宽 IDC_BUTN_GETCOLOR 设置颜色 int m_width

另外在CCTestDlgDlg类的头文件中已定义了一个全局变量COLORREF m_color用来保存颜色,颜色的获取通过点击“设置颜色”按钮来完成。该按钮的消息响应函数如下,请在// TODO: add draw code for native data here后面添加你的代码。(5分) void CCTestDlgDlg::OnButnGetcolor(){ // TODO: Add your control notification handler code here CColorDialog dialog; if (dialog.DoModal() == IDOK){ m_color = dialog.GetColor(); return; } }

“绘制”按钮的消息响应函数如下,请在// TODO: add draw code for native data here后面添加你的代码。(5分) void CCTestDlgDlg::OnApply(){ // TODO: Add your control notification handler code here CWnd* pWndCtrl = GetDlgItem(IDC_BUTNDRAW); pWndCtrl->Invalidate(TRUE); pWndCtrl->UpdateWindow(); } 为了在“自画按钮”上进行矩形绘制,工程已利用ClassWizard类向导为对话框添加WM_DRAWITEM消息处理函数,要用实现自画按钮的绘制。请按照要求,在// TODO: add your message handler code here后面添加你的绘制代码。(5分) void CCTestDlgDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here UpdateData(); CDC dc; dc.Attach(lpDrawItemStruct->hDC); if (nIDCtl == IDC_BUTNDRAW){ CPen pen(PS_SOLID, m_width, m_color); CPen* pOldPen = dc.SelectObject(&pen); dc.Rectangle(m_x1, m_y1, m_x2, m_y2); dc.SelectObject(pOldPen); } dc.Detach(); CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); } 六、编程题(10分):编写一个单文档画直线的绘图程序MyLine,具体功能:在利用鼠标画线时,按住鼠标左键并拖曳,可以随鼠标移动动态地画出当前直线,当释放左键后才真正画出一条所需要的直线。要求实现窗口重绘功能,绘图需采用标准的十字光标。

已在CMyLineView.h文件中定义了相关的变量,如下所示:


VC++期末考试题及标准答案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2019-2024年中国矿山生态修复行业专项调研及投资前景预测报告(

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: