C++考试题库及答案

若已包含头文件stdio.h且有说明chars1[5],s2[7];要给s1,s2赋值,下列语句中正确的是()

A、s1=getchar();s2=getchar();

B、scanf(“%s%s”,s1,s2);

C、scanf(“%c%c”,s1,s2);

D、gets(s1);s2=s1;


参考答案:B


已知:p是一个指向类A数据成员m的指针,A1是类A的一个对象。如果要给A1的m赋值为5,()是正确的。

A、A1.p=5;

B、A1-p=5;

C、A1.*p=5;

D、*A1.p=5;


参考答案:C


下列定义中,Sample是一个类,( )是定义指向对象数组的指针p.

A.Sample*P [5]

B.Sample (*p) [5]

C.(Sample*) P[5]

D.Sample *P[]


正确答案:B


某系统中有一个缓冲区,进程P1不断地加工数据送入缓冲区,进程P2不断地从缓冲区中取数据打印,用PV操作实现进程间的同步模型如图2所示。假设信号量S1的初值为1,信号量S2的初值为0,那么图2中a、b、c、d处应分别填(51)。

A.P(S2)、V(S2)、P(S1)、V(S1)

B.P(S2)、V(S1)、P(S1)、V(S2)

C.P(S1)、V(S2)、P(S2)、V(S1)

D.P(S1)、V(S1)、P(S2)、V(S2)


正确答案:C
解析:本题考查应试者对操作系统进程管理中PV操作方面的基础知识。
  为了保证进程P1和进程P2间的正常运行,a、b处应分别填P(S1)、V(S2),c、 d处分别填P(S2)、V(S1),如下图所示。


已知p是一个指向类A公有数据成员的指针,a是类A的一个对象,如果要给p所指向的成员赋值为5,语句应写为【 】。


正确答案:a.  *p=5;
a.  *p=5; 解析:由于是公有成员,类对象可以直接访问类的公有成员*号表示指针所指向的内容。


