计算机等级考试二级C++模拟题及解析5上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt10_1,此工程包含一个源程序文件kt10_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果为:
classBase
classD1
classD2
classD3
finBase
源程序文件kt10_1.cpp清单如下:
#include<iostream.h>
classBase
{ public:
Base(){cout<<"classBase"<<endl;}
voidf(){cout<<"finBase"<<endl;} };
classD1:virtualpublicBase
{ public:
D1(){cout<<"classD1"<<endl;}
voidf(){cout<<"finD1"<<endl;} };
/**********found**********/
classD2:publicBase
{ public:
D2(){cout<<"classD2"<<endl;} };
/**********found**********/
classD3::publicD1,publicD2
{ public:
D3(){cout<<"classD3"<<endl;} };
voidmain()
{ D3d;
/**********found**********/
d.f(); }
【参考答案】
(1)将class D2:public Base
改为:class D2:virtual public Base
(2)将class D3::public D1,public D2
改为:class D3:public D1,public D2
(3)将d.f();改为:d.Base::f();
【试题解析】
(1)主要考查对虚基类的理解,虚基类可以解决二义性的问题,其定义方式是在继承列表中使用virtual关键字,使用虚基类可以避免程序运行中对基类函数调用的不惟一;
(2)主要考查对类的定义方法的掌握,“::”为作用域符,此处应该使用“:”,因为后面是继承列表;
(3)主要考查对虚基类函数调用过程的理解,只有使用"::"限定才能访问基类函数,否则将会调用自身的函数,如果该类没有该函数的定义,则会自动调用其父类的该函数,所以必须使用“::”符号。
二、简单应用题
请编写一个函数inlinelongsum(intn),用递归函数完成运算:sum(n)=1*1+2*2+???+n*n,递归表达式为sum(n)=sum(n-1)+n2。
注意:部分源程序已存在文件kt10_2.cpp中。
请勿修改主函数main和其他函数中的任何内容,仅在函数sum的花括号中填写若干语句。
文件kt10_2.cpp的内容如下:
#include<iostream.h>
inlinelongsum(intn)
{
}
voidmain()
{ intn;
cout<<"输入n:";
cin>>n;
cout<<"结果为:"<<sum(n)<<endl; }
【参考答案】
inline long sum(int n)
{ if(n==1)
return 1;
else
return n*n+sum(n-1); }
【试题解析】
本题考查对递归函数掌握的熟练程度。递归的终止条件为n=1时,值为1。
.三、综合应用题
使用VC6打开考生文件夹下的工程kt10_3,此工程包含一个源程序文件kt10_3.cpp,其中定义了用于表示雇员信息的CEmployee类与表示公司信息的Company类,但这两个类的定义并不完整。请按要求完成下列操作。
(1)定义Cemployee类的私有数据成员name(大小为50的字符数组)和pay(double型数据),分别用于记录雇员姓名和月薪。请在注释“//**1**”之后添加适当的语句。
(2)完成Company类默认构造函数的定义,该构造函数将n值赋值给私有成员num,并完成指针emp所指的n个Cemployee对象空间的申请,请在注释“//**2**”之后添加适当的语句。
(3)完成Company类成员函数voidCompany::add(intcode,charname[50],doublepay)的定义,该函数将某一雇员的编号code、姓名name及月薪pay输入到公司信息中。请在注释“//**3**”之后添加适当的语句。
(4)完成Company类成员函数voidCompany::print()的定义,使其以"_ispaid_RMBforonemonth"的格式输出公司内所有员工的月薪信息。请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序清单如下:
#include<iostream.h>
#include<string.h>
classCEmployee
{ public:
voidputname(charn[50]){strcpy(name,n);}
voidgetname(charn[50]){strcpy(n,name);}
voidputpay(doubled){pay=d;}
doublegetpay(){returnpay;}
private:
//**1** };
classCompany
{ private:
CEmployee*emp;
intnum;
public:
Company(intn);
voidadd(intcode,charname[50],doublepay);
voidprint(); };
Company::Company(intn)
{ //**2** }
voidCompany::add(intcode,charname[50],doublepay)
{ //**3** }
voidCompany::print()
{ //**4**
for(inti=0;i<num;i++)
{ (emp+i)->getname(c);
money=(emp+i)->getpay();
cout<<c<<"ispaid"<<money<<
"RMBforonemonth"<<endl; } }
voidmain()
{ Companycom(2);
com.add(0,"Jack",200);
com.add(1,"Lee",300);
com.print(); }
【参考答案】
(1)char name[50];
double pay;
(2)num=n;
emp=new CEmployee[num];
(3)(emp+code)->putname(name);
(emp+code)->putpay(pay);
(4)char c[50];
double money;
【试题解析】
本题考查类成员的定义、类成员函数的定义与调用、对象数组的使用。注意指针和动态申请空间new的使用方法。使用指针调用成员应该用"->"符号,new的返回值是指针类型的。
.