计算机二级C++模拟题一(附参考答案&解析)

模拟题一


一、选择题

1.已知Value是一个类,value是Value的一个对象。下列以非成员函数形式重载的运算符函数原形中,正确的是______

  • A.Value operator+(Value v,int i);
  • B.Value operator+(Value v=value,int i);
  • C.Value operator+(Value V,int i=0);
  • D.Value operator+(Value v=value,int i=0);

2.有如下类定义:
class Date{
public:
Date(int y=2014, int m=9, int d=9):year(y), month(m), day(d){}
______(ostream&stream, Date&ddd); //运算符<<的声明
private:
int year, month, day;
};

若要使语句序列
Date GoodDay;
cout<<GoodDay<<endl;
能够正常运行,横线处的内容应为______。

  • A.istream& operator <<
  • B.ostream& operator <<
  • C.friend istream& operator <<
  • D.friend ostream& operator <<

3.有如下程序:

#include
using namespace std;

class Power
{
public:
	Power(int x) :val(x) {}
	________
protected:
	int val;
};

class Square :public Power
{
public:
	Square(int x) :Power(x) {}
	void Display() { cout << val << "的平方是" << val * val << endl; }
};

int main()
{
	Power*p = new Square(3);
	p->Display();
	delete p;
	return 0;
}

若运行时的输出结果为“3的平方是9”,则划线处缺失的语句可能是______。

  • A.void Display(){};
  • B.virtual void Display()=0;
  • C.void virtual Display()=0;
  • D.void Display()virtual {};

4.语句cout << ((a = 2) && (b = -2)); 的输出结果是______

  • A.无输出
  • B.编译错误
  • C.-1
  • D.1

5.数据库管理系统是______。

  • A.操作系统的一部分
  • B.系统软件
  • C.一种编译系统
  • D.一种通信软件系统

6.下列函数中对调用它的函数没有起到任何作用的是

  • A.void f1(double &x){–x;}
  • B.double f1(double x){return x-1.5;}
  • C.void f3(double x){–x;}
  • D.double f4(double *x){–x; returnx;}

7.有如下程序:

#include 
using namespace std;

int main() 
{
	int f, f1 = 0, f2 = 1;
	for (int i = 3; i <= 6; i++) 
	{
		f = f1 + f2;
		f1 = f2; f2 = f;
	}
	cout << f << endl;
	return 0;
}

运行时的输出结果是______。

  • A.2
  • B.3
  • C.5
  • D.8

8.在C++语言中函数返回值的类型是由______决定的。

  • A.调用该函数时系统临时
  • B.return语句中的表达式类型
  • C.定义该函数时所指定的函数类型
  • D.调用该函数时的主调函数类型

9.有如下程序:

#include 
using namespace std;

class TestClass
{
	int n;
	public:
		TestClass(int k):n(k) {}
		int get() { return n; }
		int get() const { return n + 1; }
};
int main()
{
	TestClass p(5);
	const TestClass q(6);
	cout<<p.get()<<q.get();
	return 0;
}

执行后的输出结果是______。

  • A.55
  • B.57
  • C.75
  • D.77

10.有如下四个语句:
① cout << ‘A’<‘) << left << setw(7) << ‘B’ << endl;
② cout << setfill(’’) << left << setw(7) << ‘A’ << ‘B’ << endl;
③ cout << ‘A’ << setfill(‘‘) << right << setw(7) << ‘B’ << endl;
④ cout << setfill(’
’) << right << setw(7) << ‘A’ << ‘B’ << endl;
其中能显示A******B的是______。

  • A.①和③
  • B.①和④
  • C.②和③
  • D.②和④

11.检查软件产品是否符合需求定义的过程称为______。

  • A.确认测试
  • B.需求测试
  • C.验证测试
  • D.路径测试

12.类模板template<class T>class x{…},其中友元函数f对特定类型T(如int),使函数f(x<int>}成为x<int>模板类的友元,则其说明为______。

  • A.fricnd voidf();
  • B.friend voidf(x<T>);
  • C.friend voidA::f();
  • D.friend void C<T>::f(x<T>);

13.有如下程序:

#include 
using namespace std;

class Con
{
	char ID;
	public:
		Con() :ID('A'){cout << 1;}
		Con(char ID) :ID(ID) { cout << 2; }
		Con(Con&c) :ID(c.getID()) { cout << 3; }
		char getID()const { return ID; }
};
void show(Con c) { cout << c.getID(); }

