2023秋--重庆大学cpp期末模拟检测参考答案

选择题:


1.下列程序代码,正确的输出结果是( C)

int a=0xfe;
char b=062;
cout<<a<<","<<b<<endl;

A.0xfe,062
B.fe,62
C.254,2
D.254,62

解析:0xfe是十六进制数。转换为10进制为254;062有前导零,C++中认为是八进制数,以数字0开头的整数常量被视为八进制数。cout输出char类型,会输出变量字符类型,即ASCII形式。062换算为10进制为50,50对应字符2。

2.下列代码能正确执行的是( A)
A.
char a='C';
const char& p=a;

B.
char a='C';
char* const p;
p=&a;

C.
char a='C';
const char& p;
p=a;

D.
char a='C';
char& p;
p=a;
 

解析:选项均将字符类型变量初始化为C。

对于B,p为指针常量,不能修改p本身的值(*p=&a合法,可以修改指针指向的字符)(区分指针常量常量指针)。

对于C,const char& p是一个常量引用,即不能用p=a表示对常量引用p的初始化。正确的方式是在声明时进行初始化,即const char& p=a。

对于D,与C类似。

3.new和delete运算符正确的使用是( C)


A.
int* p=new int[10];
delete p;

B.
int* p=new int(10);
delete []p;

C.
vector<int>* v=new vector<int>[10];
delete []v;

D.
int* a=new int[]{1,2,3,4};
delete []a;
 

解析:

对于A,p是指向数组的指针。删除应用delete[]p

对于B,与A相反。

对于D,对a的初始化不合法。(有争议,C++11后,D是正确的)

4.下列哪个代码能够实现x和y值的交换(B )


A.
void fun(int a,int b) {
    int x = a;
    a = b;
    b = x;
}
int main() {
    int x = 1, y = 2;
    fun(&x, &y);fun函数为值传递,此处传递的是x y的副本,不改变x y的值
    cout << x << ","<<y << endl;
    return 0;
}

B.
void fun(int* a,int* b) {
    int x = *a;
    *a = *b;
    *b = x;
}
int main() {
    int x = 1, y = 2;
    fun(&x,&y);
    cout << x << ","<<y << endl;
    return 0;
}

C.
void fun(int& a,int& b) {
    int x = a;
    a = b;
    b = x;
}
int main() {
    int x = 1, y = 2;
    fun(&x, &y);同A
    cout << x << ","<<y << endl;
    return 0;
}

D.
void fun(const int&a,const int&b) {//常值引用,无法改变值
    int x = a;
    a = b;//这两处不合法
    b = x;//

}
int main() {
    int x = 1, y = 2;
    fun(x, y);
    cout << x << ","<<y << endl;
    return 0;
}

5.下面有一个结构体,对结构体的错误使用是( B)

struct Book{
    string name;
    double price;
}

A.
Book b{"C++",20};

B.
Book b;
b->name="C++";
b->price=20;应用b.来访问name,price。->一般用于指向结构体、类的实例的指针

C.
Book *b=new Book[2];
b[0].name="C++";
b[0].price=20;

D.
Book *p=new Book();
p->name="C++";
p->price=20;
 

6.下列种类的函数中,哪一种不是类的成员函数?(C)
A.
构造函数
B.
析构函数
C.
友元函数\\基础概念
D.
拷贝构造函数

7.父类Base和子类Derive的定义如下。请问在子类中,继承的父类成员f,x,y的访问控制权限分别是:D

class Base
{
    public:
        void f();
    protected:
        int x;
    private:
        int y;
};

class Derive : protected Base{};

A.
public, protected, private
B.
public, public, public
C.
private, private, private
D.
protected, protected, private

三种继承:

1.public:继承父类的public,protected。且继承属性不变。

2.protected:继承父类的public,protected。且继承属性均为protected。

3.private:继承父类的public,protected。且继承属性均为private。

8.当变量x的输入值是9时,下面程序的运行结果是:C

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int x;
    cin>>x;
    try
    {
        cout<<"begin"<<endl;
        if(x>100)
        {
            cout<<"1"<<endl;
            throw string("too big.");
        }
        else
        {
            cout<<"x="<<x<<endl;
        }
        cout<<"2"<<endl;
    }
    catch(string e)
    {
        cout<<"3:"<<e<<endl;
    }
    cout<<"end"<<endl;
    return 0;
 } 

A.
begin

1

2

end


B.
begin

1

3: too big.

2

end


C.
begin

x=9

2

end


D.
begin

1

3: too big.

end
 

基础概念。

9.下列哪个代码不会调用对象的拷贝构造函数(C )


A.
MyClass a;
MyClass b=a;

B.
MyClass a;
MyClass b(a);

C.
MyClass a;
MyClass& b=a;\\引用 b 不会触发拷贝构造函数的调用。它只是一个别名,指向同一个对象 a。因此,不会发生对象的复制。

D.
void f(MyClass obj)
{
   ....
}
MyClass a;
f(a);
 

10.根据下列类模板声明,正确初始化对象的方式是( A)

template<typename T1, typename T2>
class MyClass{
    private:
        T1 x;
        T2 y;
    public:
        MyClass(T1 _x, T2 _y):x(_x),y(_y){}
};

A.
MyClass<int,char> a(10,'a');

B.
MyClass a(10,'a');

C.
MyClass<int,char> a;

D.
MyClass a;
 

解析:

根据类模板的声明,MyClass 是一个带有两个模板参数的类模板,分别为 T1 和 T2。在选项 A 中,使用了具体的类型实参 int 和 char,将 T1 实例化为 int,将 T2 实例化为char。

