《C++程序设计》习题解答

更新时间:2024-06-14 03:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《C++程序设计》习题解答

第1章 C++概述

1.填空题

(1)在面向对象程序设计中,对象是由___________、___________和___________封装在一起构成的实体。

(2)在面向对象程序设计中,类是具有________________和___________的对象的集合,它是对一类对象的抽象描述。

(3)面向对象程序设计最突出的特点就是___________、___________和___________。 (4)C++语言包含头文件的格式有两种,即_______________和__________________。 (5)C++源程序要经过________、_________、________和_________四个环节,才能在屏幕上显示结果。

(6)每个C++程序都从________函数开始执行。

(7)每个函数体都以________开始,以________结束。 (8)C++程序中的每条语句以________结束。

(9)C++程序的头文件和源程序的扩展名分别为__________和_________,目标程序的扩展名为__________,可执行程序的扩展名为__________。

(10)在C++程序中使用基本输入/输出语句需包含的头文件是________________,应放在程序的________________。

(11)在C++程序中注释语句有_______________和______________两种格式。 (12)C++程序的续行符为_________。

(13)如果从键盘输入语句给变量X,则输入函数的形式为_____________;如果再将变量X的值显示在屏幕上,其输出函数的形式为_____________。 (14)C++程序中的“endl”在输出语句中起___________作用。 参考答案:

(1)对象名,一组属性数据,一组操作 (2)相同属性数据,操作 (3)封装性,继承性,多态性

(4)#include<文件名.扩展名>,#include\文件名.扩展名\(5)编辑,编译,连接,运行 (6)主函数 (7){、} (8)分号;

(9).h,.cpp,.obj,.exe

(10)#include,开始部分 (11)/* */,// (12)\\

(13)cin>>X、cout<

2.选择题

(1)面向对象程序设计把数据和( )封装在一起。

A. 数据隐藏 B. 信息 C. 数据抽象 D. 对数据的操作 (2)C++源程序的扩展名是( )。

A. c B. exe C. cpp D. pch (3)把高级语言程序转换为目标程序需使用( )。

A. 编辑程序 B. 编译程序 C. 调试程序 D. 运行程序 (4)C++语言与C语言相比最大的改进是( )。

A. 安全性 B. 复用性 C. 面向对象 D. 面向过程 (5)以下叙述不正确的是( )。

A. C++程序的基本单位是函数

B. 一C++程序可由一个或多个函数组成 C. 一个C++程序有且只有一个主函数 D. C++程序的注释只能出现在语句的后面 参考答案:

(1)D (2)C (3)B (4)C (5)D

3.简答题

(1)试比较面向对象程序设计、结构化程序设计和模块化程序设计。 (2)解释以下概念:

类 对象 封装 数据抽象 继承 多态 (3)简述C++语言有哪些特点。 参考答案:

(1)结构化程序设计强调从程序结构和风格上研究程序设计。结构化程序设计的程序代码是按顺序执行的,有一套完整的控制结构,函数之间的参数按一定规则传递,不提倡使用全局变量,程序设计的首要问题是“设计过程”。

模块化程序设计将软件划分成若干个可单独命名和编址的部分,称之为“模块”。模块化程序设计的设计思路是“自顶向下,逐步求精”,其程序结构是按功能划分成若干个基本模块,各模块之间的关系尽可能简单,在功能上相对独立。模块和模块之间隔离,不能访问模块内部信息,即这些信息对模块外部是不透明的,只能通过严格定义的接口对模块进行访问。模块化程序设计将数据结构和相应算法集中在一个模块中,提出了“数据结构+算法=程序设计”的程序设计思想。模块化能够有效地管理和维护软件研发,能够有效地分解和处理复杂问题。但它仍是一种面向过程的程序设计方法,程序员必须时刻考虑所要处理数据的格式,对不同格式的数据做相同处理或对相同数据格式做不同处理都要重新编程,代码可重用性不好。

面向对象程序设计面对的是一个个对象,用一种操作调用一组数据。把数据和有关操作封装成一个对象。各个对象的操作完成了,总的任务也就完成了。他适用于编写大型程序。结构化程序设计和模块化程序设计适用于比较小的程序,他要求细致的描写程序设计的每个细节。

(2)类:在面向对象程序设计中,类是具有相同属性数据和操作数据的函数的封装,它是对一类对象的抽象描述。

对象:在面向对象程序设计中,对象是由对象名、一组属性数据和一组操作封装在一起构成的实体。其中属性数据是对象固有特征的描述,操作是对这些属性数据施加的动态行为,是一系列的实现步骤,通常称之为方法。