int main()
{
	Con c1;
	show(c1);
	Con c2('B');
	show(c2);
	return 0;
}

执行上面程序的输出结果是______。

  • A.13A23A
  • B.23A13B
  • C.13A23B
  • D.13B23A

14.有如下程序:

#include < iostream >
using namespace std;

class Basel
{
public:
	Basel(int d) { cout << d; }
	~Basel() {}
};

class Base2
{
public:
	Base2(int d) { cout << d; }
	~Base2() {}
};

class Derived : public Basel, Base2
{
public:
	Derived(int a, int b, int c, int d) :Basel(b), Base2(a), b1(d), b2(c) {}
private:
	int b1;
	int b2;
};

int main()
{
	Derived d(1, 2, 3, 4);
	return 0;
}

执行这个程序的输出结果是______。

  • A.1234
  • B.2134
  • C.12
  • D.21

15.下列关于goto语句的描述中,正确的是______。

  • A.goto语句可在一个文件中随意转向
  • B.goto语句后面要跟一个它所转向的语句
  • C.goto语句可以同时转向多条语句
  • D.goto语句可以从一个循环体内转到循环体外

16.有如下类定义:

class AA
{
    int a;
    public:
    int getRef() const {return &a;}	//①
    int getValue() const {return a;}//②
    void set(int n)const{a=n; }		//③
    friend void show(AA aa)const {cout << a;}	//④
};

其中四个函数的定义中正确的是______。

  • A.①
  • B.②
  • C.③
  • D.④

17.已知函数f的原型是void f(int *a, long &b); ,变量v1、v2的定义是:int v1; long v2;

下列调用语句中正确的是______。

  • A.f(v1,&v2);
  • B.f(v1,v2);
  • C.f(&v1,&v2);
  • D.f(&1,v2);

18.下列关于虚函数的描述中正确的是______。

  • A.如果在重定义函数时使用了保留字virtual,则该重定义函数仍然是虚函数
  • B.虚函数不得声明为静态成员函数
  • C.虚函数不得声明为另一个类的友元函数
  • D.派生类必须重新定义基类的虚函数

19.模块独立性是软件模块化所提出的要求,衡量模块独立性的度量标准则是模块的______。

  • A.抽象和信息隐蔽
  • B.局部化和封装化
  • C.内聚性和耦合性
  • D.激活机制和控制方法

20.若有定义语句“double x[5]={1.0,2.0,3.0,4.0,5.0},* p=x”,则错误引用x数组元素的是______。

  • A.*p
  • B.x[5]
  • C.*(p+1)
  • D.*x

21.下列属于黑盒测试方法的是______。

  • A.语句覆盖
  • B.逻辑覆盖
  • C.边界值分析
  • D.路径分析

22.数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的______。

  • A.需求分析阶段
  • B.逻辑设计阶段
  • C.概念设计阶段
  • D.物理设计阶段

23.若有如下程序:

#include 
using namespace std;

int s = 0;

class sample
{
	static int n;
public:
	sample(int i)
	{
		n = i;
	}
	static void add()
	{
		s += n;
	}
};

int sample::n = 0;

int main()
{
	sample a(2), b(5);
	sample::add();
	cout << s << endl;
	return 0;
}

程序运行后的输出结果是______。

  • A.2
  • B.5
  • C.7
  • D.3

24.下列关于this指针的描述中,正确的是______。

  • A.类的成员函数都有this指针
  • B.类的友元函数都有this指针
  • C.任何与类相关的函数都有this指针
  • D.类的非静态成员函数都有this指针

25.在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是______。

  • A.()
  • B.[]
  • C.<>
  • D.{}

26.若有如下程序:

#include 
using namespace std;

class TestClass
{
public:
	void who() { cout << "TestClass" << endl; }
};

class TestClass1 :public TestClass
{
public:
	void who() { cout << "TestClass1" << endl; }
};

int main()
{
	TestClass *p;
	TestClass1 obj1;
	p = &obj1;
	p -> who();
	return 0;
}

则该程序运行后的输出结果是______。

  • A.TestClass1
  • B.TestClass
  • C.0
  • D.无输出

27.以下C++语言中用于单行注释的是______

  • A.//
  • B./*
  • C.*/
  • D.|

28.下列数据结构中,属于非线性结构的是______。

  • A.双向链表
  • B.循环链表
  • C.二叉链表
  • D.循环队列