WORD格式判断 char 型变量 cl 是否为小写字母的正确表达式是 。( 2.0 分)A、 (cl>='a')&&(cl<='z')B、('a'>=cl)|('z'<=cl)C、a'<=cl<='z'D、(cl>=a)&&(cl<=z)假定 MyClass 为一个类 , 则执行 "MyClass a(2),b5,*c4" 后 , 执行构造函数的次数为( 2.0 分)A、6B、11C、10D、5char *s1="hello",*s2;s2=s1;则 。( 2.0 分)A、 s1 不能再指向其它单元B、cout<<s1; 与 cout<<s2; 结果相同C、 不能访问 "hello"D、s2 指向不确定的内存单元专业资料整理已是一个指向类 A 数据成m 的指,A1 是A 的一个对象。如果要知 :p员确的是针类给m 赋值 5, 正 为2.0 分)A、 *A1.p=5;B、A1.*p=5;C、A1->p=5;D、A1.p=5;C+异常处理机制中没有 。( 2.0 分)A、 finallyB、tryC、throwD、catch所谓多态性是指 。( 2.0 分)A、 一个对象调用不同名称的对象B、 一个对象调用不同名称的函数C、 不同的对象调用相同名称的函数D、 不同的对象调用不同名称的函数关于 new 运算符的下列描述中 , 是错的。( 2.0 分)A、 使用它创建对象数组时必须指定初始值B、 它可以用来动态创建对象和对象数组C、 使用它创建对象时要调用构造函数D、 使用它创建的对象和对象数组可以使用运算 delet 删除 符e分)以下正确的说法 : C+语言中进行值传递 。是 在 时 ( 2.0A、形参是虚拟的 , 不占用存储单元B、 实参和与其对应的形参各占用独立的存储单元C、 只有当实参和与其对应的形参同名时才共占用存储单元D、 实参和与其对应的形参共占用一个存储单元C+类体系中 , 能被派生类继承的是 。( 2.0 分)A、友元函数B、析构函数C、构造函数D、虚函数对于重载的运算符 >>, 它是一个 。( 2.0 分)A、 用于输出的成员函数B、用于输入的友元函数C、用于输入的成员函数D、 用于输出的友元函数是一个在基类中说明的虚函数, 它在该基类中没有定义 , 但要求任何派生类都必须定 义自己的版本。( 2.0 分)A、静态成员函数B、纯虚函数C、虚析构函数D、虚构造函数定义重载函数的下列要求中 , 是错误的。( 2.0 分)A、要求函数的返回值不同B、 要求参数个数相同 , 参数类型不同 时C、 要求参数中至少有一个类型不同D、 要求参数的个数不同 可以通过友元函数重载的运算符 。 分)为 ( 2.0A、>>B、()C、D、 在下列运算符中 , 不能重载的是 。( 2.0 分)A、deleteB、sizeofC、!D、new2.0 分)下列运算符中 , 运算符在C+语言中不能重载。(A、 newB、C、+=D、可以通过友元函数重载的运算符为 。( 2.0 分)A、()B、C、D、>>: ( 域运算符 ) 4 、不能被重载的运算符1、. ( 成员访问运算符) 2 、 .* ( 成员指针访问运算符 ) 3 、sizeof( 长度运算符 ) 5 、 ?: ( 条件运算符)下列运算符中 , 只能作为类成员函数重载的是 。( 2.0 分)A、B、<<C、+D、+类 MyA 的拷贝初始化构造函数是 。( 2.0 分)A、MyA(MyA)B、MyA(MyA&)C、MyA(MyA*)D、MyA();, 如果从键盘输入的不是数字, 输入后用 cin 为整型变量输入数据时 整型变量中的结果会 是 : ( 2.0 分)A、 不确定B、0C、 正数D、 负数在 C+语言中 , 引用数组元素时, 其数组下标的数据类型允许是。( 2.0 分)A、 任何类型的表达式B、整型表达式C、整型常量或整型表达式D、整型常量关于类模板描述不正确的是 。( 2.0 分)A、 根据它可以定义多个对象B、 它的存在不代表一个具体的、实际的类, 而是代表一类的类C、 它可以使类中的某些数据取任意类型D、 根据它可以产生一系列类 下列说法不正确的是 。( 2.0 分)A、不同函数中 , 可以使用相同名字的变量B、在一个函数内部 , 可以在复合语句中定义变量 , 这些变量只在复合语句中有效C、 形式参数是局部变量D、主函数 main 中定义的变量在整个文件或程序中有效建立包含有类对象成员的派生类对象时 , 自动调用构造函数的执行顺序依次为 的构 造函数。( 2.0 分)A、 基类、自己所属类、对象成员所属类B、 对象成员所属类、基类、自己所属类C、 自己所属类、对象成员所属类、基类D、 基类、对象成员所属类、自己所属类关于运算符重载 , 下列表述中正确的是 。( 2.0 分)A、可以通过运算符重载来创建C+中原来没有的运算符B、 在类型转换函数的定义中不需要声明返回类型C、 运算符函数的返回类型不能声明为基本数据类型D、C+已有的任何运算符都可以重载下列关于运算符重载不正确的是 。( 2.0 分)A、 运算符重载不能改变运算符的优先级B、 运算符重载能改变对预定义类型数据的操作方式C、 运算符重载不能改变运算符的结合性D、 运算符重载不能改变运算符的操作数个数在表达式 x+y*z 中 ,+ 是作为成员函数重载的运算符 ,* 是作为非成员函数重载的运算符 下列叙述中正确的是 。( 2.0 分)A、 operator+ 有两个参数 ,operator* 有一个参数B、operator+有两个参数,operator*有两个参数C、operator+有一个参数,operator*有两个参数D、operator+有一个参数,operator*有一个参数+和 * 都是二元运算符,当作为成员函数重载时,参数表中只有一个参数,对应于第二个参 数,而第一个操作数就是对象本身, 仅以 this 指针的形式隐藏在参数表中 当作为非成员函 数重载时有两个参数。以下叙述中正确的是 。( 2.0 分)A、 静态 (static) 类别变量的生存期贯穿于整个程序的、运行期间B、 函数的形参都属于全局变量C、未在定义语句中赋初值的 auto 变量和 static 变量的初值都是随机值D、全局变量的作用域一定比局部变量的作用域范围大在公有派生情况下 , 有关派生类对象和基类对象的关系 , 不正确的叙述是 。( 2.0 分)A、 派生类的对象的地址可以赋给指向基类的指针B、 派生类的对象可以初始化基类的引用C、 派生类的对象可以直接访问基类中的成员D、 派生类的对象可以赋给基类的对象。( 2.0 分)不能作为重载函数的调用的依据是A、函数名称B、 参数类型C、 参数个数D、函数类型若已定义的函数有返回值 , 则以下关于该函数调用的叙述中错误的是 。( 2.0 、分)A、 函数调用可以作为一个函数的形参B、 函数调用可以出现在表达式中C、 函数调用可以作为独立的语句存在D、 函数调用可以作为一个函数的实参在有参函数调用中, 是将主调函数的实参值传给被调函数的形参。 按函数在程序中出现的位 函数调用作为一条语句。例 fun() ;这时不要 置来分,有以下三种函数调用形式: 如: 求 函数带回值,只要求函数完成一定的操作。故选项 A) 正确。 函数出现在表达式中,这种 表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如: c=5*max(a,b) ;函数 max 是表达式的一部分,将其值乘以 5 后赋给 c 。故选项 C) 正确。

阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。

【说明】

本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。

【代码】

include<stdio.h>

include<stdlib.h>

include<string.h>

char*replace(char *s1, char *s2,char *s3)

{ char *p, *q, *r, *s; int |2,|3, i=0;

|2=strlen(s2);

|3=strlen(s3);

p=s1;

while((p=strstr(p,s2))!=NULL)

{ i++; /* 统计s2串出现的次数*/

(1);

}

i=(2);

s=r=(char*)malloc(i); /*分配动态内存存放新字符串*/

p=s1;

while(1)

{ q=strstr(p, s2); /* s2串是否在s1中出现,q是首次出现的位置*/

if(q!=NULL)

{ i=q-p;

(3);

r+=i;

(4);

r+=|3;

p=q+|2; /*将指向s1串的指针移到s2子串出现的位置后,

为下一次循环做好准备*/

}

else /*q为空,表示剩余的s1串中已经没有s2*/

{ (5);

break; /*终止循环*/

}

}

return(s); /*返回指向所形成的新串的指针*/

}

void main()

{ char *a="sabcababde", *b="ab", *c="efg", *d;

d=replace(a, b, c); printf("result=%s\n", d); free(d);

}


正确答案:(1)p+=12 (2)strlen(s1)-i*12+i*13+1 (3)strncpy(rpi) (4)strcpy(rs3) (5)strcpy(rp)
(1)p+=12 (2)strlen(s1)-i*12+i*13+1 (3)strncpy(r,p,i) (4)strcpy(r,s3) (5)strcpy(r,p) 解析:本题考查用C语言实现对字符串的操作。
题目要求将字符串s1中出现的所有子串s2替换成s3,形成一个新串,但不破坏字符串s1。要不破坏字符串s1,只有用一个新串来存放处理结果;要用到新串,那么就需要重新分配空间。
第(1)空在第一个循环体中,此循环体的作用在注释中已经给出,用来统计串s2在串s1中出现的次数,这里的统计变量已经给出,并将结果存放在统计变量i中,但每次统计成功后串s1的位置应该往后移动串s2的长度,由程序我们可以看出,串s1存放在指针变量p中,因此,指针变量p指的位置需要往后移动串s2的长度,而串s2的长度存放在变量12中。因此,此空答案为p+=12。
第(2)空很明显是用来给变量i赋一个值,但根据s=r=(char*)malloc(i)语句我们可以推断出,当前变量i中存放的是新串的长度。而新串的长度应该等于串s1的长度减去串中x个串s2的长度,加上x个串s3的长度再加1,而在上面的循环中已经求出了串s2在串s1中出现的次数,结果存放在变量i中。因此,此空答案为strlen(sl)-i*12+i*13+1。
第(3)空是在if(q !=NULL)成立的情况下运行的语句,而变量q指向的是s2在s1中首次出现的位置,如果条件成立,说明串s2在串s1中出现了,语句i=q-p用来表示出现的位置到s1开始位置的距离。在这些条件都清楚了后,应该往新的串中写字符了,首先写串s1的前i个字符,此空就是用来完成这个功能的,因此,此空答案为strncpy(r,p,i)。
第(4)空是接着上一空而来的,在上面我们[分析]到,把串s1的前i个字符写入新串,那么在新串中接着要出现的应该是替换串s2的串s3,此空的任务应该是将串s3写入新串中,因此,此空答案为strcpy(r,s3)。
第(5)空是在if(q !=NULL)不成立的情况下运行的语句,这说明串s2不在串s1中出现,在这种情况下,串应该不需要进行替换操作,而直接将串s1写入到新串中,此空的作用就是用来实现这个功能的,因此,此空答案为strcpy(r,p)。


