logo

咨询热线

13613410649 (点击在线咨询)
您现在的位置:山西自考网>历年真题 > 理工类 > 正文
自考攻略

2021年4月山西自考《C++程序设计》模拟试题和答案(二)

时间:2021-02-27 11:50:54 作者:储老师

自考助学
二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。
 
第1题单目运算符作为类成员函数重载时,形参个数为___个。
 
【正确答案】(P189)0
 
[解析]单目运算符使用成员函数重载可以不用形参,双目运算符使用一个参数。
 
第2题假设int a=1,b=2;则表达式(++a/b)*b--的值为___。
 
【正确答案】2
 
[解析]前缀++或――表示先使变量值变化,再使用,这和后缀恰恰相反。但是编译cout<<(++a/b)*b--时,先++a/b值为1,后1*b--,先取b=2,结果为2,再让b=1。
 
第3题每个对象都是所属类的一个___。
 
【正确答案】(P69)实例
 
[解析]类是对象的抽象,对象是类的一个实例。
 
第4题设类A有成员函数void f(void);若要定义一个指向类成员函数的指针变量pf来指向f,该指针变量的声明语句是:___。
 
【正确答案】(P117)void(A::*pf)(void)=&A::f;
 
[解析]void(A::*pf)(void)=&A::f;指向成员函数的指针,它相当于两条语句:void(A::*pf)(void);和pf=&A::f;。
 
第5题在单继承和多继承方式中,面向对象的程序设计应尽量使用___继承。
 
【正确答案】(P138)单
 
[解析]多继承是单继承的扩展,且多继承易产生二义性等问题。
 
第6题在C++中,虚函数帮助实现了类的___。
 
【正确答案】(P170)多态性
 
[解析]动态多态性是通过基类指针或引用结合虚函数来实现的。
 
第7题在删除一个动态对象时,将自动调用该动态对象所属类的___函数。
 
【正确答案】(P80)析构
 
[解析]在下列情况下,析构函数会自动被调用:
 
(1)如果一个对象被定义被一个函数体内,当这个函数结束时,该对象的析构函数被自动调用。
 
(2)若使用new运算符动态创建一个对象,在使用delete运算符释放时,delete将会自动调用析构函数。
 
第8题编译时的多态性通过___函数实现。
 
【正确答案】(P165)重载
 
[解析]编译多态性,实现的方法主要通过函数的重载或运算符的重载。
 
第9题在C++中,访问指针所指向的对象的成员使用___运算符。
 
【正确答案】->或.
 
[解析]使用指针访问成员有两种方法:成员运算符“.”或指向运算符“.”。
 
第10题在C++中,访问一个指针所指向的对象的成员所用的指向运算符是___。
 
【正确答案】->
 
[解析]指针使用成员有两种方法:“->”指向运算符和“.”成员访问运算符。
 
第11题静态成员定义的关键字为___。
 
【正确答案】static
 
[解析]静态成员是类中所有对象共享特征,使用static关键字来说明。静态数据成员在每个类对象中并不占有存储空间,静态数据成员的值对每个对象都是一样的,但它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。静态数据成员具有静态生存期,必须对它进行初始化。静态数据成员初始化的一般格式如下:<数据类型说明符><类名>::<静态数据成员名>=<初始值>;。
 
第12题下面程序的输出结果为___
 
【正确答案】33
 
第13题带有___的类称为抽象类。
 
【正确答案】(P173)纯虚函数
 
[解析]类中至少有一个纯虚函数,该类就称为抽象类,抽象类不能定义对象。
 
第14题控制格式输入输出的操作中,函数___是用来设置填充字符。要求给出函数名和参数类型。
 
【正确答案】(P195)setfill(char)
 
[解析]格式控制方法的使用,如setw,setfill等等。
 
第15题在定义成员函数时,函数体之前加上___防止覆盖函数改变数据成员的值。
 
【正确答案】(P114)const
 
[解析]使用const关键字说明的成员函数称为常成员函数,常成员函数的说明格式如下:<返回类型说明符><成员函数名>(<参数表>)const;
 
在使用常成员函数时要注意:
 
(1)const是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字。
 
(2)常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
 
(3)常对象只能调用它的常成员函数,而不能调用其他成员函数。
 