29.已知枚举类型声明语句为:
enum COLOR{WHITE,YELLOW,GREEN=5,RED,BLACK=10};
则下列说法中错误的是______。

  • A.枚举常量YELLOW的值为1
  • B.枚举常量RED的值为6
  • C.枚举常量BLACK的值为10
  • D.枚举常量WHITE的值为1

30.下列关于纯虚函数与抽象类的描述中,错误的是______。

  • A.纯虚函数是一种特殊的虚函数,它没有具体的实现
  • B.抽象类是指具有纯虚函数的类
  • C.一个基类声明了纯虚函数,该基类的派生类一定不是抽象类
  • D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出

31.下列选项中,不是一个算法的基本特征的是______。

  • A.完整性
  • B.可行性
  • C.有穷性
  • D.拥有足够的情报

32.有如下类声明:
class XA{
int x;
public:
XA(int n){x=n;}
};
class XB:public XA{
int y;
public:
XB(int a,int b);
};
在构造函数XB的下列定义中,正确的是______。

  • A.XB::XB(int a,int b):x(a),y(b){}
  • B.XB::XB(int a,int b):XA(a),y(b){}
  • C.XB::XB(int a,int b):x(a),XB(b){}
  • D.XB::XB(int a,int b):XA(a),XB(b){}

33.在深度为5的满二叉树中,叶子节点的个数为______。

  • A.32
  • B.31
  • C.16
  • D.15

34.在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是______。

  • A.派生类的对象可以赋给基类的对象
  • B.派生类的对象可以初始化基类的引用
  • C.派生类的对象可以直接访问基类中的成员
  • D.派生类的对象的地址可以赋给指向基类的指针

35.数据库管理系统是______。

  • A.操作系统的一部分
  • B.在操作系统支持下的系统软件
  • C.一种编译系统
  • D.一种操作系统

36.有以下程序:

void fun(int a[], int i, int j)
{
	int t;
	if (i < j)
	{
		t = a[i]; 
		a[i]=a[j]; 
		a[j]=t;
		fun(a, ++i, --j);
	}
}

int main()
{
	int a[] = { 1,2,3,4,5,6 }, i;
	fun(a, 0, 5);
	for (i=0; i<6; i++)
		cout << (a[i]);
}

执行后输出结果是______。
A.6 5 4 3 2 1
B.4 3 2 1 5 6
C.4 5 6 1 2 3
D.1 2 3 4 5 6

37.有如下程序:

#include 
using namespace std;

int main() {
	char a;
	cin >> a;
	if (a == '*')cout << "**" << endl;
	else cout << "###" << endl;
	return 0;
}

输入字符+时,程序的运行结果是______。

  • A.***
  • B.###
  • C.***###
  • D.无输出

38.若函数中有定义语句“int k;”,则______。

  • A.系统将自动给k赋初值0
  • B.这时k中的值无定义
  • C.系统将自动给k赋初值-1
  • D.这时k中无任何值

39.有如下程序:

#include 
using namespace std;

int main() {
	int i, s = 0;
	for (i = 1; s < 20; i += 2)s += i * i;
	cout << i << endl;
	return 0;
}

运行这个程序的输出结果是______。

  • A.3
  • B.5
  • C.7
  • D.9

40.堆栈s进行下列操作:push(1);push(2);pop();pop();后,此时的栈顶元素为______。

  • A.1
  • B.2
  • C.0
  • D.不确定


二、基本操作题

1.请打开工程prog1,该工程中包含程序文件main.cpp,其中有Salary(“工资”)类和主函数main的定义。
程序中位于每个“// ERROR found”之后的一行语句行有错误,请加以改正。
改正后程序的输出结果应为:

应发合计:3500 应扣合计:67.5 实发工资:3432.5

注意:只修改每个“// ERROR found”下的那一行,不要改动程序中的其他内容。

#include
using namespace std;

class Salary{
public:
  Salary(const char *id, double the_base, double the_bonus, double the_tax)
  // ERROR **********found********** 
     : the_base(base), the_bonus(bonus), the_tax(tax)
  {
     staff_id=new char[strlen(id)+1];
     strcpy(staff_id,id);
  }
  // ERROR **********found********** 
  ~Salary(){ delete *staff_id; }
  double getGrossPay()const{ return base+bonus; }          //返回应发项合计
  double getNetPay()const{ return getGrossPay()-tax; }   //返回实发工资额
private:
  char *staff_id;    //职工号
  double base;       //基本工资
  double bonus;      //奖金
  double tax;        //代扣个人所得税
};

