计算机等级考试二级C++模拟题及解析8上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt13_1,此工程包含一个源程序文件kt13_1.cpp,但该程序运行有问题,请改正程序中的错误,使该程序的输出结果为:
5
5
源程序文件kt13_1.cpp清单如下:
#include<iostream.h>
classA{
public:
/*****************found*****************/
staticintn=1;
A(){n++;};
~A(){n--;}; };
/*****************found*****************/
intn=0;
intmain(){
Aa;
Ab[3];
A*c=newA;
c=&a;
/*****************found*****************/
cout<<c.n<<endl;
cout<<A::n<<endl;
return0; }
【参考答案】
(1)将static int n=1;改为:static int n;
(2)将int n=0;改为:int A::n=0;
(3)将cout<<c.n<<endl;改为:cout<<c->n<<endl;
【试题解析】
(1)在类的声明中只能对静态数据成员进行引用性声明,不能进行静态数据成员初始化;
(2)由于静态数据成员是类的成员,所以在初始化时必须限定它所属的类;
(3)c为类的对象指针,访问类成员函数时使用符号“->”,而不能用“.”。
.二、简单应用题
请编写一个函数sortnum(intnum),参数num是一个三位的整数,该函数将num的百位、十位和个位的数字进行重排,并返回由上述的三个数字组成的最大的三位数。
注意:部分源程序已存在文件kt13_2.cpp中。
如输入456后,输出结果如下:
654
请勿修改主函数main和其他函数中的内容,仅在函数sortnum的花括号中填写若干语句。
文件kt13_2.cpp的内容如下:
#include<iostream.h>
intsortnum(intnum)
{
}
voidmain()
{ intnum;
intresult=0;
cout<<"请输入一个三位数";
cin>>num;
cout<<sortnum(num)<<endl; }
【参考答案】
int number[3],i,j,temp;
for(i=0;i<3;i++)
{ number[i]=num%10;
num=num/10; }
for (i=0;i<2;i++)
{ for (j=i+1;j<3;j++)
if (number[j]<=number[i])
{ temp=number[j];
number[j]=number[i];
number[i]=temp; } }
num=number[2]*100+number[1]*10+number[0];
return num;
【试题解析】
本题主要考查对基本控制结构和数组的访问,以及根据实际需要建立模型,对数字进行排序的能力,答案中采用的是冒泡排序法。请注意程序中数组下标的范围和两层for循环嵌套中循环变量的取值情况。
.三、综合应用题
使用VC6打开考生文件夹下的工程kt13_3。此工程包含一个kt13_3.cpp,其中定义了类Person,但该类的定义并不完整。请按要求完成下列操作,将程序补充完整。
(1)定义类Person的私有数据成员forename、surname和money,forename和surname都是char型的指针数据,money是double型的数据。请在注释“//**1**”之后添加适当的语句。
(2)完成类Person的带三个参数的构造函数Person(char*f,char*s,doublem),分别为forename和surname申请新的空间来存储参数f和s指针指向的内容,注意空间的大小,最后把参数m的值赋给money,请在注释“//**2**”之后添加适当的语句。
(3)完成类Person的析构函数的定义,把forename和surname指向的空间释放,请在注释“//**3**”之后添加适当的语句。
(4)完成类Person的成员函数display的定义,使其以格式"fornamesurnamehasmoney"的形式输出内容,请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
输出结果如下:
RichardBerkhas1000.56
Pressanykeytocontinue
源程序文件kt13_3.cpp清单如下:
#include<iostream.h>
#include<string.h>
classPerson
{ private:
//**1**
doublemoney;
public:
Person(char*f,char*s,doublem);
~Person();
voiddisplay(); };
Person::Person(char*f,char*s,doublem)
{ //**2**
strcpy(forename,f);
surname=newchar[strlen(s)+1];
strcpy(surname,s);
money=m; }
Person::~Person()
{ //**3** }
voidPerson::display()
{ //**4** }
voidmain()
{ Personp("Richard","Berk",1000.56);
p.display(); }
【参考答案】
(1)char *forename;
char *surname;
(2)forename = new char[strlen(f)+1];
(3)delete []forename;
delete []surname;
(4)cout<<forename<<" "<<surname<<" has "<<money<<endl;
【试题解析】
主要考查类的定义和字符指针的动态空间申请和释放。(2)中new关键字是动态申请空间,里面使用了函数strlen,该函数是返回参数字符串的长度,之所以加一是要加入字符串结尾标志,这一点考生切记。(3)中delete是释放动态内存的关键字,释放一位数组占用的内存格式是先写[],之后是指针名,括号内不写数组的大小。
.