封装:封装是一种数据隐藏技术,在面向对象程序设计中可以把数据和与数据有关的操作集中在一起形成类,将类的一部分属性和操作隐藏起来,不让用户访问,另一部分作为类的外部接口,用户可以访问。

数据抽象:抽象的作用是表示同类事物的本质,c++中的数据类型就是对一批具体的数的抽象。类是对象的抽象,对象是类的特例。

继承:在面向对象程序设计中,继承是指新建的类从已有的类那里获得已有的属性和操

作。

多态:在面向对象程序设计中,多态性是指相同的函数名可以有多个不同的函数体,即一个函数名可以对应多个不同的实现部分。

(3)面向对象程序设计最突出的特点就是封装性、继承性和多态性。 ① 封装性

封装是一种数据隐藏技术,在面向对象程序设计中可以把数据和与数据有关的操作集中在一起形成类,将类的一部分属性和操作隐藏起来,不让用户访问,另一部分作为类的外部接口,用户可以访问。类通过接口与外部发生联系,用户只能通过类的外部接口使用类提供的服务,而内部的具体实现细节则被隐藏起来,对外是不可见的。

② 继承性

在面向对象程序设计中,继承是指新建的类从已有的类那里获得已有的属性和操作。已有的类称为基类或父类,继承基类而产生的新建类称为基类的子类或派生类。由父类产生子类的过程称为类的派生。通过继承,程序可以在现有类的基础上声明新类,即新类是从原有类的基础上派生出来的,新类将共享原有类的属性,并且还可以添加新的属性。继承有效地实现了软件代码的重用,增强了系统的可扩充性。

③ 多态性

在面向对象程序设计中,多态性是指相同的函数名可以有多个不同的函数体,即一个函数名可以对应多个不同的实现部分。在调用同一函数时,由于环境的不同,可能引发不同的行为,导致不同的动作,这种功能称为多态。它使得类中具有相似功能的不同函数可以使用同一个函数名。多态既表达了人类的思维方式,又减少了程序中标识符的个数,方便了程序员编写程序。多态是面向对象程序设计的重要机制。

4.编程题

编写程序在屏幕上显示字符串“欢迎大家学习C++语言!”,并按照书中介绍练习C++语言的上机实现过程。

参考答案:

#include void main() { cout<<\欢迎大家学习C++语言\}

第2章 C++程序设计基础

1.填空题

(1)Visual C++中如果一个变量为int型,它所占的内存空间是________字节,_______位。

(2)short int型变量占用的内存空间是________字节,long int型变量占用的内存空间是________字节,char型变量占用的内存空间是________字节,float型变量占用的内存空间是________字节,double型变量占用的内存空间是________字节。

(3)bool类型数据的值为非0时会自动转换成________,如果等于0会自动转换成________。

(4)C++程序中的关系运算符满足条件时返回________,不满足条件时返回________。 (5)表达式x&&y>=z是________类型的表达式;表达式x+y||z是________类型的表达式。

(6)表达式1<3&&5<7的值是________,表达式!(5<8)||2<6的值是________。 (7)表达式a+b

a>b?max=a:max=b ________________________ y=x*-y ________________________

(x-y)= =(x-z) ________________________ y=x^2 ________________________ x*=y+1 ________________________

(9)以下程序的功能是:从键盘输入一个字符,判断其是否是字母,并输出相应信息,请填空。

#include void main() {

char c; cin>>c;

if((c>='a' _____ c<='z') ___ (c>='A' _____ c<='Z'))

cout<<\接收的是一个字母\else

cout<<\接收的不是一个字母\

}

(10)以下程序的输出结果是________。 #include void main() {

int i=0,j=0; while(i<15) {

j++; i+=++j;

}

cout<

}

(11)以下程序的功能是:在屏幕上同一行显示1-9的平方的值,请填空。 #include void main() {

unsigned int i;

for ________________ cout<

(12)以下程序的功能是:求一组(10个)正数中的最大数,当输入为负数时提前结束程序,请填空。

#include void main() {

const int N=10; int x,max=0;

cout<< \for(int i=1;i<=N;i++) {

cin>>x;

if(________________ ) {

max=x; continue; }

else if(______________)

__________________ }

cout<<\}

(13)以下程序的输出结果是____________。 #include void main() {

int i=0; while(++i) {

if(i= =10) break; if(i%3!=1) continue; cout<

}

(14)以下程序的输出结果是____________。 #include void main() {

int x=5; do {

switch(x%2) {

case 1:x--;break; case 0:x++;break; } x--;

cout<0); }

参考答案: (1)4,32

(2)2,4,1,4,8 (3)true,false (4)1,0

(5)逻辑,逻辑 (6)1,1

(7)+ < = = &&

(8) y=x<<2的含义:x左移两位后的值赋值给y

