串行化简化了对象的保存和载入,为对象提供了持续性。
但是,串行化本身还是具有一定的局限性的。
串行化一次从文件中载入所有对象,这不适合于大文件编辑器和数据库。
对于数据库和大文件编辑器,它们每次只是从文件中读入一部分。
此时,就要避开文档的串行化机制来直接读取和保存文件了。
另外,使用外部文件格式(预先定义的文件格式而不是本应用程序定义的文件格式)的程序一般也不使用文档的串行化。
《VC++程序设计》试卷模板
一、单项选择题(每小题1分,共20分)
1、假定AB为一个类,则执行“”ABa(4),b(3),*p[2];”语句时,自动调用该类构造函数的次数为()
A、2B、3C、4D、5
2、对于结构中定义的成员,其隐含访问权限为()
A、protectedB、privateC、publicD、static
3、在面向对象编程中,对象的抽象集合称为()。
A、对象B、集合C、类D、实例
4、下面说法正确的是()
A、构造函数可以重载,析构函数不能重载。
B、构造函数不能重载,析构函数可以重载。
C、构造函数可以重载,析构函数也可以重载。
D、构造函数和析构函数都不可以重载。
5、实现运行时的多态性,必须通过()来完成。
A、虚函数B、重载函数C、构造函数D、析构函数
6、类CNum的缺省构造函数和析构函数是()
A、CNum()和~CNum()B、CNum(int)和~CNum()
C、CNum()和~CNum(delete)D、CNum()和int~CNum()
7、在类外定义类的成员函数时,应当使用()来标识该函数为特定类的成员。
A、:
B、:
:
C、->D、this
8、已知类A是类B的友元,类B是类C的友元,则()
A、类A一定是类C的友元
B、类C一定是类A的友元
C、类C的成员函数可以访问类B的对象的任何成员
D、类A的成员函数可以访问类B的对象的任何成员
9、下面()是函数重载。
A、voidplay(int)和voidplay(float)
B、play()和~play()
C、voidplay(int)和intplay(int)
D、voidplay()和intplay()
10、下列说法中正确的是()
A.类定义中只能说明函数成员的函数头,不能定义函数体。
B.类中的函数成员可以在类体中定义,也可以在类体之外定义。
C.类中的函数成员在类体之外定义时必须要与类声明在同一文件中。
D.在类体之外定义的函数成员不能操作该类的私有数据成员。
11、Windows操作系统主要基本内核元件中,_______支持与操作系统密切相关的功能:
如进程加载、文本切换、文件I/O以及内存管理、线程管理等。
()
A、GDIB、KERNELC、USERD、以上都不是。
12、一个视图对象能连接()文档对象,一个文档对象能连接()视图对象。
A、一个,多个B、多个,一个
C、一个,一个D、多个,多个
13、所有的控件都是()类的派生类,都可以作为一个特殊的窗口来处理。
A、CViewB、CWndC、CWindowD、CDialog
14、设置编辑控件的文本内容,可使用函数()
A、SetWindowText()B、SetSel()
C、ReplaceSel()D、GetWindowText()
15、根据对话框的行为性质,对话框可以分为两类:
()
A、对话框资源和对话框类B、模式对话框和非模式对话框
C、对话框资源和对话框模板D、消息对话框和模式对话框
16、以下控件中,()没有Caption属性。
A、按钮B、群组框C、编辑控件D、静态控件
17、菜单项助记符前用()引导。
A、%B、&C、#D、$
18、MFC中的集合类包括()。
A、对象、列表和映射B、数组、列表和对象
C、数组、列表和映射D、数组、列表和链表
19、文档负责将数据存储到永久存储介质中,通常是磁盘文件或数据库,存取过程称为()。
A、文件访问B、串行化C、文件读写D、格式化
20、下列对模板的声明,正确的是()。
A、templateB、template
C、templateD、template
二、选择填空题(每空1分,共20分)
1、如果在基类和派生类中都包含其他类的对象(即有对象成员),则在创建派生类的对象时,首先执行⑴的构造函数,接着执行⑵的构造函数,然后执行___⑶___的构造函数,最后才执行⑷的构造函数。
A、基类的对象成员B、派生类的对象成员
C、基类D、派生类
2、所有的文档类都派生于[5],所有的视图类都派生于[6]。
A、CViewB、CWindowC、CDocumentD、CFormView
3、[7]包括键盘和鼠标的输入。
这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由程序来处理消息;[8]用来与Windows的控制对象,如列表框、按钮、复选框等进行双向通信。
当用户在列表框中改动当前选择或改变了复选框的状态时发出此类消息。
A、系统消息B、用户消息C、输入消息D、控制消息
4、使用[9]获取的设备上下文在退出时,必须调用ReleaseDC()释放设备上下文。
A、GetWindowRect()B、GetDC()
C、BeginPaint()D、GetClientRect()
5、常用的CButton类的成员函数中:
⑽获得一个按钮控件的选中、选择和聚焦状态;⑾得到一个按钮的选中状态;⑿设置一个按钮的选中状态。
A、GetState()B、SetState()C、SetCheck()
D、GetCheck()E、GetButtonStyle()
6、滚动条类CScrollBar的成员函数规定了滚动条的操作。
设置滚动条的范围使用⒀函数,设置滚动块的位置使用⒁函数,获取滚动块的当前位置使用⒂函数。
A、SetPosB、SetRangeC、SetScrollRangeD、GetPos
E、SetScrollPosF、GetScrollPosG、GetScrollRange
7、如果类中的成员只能被本类的成员函数和友元函数访问,则这些成员的访问权限为___[16]_;如果类中的成员能够被类外的函数访问,则这些成员的访问权限为:
___[17]__。
A、protectedB、privateC、publicD、static
8、列表框分为[18]和[19]两种,[20]中任一时刻只能选择一项。
A、组合框B、单选列表框C、多选列表框D、编辑框
三、程序设计题(共60分)
1、下列shape类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是一个通用的用以求不同形状的图形面积总和的函数。
请从shape类派生三角形类(triangle)、矩形类(rectangle)、并给出具体的求面积函数。
(10分)
classshape{
public:
virtualfloatarea()=0
};
floattotal(shape*s[],intn)
{floatsum=0.0;
for(inti=0;ii++)
sum=sum+i.area();
returnsum;
}
2、创建一个记录通讯录内容的新类Caddrlist,包含:
姓名、住址、电话、出生日期,并使该类可以实现串行化。
请写出可以实现要求的CAddrlist.h和CAddrlist.cpp文件的内容。
(10分)
3、(20分)该应用有4个命令按钮,作为增加项目、删除项目和全部删除项目以及退出程序的按键。
另外,还有一个编辑框作为新项目名称输入框IDC_NAME_EDIT对应控件变量为m_Name(类型为CString),1个静态文本用于显示项目数目,列表框用于项目列表对应控件变量为m_List1,1个静态文本用于显示标题。
界面下图所示。
根据要求写出代码:
(1)对话框初始化消息处理函数OnInitDialog()里,向列表框添加“China”,“Germany”两项内容。
BOOLCEx6_3Dlg:
:
OnInitDialog()
{
returnTRUE;
}
(2)“增加”命令按钮的单击消息处理函数OnAdd()将新项目名称输入框的内容增加到列表框中。
voidCEx6_3Dlg:
:
OnAdd()
{
}
(3)“删除”按钮的单击消息处理函数OnDel()将当前列表框中选中的项删除
voidCEx6_3Dlg:
:
OnDel()
{
}
4、下面是一个基于对话框的应用程序,用来求解一元二次方程的根。
当用户在A、B、C三个编辑框中输入3个参数后,单击【计算】按钮,将显示出该方程的根。
(10分)
各控件对应的成员变量见下表:
控件ID号
变量类型
变量名
IDC_A_EDIT
int
m_a
IDC_B_EDIT
int
m_b
IDC_C_EDIT
int
m_c
IDC_X1_EDIT
CString
m_x1
IDC_X2_EDIT
Cstring
m_x2
试写出计算按钮的单击消息处理函数。
voidCEx3_4Dlg:
:
OnButton1()
{
}
5、简述用MFC进行ODBC的编程过程。
(10分)
2005—2006学年第2学期
《VC++程序设计》试题答案及评分标准
一、单项选择题(每小题1分,共20分)
题号
1
2
3
4
5
6
7
8
9
10
答案
B
C
C
A
A
A
B
D
A
B
题号
11
12
13
14
15
16
17
18
19
20
答案
B
A
B
A
B
C
B
C
B
D
二、选择填空题(每空1分,共20分)
题号
⑴
⑵
⑶
⑷
⑸
⑹
⑺
⑻
⑼
⑽
答案
A
C
B
D
C
A
C
D
B
A
题号
⑾
⑿
⒀
⒁
⒂
[16]
[17]
[18]
[18]
[20]
答案
D
C
C
E
F
B
C
B
C
B
三、程序设计题(每题10分,共60分)
1、每个类5分
#include
classtriangle:
publicshape{
public:
virtualfloatarea()
{
floats=(a+b+c)/2;
returnsqrt(s*(s-a)*(s-b)*(s-c));
}
private:
floata,b,c;
};
classrectangle:
publicshape{
public:
virtualfloatarea()
{
returna*b;
}
private:
floata,b;};
2、
//Addrlist.h文件内容:
5分
classCAddrlist:
publicCObject{
public:
CStringName;
CStringAddress;
CStringTel;
CTimeBirth;
CAddrlist();
DECLARE_SERIAL(CAddrlist)//使对象可串行化
virtualvoidSerialize(CArchive&ar);//重载串行化函数
};
//Addrlist.cpp文件内容:
5分
IMPLEMENT_SERIAL(CAddrlist,CObject,0)
voidCAddrlist:
:
Serialize(CArchive&ar)
{CObject:
:
Serialize(ar);
if(ar.IsStoring())
{ar<}
else
{ar>>Name>>Tel>>Address>>Birth;
}
}
3、第一个函数5分,第二个函数8分,第三个函数7分,
(1)BOOLCEx6_3Dlg:
:
OnInitDialog()
{m_List1.AddString("China");
m_List1.AddString("Germany");
UpdateData(FALSE);
returnTRUE;
}
(2)voidCEx6_3Dlg:
:
OnAdd()
{if(m_Name.IsEmpty())
{MessageBox("项目名不能为空!
");
return;
}
m_Name.TrimLeft();
m_Name.TrimRight();
if(m_List1.FindString(-1,m_Name)!
=LB_ERR)
{MessageBox("列表框中已有相同的项目名,不能添加!
");
return;
}
m_List1.AddString(m_Name);
UpdateData(FALSE);
}
(3)voidCEx6_3Dlg:
:
OnDel()
{intnIndex=m_List1.GetCurSel();
if(nIndex!
=LB_ERR)
{m_List1.DeleteString(nIndex);}
else
MessageBox("当前没有选择项或列表框操作失败");
UpdateData(FALSE);
}
4、voidCEx6_1Dlg:
:
OnButton1()
{
UpdateData();
doubledisc;
disc=(double)(m_b*m_b-4*m_a*m_c);
if(fabs(disc)<=1e-6)//如果disc等于0
{m_x1.Format("x1=%6.2f",-m_b/(2*m_a));
m_x2.Format("x2=%6.2f",-m_b/(2*m_a));
}
elseif(disc>1e-6)//如果disc大于0
{doublex1,x2;
x1=(-m_b-sqrt(disc))/(2*m_a);
x2=(-m_b+sqrt(disc))/(2*m_a);
m_x1.Format("x1=%6.2f",x1);
m_x2.Format("x2=%6.2f",x2);
}
else//如果disc小于0
{
doublerealpart,imagpart;
realpart=-m_b/(2*m_a);
imagpart=sqrt(-disc)/(2*m_a);
m_x1.Format("x1=%6.2f+%6.2fi",realpart,imagpart);
m_x2.Format("x2=%6.2f-%6.2fi",realpart,imagpart);
}
UpdateData(FALSE);
}
5、关键知识点:
(1)设计数据库。
(2)定义ODBC数据源。
(3)创建应用程序外壳。
(4)设计主窗体。
(5)将控件与数据库字段相关联。
(6)编写代码实现添加新记录功能。
(7)编写代码实现删除记录功能。
(8)编写代码实现对记录排序功能。
(9)编写代码实现查找记录功能等。