在构造函数中,通过初始化列表对成员变量 x 和 y 进行初始化。因此,选项 A 中的初始化方式是正确的,它使用了正确的类型实参,并通过初始化列表对成员变量进行初始化。

选项 B、C 和 D 都没有提供类型实参,无法实例化类模板。不正确。

函数题:

6-1 类的定义(教师类Teacher):本题要求定义一个教师类Teacher,数据成员包含姓名name和年龄age,类的声明见给出的代码,请给出类的完整实现,并通过测试程序。

Teacher::Teacher(string n,int a){\\基础题
    name=n;
    age=a;
}
string Teacher::getName() const{
    return name;
}
int Teacher::getAge() const{
    return age;
}
void Teacher::setName(string n)
{
    name =n;
}
void Teacher::setAge(int a)
{
    age =a;
}

6-2 加、不等和输入输出的运算符重载(2维向量Vec2)
本题要求定义一个二维向量类Vec2,类的声明见给出的代码,请给出类的完整实现,并通过测试程序。类的声明包括如下内容:

数据成员,向量的第一维u和第二维v;
u和v的访问函数;
构造函数;
加号、减号运算符重载(遵守二维向量的运算规则);
==和!=运算符重载(遵守二维向量的运算规则)
输入、输出运算符重载。

Vec2::Vec2(double a,double b){\\其实与上题name,age初始化是一样的
    u=a;
    v=b;
}
Vec2 Vec2::operator+(const Vec2&b)
\\重载加法,原先的Vec2的u v分别与新的b的u v相加。(左值与右值)
{
    return Vec2(b.u+u,b.v+v);
}
bool operator!=(const Vec2&a,const Vec2&b) \\不等,其实可以照抄那个==
{
    return a.u!=b.u&&a.v!=b.v;
}
ostream&operator<<(ostream&os,const Vec2&c)\\重载输出流,对着题目照葫芦画瓢
{
    os<<"u="<<c.u<<",v="<<c.v;
}
istream&operator>>(istream&is,Vec2&c)\\输入流也是
{
    is>>c.u>>c.v;
}

6-3 继承和多态(水果和香蕉)
请设计水果和香蕉类,并通过测试程序,具体要求如下:

水果(Fruit)是基类,成员包含:
保护成员变量重量(weight,int类型)
公有构造函数
公有析构函数
公有函数display
香蕉(Banana)从水果类公有继承,成员包含:
私有成员变量产地(origin,string类型)
公有构造函数
公有析构函数
公有函数display

class Fruit
{
    protected:
    int weight;
    public:
    Fruit()
    {
        cout<<"Fruit Constructor"<<endl;\\构造
    }
    Fruit(int w)
    {
        weight=w;
        cout<<"Fruit Constructor"<<endl;\\含参构造
        
    }
    virtual ~Fruit()
    {
        cout<<"Fruit Destructor"<<endl;\\析构,防止与子类冲突用virtual
    }
    virtual void display()\\同上。(为了满足题意)
    {
        cout<<"weight="<<weight<<endl;

    }
};
class Banana:public Fruit
{
    private:
    string origin;
    public:
    Banana(){};
    Banana(string o,int w)
    {
        Fruit::weight=w;
        origin=o;
        cout<<"Banana Constructor"<<endl;
    }
    ~Banana()
    {
        cout<<"Banana Destructor"<<endl;
    }
    void display()
    {
        cout<<"origin="<<origin<<",weight="<<weight<<endl;
    }
};

编程题:

7-1 约数
当整数a除以整数b(b≠0),除得的商正好是整数而没有余数时,称b是a的约数。给你两个正整数A和B, 如果B是A的约数,请打印输出A+B, 否则打印输出A−B。

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int A,B;
    cin>>A>>B;
    if(A%B==0)
    {
        cout<<A+B;
    }
    else
    {
        cout<<A-B;
    }
}

7-2 逆序整数

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
    int n,cnt=0;
    cin>>n;
    string x,y;\\用字符串实现
    cin>>x>>y;
    for(int i=0;i<n;i++)
    {
        if(x[i]!=y[n-i-1])
        {
            cnt++;
        }
    }
if(cnt>0)
{
    
    cout<<x<<" and "<<y<<" are not reverse.";
}
if(cnt==0)
    {
    cout<<x<<" and "<<y<<" are reverse.";
    }
}

7-3 一维世界的疫情传播

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
    int N,M,X,Y;
    int xmax=-101,xmin=101,ymax=-101,ymin=101;
    cin>>N>>M>>X>>Y;
    vector<int>xi(N);
    vector<int>yi(M);
    for(int i=0;i<N;i++)
    {
        cin>>xi[i];
        if(xi[i]>xmax)
        {
            xmax=xi[i];
        }
        if(xi[i]<xmin)
        {
            xmin=xi[i];
        }
    }
    for(int i=0;i<M;i++)
    {
        cin>>yi[i];
        if(yi[i]>ymax)
        {
            ymax=yi[i];
        }
        if(yi[i]<ymin)
        {
            ymin=yi[i];
        }
    }
    xmax=max(X,xmax);
    xmin=min(X,xmin);
    ymax=max(Y,ymax);
    ymin=min(Y,ymin);

if(ymax<xmin||xmax<ymin)
{
    cout<<X<<" and "<<Y<<": impossible";
}
else
{
    cout<<X<<" and "<<Y<<": possible";
}
}

解析:首先确定x,y的活动范围。因为参数均在[-100,100],用xmax,xmin,ymax,ymin找到感染者与正常者的活动区域的边界。再与他们的家比较,得到活动范围。如果,其中一个范围的最大值小于另一个范围的最小值,则可以认为两个范围没有重叠。

  • 39
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值