int main() {
  Salary pay("888888", 3000.0, 500.0, 67.50);
  cout<<"应发合计:"<<pay.getGrossPay()<<"   ";
  cout<<"应扣合计:"<<pay.getGrossPay()-pay.getNetPay()<<"   ";
  // ERROR **********found********** 
  cout<<"实发工资:"<<pay::getNetPay()<<endl;

  return 0;
}


三、简单应用题

请打开源程序文件2.cpp。阅读下列函数说明和代码。函数num(char *str)用于返回字符串中非数字的个数。
例如:abc123abc45
返回值为:6
将函数num补充完整。
注意:请勿改动主函数main。
试题程序:

#include 
int num(char *str)
{

}
int main()
{
    char str[1024];
    cout<<"please input a string: "<<endl;
    cin.getline(str,1024);
    cout<<"char number is "<<num(str)<<endl;
    return 0;
}


四、综合应用题

请打开工程proj3,其中声明的是一个人员信息类,补充编制程序,使其功能完整。在main函数中给出了一组测试数据,此种情况下程序的输出应该是:Zhang 20 Tsinghua。
注意:只能在函数address_change的“// 333”和“// 666”之间填入若干语句,不要改动程序中的其他内容。
程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。

#include 
#include 
#include"proj3.h"
using namespace std;
void Person::name_change(char*  _name)
{
  strcpy(name, _name);	
}

void Person::age_change(int _age)
{
  age=_age;
}

void Person::address_change(char* _add)
{	
	if (address!=NULL) delete [] address;
//********333******** 



//********666******** 
}

void Person::info_display(){
	cout<<name<<'\t'
		<<age<<'\t';
	if(address!=NULL)
		cout<<address<<endl;
	cout<<endl;
}

Person::~Person(){
	if(address!=NULL)
		delete[] address;
}
void main()
{
	Person p1;
	p1.name_change("Zhang");
	p1.age_change(20);
	p1.address_change("Tsinghua University");
	p1.address_change("Tsinghua");
	p1.info_display();
	writeToFile("");
}

proj3.h

#include 
#include 
using namespace std;
class Person{
    char name[20];
    int age;
    char* address;
  public:
    Person(){  age=0;address=0;  }
    void name_change(char *_name);    //名字修改函数
    void age_change(int _age);        //年龄修改函数
    void address_change(char* _add);  //地址修改函数
    void info_display();              //人员信息显示
    ~Person();                        //析构函数
};

void writeToFile(const char *path);



参考答案:


一、选择题

1.A

[解析] +是二元运算符,重载不能改变这一点。所以为了保证+有两个参数,所以不允许有默认参数。

2.D

[解析] 本题考查的是输出运算符<<的重载首先函数的第一个形参类型为ostream&,所以返回值也应该是ostream&,以保证输出运算符可以链接使用,选项A、C错误;由于L/O操作符的第一个形参类型并不是Date类类型,所以不能作为成员函数,必须使用友元函数,声明前必须加关键字friend,选项B错误,选项D正确。

3.B

[解析] 由题意可知,基类指针p指向的是派生类的对象,当p调用Display()时,输出的结果是派生类中的Display(),可知Display()必为虚函数,这样才能满足动态联编。虚函数的定义是在声明前加关键字virtual,选项A不是虚函数,错误;选项C、D定义虚函数的格式不对,错误;答案为B选项。

4.D

[解析] 很明显,本题考查的是表达式的值作为结果输出。可以看出,本表达式是一个逻辑表达式,其结果为真或假,那么输出则对应1和0,故排除选项C。本题答案为D。

5.B

[解析] 系统软件主要包括如下几个方而:
(1)操作系统软件,这是软件的核心。
(2)各种语言的解释程序和编译程序。
(3)各种服务性程序。
(4)各种数据库管理系统。

6.C

[解析] 本题考核函数的调用和参数值的传递(形参、实参)。选项C中的函数D调用采用按值传递的方式,函数中对形参的修改没有影响到实参的值,而且函数G还没有返回值,所以函数耀对调用它的函数没有起到任何作用。选项A中的函数f1采用引用传递的方式影响实参的值,选项D中的函数f4通过返回值和指针调用来影响调用函数;选项B中的函数f2采用返回值的形式对其调用函数发生作用。