若有如下图所示5个连续的int类型的存储单元并赋值,a[0]的地址小于a[4]的地址。 p和s为int型的指针变量。请对以下问题填空。

①若p已指向存储单元a[1]。通过指针p给s赋值,使s指向最后一个存储单元a[4]的语句是【 】。

②若指针s指向存储单元a[2],p指向存储单元a[0],表达式s-p的值是【 】。


正确答案:s=p+3; 2
s=p+3; 2 解析:若p指向了a[1],则p+3将指向其后的第3个元素a[4],把它赋值给s,s就指向了a[4],所以第1空填“s=p+3;”。由于s指向了a[2],p指向了a[0],s和p为指向同一个数组元素的指针变量,它们的差为它们指向元素的下标差值(即间隔多少个元素),所以“s-p”的结果为2。


已知p是一个指向类Sample数据成员m的指针,s是类Sample 的一个对象。如果要给 m赋值为5,( )是正确的。

A.s.p=5

B.s->p=5

C.s.*p=5

D.*s.p=5


正确答案:C


以下程序的输出结果是 ______。includevoid main(){ char s1[]=”Hello”,s2[]="World

以下程序的输出结果是 ______。 #include<iostream.h> void main(){ char s1[]=”Hello”,s2[]="World"; char *p1,*p2; int i; p1=s1; p2=s2; for(i=0;i<5;i++) if(*(pl+i)==*(p2+i)) cout<<*(p1+i); }

A.H1

B.Ho

C.10

D.1


正确答案:D


● 进程P1、P2、P3、P4和P5 的前趋图如下:

若用PV操作控制进程P1~P5并发执行的过程,则需要设置 6 个信号量 S1、S2、S3、S4、S5和S6,且信号量S1~S6的初值都等于零。下图中 a和 b 处应分别填写 (23) ;c和d处应分别填写 (24) ,e和f处应分别填写 (25) 。

(23)

A. P(S1) P(S2) 和P(S3) P(S4)

B. P(S1) V(S2) 和P(S2) V(S1)

C. V(S1) V(S2) 和V(S3) V(S4)

D. P(S1) P(S2) 和V(S1) V(S2)

(24)

A. P(S1) P(S2) 和V(S3) V(S4)

B. P(S1) P(S3) 和V(S5) V(S6)

C. V(S1) V(S2) 和P(S3) P(S4)

D. P(S1) V(S3) 和P(S2) V(S4)

(25)

A. P(S3) P(S4) 和V(S5) V(S6)

B. V(S5) V(S6) 和P(S5) P(S6)

C. P(S2) P(S5) 和P(S4) P(S6)

D. P(S4) V(S5) 和P(S5) V(S6)


正确答案:C,B,C

更多 “C++考试题库及答案” 相关考题
考题 若用PV操作控制进程P1、P2、P3、P4和P5并发执行的过程,则需要设置5个信号S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于零。下图中c和d处应分别填写(55)A.P(S2)和P(S4) B.P(S2)和V(S4) C.V(S2)和P(S4) D.V(S2)和V(S4)答案:B解析:

考题 进程P1、P2、P3、P4和P5的前趋图如下:若用PV操作控制进程P1~P5并发执行的过程,则需要设置6个信号S1、S2、S3、S4、S5和S6,且信号量S1-S6的初值都等于零。下图中a和b处应分别填写(请作答此空);c和d处应分别填写( ),e和f处应分别填写( )。 A. P(S1)P(S2)和P(S3)P(S4) B. P(S1)V(S2)和P(S2)V(S1) C. V(S1)V(S2)和V(S3)V(S4) D. P(S1)P(S2)和V(S1)V(S2) 答案:C解析:本题主要考查用PV操作控制进程的并发执行。首先我们需要弄清楚前驱图中给出的各进制的执行顺序。从图中我们不难看出进程P1和P2没有前驱,也就是可以首先并发执行,而进程P3的前驱是P1和P2,P4的前驱是P1和P3,P5的前驱是P2和P3。那么怎么理解前驱呢?其实前驱就是指只有在前驱进程完成后,该进程才能开始执行。 在本题的前驱图中我们不难看出,有6条路径,分别是P1->P3,P1->P4,P2->P3,P2->P5,P3->P4,P3->P5。而且题目也告诉我们分别有6初值为0个信号量(S1-S6),要我们用PV操作来控制进程P1~P5的并发执行。这里我们就需要清楚P与V这两种操作。 P原语的主要操作是: (1)信号量(sem)减1;    (2)若相减结果大于等于零,则进程继续执行;    (3)若相减结果小于零,则阻塞一个在该信号量上的进程,然后再返回原进程继续执行或转进程调度。 V原语的主要操作是:    (1)信号量(sem)加1;    (2)若相加结果大于零,则进程继续执行;    (3)若相加结果小于或等于零,则唤醒一阻塞在该信号量上的进程,然后再返回原进程继续执行或转进程调度。 总而言之,进行P操作的主要目的是阻塞某信号量上的进程,而进行V操作的主要目的是唤醒某信号量上的进程。 下面我们具体来求解这个题目。a空处,是在进程P1执行完成以后,那么根据题目的前驱图我们可以知道,这个时候它应该唤醒它的后继进程P3和P4,因此需要执行两个V操作,同样的道路,b空处也需要执行两个V操作,因此可以知道第一空答案选C。 至于C空处,它是在进程P3执行前进行的处理。根据前驱的意义,我们可以知道执行P3要在P1和P2完成后,因此这个时候,它首先需要判断P1和P2进程是否完成,如何它们完成的话,会分别执行唤醒P3的V操作(换句话说就是会给相应的信号量进行加1操作),那么这个时候我们也可以通过同样的信号量来判断,即对相应的信号量进行减1操作,判断它是否大于0,如果大于等于0,则执行P3。从题目给出的答案来看,这两个信号量应该分别是S1和S3。那么执行完P3后,它也需要唤醒它的后继进程P4和P5,因此需要执行两个V操作,因此D空处应该是两个V操作。综上所述,我们可以知道第二空的答案选B。 分析到这里后,第三空的答案应该就很明显了,P4和P5进程在执行前,都需要做与P3进程执行前一样的判断,因此都需要进行两个P操作。所以本题答案选C。 其实做这类题也不难,首先需要我们对PV操作要有一个透彻的理解,另外就是能分析出题目执行的逻辑关系。

考题 单选题p是指向类A数据成员a的指针,a是类A的一个对象。在给a成员赋值为5的下列表达式中,正确的是()。A a.p=5B a->p=5C a.*p=5D *a.p=5正确答案:A解析:暂无解析

考题 进程P1、P2、P3和P4的前趋图如下所示若用PV操作控制进程P1~P4并发执行的过程,则需要设置5个信号量S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于0。下图中a、b和c处应分别填写(请作答此空);d、e和f处应分别填写( )。 A.V(S1)V(S2)、P(S1)V(S3)和V(S4) B.P(S1)V(S2)、P(S1)P(S2)和V(S1) C.V(S1)V(S2)、P(S1)P(S3)和V(S4) D.P(S1)P(S2)、V(S1)P(S3)和V(S2) 答案:C解析:因为P1是P2和P3的前驱,当P1执行完需通知P2和P3,应采用V(S1)V(S2)操作分别通知P2和P3,故a处应填写V(S1)V(S2);又因为P2是P1和P3的后继,当P2执行前应测试P1和P3是否执行完,应采用P(S1)P(S3)操作测试P1和P3是否执行完,故b处应填写P(S1)P(S3);同理,P2是P4的前驱,当P2执行完应通知P4,应采用V(S4)操作分别通知P4,故C处应填写V(S4)。 因为P3是P1的后继,当P3执行前应测试P1是否执行完,应采用P(S2)操作测试P1是否执行完,故d处应填写P(S2);又因为P3是P2和P4的前驱,当P3执行完应通知P2和P4,应采用V(S3)V(S5)操作通知P5,故e处应填写V(S3)V(S5);P4是P2和P3的后继,当P4执行前应测试P2和P3是否执行完,应采用P(S4)P(S5)操作测试P2和P3是否执行完,故f处应填写P(S4)P(S5)。

考题 进程P1、P2、P3和P4的前趋图如下所示:若用PV操作控制进程P1~P4并发执行的过程,则需要设置5个信号量S1、S2、S3、S4和S5,且信号量S4-S5的初值都等于0。下图中a、b和c处应分别填写①;d、e和f处应分别填写②。A.V(S1)V(S2)、P(S1)V(S3)和V(S4)B.P(S1)V(S2)、P(S1)P(S2)和V(S1)C.V(S1)V(S2)、P(S1)P(S3)和V(S4)D.P(S1)P(S2)、V(S1)P(S3)和V(S2)正确答案:C本题只要将信号量在前趋图中标识出来,题目就非常容易解了。在前趋图中,每个箭头对应一个信号量,编号从左至右,从上至下,由小到大,如图所示。标出信号量之后,从某进程引出的信号量,在该进程末尾需要对信号量执行V操作,而信号量箭头指向的进程开始处应有信号量的P操作。以P1为例,S1与S2从P1发出,所以在P1末尾处要执行V(S1)V(S2),而在P2开始处应执行P(S1)P(S3)。

考题 下列关系代数运算中,哪一个是不正确的?A.σF(S1∩S2)=σF(S1)∩σF(S2)B.πP(S1∩S2)=πP(S1)∩πP(S2)C.σF(S1∪S2)=σF(S1)∪σF(S2)D.πP(S1∪S2)=πP(S1)∪πP(S2)正确答案:B解析:选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出满足条件的行形成一个新表作为运算结果。投影也是单目运算,该运算从表中选出指定的属性值组成一个新表。连接把两个表中的行按着给定的条件拼接而形成的新表。

考题 已知:p是一个指向类A数据成员m的指针,a是类A的一个对象。在给m赋值为5的下列表达式中,()是正确的A、a.p=5B、a->p=5C、a.*p=5D、*a.p=5正确答案:C

考题 以下程序的输出结果是( )。 include main() {char*s1,*s2,m; s1=s2=(char*)malloc(size以下程序的输出结果是( )。include<stdlib.h>main(){char*s1,*s2,m;s1=s2=(char*)malloc(sizeof(char));*s1=15;*s2=20;m=*s1+*s2:printf("%d\n",m);}正确答案:4040 解析:malloc()函数的作用是开辟一个长度为sizeof(char)的内存区,s1、s2为指向字符型数据的指针变量,执行“s1=s2=(char*)malloc(sizeof(chat));”语句后,s1、s2指向同一个存储空间,此时m=*s1+*s2=20+20=40。

考题 ( 31 )若有以下定义和语句char s1[10]= " abcd! " ,*s2= " \n123\\ ";printf ( " %d %d\n ", strlen ( s1 ) ,strlen ( s2 ) ) ;则输出结果是A ) 5 5B ) 10 5C ) 10 7D ) 5 8正确答案:A

考题 进程P1、P2 、P3、P4 和P5的前趋图如下所示:若用PV操作控制进程P1、P2、P3、P4和P5并发执行的过程,需要设置5个信号量S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于零。如下的进程执行图中a和b处应分别填写( );c和d处应分别填写( );e和f处应分别填写( )。A.V (S1)和P(S2)V(S3)B.P(S1)和V(S2)V(S3)C.V(S1)和V(S2)V(S3)D.P(S1)和P(S2)V(S3)A.P(S2)和P(S4)B.V(S2)和P(S4)C.P(S2)和V(S4)D.V(S2)和V(S4)A.P(S4)和V(S5)B.V(S5)和P(S4)C.V(S4)和P(S5)D.V(S4)和V(S5)正确答案:B,C,A