第16题C++是通过引用运算符___来定义一个引用的。
 
【正确答案】(P10)&
 
[解析]引用是C不具有使用方法,它表示变量的别名,在函数中使用很频繁,因为调用形式同传值调用,但修改形参实参也会相应改变的特征。
 
第17题执行___操作将释放由指针所指向的动态分配的数据空间。
 
【正确答案】(P10)delete
 
[解析]delete用来删除new创建的对象。
 
第18题有int a=1,b=2;则表达式a+++--b的值为___。
 
【正确答案】2
 
[解析]a++是后加,--b是前减。
 
第19题在面向对象的程序设计中,将一组对象的共同特性抽象出来形成___。
 
【正确答案】(P38)类
 
[解析]类是相似特征的对象的抽象,对象是类的一个实例。
 
第20题将指向对象的引用作为函数的形参,形参是对象的引用,实参是___。
 
【正确答案】(P53)对象名
 
[解析]实参与形参类型要一致,形参是对象的引用,实参应该是对象名。
 
三、改错题(本大题共5小题,每小题4分,共20分)
 
第1题#include<iostream.h>
 
class A
 
{public:
 
A(int i=8):y(i){}
 
static int x;
 
int y;
 
};
 
int x=20;//对类成员初始化
 
void main()
 
{A a;
 
cout<<a.x<<","<<a.y<<endl;
 
}
 
【正确答案】int x=20;//静态数据成员初始化,需要在外进行,格式错。
 
[修改]int A::x=20;
 
第2题#include<iostream.h>
 
class Aton
 
{int X,Y;
 
protected:
 
int zx,zy;
 
public:
 
void init(int i,int j){zx=i;zy=j;}
 
Aton(int i,int j,int n=0,int m=0)
 
{X=i,Y=j,zx=m,zy=n;
 
}
 
};
 
void main()
 