y=3*++x的含义:将x加1后乘以3后的值赋值给y

a>b?max=a:max=b的含义:若a>b则将a的值赋值给max,否则将b的值赋值给

max

y=x*-y的含义:现将负y的值乘以x,再将结果值赋值给y (x-y)= =(x-z)的含义:比较x-y和x-z是否相等 y=x^2的含义:将x和2按位异或的值赋值给y

x*=y+1的含义:将x乘以(y+1), 再将结果值赋值给x (9)&&,||,&& (10)20 8

(11)i=1;i<=9;i++,\ \

(12)x>0&&max

2.选择题

(1)下列四组标识符中不属于Visual C++关键字的是( )。

A. witch B. break C. main D. continue float char cin case

(2)下列四组变量命名,不符合Visual C++变量命名规则的是( )。

A. cc B. 6x C. wl D. ye_78 aver char year78 wo

(3)假设有两个变量a=65432和b=a*2,在保证数据正确存储的前提下,以下变量类型定义错误的是( )。

A.int a; int b; C.unsigned short a; unsigned short b; (4)在if语句中的表达式( A. 只能是关系表达式 C. 只能是逻辑表达式 (5)以下程序的输出结果为( A.t1=true B.t1=8 t2=false t2=0 t3=true t3=-1 #include void main() {

bool t1=8; bool t2=0; bool t3=-1;

cout<<\cout<<\cout<<\}

(6)以下程序的输出结果为( A. a=13 b=4 c=3 B. a=13 b=8 c=4 C. a=13 b=4 c=4 D. a=13 b=8 c=3 #include void main() {

int x=8,y=5; int a,b,c,d; a=x+y--; b=x/y<<2; c=x-y++; d=x%y*2;

B. unsigned short a; signed int b; D.int a; signed int b; )。

B. 只能是关系表达式和逻辑表达式 D. 可以是任意表达式 )。

C.t1=false D. t1=1 t2=true t2=0 t3=false t3=1 )。

d=6 d=6 d=6 d=6

cout<<\ a=\ b=\

cout<<\ c=\ d=\

}

参考答案:

(1)A (2)B (3)C (4)D (5)D (6)B

3.简答题

(1)字符常量和字符串常量有什么区别?

(2)定义符号常量的方法有哪些?它们有什么区别?。 (3)while与do-while语句的主要区别是什么? 参考答案:

(1)在C++语言中,字符串常量和字符常量是不同的。字符串常量是用一对双引号括起来的字符序列。例如,\、\、\等都是字符串常量。一般字符常量是用一对单引号括起来的一个字符,其值为ASCII码值。例如,'a'、'A'、'$'、'5'等都是合法的字符常量。

(2)C++语言提供了两种定义符号常量的方法: ① 用const语句定义符号常量

这种方法是C++语言中广泛采用的定义符号常量的方法,其一般格式为: const 数据类型 符号常量=表达式; ② 用#define语句定义符号常量

这是C语言中定义符号常量的方法,其中#define是预处理指令。其缺点是不能显示声明常量的类型。其一般格式为:#define 常量名 常量值

(3) while把循环条件判断放在循环体执行前,而do-while循环条件判断放在循环体执行后,不管循环条件是否成立,它都至少执行一次循环体。

4.编程题

(1)求100以内的自然数中奇数之和。

(2)求100以内能被13整除的最大自然数。 (3)有一个函数如下所示: x (x<1)

y= x+5 (1≤x≤10) x-5 (x>10)

从键盘输入一个x,求出相应的y值。

(4)输入3个整型数,按由大到小的顺序输出显示。

(5)根据从键盘输入的表示星期几的数字,输出它对应的英文名称。 (6)从键盘输入一个整数,求其阶乘。

(7)编写一个简易计算器程序,根据用户输入的运算符做两个数的加、减、乘或除运算。

(8)编写程序在屏幕上打印如下图案。

* * * * * * * * * * * * * * * * * * * * * * * * * 参考答案:

(1)#include

void main() {

int sum=0;

for(int i=1;i<=100;) {

sum=sum+i; i=i+2; }

cout<<\以内奇数之和为:\}

(2)#include

void main() {

int max=0; int i=13;

while(i<=100) {

if(i==0&&max

max=i; i=i+13; continue; } }

cout<<\以内能被13整除的最大自然数为:\}

(3)#include

