资源描述
《VC程序设计》习题
一、单项选择题1、假定MyClass为一个类,则执行“” MyClass a[3],*p[2];”语句时,自动调用该类构造函数的次数为( B )
A、2 B、3 C、4 D、5
2、对于结构中定义的成员,其隐含访问权限为( C )
A、protected B、private C、public D、 static
3、一个类的友元函数或友元类能够通过成员操作符访问该类的( B )
A、私有成员 B、所有成员 C、公用成员 D、保护成员
4、下面说法正确的是( A )
A、构造函数可以重载,析构函数不能重载。
B、构造函数不能重载,析构函数可以重载。
C、构造函数可以重载,析构函数也可以重载。
D、构造函数和析构函数都不可以重载。
5、下列语句的运行结果为( D )
#include <iostream.h>
srtuct COMPLEX
{
int x;
int y;
} cNum[2]={1,3,2,7};
void main()
{
cout<< cNum[0].y*cNum[1] x<<endl;
}
A、3 B、2 C、21 D、6
6、类CNum的缺省构造函数和析构函数是( A )
A、CNum ( )和~CNum ( ) B、CNum (int)和~CNum( )
C、CNum ( )和~CNum (delete ) D、CNum ( )和int~CNum ( )
7、在C++中,若对函数未加说明,则函数的隐含类型是( A )
A、int B、double C、void D、char
8、已知类A是类B的友元,类B是类C的友元,则(D )
A、类A一定是类C的友元
B、类C一定是类A的友元
C、类C的成员函数可以访问类B的对象的任何成员
D、类A的成员函数可以访问类B的对象的任何成员
9、下列说法中正确的是( B )
A、类定义中只能说明函数成员的函数头,不能定义函数体
B、类中的函数成员可以在类体中定义,也可以在类体之外定义
C、类中的函数成员在类体之外定义时必须要与类声明在同一文件中
D、在类体之外定义的函数成员不能操作该类的私有数据成员
10、以下不属于成员函数的是( B )
A、静态成员函数 B、友元函数
C、构造函数 D、析构函数
11、对于消息队列的描述正确的是( D )
A、在Windows中只有一个消息系统,即系统消息队列。消息队列是一个系统定义的数据结构,用于临时存储消息。
B、系统可从消息队列将信息直接发给窗口。另外,每个正在Windows下运行的应用程序都有自己的消息队列。
C、系统消息队列中的每个消息最终都要被USER模块传送到应用程序的消息队列中去。应用程序的消息对列中存储了程序的所有窗口的全部消息。
D、以上都正确
12、一个视图对象能连接( A )文档对象,一个文档对象能连接( )视图对象。
A、一个,多个 B、多个,一个
C、一个,一个 D、多个,多个
13、MFC类库中的类按层次关系可知,CStatic 的直接父类为( B )
A、CObject B、CWnd C、CcmdTarget D、CFrameWnd
14、可以利用控件的(C )属性和Tab键顺序来为控件分组。
A、ID B、Tab stop C、Group D、Caption
15、根据对话框的行为性质,对话框可以分为两类:( B )
A、对话框资源和对话框类 B、模式对话框和非模式对话框
C、对话框资源和对话框模板 D、消息对话框和模式对话框
16、以下控件中,( C )没有Caption属性。
A、按钮 B、群组框 C、编辑控件 D、静态控件
17、菜单项助记符前用( B )引导。
A、% B、& C、# D、$
18、更新菜单状态的消息是( C )。
A、WM_COMMAND B、UPDATE
C、ON_UPDATE_COMMAND_UI D、INVALIDATE
19、关于工具栏、菜单和加速键的关系,正确的说法是( C )。
A、工具按钮与菜单必须一一对应 B、工具按钮与加速键一一对应
C、工具按钮不必与菜单一一对应 D、菜单与加速键一一对应
20、使用GetWindowDC( )和GetDC( )获取的设备上下文在退出时,必须调用( A )释放设备上下文。
A、ReleaseDC( ) B、delete( ) C、DeleteDC( ) D、Detach( )
21、在面向对象编程中,对象的抽象集合称为( C )。
A、对象 B、集合 C、类 D、实例
22、实现运行时的多态性,必须通过( A )来完成。
A、虚函数 B、重载函数 C、构造函数 D、析构函数
23、在类外定义类的成员函数时,应当使用( B )来标识该函数为特定类的成员。
A、 : B、 :: C、-> D、this
24、下面( A )是函数重载。
A、void play(int) 和void play(float)
B、play( ) 和 ~play()
C、void play(int) 和int play(int)
D、void play( ) 和int play( )
25、Windows操作系统主要基本内核元件中,___B____支持与操作系统密切相关的功能:如进程加载、文本切换、文件I/O以及内存管理、线程管理等。( )
A、GDI B、KERNEL C、USER D、以上都不是。
26、所有的控件都是 (B ) 类的派生类,都可以作为一个特殊的窗口来处理。
A、CView B、CWnd C、CWindow D、CDialog
27、设置编辑控件的文本内容,可使用函数 ( A )
A、SetWindowText( ) B、SetSel( )
C、ReplaceSel( ) D、GetWindowText( )
28、MFC中的集合类包括( C )。
A、对象、列表和映射 B、数组、列表和对象
C、数组、列表和映射 D、数组、列表和链表
29、文档负责将数据存储到永久存储介质中,通常是磁盘文件或数据库,存取过程称为( B )。
A、文件访问 B、串行化 C、文件读写 D、格式化
30、下列对模板的声明,正确的是(D )。
A、template<T> B、template<class T1;class T2>
C、template<class T1,T2> D、template<class T1,class T2>
二、填空题
1、VC++开发环境中,int型数据占4个字节,short int占____2___个字节,long int 占____4_____个字节,char型数据占 1 个字节, double型数据占____8_____个字节。
2、若for循环的“头”为“for(int i=1;i<10;i++)”,并且在循环体中不会修改i的值,则循环体将被重复执行____9________次后结束。
3、两个函数的函数名___相同_____,但参数的个数或对应参数的类型_不同______时,则称为重载函数。
4、若ch为char型变量,n为int型变量,则下列语句
ch = ’a’; n = 3; ch = ch + n;
cout<<” ch = ”<< ch;
执行的结果是____ch=d______。
5、C++中函数的参数传递一种是按值传递,另一种是地址传递或_引用____传递。
6、C++运行时的多态性通过虚函数来实现,而编译时的多态性通过函数重载来实现。
7 只读成员函数用____ const _________关键字标识,内联成员函数用_______inline____关键字标识。
8、 class test{
public:
static int x;
};
test t1,t2; t1.x = 25;
程序运行到这里时,t2.x的值为____25________。
9、所有的文档类都派生于___Cdocument_____ _______,所有的视图类都派生于:_____Cview_ _______。
10、为解决多继承中因公共基类而产生的二义性问题,C++语言提供了__虚基类______机制。将公共基类声明为它以后,它在派生类中只产生一个实例。
11、在代码中,使用CWnd::_____ UpdateData _______函数可实现控件与其成员变量之间的数据的传输。
12、列表框ClistBox类的成员函数___ AddString ___________用来向列表框增加列表项,成员函数_____ ResetContent _______用来清除列表项所有项目。
13、:______串行化___________ 是指将对象写入永久存储介质或者将对象从永久存储介质中读出的过程。
14、Windows程序中的消息有窗口消息、命令消息和控件通知消息三种类型。
15、MFC中的集合类包括数组 、 列表 、 映射 。
16、在进行绘图时, 画刷 用于指定图形的填充样式, _____画笔_______用于指定图形的边框样式。
17、组合框与列表框用途类似,它是由__列表框________和__编辑框________功能组合而成。
18、 DC 是Windows应用程序与设备驱动程序和输出设备之间的接口。
19、如果一个类中含有纯虚函数,则称该类为___抽象基类_________
20、如果类的所有对象共享一个成员,则称该成员为__静态成员___________
21、如果类中的成员只能被本类的成员函数和友元函数访问,则这些成员的访问权限为__私有______ _;如果类中的成员能够被类外的函数访问,则这些成员的访问权限为:____公有__ ____。
22、用户按下键盘按键并放开的过程中,将产生至少三条消息:WM_KEYDOWN,WM_CHAR,WM_KEYUP
23、单选按钮初始化要使用函数如下:
void CheckRadioButton(IDC_RADIO1, IDC_RADIOn , IDC_RADIOm)
其功能的具体描述为:_从IDC_RADIO1到IDC_RADIOn,中设置IDC_RADIOm为默认
24、列表框分为 单选列表框 和 多选列表框 两种, 中任一时刻只能选择一项, 则可以选取多项。
三 选择填空题(每空1分,共15分)
1、如果在基类和派生类中都包含其他类的对象(即有对象成员),则在创建派生类的对象时,首先执行 ⑴A 的构造函数,接着执行 ⑵ C 的构造函数,然后执行__ _⑶_B__的构造函数,最后才执行 ⑷ D 的构造函数。
A、基类的对象成员 B、派生类的对象成员
C、基类 D、派生类
2、 [5] B 代表窗口客户区的显示设备上下文, [6]C 代表整个窗口的显示设备上下文。
A、CPaintDC B、CClientDC C、CWindowDC D、CMetaFileDC
3、消息循环的处理过程如下:
⑺A 函数不断侦察应用程序的消息队列,若队列为空,该函数一直运行,不返回;一旦发现队列不为空,便取出一条消息,把它拷贝到msg结构变量中,同时该函数返回TRUE;得到消息msg后, ⑻B 把来自键盘的命令翻译成WM_XXX消息命令形式。 ⑼E 函数通知Windows把每个消息分发给相应的窗口函数。应用程序并不直接调用窗口函数,而由Windows根据消息去调用窗口函数,因此,窗口函数经常被称为回调函数。
A、GetMessage( ) B、translateMessage( ) C、PostMessage( )
D、SendMessage( ) E、DispatchMessage( )
4、常用的CButton类的成员函数中: ⑽A 获得一个按钮控件的选中、选择和 聚焦状态; ⑾ D 得到一个按钮的选中状态; ⑿C 设置一个按钮的选中状态。
A、GetState( ) B、SetState( ) C、SetCheck( )
D、GetCheck( ) E、GetButtonStyle( )
5、滚动条类CScrollBar的成员函数规定了滚动条的操作。设置滚动条的范围使用 ⒀ C 函数,设置滚动块的位置使用 ⒁ E 函数,获取滚动块的当前位置使用 ⒂F 函数。
A、SetPos B、SetRange C、SetScrollRange D、GetPos
E、SetScrollPos F、GetScrollPos G、 GetScrollRange
6、所有的文档类都派生于 [5]C ,所有的视图类都派生于 [6]A 。
A、CView B、CWindow C、CDocument D、CFormView
7、 [7]C 包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由程序来处理消息; D [8] 用来与Windows的控制对象,如列表框、按钮、复选框等进行双向通信。当用户在列表框中改动当前选择或改变了复选框的状态时发出此类消息。
A、系统消息 B、用户消息 C、输入消息 D、控制消息
8、使用 [9] B 获取的设备上下文在退出时,必须调用ReleaseDC( )释放设备上下文。
A、GetWindowRect( ) B、GetDC( )
C、BeginPaint() D、GetClientRect( )
9、在进行绘图时, [16]A 用于指定图形的填充样式,___[17]_B__用于指定图形的边框样式。
A、画笔 B、画刷 C、区域 D、位图
10、列表框ClistBox类的成员函数___[18]A__用来向列表框增加列表项,成员函数___[19]C__用来清除列表项所有项目,成员函数___[20]F__用来返回列表框的列表项的总数。
A、AddString B、DeleteString C、ResetContent
D、FindString E、GetCurSel F、GetCount
11、如果类中的成员只能被本类的成员函数和友元函数访问,则这些成员的访问权限为___[16]B _;如果类中的成员能够被类外的函数访问,则这些成员的访问权限为:___[17]C__。
A、protected B、private C、public D、static
12、列表框分为 [18] B 和 [19C] 两种, [20] B 中任一时刻只能选择一项。
A、组合框 B、单选列表框 C、多选列表框 D、编辑框
六、程序设计题(1题4 分,2题9 分,共13分)
1、简单的计算程序界面如下图所示,操作数1对应编辑框控件的ID为 IDC_EDIT1,对应值类型的成员变量m_op1(int);操作数2对应编辑框控件的ID为IDC_EDIT2,对应值类型的成员变量m_op2(int);计算结果对应的编辑框控件的ID 为IDC_EDIT3,对应值类型的成员变量m_result(int)。 假设输入的数为整数,加法按钮的功能是将两操作数相加,并将结果在对应的编辑框IDC_EDIT3显示出来。写出加法按钮对应的代码。
void CExDlg::OnButton1()
{ UpdateDate(TRUE); 1分
m_result = m_op1 + m_op2; 2分
UpdateDate(FALSE); 1分
}
2、为学员信息设计一个类CStudent,包含:学号、姓名、出生日期、家庭住址、班级,并使该类可以实现串行化。请写出可以实现要求的CStudent.h和CStudent.cpp文件的内容
2、 //CStudent.h
class CStudent :public CObject { 1分
public:
CString Num;
CString Name;
CTime Birth;
CString Address;
CString Grade; 2分
DECLARE_SERIAL(CStudent) // 使对象可串行化 1分
virtual void Serialize( CArchive & ar ); //重载串行化函数 1分
};
// CStudent.cpp
IMPLEMENT_SERIAL(CStudent ,CObject, 0) 1分
void CStudent:Serialize(CArchive & ar)
{ CObject::Serialize(ar); 1分
if ( ar.IsStoring() )
{ ar<<Num<<Name<< Birth <<Address<<Grade; 1分
}
else
{ ar>>Num>>Name>> Birth >>Address>>Grade; 1分
}
}
3、下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle)、并给出具体的求面积函数。
class shape{
public:
virtual float area( )=0
};
float total(shape *s[ ],int n)
{ float sum=0.0;
for(int i=0; i<n: i++)
sum=sum+i.area( );
return sum;
}
#include<math.h> 1分
class triangle:public shape{ 1分
public:
virtual float area( )
{
float s=(a+b+c)/2;
return sqrt(s*(s-a)*(s-b)*(s-c)); 3分
}
private:
float a,b,c; 1分
};
class rectangle:public shape{ 1分
public:
virtual float area( )
{
return a*b; 2分
}
private:
float a,b; 1分
};
4、创建一个记录通讯录内容的新类Caddrlist,包含:姓名、住址、电话、出生日期,并使该类可以实现串行化。请写出可以实现要求的CAddrlist.h和CAddrlist.cpp文件的内容
//Addrlist.h文件内容:
class CAddrlist : public CObject { 1分
public:
CString Name;
CString Address;
CString Tel;
CTime Birth;
CAddrlist(); 3分
DECLARE_SERIAL(CAddrlist) // 使对象可串行化 1分
virtual void Serialize( CArchive & ar ); //重载串行化函数 1分
};
// Addrlist.cpp文件内容:
IMPLEMENT_SERIAL(CAddrlist,CObject, 0) 1分
void CAddrlist::Serialize(CArchive & ar)
{ CObject::Serialize(ar); 1分
if ( ar.IsStoring() )
{ ar<<Name<<Tel<<Address<<Birth; 1分
}
else
{ ar>>Name>>Tel>>Address>>Birth; 1分
}
}
1、 (10分)已知点类的定义如下:
class Point{
……
private:
double x,y;
};
分别用成员函数和友元函数实现计算两点间的距离,函数名为distance。
用成员函数实现(5分)
double Point::distance( const Point &a )
{ double dx,dy;
dx = x-a.x;
dy = y-a.y;
return sqrt( dx*dx + dy*dy );
}
用友元函数实现(5分)
double distance( const Point &a, const Point &b )
{ double dx,dy;
dx = a.x-b.x;
dy = a.y-b.y;
return sqrt( dx*dx + dy*dy );
}
5、(15分)要求计算立方体和圆柱2个几何体的表面积和体积。可以抽象出一个公共的基类Base,把它作为抽象类,在该类内定义求表面积和体积的纯虚函数(抽象类本身是没有表面积和体积可言的)。由这个抽象类派生出描述立方体和圆柱的2个具体类,在这2个类中都有计算表面积和体积的函数的自己版本。请用C++语言定义上述类等级。
const double PI=3.14159;
class Base{
public:
virtual double area() const=0;
virtual double volume() const=0;
};
class Cube:public Base{
public:
Cube(double l=10)
{ length=l>0 ? l : 10; }
double area() const
{ return 6*length*length; }
double volume() const
{ return length*length*length; }
private:
double length;
};
class Cylinder:public Base{
public:
Cylinder(double r=10, double h=5)
{ radius=r>0 ? r : 10;
height=h>0 ? h : 5;
}
double area() const
{ return 2*PI*radius*radius+2*PI*radius*height; }
double volume() const
{ return PI*radius*radius*height; }
private:
double radius;
double height;
};
6、(10分)简单计算程序界面如下图所示,x对应编辑框控件的ID为 IDC_EDIT1,对应值类型的成员变量m_x(double);y对应编辑框控件的ID为IDC_EDIT2,对应值类型的成员变量m_y(double);z对应的编辑框控件的ID 为IDC_EDIT3,对应值类型的成员变量m_z(double)。乘法按钮的功能是将x,y相乘,除法按钮的功能是将x,y相除,并将结果在z对应的编辑框IDC_EDIT3显示出来。写出乘法按钮和除法按钮对应的代码。(10分)
void CExDlg::OnButtonMul( ) // 乘法按钮
{ UpdateDate(TRUE);
m_z = m_x * m_y;
UpdateDate(FALSE); }
void CExDlg::OnButtondIV( ) // 除法按钮
{
UpdateDate(TRUE);
if ( m_y == 0 )
{ MessageBox( “除数不能为0!”);
return;
}
m_z = m_x / m_y;
UpdateDate(FALSE);
7、(10分)设计一个基于对话框的应用程序,如下图所示。要求:单击Color按钮,能弹出通用颜色对话框选取颜色,并用该颜色显示:This is a color example。
已知:Example组合框的ID为:IDC_DISPLAY。
写出Color按钮的BN_CLICKED消息处理函数。
void CXT6_4Dlg::OnColor()
{
// TODO: Add your control notification handler code here
COLORREF m_cTextColor;
CColorDialog Dlg;
if ( Dlg.DoModal()==IDOK )
{
m_cTextColor=Dlg.GetColor();
CWnd * pWnd=GetDlgItem(IDC_DISPLAY);
CDC * pDC=pWnd->GetDC();
CRect rcDisplay;
pWnd->GetClientRect(rcDisplay);
pDC->SetTextColor(m_cTextColor);
CString s="This is a color example";
DC->TextOut(rcDisplay.right/2-80,rcDisplay.bottom/2-5,s);
}
}
8、如何定义ODBC的数据源?试叙述其过程。(5分)
打开控制面板,双击ODBC图标,进入ODBC数据源管理器。定义用户DSN的步骤如下:
(1) 单击【添加】按钮,弹出“创建新数据源”对话框。
(2) 为新的数据源选择数据库驱动程序。并单击【完成】按钮。
(3) 在“ODBC Microsoft Access 97 安装”对话框中,应为该数据源起一个简短的名称。并在下一个编辑框中输入对该数据库的说明。
(4) 指定数据库的位置。单击【选取】按钮,然后指定所创建的Access数据库。
(5) 单击【确定】按钮,刚才创建的用户数据源被添加在“ODBC数据源管理器”的“用户数据源”列表中。
9、(20分)该应用有4个命令按钮,作为增加项目、删除项目和全部删除项目以及退出程序的按键。另外,还有一个编辑框作为新项目名称输入框IDC_NAME_EDIT对应控件变量为m_Name(类型为CString),1个静态文本用于显示项目数目,列表框用于项目列表对应控件变量为m_List1,1个静态文本用于显示标题。界面下图所示。
根据要求写出代码:
(1)对话框初始化消息处理函数OnInitDialog()里,向列表框添加“China”,“Germany”两项内容。
BOOL CEx6_3Dlg::OnInitDialog()
{
return TRUE;
}
(2) “增加”命令按钮的单击消息处理函数OnAdd() 将新项目名称输入框的内容增加到列表框中。
void CEx6_3Dlg::OnAdd()
{
}
(3)“删除”按钮的单击消息处理函数OnDel() 将当前列表框中选中的项删除
void CEx6_3Dlg::OnDel()
{
}
(1) BOOL CEx6_3Dlg::OnInitDialog( )
{ m_List1.AddString("China");
m_List1.AddString("Germany");
UpdateData(FALSE);
return TRUE;
}
(2) void CEx6_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) void CEx6_3Dlg::OnDel( )
{ int nIndex=m_List1.GetCurSel();
if(nIndex!=LB_ERR)
{ m_List1.DeleteString(nIndex); }
else
MessageBox("当前没有选择项或列表框操作失败");
UpdateData(FALSE);
}
10、下面是一个基于对话框的应用程序,用来求解一元二次方程的根。当用户在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
试写出计算按钮的单击消息处理函数。
void CEx3_4Dlg::OnButton1()
{
}
4、 void CEx6_1Dlg::OnButton1()
{
UpdateData();
double disc;
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));
}
else if ( disc>1e-6 ) //如果disc大于0
{ double x1,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
{
double realpart,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);
}
11、简述用MFC进行ODBC的编程过程。(10分)
关键知识点:(1)设计数据库。(2)定义ODBC数据源。(3)创建应用程序外壳。(4)设计主窗体。(5)将控件与数据库字段相关联。(6)编写代码实现添加新记录功能。(7)编写代码实现删除记录功能。(8)编写代码实现对记录排序功能。(9)编写代码实现查找记录功能等。
展开阅读全文