{Aton A(25,20,3,5);
 
A.init(5,9);
 
cout<<A.X<<endl;
 
【正确答案】int X,Y;因为X,Y都是私有的,在类外无法直接访问。
 
[修改]public:int X,Y;
 
第3题#include<iostream.h>
 
void main()
 
{int i(3),j(8);
 
int*const p=&i;
 
cout<<*p<<endl;
 
p=&j;
 
cout<<*p<<endl;
 
}
 
【正确答案】int*const p=&i;在指针变量前加const表示一个常指针即地址不能变化,它指向的变量不能改变且定义时必须设置指向变量或对象的地址。
 
[修改]int*p=&i;
 
第4题#include<iostream.h>
 
class A
 
{int i;
 
public:
 
virtual void fun()=0;
 
A(int a)
 
{i=a;}
 
};
 
class B:public A
 
{int j;
 
public:
 
void fun()
 
{cout<<"B::fun()\n";}
 
B(int m,int n=0):A(m),j(n){}
 
};
 
void main()
 
{A*pa;
 
B b(7);
 
pa=&b;
 
}
 
【正确答案】B(int m,int n=0):A(m),j(n){}因为基类是抽象类,不能被实例化,所以在派生类中不能调用初始化基类对象。所以B(int m,int n=0):A(m),j(n){}错误,删去A(m)。
 
[修改]B(int m,int n=0):j(n){}
 
第5题#include<iostream.h>
 
class fract
 
{private:
 
int den;
 
int num;
 
public:
 
fract(int d=0,int n=1):den(d),num(n){}
 
friend fract&operator+=(fract&,fract&);
 
void show(){cout<<den<<?/?<<num;}
 
};
 
friend fract&operator+=(fract&f1,fract&f2)
 
{f1.den=f1.den*f2.num+f1.num*f2.den;
 
f1.num*=f2.num;
 
return f1;
 
}
 
void main()
 
{fract fr(3,4);
 
fr+=fract(5,7);
 
fr.show();
 
cout<<endl;
 
}
 
【正确答案】friend fract&operator+=(fract&f1,fract&f2)定义函数时,不能用friend修饰。
 
[修改]fract&operator+=(fract&f1,fract&f2)
 
四、完成程序题(本大题共5小题,每小题4分,共20分)
 
第1题先为数组a输满数据,再为x输入一个数据,在数组a中找出第一个与x相等的元素并将其下标输出,若不存在这样的元素,则输出"Not found!"标志。
 
#include<iostream.h>
 
void main()
 
{int i,x,a[10];
 
cout<<"输入数组中的10个数据:";
 
for(i=0;i<10;i++)
 
cin>>a[i];
 
cout<<endl<<"输入要查找的一个数据:";
 
cin>>x;
 
cout<<x<<endl;
 
for(i=0;i<10;i++)
 
if(_____)break;
 
if(_____)
 
cout<<x<<"在数组中的位置是:"<<x<<endl;
 
else
 
cout<<"Not found!\n"<<endl;
 
}
 
【正确答案】a[i]==x,i<10
 
[解析]在for循环中没有使用{},所以for只有一条语句组成的循环体。只有在找到该数据的情况下,强制退出循环,所以第一个判断是a[i]==x;第二个也是判断它是不成立时输出Not found!,另外成立条件就是i<10,没有超出数组范围。
 
第2题功能用冒泡法对数组a中的整数由小到大进行排序。
 
#include<iostream.h>
 
void sort(int b[],int n)
 
{int i,j=0,t;
 
for(i=1;i<n;i++)
 
{for(j=0;________;j++)
 
{if(b[j]>b[j+1])
 
{t=b[j];________;b[j+1]=t;}
 
}
 
}
 
}
 
void main()
 
{int a[]={3,2,7,1,19,6,2,8};
 
int i;
 
for(i=0;i<8;i++)
 
cout<<a[i]<"";
 
cout<<endl;
 
sort(a,8);
 
for(i=0;i<8;i++)
 
cout<<a[i]<<"";
 
cout<<endl;
 
}
 
【正确答案】j<n-i,b[j]=b[j+1]
 
[解析]由t=b[j];;b[j+1]=t;可知相邻元素交换,所以第二个空为b[j]=b[j+1],两次循环分别控制外层循环的次数,内层循环的次数,由冒泡排序的算法可知第一空应填入j<n-i。
 
过程:i=1时内层循环应该是7(0~n-i)次,即8个数需要比较7次大数至于a[7]。
 
i=2时内层循环应该是6次,即余7个数需要比较6次大数至于a[6]。
 
所以答案为b[j]=b[j+1]和j<n-i。
 
第3题完成下面类中成员函数的定义。
 
#include<iostream.h>
 
template<class T>
 
class f
 
{private:
 
T x,y,s;
 
public:
 
f(T a=0,T b=0){x=a;y=b;}
 
void sum()
 
{s=x+y;}
 
T gets();
 
};
 
template<class T>
 
________gets()
 
{
 
return s;
 
}
 
void main()
 
{______a(1.5,3.8);
 
a.sum();
 
cout<<a.gets()<<endl;
 
}
 
【正确答案】T f<T>::gets(),f<double>
 
[解析]定义模板函数的格式。定义模板类时要指出它的类型。
 
第4题请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为:
 
11,10
 
13,12
 
#include<iostream.h>
 
class A
 
{int a;
 
public:
 
A(int i=0){a=i;}
 
int Geta(){return a;}
 
void show(){cout<<a<<endl;}
 
};
 
class B
 
{A a;
 
int b;
 
public:
 
B(int i,int j)_________
 
{}
 
void show(){cout<<a.Geta()<<","<<b<<endl;}
 
};
 
void main()
 
{B b[2]={B(10,11),B(12,13)};
 
for(int i=0;i<2;i++)
 
__________
 
}
 
【正确答案】:a(j),b(i),b[i].show();
 
[解析]在构造函数中对数据成员初始化,从结果先输出a,后b,所以对a=j,b=i;在循环中输出成员,调用show成员。
 
第5题有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
 
#include<iostream>
 
using namespace std;
 
void copystr(________)
 
{int n=0;
 
while(n<m-1)
 
{n++;
 
p1++;
 
}
 
while(*p1!=?0?)
 
{*p2=*p1;
 
p1++;
 
p2++;
 
}
 
*p2=?0?;
 
}
 
void main()
 
{int m;
 
char str1[20],str2[20];
 
cout<<"输入字符串1:";
 
__________
 
cout<<"输入从m个字符开始复制:";
 
cin>>m;
 
if(strlen(str1)<m)
 
cout<<"输入超过str1的长度"<<endl;
 
else
 
{copystr(str1,str2,m);
 
cout<<"复制的字符串是:"<<str2<<endl;
 
}
 
}
 
【正确答案】char*p1,char*p2,int m,gets(str1);
 
p,q都是字符指针,从m位置取字符。所以char*p1,char*p2,int m。cin.get(str1,20),不要使用cin,因为cin把空格也作为结束符了,这样导致str1不能有空格。
 
五、程序分析题(本大题共2小题,每小题5分,共10分)
 
第1题给出下面程序输出结果。
 
#include<iostream.h>
 
class a
 
{public:
 
a(int i=10){x=i;cout<<"a:"<<x<<endl;}
 
int x;
 
};
 
class b:public a
 
{public:
 
b(int i):A(i){x=i;cout<<"b:"<<x<<","<<a::x<<endl;}
 
private:
 
a A;
 
int x;
 
};
 
void main()
 
{b B(5);
 
}
 
【正确答案】a:10
 
a:5
 
b:5,10
 
[解析]定义对象B,先调用基类构造函数,在b构造函数中使用的是A(i),注意大小写,不是a(i),也就是说调用基类的构造函数时没有实参值,所以采用默认值;在初始化类成员A,即A(i),i=5,所以输入为a:5;最后是b类的构造函数,x=5,来自基类x=10,输出b:5,10。
 
第2题给出下面程序输出结果。
 
#include<iostream.h>
 
class Bas
 
{private:
 
int a;
 
public:
 
void set(int x)
 
{a=x;}
 
void show()
 
{cout<<"a="<<a<<",";}
 
};
 
class Der:public Bas
 
{private:
 
int b;
 
public:
 
void set(int x,int y=0)
 
{Bas::set(x);b=y;}
 
void show()
 
{Bas::show();cout<<"b="<<b<<endl;}
 
};
 
void main()
 
{Der b;
 
b.set(20);
 
b.show();
 
b.set(10,30);
 
b.show();
 
}
 
【正确答案】a=20,b=0
 
a=10,b=30
 
[解析]调用基类函数使用形式:类名::成员。
 
六、程序设计题(本大题共1小题,共10分)
 
第1题编写一个时间类,实现时间的加、减、读和输出。
 
#include<time.h>
 
#include<iostream.h>
 
#include<string.h>
 
#include<stdlib.h>
 
class Time
 
{public:
 
Time(char*s=NULL);
 
void operator+(Time&ti);
 
void operator-(Time&ti);
 
void Display();
 
protected:
 
int hour;
 
int minute;
 
int second;
 
};
 
result[0]=?0?+hour%10;
 
result[1]=?0?+hour/10;
 
result[3]=?0?+minute%10;
 
result[4]=?0?+minute/10;
 
result[6]=?0?+second%10;
 
result[7]=?0?+second/10;
 
cout<<result<<endl;
 
}
 