7.C

[解析] 循环3次,分别每次计算出f1,f2和f的值,该题比较简单,只需要细心即可。

8.C

[解析] C++中函数return语句中返回的类型应与函数定义指定的类型一致,即函数定义的类型即为函数应返回的类型。

9.B

[解析] C++中对常对象的成员函数调用,将自动调用其常成员函数,程序中调用原型为"int get()const;"的函数,对于非常对象将调用原型为"int get();"的函数。因为首先用5对对象p进行了初始化,所以执行p.get()时直接返回5,而对于常对象则以6对q进行初始化。在调用q.get()时,将调用原型为"int get()const;"的函数,该函数将返回n+1,第二个输出应为7,所以本题答案为57。

10.C

[解析] 本题考查C++流的使用。setfill()的作用是设置填充字符;left的作用是使输出数据在指定宽度内左对齐;right的作用是使输出数据在指定宽度内右对齐。(各选项运行结果见文章下方代码)

11.A

[解析] 确认测试的任务是验证软件的功能和性能,以及其他特性是否满足需求规格说明中确定的各种需求。

12.B

[解析] 声明一个函数模板的格式template<模板形参表声明>函数声明。调用模板函数时,如果与模板实参中最后的若干个参数有关的信息可以从模板函数的实参中获得,则相关的模板实参可以省略。

13.C

[解析] Con c1定义c1对象,调用Con的无参数构造函数,输出1,ID值变为A,执行show(c1)时会调用拷贝构造函数,将c1对象的值复制给show函数的形参,此时输出3,然后在show()中输出c1的ID值A,Con c2(‘B’)定义c2对象,调用Con(char ID)构造函数,输出2,c2的ID值为B,show(c2)执行时先调用拷贝构造函数输出3,然后输出B。因此程序输出结果为“13A23B”。

14.D

[解析] 本题考查派生类的构造函数和析构函数,在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数,对象释放时,先执行派生类的析构函数,再执行基类的析构函数。本题中定义一个派生类对象时,分别调用基类的构造函数,所以分别输出21。

15.D

[解析] goto语句也可以跳出循环和switch语句,goto语句无条件地转移程序的执行控制。它总是与一标号相匹配,其形式为:goto标号;,标号是用户自定义的标识符,它可以处于goto语句的前面,也可以处于其后,但标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一个冒号组成。

16.B

[解析] 本题考查常成员函数,常成员函数只能引用本类中的数据成员,而不能修改它。所以本题答案为B。

……
详见:https://download.csdn.net/download/weixin_44785513/80252491


二、基本操作题:

#include 
#include 
using namespace std;

class Salary {
public:
	Salary(const char *id, double the_base, double the_bonus, double the_tax)
		// ERROR **********found********** 
		: base(the_base), bonus(the_bonus), tax(the_tax)
	{
		staff_id = new char[strlen(id) + 1];
		strcpy(staff_id, id);
	}
	// ERROR **********found********** 
	~Salary() { delete[] staff_id; }
	double getGrossPay()const { return base + bonus; }          //返回应发项合计
	double getNetPay()const { return getGrossPay() - tax; }   //返回实发工资额
private:
	char *staff_id;    //职工号
	double base;       //基本工资
	double bonus;      //奖金
	double tax;        //代扣个人所得税
};

int main() {
	Salary pay("888888", 3000.0, 500.0, 67.50);
	cout << "应发合计:" << pay.getGrossPay() << "   ";
	cout << "应扣合计:" << pay.getGrossPay() - pay.getNetPay() << "   ";
	// ERROR **********found********** 
	cout << "实发工资:" << pay.getNetPay() << endl;

	return 0;
}

输出结果:

应发合计:3500 应扣合计:67.5 实发工资:3432.5

(1):base(the_base),bonus(the_bonus),tax(the_tax)
(2)~Salary() {delete[] staff_id;}
(3)cout << “实发工资:” << pay.getNetPay() << endl;

[考点] 本题考查的是Salary类,其中涉及动态数组、构造函数、析构函数和const函数。构造函数一般使用成员列表初始化,括号内应该为形参。析构函数使用delete语句释放指针,格式为:delete[]指针。
[解析] (1)主要考查考生对构造函数的掌握情况,构造函数的成员初始列表要把形参放在括号内。
……

详见:https://download.csdn.net/download/weixin_44785513/80252491

你可能感兴趣的:(c++,开发语言,后端)