void main() {

float x,y; cin>>x; if(x<1) y=x;

else if(x>=1&&x<=10) y=x+5; else y=x-5; cout<

(4)#include

void main() {

int inta,intb,intc;

cin>>inta>>intb>>intc; if(inta

if(intb

if(inta

else if(inta

if(intb

(5)#include

void main() {

int data;

cout<<\ cin>>data; switch(data) {

case 0:cout<<\ case 1:cout<<\ case 2:cout<<\ case 3:cout<<\ case 4:cout<<\ case 5:cout<<\ case 6:cout<<\ default:cout<<\} }

(6)#include

void main() {

int n,t=1;

cout<<\ cin>>n; if(n<0) { cout<<\ return; }

else if(n==0||n==1) t=1; else for(int i=1;i<=n;i++) t=t*i; cout<<\}

(7)#include

void main() {

float x,y; char ch;

cout<<\请输入两个操作数:\ cin>>x>>y;

cout<<\请输入运算符 + - * /: \ cin>>ch; switch(ch) { case '+':cout<

(8)#include

void main() {

for(int i=0;i<5;i++) { for(int j=0;j<2*i+1;j++) cout<<\ cout<

第3章 函数

1.填空题

(1)在C++中,一个函数一般由两部分组成,分别是_____________和___________。 (2)在C++中,若没有定义函数的返回类型,则系统默认为_____________型。 (3)当一个函数没有返回值时,函数的类型应定义为___________。

(4)在C++中,函数的参数传递可有三种形式,即___________、___________和___________。

(5)在函数体外定义的变量是__________变量;在函数体内定义的变量是__________变量。

(6)在C++的一个程序内可以定义多个同名的函数,称为__________。

(7)在一个函数的定义或声明前加上关键字__________,该函数就声明为内联函数。 (8)若在一个函数中又调用另一个函数,则称这样的调用过程为函数的_________调用。 (9)在调用一个函数的过程中出现直接或间接调用该函数本身,就称作函数的________调用。

(10)在程序中可以使用系统函数,但是要在程序的_________说明函数所在的头文件名。

(11)以下程序的输出结果为________________。 #include #define N 8 void fun(int); void main( ) {

for(int i=1;i

void fun(int x ) {

int a=0,b=2;

cout<<(a+=x+3,a+b)<

(12)以下程序的输出结果为________________。 #include const int N=5; void fun(); int a=0; void main( ) {

for(int i=1;i

void fun( ) {

int b=2;

cout<<(a+=3,a+b)<

(13)以下程序的输出结果为________________。 #include int m=3;

void fun(int m) { m=6; }

void main() {

fun(m);

cout<<\}

(14)以下程序的输出结果为________________。 #include int gcd(int,int); void main( ) {

int a,b; a=16;b=24;

cout<< “GCD(“<

int gcd(int a,int b) {

if(b==0)return a;

else return gcd(b,a%b); }

参考答案:

(1)函数头,函数体 (2)int (3)void

(4)传值调用,传址调用,引用调用 (5)全局变量,局部变量 (6)函数重载 (7)inline (8)嵌套 (9)递归 (10)开始处 (11)6

7 8 9 10

11 12 (12)5

8 11 14 (13)m=3

(14)GCD<16,24>=8

2.选择题

1)以下叙述不正确的是( )。

A. 函数是构成C++程序的基本元素

B. 程序总是从第一个定义的函数开始执行 C. 主函数是C++程序中不可缺少的函数

D. 在函数调用之前,必须要进行函数的定义或声明 2)以下函数声明正确的是( )。

A. double fun(int x,int y) B. double fun(int x;int y) C. double fun(int x,int y); D. double fun(int x, y); 3)当一个函数无返回值时,函数的类型应为( )。

A. 任意 B. void C. int D. char 4)下列关于函数声明说法不正确的是( )。

void fun(void);

A. 函数声明是一条独立的语句,必须以分号结尾 B. 函数声明通常放在程序的开始部分 C. 函数fun无参数传入

D. 函数fun返回一个值,其类型为void

5)下列关于return语句的说法错误的是( )。

A. 在函数中通过return语句返回一个函数值

B. return语句中表达式的类型决定函数返回的类型 C. 在无返回值的函数体中可以没有return语句

D. 当函数返回值的类型为void时,函数中不应出现return(表达式)6)下列关于重载函数的说法正确的是( )。

A. 重载函数必须具有不同的返回值类型 B. 重载函数形参个数必须不同

C. 重载函数必须具有不同的形参列表 D. 重载函数名可以不同

7)一个函数为void f(int,float=?a?),另一个函数为void f(int),则它们( A. 不能在同一个程序中定义

B. 可以在同一个程序中定义并可重载 C. 可以在同一个程序中定义,但不可重载 D. 以上说法均不正确

8)下列函数定义中正确的是( )。

A. double fun(double x,y) B. double fun(double x, double y) { {

double z; return x/y;

。((((( (( )

z=x/y; } return z; }

C. double fun(double x,y) D. double fun(double x, double y) { {

z=x/y; z=x/y; return z; return x/y; } }

(9)下列关于默认参数值函数说法错误的是( )。

A. C++中,允许设置参数的默认值

B. 必须从参数表最右边的参数开始,设置参数的默认值 C. 在函数声明和函数定义中,默认参数的值必须相同

D. 函数调用时,带默认值的参数无实参输入时,使用默认值 (10)下列程序的输出结果为( )。

A. 10,20,30 B. 35,7,5 C. 35,20,10 D. 10,20,35 #include int fun(int a,int b,int c) { a=5; b=a+2; c=a*b; return (c); }

void main() { int a=10,b=20,c=30; c=fun(a,b,c); cout<

(11)下列程序的输出结果为( )。

A. 0 B. 4 C. 15 D. 60 #include int fun(int a,int b) { int c; c=a*b; return (c); }

void main() { int a=3,b=5,c=4,x=0; x=fun(fun(a,b),c); cout<

}

(12)下列函数的返回类型为( )。

A. void B. float C. int D. 无法确定 fun(void) { float x=3.0,y; y=x*x/2; return (y); }

(13)下列程序的输出结果为( )。

A. x=15 B. x=17 C. x=23 D. x=25 #include int x=5; int fun(int a) { int c; c=x*a; return (c); }

void main() { int x=3; int a=4; x=x+fun(a); cout<<\}

参考答案:

(1)B (2)C (3)B (4)D (5)B (6)C (7)C (8)B (9)C (10)C (11)D (12)C (13)C

3.简答题

(1)在C++中,函数定义的格式是怎样的?

(2)什么是函数的声明?函数声明和函数定义有什么区别?是否必须要进行函数的声明?

(3)什么是内联函数?引入内联函数的目的是什么? (4)什么是函数重载?函数重载的原则是什么? (5)函数的嵌套调用应注意什么? (6)函数的递归调用的步骤是什么? (7)什么是局部变量?什么是全局变量? (8)在C++中,如何使用系统函数? 参考答案:

(1)类型 函数名(形参表)

{

语句序列

}

(2)函数原型又称函数声明,用来告诉编译器函数的名称、函数的返回类型、函数要接收的参数个数、参数类型和参数顺序,编译器用函数原型验证函数调用。在定义函数之前常用函数原型加以说明。

函数原型通常位于程序代码的开始处。在函数原型说明中也可以不给出参数名,只给出类型。

如果函数调用在函数定义之前则必须声明。若在后则可以不用声明。 (3)内联函数是在函数名第一次出现时在函数名之前冠以关键字inline。在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换。

使用内联函数,加快了程序的执行速度,节省程序运行时的开销。 (4)函数重载是指同一个函数名可以对应着多个不同函数的实现。

原则:函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码。确定函数时,编译器是通过函数的参数个数、参数类型和参数顺序来区分的。也就是说,进行函数重载时,要求同名函数参数个数不同、参数类型不同或参数顺序不同。否则,将无法确定是哪一个函数体。

(5)在使用函数的嵌套调用时要注意函数的返回地址,在函数体执行完毕后,一定要返回调用该函数的主调函数,不能出现越级返回的情况。

(6)第一阶段:递推。将原问题不断分解为新的子问题,逐渐从未知向已知递推,最终达到已知的条件,即递归结束的条件,这时递推阶段结束。

第二阶段:回归。从已知条件出发,按照递推的逆过程,逐一求值回归,最后达到递归的开始处,结束回归阶段,完成递归调用。

(7)在函数或者类内说明的变量是局部变量。全局变量是在函数和类外部定义的变量。 (8)C++将所提供的系统函数的说明分别放在不同的头文件中,即.h文件,在程序中使用系统函数时,要在程序开始处说明函数所在的头文件名。

4.编程题

(1)从键盘输入10个浮点数,求其和及其平均值。要求写出其和及平均值的函数。 (2)编写函数fun,函数首部为double fun(int n),其功能是计算S??i!的值,并通过

1n函数值返回主调函数。

(3)输入一个年份,判断是否是闰年。

(4)写出一个函数,使从键盘输入的一个字符串反序存放,并在主函数中输入、输出该字符串。

(5)编写一个函数,其功能是:输入全班学生的成绩,以负数结束输入,统计学生人数,作为函数值返回主调函数,并计算平均分,通过函数ave返回主调函数。

参考答案: (1)void sa()

{ float x,sum=0,ave=0; cout<<\请输入10个符点数:\ for(int i=0;i<10;i++) { cin>>x; sum=sum+x; } ave=sum/10;

cout<<\个符点数的和为:\平均值为:\}

(2)double fun(int n)

{ int sum=0,fac=1; for(int i=1;i<=n;i++) { fac=fac*i; sum=sum+fac; } return(sum); }

(3)void leap(int year)

{ int flag; if(year%4==0) if(year0==0) if(year@0==0) flag=1; else flag=0; else flag=1; else flag=0;

if(flag) cout<

(4)#include

void inverts() { char ch; cin>>ch; if(ch=='0') return; else inverts(); cout<

void main() { cout<<\请输入字符串,输入0结束:\ inverts(); cout<

(5)#include

int total(float &ave) {

float score; float sum=0; int n=0;

cout<<\请输入全班学生成绩,以负数结束\cin>>score; do { n=n+1; sum=sum+score; cin>>score; }while(score>0); ave=sum/n; return n;

}

float ave() {

float average;

cout<<\人数为:\ return average; }

void main() {

cout<<\平均值为:\}

第4章 数组

1.填空题

(1)若定义int a[8]; 则a数组元素下标的下限是___________,上限是___________。 (2)若定义float b[3][4]; 则b数组中含有_________ 个 __________类型的数组元素。 (3)在C++中二维数组的存放顺序为_______________。

(4)要使一个数组a[5]中全部元素的值为0,可以定义为_______________。 (5)以下程序段为数组a中所有元素输入数据,请填空。

void main() {

int i,a[5];

for(i=0;i<5;i++)

cin>>___________; }

(6)以下程序按2行3列输出二维数组,请填空。

#include void main() {

int b[2][3]={1,2,3,4,5,6},i,j; for(i=0; _________;i++) {

for(j=0; _________;j++)

cout<

} }

(7)下列函数的功能是:将数组a中n个元素逆序存放,请填空。

void invert(int a[],int n) {

int i=0,j=n-1;

while( _________) {

int t; t=a[i]; ________; a[j]=t; i++;

_________; } }

(8)已知整数数组b[2][5]={{7,15,2,8,20},{12,25,37,16,28}},求数组中所有元素的最大值,请填空。

#include void main( )

C. D.

struct student struct student { { int num; int num char name[10]; char name[10] char sex; char sex }; }; student stu1,stu2; struct stu1,stu2;

(7)以下关于共用体的叙述错误的是( )。

A. 在定义共用体变量时可以进行初始化

B. 共用体变量的地址和它的各成员的地址都是同一地址 C. 共用体和结构体在变量的初始化方法相同 D. 共用体可以作为结构体的成员, 参考答案:

(1)D (2)B (3)C (4)C (5)D (6)D (7)C

3.简答题

(1)简述结构体和共用体的区别。 参考答案:

结构体是一种用户自定义的数据类型,结构体成员组合在一起形成一个整体,结构体中的成员可以是不同的类型。

共用体是指多种不同类型的变量从同一地址开始存放,共同占用同一段内存单元。这种含有共用体成员的结构体称为异质结构。共用体也是一种自定义的数据类型,由若干数据成员组成。

虽然共用体与结构体有很多相似之处,但两者还是有本质区别的。在任一时刻,结构体中的所有成员都是可访问的,而共用体中只有一个成员可以访问,其他所有成员都是不可访问的。这种不同反映到存储空间分配上就是结构体变量各成员顺序存放在一段内存中,每个成员分别占有自己的内存单元,结构体变量所占存储空间的大小等于其所有数据成员所占存储空间的总和。而共用体变量的各成员均从同一地址开始存放,共同占用同一存储空间,即各成员所占用的存储空间是相互覆盖的。因此,每个共用体变量所占存储空间的大小等于其所有数据成员中所占存储空间最大者的值,在任一时刻只能从变量的首地址开始保存一个数据成员的值。

4.编程题

(1)定义一个结构体“教师”,其成员包括姓名、性别、年龄、职称和联系电话。 (2)定义一个通讯录结构,成员包括:姓名(字符串)、电话(字符串)、生日。 参考答案:

(1)struct teacher

{ char name[10]; char sex; int age; char zhicheng[10]; char telephone[20];

};

(2)struct information //定义通讯录信息类

{ char name[20]; char telephone[20]; char bathday[20]; };

第6章 指针和引用

1.填空题

(1)若定义int a; 则&a的含义为___________。

(2)若有如下定义,则“&”的含义为___________。

int a; int &b=a;

(3)可以直接赋给指针的唯一正数值是___________。

(4)指针可以进行的运算有___________、___________和___________。 (5)若定义double x; 则:

使指针p可以指向变量x的定义语句是___________。 使指针p指向变量x的赋值语句是___________。

(6)若一个数组中的所有元素的值都是地址,则称该数组为___________。 (7)以下程序段的输出结果为___________。

char s[10]= \char *p=s; p++;

cout<<(strcat(s, \

(8)若有以下定义和语句,则++(*p)的值是___________。

int a[5]={0,1,2,3,4},*p; p=&a[3];

(9)若有以下定义和语句,则*--p的值是___________。

int a[5]={0,1,2,3,4},*p; p=&a[3];

(10)函数change的功能是___________。

void change(char *a) {

int i=0;

for(i=0;i= 'a'&&a[i]<= 'z') a[i]=a[i]-32;

}

(11)如果正常执行了如下语句:

int m[22],*p1=&m[4],*p2=m+15,x; x=p2-p1;

则x的值为___________。 (12)如果正常执行了如下语句: int d[]={1,2,3,4,5,6,7,8,9,10},*p1=d+8,*p2=&d[3]; p1-=3 cout<<*p1<<'\\t'<<*p2;

则程序的输出为___________。

(13)已知数组x定义为int x[10]; 并能顺利执行语句p1=x; 则p1的声明语句为___________。

(14)已知数组y定义为int y[5]; 并能顺利执行语句p2=&y; 则p2的声明语句为

___________。

(15)运算符_______用于申请所需的内存单元,运算符_______用来释放不需要的内存单元。

(16)将一个变量另起一个别名从而用别名来操作该变量,这个别名叫做该变量的_______。

(17)下面程序的运行结果是___________。

#include void main() { int a=10;

int *p1=&a; int *&p2=p1;

cout<<\}

(18)下面程序的运行结果是___________。

#include void main() { int x=100;

int &x1=x; int y=200; int &y1=y;

cout<<\cout<<\x1+=20; y1/=8;

cout<<\cout<<\}

参考答案:

(1)取变量a的地址 (2)b是变量a的引用 (3)0

(4)赋值运算,算术运算,关系运算 (5)double *p; p=&x; (6)指针数组 (7)abcdABCD (8)4 (9)2

(10)将小写字母转为相应的大写字母 (11)11 (12)6 4 (13)int *p1;

(14)int **p2; (15)new delete (16)引用

(17)a=10,*p1=10,*p2=10 (18)x=100,x1=100 y=200,y1=200 x=120,x1=120 y=25,y1=25

2.选择题

(1)若有以下定义,则变量p所占内存空间的字节数是( )。

float *p; A.1 B. 2 C. 4 D. 8 (2)若有以下定义,则下面说法错误的是( )。

int a=10,*p=&a;

A. 声明变量p,其中“*”表示p是一个指针变量 B. 声明变量p只可以指向一个整型变量 C. 变量p经初始化,获取变量a的地址 D. 变量p的值为10

(3)若有以下定义,则下面均代表地址的一组选项是( )。

int *p,a=10; p=&a;

A. a,p, *& a B. &*a,&a,*p C. &p,*p,&a D. &a,&*p,p

(4)若有说明:int *p1,*p2,m=5,n; 以下均是正确赋值语句的选项为(A. p1=&m;p2=&p1; B. p1=&m;p2=&n;*p1=*p2; C. p1=&m;p2=p1; D. p1=&m;*p1=*p2; (5)若有下列程序段,则下面叙述正确的是( )。

char s[ ]= \char *p; p=s;

A. s与p完全相同

B. 数组s中的内容和指针变量p中的内容相同 C. s数组的长度和p所指向的字符长度相等 D.*p与s[0]相等

(6)若要建立如下的指向关系,错误的语句组是( )。

p15a

A. int *p,a=15;p=&a; B. int a,*p=&a; *p=15;

C. int *p=&a, a; *p=15; D. int *p, a; p=&a;a=15; (7)下列程序的运行结果为( )。

char str[ ]= \

cout<<*(p+2); //将3改为2,才有正确答案!!!!! A. 67 B. 0 C. 字符c的地址 D. c

(8)若有以下定义,则对数组元素的正确引用是( )。

。//拿不准 )

int a[5],*p=a; A. *&a[5] B. a+2 C. *(p+5) D. *(a+2) (9)若有定义:int (*p)[4]; 则标示符p( )。

A. 是一个指向整型变量的指针 B. 是一个指针数组名

C. 是一个指针,它指向一个含有4个整型元素的一维数组 D. 定义不合法

(10)若有以下定义,则正确的叙述是( )。

Char*b[2]= {\

A. 数组b的两个元素中各存放了字符串\和\的首地址 B. 数组b的两个元素中各存放了含有四个字符的一维数组的首地址 C. b是一个指针,它指向含有2个数组元素的字符型一维数组 D. 数组b的两个元素值分别是\和\(11)关于引用的说明,下列说法错误的是( )。

A. 任何变量都可以被引用

B. 不允许把为一个变量建立的引用重新用作另一变量的别名 C. 引用和其所代表的变量使用同一片存储空间

D. 如果程序需要先指向一个对象,后又指向另一对象,此时应该采用引用 (12)下列程序的运行结果为( )。

#include void main() { int a[5]={2,4,6,8,10},*p1,**p2;

p1=a; p2=&p1;

cout<<*(p++)<<'\\t'<<**p2; } A. 4 4 B. 2 4 C. 2 2 D. 4 6 参考答案:

(1)C (2)D (3)D (4)C (5)D (6)C (7)D (8)D (9)C (10)A (11)D (12)C

3.编程题

(1)设有一个整型数组,有10个元素,请用3种不同的方法输出各元素。 (2)假设有一个字符串str1,其内容为“Hello!”,请利用指针将该字符串的内容复制到另一个字符串str2中。

(3)输入10个字符串,将它们排序,然后输出这10个已排好序的字符串。编写3个函数分别用于输入、排序和输出,并在main()函数中调用它们。

(4)编写程序,将输入字符串中的大写字母转换为小写字母,并显示输出。 (5)输入一个字符串,然后将它们逆序输出。例如:输入“abcd”,输出“dcba”。 参考答案:

(1)#include

void main() {

int a[]={1,3,5,6,7,8,9,2,4,1},i,*p;

for(i=0;i<10;i++) cout<

(2)#include

#include void main() { char str1[]={'h','e','l','l','o','\\0'}; char *str2; str2=new char[strlen(str1)+1]; for(int i=0;*(str1+i)!='\\0';i++) { str2[i]=str1[i]; } str2[i]='\\0'; cout<

}

(3)#include \

#include \#define N 10

void in(char *p[N]) //输入函数 { int i; char ch[40]; for(i=0;i>ch; p[i]=new char[strlen(ch)+1]; strcpy(p[i],ch); }

}

void out(char *p[N]) //输出函数 { int i; for(i=0;i

}

void sort(char *p[N]) //排序函数 { int i,j,k; char *t=NULL; for(i=0;i0) k=j; j++; } if(i!=k) { t=p[k]; p[k]=p[i]; p[i]=t; } }

}

void main() { char *p[N]; cout<<\请输入需要排序的\个字符串:\ in(p); cout<<\输出排序前的\个字符串:\ out(p); sort(p); cout<<\输出排序后的\个字符串:\ out(p);

}

(4)#include

#include void main() { char a[20];int n=0,j,i=0;char c; cout<<\请输入字母,以‘@’结束\ c=getchar();

while(c!='@') { a[i]=c; i++;n++;

c=getchar(); } a[i]='\\0';

for(i=0;i

if(a[i]>= 'A'&&a[i]<= 'Z') a[i]=a[i]+32; for(i=0;i}

(5)#include

#include void main() { char a[20];int n=0,j,i=0;char c; cout<<\请输入字符串@结束\ c=getchar();

while(c!='@') { a[i]=c; i++;n++; c=getchar(); } a[i]='\\0'; i=0,j=n-1; while(i<=j) { int t; t=a[i]; a[i]=a[j]; a[j]=t; i++; j--; } for(i=0;i}

第七章 类与对象

1.填空题

(1)在C++中,类成员有3种访问权限,它们分别是___________、___________和___________。其中_________提供给用户的接口功能;_________用来描述对象的属性。

(2)类中有一种特殊的成员函数,它主要用来为对象分配内存空间,对类的数据成员进行初始化,这种成员函数是___________。

(3)析构函数的作用是___________。

(4)类是对象的___________,而对象是类的具体___________。

(5)如果在类中没有明确定义析构函数,清除对象的工作仍由___________来完成,原因是___________。

(6)如果想将类的一般成员函数说明为类的常成员函数,则应该使用关键字___________说明成员函数。

(7)当一个类的对象成员函数被调用时,该成员函数的___________指向调用它的对象。 (8)被声明为const的数据成员只允许声明为___________的成员函数访问。

(9)一个类中若包含另一个类的对象,则这种情况称为类的___________,这个对象称为___________。

(10)若外界函数想直接访问类的私有数据成员,则必须把该函数声明为类的___________。

(11)一个类A若声明为另一个类B的友元类,则意味着类A中的所有成员函数都是类B的___________。

(12)将类中的数据成员声明为static的目的是___________。 (13)类的静态数据成员的初始化工作要放在___________。

(14)若有以下程序结构,该程序运行时调用了___________次构造函数,调用了___________次析构函数。

class Box {……}; void main() {

Box A,B,C; }

(15)下列程序的执行结果是___________。

#include class A { int a; double b; public: A(int x=100,double y=1.2){a=x;b=y;} void show(char *pt) { cout<

本文来源:https://www.bwwdw.com/article/i636.html

Top