void main()
 
{Time a;
 
Time b("02:15:30");
 
a+b;
 
a.Display();
 
}
 
"/>
 
【正确答案】Time::Time(char*s)
 
{char str[9]={0};
 
char t[3]={0};
 
if(s)
 
strncpy(str,s,8);
 
else
 
_strtime(str);
 
hour=atoi(strncpy(t,str,2))%24;
 
minute=atoi(strncpy(t,&str[3],2))%60;
 

声明:

(一)由于考试政策等各方面情况的不断调整与变化,本网站所提供的考试信息仅供参考,请以权威部门公布的正式信息为准。

(二)本网站在文章内容来源出处标注为其他平台的稿件均为转载稿,免费转载出于非商业性学习目的,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。

考试提醒

准考证打印:4月5日起

  • 考生交流群
  • 微信公众号
  • 考生交流群 扫一扫加入微信交流群

    与考生自由互动、并且能直接与专业老师进行交流解答。

  • 微信公众号 扫一扫加关注微信公众号

    与考生自由互动、并且能直接与专业老师进行交流解答。

关注公众号

回复“免费资料”领取复习资料

微信公众号

微信公众号

微信公众号

微信交流群

<<点击收起

在线咨询

在线咨询

APP下载

APP
下载

联系微信
联系
微信
扫描二维码
扫描
二维码
APP下载
微信客服
微信交流群