C++第一至第八章课后习题答案

更新时间:2024-05-03 19:19:01 阅读量: 综合文库 文档下载

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

第1章 概述 思考与练习题参考答案

1、 简述C++的发展简况。

答:C++语言是从C语言发展而来的,C 语言是一种编译型的面向过程的程序设计语言,它最早是从英国剑桥大学一个名叫Martin Richards的学者在60年代开发的BCPL( 即Basic Combind Programming Language)语言的基础之上发展而来的。BCPL语言是Martin Richards在开发系统软件时,作为描述性语言而使用的一种程序设计语言。1970年,美国Bell实验室的 Ken?Thompson在软件开发工作中,继承和发展了BCPL语言的许多特点,进一步提出了一种叫“B语言”的语言。随后,在美国Bell实验室实现的更新型的小型机PDP-11的UNIX操作系统的研发工作中,于1972年推出了一种新型的程序语言 — C语言,该语言一经推出就在国际上广泛流行。20世纪80年代,由于软件工程的需要,面向对象程序设计方法在软件设计领域引起了普遍的重视,AT&T Bell实验室的计算机科学家Bjarne Stroustrup结合流行的C语言的所有成分,开发出了面向对象的程序设计语言C++。

2、 C++语言有那些主要特点?

答: C ++ 语言具有以下主要特点:

(1) C++语言是一个中级的程序设计语言。 (2) C++是一个结构化的程序设计语言 。 (3) C++是一种面向对象的程序设计语言。 (4) C++语言是一个功能齐全的编程语言。 (5) C++语言是一种移植性很好的编程语言 。

3、 编写的C++语言的程序主要由那些基本组成部分构成? 答:C++语言的程序主要由以下几个基本组成部分构成:

(1) 预处理命令:C++语言提供了三类预处理命令:宏定义命令(define)、文件包含命令(include)、条件编译命令(if~else~endif),

(2) 输入/输出语句(Input/Output语句,简称I/O语句):C++语言的程序中总是少不了输入和输出的语句,实现与程序内部的信息交流。 (3) 函数(Function):C++的程序是由若干个文件组成的,每个文件又是由若干个函数组成,因此,可以认为C++的程序就是函数串,即由若干个函数组成,函数与函数之间是相对的,并且是并行的,函数之间可以调用。

(4) 语句(Statement):语句是组成程序的基本单元。每个函数都是由若干条语句组成的。 (5) 变量(Variable):变量是通过说明语句来定义的,多数程序都需要说明变量和使用变量。 (6)其他:除了以上讲述的5个部分以外,还有其他组成部分。例如,符号常量和注释信息等也是程序的一部分。C++程序中尽量把有些常量定义为符号常量,而在C++的程序中使用符号常量,该符号常量代表着某个确定的常量值。

4、 C++语言编写的程序代码有那些格式特点?

答:C++语言编写的源代码程序的格式具有以下特点:

(1) C++语言的关键字是小写字符构成的,习惯上也使用小写字母书写程序;

(2) 大多数语句结尾必须用 \作为终止符, 否则C++不认为该语句的结束; (3) 每个程序必须有一个且只能有一个主函数,其名称为main()的函数;

(4) 每个函数的函数体 (包括主函数和每个子函数) 必须用一对花括号\和\括起来; (5) 一个较完整的程序文件大致含有: 包括文件程序段(一组#include<*.h>语句)、函数说明部分、全局变量说明、主函数和若干个子函数组成。在主函数和子函数中又包括局部变量定义、库函数调用、流程控制语句、用户函数的调用语句等;

(6) 注释部分包含在\和\之间或\之后, 在编译时它将被C++编译器忽略;

(7) 像其它一些语言一样, C++的变量在使用之前必须先说明其数据类型, 未经说明的变量不能使用。说明变量类型应在可执行语句前面, 如上例main()函数中的第一条语句就是变量说明语句, 它必须放在所用的执行语句前面。

(8) 在C++语言中, 大小写字母是有区别的, 相同字母的大小写代表不同的变量;

5、 编写C++语言程序,在书写格式上应该遵从哪些基本原则?

答:为了使程序结构更加清楚、易于阅读、维护和修改,在书写格式上应该遵从以下基本原则:

(1) 一般一行只写一条语句;

(2) 一条复杂语句采用多行,如分支语句和循环语句;

(3) 遇到嵌套语句应向后缩进, 必要时对程序增加适当的注释行。

6、 什么叫关键字?什么叫标识符?

答:关键字(Keyword)也叫保留字(Reserved Word)。所谓关键字就是指已被C++语言本身使用, 不能作为其它用途使用的单词。

标识符是用户为程序中各种需要命名的\元素\所起的名称。

7、 请指出下列那些字符串可以作为变量或函数名称:

(1) _FormalName (2) String Length (3) Pay$ (4) 2Service (5) IF (6) Double (7) XYZ (8) W12345 答:可以作为变量或函数名称的字符串:

(1) _FormalName 、 (5) IF 、 (6) Double 、(7) XYZ、 (8) W12345

8、 请给出下列输出结果:

(1) cout<< \张三\ setw(5) << 20 << endl; 答:输出结果:张三 20

(2) cout<< setprecision(2) << 367 <

(3) cout<

(4) cout<< hex << 18 << oct <<19 <

9、 请将下列十进制数转换为二进制、八进制和十六进制数:

(1) 79 (2) 127 (3) 64 (4) 512 (5) 567 (6) 128 (7) 960 (8) 100 数字 79 127 64 512 567 128 960 100 10、

二进制 01001111 01111111 01000000 001000000000 001000110111 10000000 1111000000 1100100 八进制 117 177 100 1000 1067 200 1700 144 十六进制 4F 7F 40 200 237 80 3C0 64 答:给出题中字符的ASCII码的对应数值如下:

(1) A: 41h (2) 0: 30h (3) =: 3D (4) Z: 5A (5) a: 61h (6) 9: 39h (7) f: 66h (8) z: 7A

第2章 数据与运算 思考与练习题参考答案

1、 什么数据 ?什么叫数据类型 ?

答:数据是指能输入到计算机中,并能被计算机处理和加工的对象。 数据类型是对系统中实体的一种抽象,它描述了某种实体的基本特性,不同类型数据的表示、所占存储空间的大小以及定义在其上的操作是不同的。

2、 C++语言有哪些基本数据类型?其值域是什么? 类型名称 char signed char unsigned char bool short(signed short) unsigned short int( signed int) unisnged int long(signed long) unisnged long float 长度(字节) 1 1 1 1 2 2 4 4 4 4 4 值 域 -128~127或0~255(使用/J编译选项) -128~127 0~255 非零(true), 零(false) -32768~32767 0-65535 -2147483648~2147483647 0~4294967295 -2147483648~2147483647 0~4294967295 1.175494351e-38~3.402823466e+38(正数) double 8 2.2250738585072014e-3081.7976931348623158e+308(正数) ~

3、 C++语言有哪些常量?请给出实例。 答:C++语言共有六种常量,分别如下: (1)整型常量

整型常量通常简称为整数。C++语言的整数可以是十进制数、八进制数和十六进制数。 例如,十进制的数值3356可以有下列三种不同的表示形式: 十进制数 3356;八进制数 06434 ;十六进制数 0xd1c (2)浮点常量

浮点常量又称为实数,一般含有小数部分。

例如,

-0.6523, .08765, 1234.0, 9.9999, 98., 5.544, 2355.876554都是一般形式的实数。 (3)字符常量

所谓字符常量是指一个单一字符, 其表示形式是由两个单引号包括的一个字符。 例如, 'A', 'a', 'Q', '0', '9', '+', ':', '?', '$' 都是字符常量。 (4)字符串常量

所谓字符串常量是指用双引号括起来的一串字符来表示的数据

下面给出几个字符串常量的例子:

\ \ \ \ \李四\\北京海淀学院路29号\, \姓名:\, \ \(5)标识常量

所谓标识常量是指用标识符代替常量使用的一种常量, 其名称通常是一个标识符。

标识常量的一般说明形式为:

#define <标识常量名称> <常量> 例如,

#define MAX 50 #define PI 3.1415926 #define ERROR -1

其中,MAX、PI以及ERROR都是标识常量, 它们代替的常量分别是50、3.1415926、和-1 。

(6)换码序列

所谓换码序列是用反斜线\\后面跟有一个字符或者一个或不超过3个的数字来表示的

控制代码的换码序列如下表所示, 它们的表示形式是在反斜线\\后面跟有一个小写英文

字母。例如,'\\a','\\\\', '\\'', '\\056', '\\x05a'

4、 什么叫说明语句?怎样说明的变量为局部变量?怎样说明的变量为全局变量?

答:一般来说,变量在使用以前,必须说明才能使用。用来说明已有类型的变量的语句称为变量说明语句。变量说明的一般形式是: <存储类型> <数据类型 > <变量名> ; 在上面变量说明的式子里,<变量名>之后有一个分号“;”意味着它是一个语句,该语句我们通常称为变量的说明语句。

在函数体或程序段内说明的变量只能在定义它的函数体内或程序段内可以访问,这种变量通常称为局部变量;在函数体外说明的变量可以在说明它的文件中所有函数里或程序段中访问,也可以通过extern被其它文件中的函数或程序段访问,这种变量通常称为全局变量。

5、 说明变量时有哪些存储类型?其含义是什么?

答:C++语言支持四种存储类型:auto, register, static和extern。

(1) auto称为自动型也称为堆栈型,用auto存储类型说明的变量都是局部于某个程序范围内的,只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里。

(2) register称为寄存器型,使用register关键词说明的变量主要目的是想将所说明的变量放入CPU的寄存器存储空间中,这样可以加快程序的运行速度。

(3) static称为静态存储类型,在C++语言中,既可以在函数体内,也可在函数体外说明static 存储类型的变量。在函数体内说明的static 存储类型的变量也是一种局部变量,与auto最大不同点是:static存储类型的变量在内存中是以固定地址存放的,而不是以堆栈方式存放的;只要整个程序还在继续运行静态变量就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值。 (4) extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。这种变量的作用域是所有的函数和程序段,一般用于在函数之间传递数据。

6、 什么叫常量化变量?其作用是什么?

所谓常量化变量是指将一个变量说明为一个常量。

作用:当一个变量被说明为常量时,那么该变量在程序执行过程中其值是不能改变的。也就是说,不能再向常量化的变量再赋值。因此,常量化变量在说明时就必须赋给一个数值。常量化的变量基本上和常量一样。

7、 什么叫数组?说说short型的数组与char型的数组的异同点。 答:

所谓数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。数组中各元素的数据类型要求相同。数组可以是一维的,也可以是多维的。

char型的数组由包含ASCII字符集中的字符(英文字母、数字、标点符号以及某些特殊符号)的整数类型组成的数组。

short型的数组是由short数据类型组成的数组。类型short (或short int)是一种短整数类型,它占用字节的长度大于类型char, 小于或等于类型int。 8、 什么叫表达式?什么叫表达式语句?

答:所谓表达式是指由运算符、运算量和标点符号组成的有效序列,其目的是用来说明一个计算过程。

表达式可以独立形成语句,该语句称为表达式语句 9、 什么叫左值?什么叫右值?

答:所谓左值是指能够出现在赋值表达式左边的表达式。

所谓右值是指只能出现在赋值表达式的右边的数值。 10、 判断下列表达式的写法是否正确,如有错误,请改正:

a) V=43*PI*r3; // 原来公式为V=

43*?*r3

答:错误,表达式要写成 #define PI 3.1415926 V=4.0/3*PI*r*r*r

b) s=PI*r*r; // 原来公式为 s = 答:正确

c) r=1/(1/r1+r2) //原来公式为r?(11?1?r2

1

)2rr答:错误,表达式要写成 r=1/(1/r1+1/r2)

11、 若说明 int x(5), y(12), z(0) ; 经过下列算术表达式的计算之后,请给出整个算术表达式的结果值和x,y,z的各自值:

a) ++x+(--y+z++) b) y/x+y++/++z c) ?a?+y%x d) +x+(-y)/(++z+2)

答: a) x=6,y=11,z=1

b) x=5,y=13,z=1 c) x=5,y=12,z=0 d) x=5,y=12,z=1

12、 若说明 double x(12), y(1.5), z(18.5) ; 给出下列逻辑表达式的计算结果: a) x*y > z && z<100 || x>10 答: 结果:1 b) y/x<0 || z>0 && x>20

答: 结果:0

c) z-x>10 || z<100 && x<50 && y <0 答:结果:0

d) x && y>0 && !(z-x-6.5) || z<10 答:结果:1 13、 若说明 unsigned char x=47, y=0146, z=0xa3 ;给出下列位运算表达式的运算结果: a) ~x |y 结果为:0xf6 b) x & ~y 结果为:0x09

c) x & y ^ ~z 结果为:0x7a d) x | y ^z 结果为:0xef e) x<<2 | y 结果为:0xfe f) y>>5 ^ ~z 结果为:0x5f g) z ^ z | x 结果为:0x2f h) x&~x | z 结果为:0xa3 14、 若说明 char x= -27, y=056;分别给出下列位运算表达式的运算结果: a) ~x & y 答:结果:0x0a b) x | ~y 答: 0xf5

c) x<<2 | ~y 答: 0xd5 d) y>>3 ^ ~x答: 0xe0 15、 若说明 long x(1), y(2), z(3) ;请分别给出下列特殊运算符的运算结果; a) xy ? x+=1 : y- =5, z+=x+y 答: 结果:-3 16、 综合运算题

(a) 若int x=1, y=2; 则表达式 (y = 0)? ++x/- -y : ++y 的运算结果是什么? 答:x=1;y=1

(b) 若int x=5, y(15), *p=&x ; 则经过 y += ++x - 5, *p=++x+- -y ; 的运算之后,cout<

(c) 若unsigned char x=77, y =077, z=0x 77 ; 则表达式 (x & y) ^ ~z 的值是什么? 答:结果:0x85

(d) 若int x(0), y=1, z(2), *pw=&z ; 则经过语句 *pw += y +1, x+= ++z, x += z –y ; 的运算, 则 x, y, z 的结果值各是什么?

答:x=9,y=1,z=5

(e) 若char x = ‘A’, y= 0x20; int z; y = z = x + y ; 则 cout<< x << \ \ y << \的输出结果是什么?

答:结果:A => a(97)

第三章

1、答:

#include \#include using namespace std; void main(void) {

double a[10]={-5,65,-32,98,-54,23,0,76,-307,-2};

double m=0; //m存放负数的和 cout<<\负数为:\ for(int i=0; i<10; i++)

if( a[i]<0 ) //如为负数,则输出且叠加 { }

cout<

cout<

2、

#include \#include #include using namespace std; void main(void) {

float x,y; //定义x,y cout<<\请输入x:\ cin>>x;

if( x>=0 )

y=(sin(x)+cos(x))/2;

else

y=(sin(x)-cos(x))/2;

cout<<\

return; }

3、

#include \#include using namespace std; void main(void) {

float p0=1.03e9,pn; //定义人口基数p0和现在人口数量pn float r=0.01; //增长率r int n; //增长年份n

for(n=1,pn=p0;pn<1.5e9;n++) //当人口多于15亿时停止循环 {

pn=pn*(1+r);

} n=n+1982;

cout<

return; }

4、

#include \#include using namespace std; void main(void) {

char str[256]; //存放输入的字符串 int nLength=0; //存放统计的长度结果 int n[4]={0,0,0,0}; //记录各种字符个数 cout<<\:\ //显示输入提示信息

cin.get(str,256); // 使用cin流对象的输入方法,等价cin>>str ; while (str[nLength] != '\\0')

nLength++;

for(int i=0;i

n[0]++;

else if('0'<=str[i]&&str[i]<='9')

n[1]++;

else if('A'<=str[i]&&str[i]<='z')

n[2]++;

else

n[3]++;

};

cout<<\空格字符个数为:\ <<\数字的个数为:\ <<\英文字母个数为:\

<<\其它字符个数为:\ return;

} 5、

#include \#include using namespace std; void main(void) { int i,j,k,m,n;

for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++)

{

//个十百位依次进行循环

m=i*100+j*10+k; n=i*i*i+j*j*j+k*k*k; if(n==m)

cout<

}

return;

} 6、

#include \#include using namespace std; void main(void) { int i,j,k,n=0; for(i=0;i<=100;i++) for(j=0;j<=50;j++) for(k=0;k<=20;k++) {

if((i+2*j+5*k)==100) 钱

{ n++; cout<<\一分硬币:\ <<\两分硬币:\

<<\五分硬币:\

<

}

cout<<\共有\种方法\

//判断是否能组成一元

//组合次数记录 return;

} 7、

#include \#include using namespace std; void main(void) { int i,n; for(i=1;i<=1000;i++)

{ n=i*i; if(i<10) {

if(n>10&&i==n) 位数大

cout<

else if(i<100) { if(i==n0)

cout<

else if(i<=1000) { if(i==n00)

cout<

} return;

}

//同构数的平方一定比它

8、

#include \#include using namespace std; void main(void) {

int i,n; for(n=1981;n<=2050;n++) {

for(i=2;i

if (n%i==0) //若被i整除则不是素数

break; //不是素数年号则跳出,进行对下

一年的判断

} 9、

#include \#include using namespace std; void main(void) {

int i,m; for(i=100;i<=100000;i++)

{ //分别取其各个位上的数字然后相加

m=i+i/10+i/100+i/1000+i/10000+i/100000; } return;

if(i>=n/2)

cout<

if(m==5)

cout<

}

return;

}

10、

#include \#include using namespace std; void main(void) { int i,m,k; for(i=1,m=0,k=1;i<=25;i++) { k=k*i; m+=k; } cout<

} 11、

#include \#include using namespace std; void main(void) { int a,b,r,n1,n2;

cout<<\请输入两个整数:\//求各个数的阶乘 //将其相加

cin>>n1>>n2; //输入两个整数 a=n1;b=n2; if(a

{ r=a;a=b;b=r;} //若a>b则调整顺序 r=a%b; //用辗转相除法求最大公约数 while(r!=0) { a=b;b=r;r=a%b;

}

cout<<\最大公约数为:\ cout<<\最小公倍数为:\

}

12、

#include \#include using namespace std; void main(void) { double num[10]; int i,j,k;

cout<<\请输入个实数:\ for(i=0;i<10;i++)

cin>>num[i]; for(i=0;i<10;i++) for(j=i+1;j<10;j++) if(num[i]>num[j]) { k=num[i];

num[i]=num[j];

//输入个实数

num[j]=k;

}

cout<<\按升序排列:\ for(i=0;i<10;i++) cout<

}

13、

#include \#include using namespace std; void main(void) { int nday,nmonth,weekday,i; for(i=1;i<=212;i++) { if(i<=31) { nmonth=1;nday=i; } else if(i<=59)

{ nmonth=2;nday=i-31; } else if(i<=90)

{ nmonth=3;nday=i-59; } else if(i<=120)

{ nmonth=4;nday=i-90; } else if(i<=151)

{ nmonth=5;nday=i-120; } else if(i<=181)

{ nmonth=6;nday=i-151; } else if(i<=212)

{ nmonth=7;nday=i-181; }

//判断月份和日期

else if(i<=243)

{ nmonth=8;nday=i-212; } else if(i<=273)

{ nmonth=9;nday=i-243; } else if(i<=304)

{ nmonth=10;nday=i-273; } else if(i<=334)

{ nmonth=11;nday=i-304; } else

{ nmonth=12;nday=i-334; }

cout<<2006<<\年\月\号\

weekday=(i+1)%7; //判断星期几 } 14、

#include \#include

} return;

switch(weekday) {

case 1:cout<<\星期一\case 2:cout<<\星期二\case 3:cout<<\星期三\case 4:cout<<\星期四\case 5:cout<<\星期五\case 6:cout<<\星期六\case 0:cout<<\星期日\}

cout<

using namespace std; void main(void) { float x=0.5,s,r; int n;

for(n=1,r=1,s=1;s>1e-8;n++) //精度决定循环次数 { s=s*x/n; r+=s; }

cout<<\时近似解为\ return;

} 15、

#include \#include #include using namespace std; void main(void) {

double a,xn;

for(xn=1,a=2;abs(sqrt(a)-xn)>=1.0e-8;) {

xn=(xn+a/xn)/2; };

cout<<\的平方根为\} 16、

//每一项的迭代变化 //将每一项加和

//精度为10的-8次方 //迭代公式

#include \#include using namespace std; #define pai 3.1415926 void main(void) { double x,s,cosx; int k,i;

cout<<\请输入角度x:\ cin>>x; x=pai*x/180;

for(i=2,k=-1,s=1,cosx=1;s>=1e-8;i+=2) { s=s*x*x/(i*(i-1)); cosx+=k*s; k*=-1; }

cout<<\为:\

} 17、

#include \#include using namespace std; void main(void) { char a[256],b[256]; int i=0;

cout<<\请输入两个字符串:\ //精度为的-8次方 //求每一项

//将各项加和 //改变单位项的正负

}

cin>>a; cin>>b; while(a[i]!='\\0')

i++;

strcpy(&a[i],b); //将字符串b拷贝在a的末尾 cout<

18、

#include \#include #include using namespace std; void main(void) { } 19、

#include \#include #include

string str; int i;

cout<<\请输入字符串:\cin>>str;

for(i=0;i

cout<<\字符转变为大写:\

str[i]=toupper(str[i]);

using namespace std; void main(void) { string s1,s2; int n1,n2,i;

cout<<\ cin>>s1>>s2; n1=s1.length();

n2=s2.length(); for(i=0;is2[i])

{

cout<<\二,则输出结果,跳出循环

break; }

else if(s1[i]

{ cout<<\ break; }

}

if (i==n1||i==n2) 相等,则比较字符串长度

{ if (n1==n2)

cout<<\相等

else if(n1>n2)

cout<<\ else cout<<\

}

//计算字符串长度 //若字符串一大于字符串

//若字符串一小于字符串

//两字符串前面部分均

//两者长度相同则字符串

//长度长的字符串比较大 } 20、 fabcdef efabcde defabcd

第4章 指 针

思考与练习题

1、什么叫内存单元的地址?什么叫指针?

答:在计算机内部的存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。内存单元的编号,称为内存单元的地址。

在C++语言中,内存单元的地址称为指针。 2、什么叫指针变量?什么叫指针的目标?

答:专门用来存放地址的变量,称为指针变量(pointer variable)。指针指向的内存区域中的数据称为指针的目标。

3、什么叫空指针?其作用是什么?

答:所谓空指针就是指针变量的内容为零的状态。 4、指针运算的实质是什么?

答:指针运算是以指针变量所存放的地址量作为运算量而进行的运算。因此,指针运算的实质就是地址的计算。

5、指针有哪些运算?请枚举这些计算。

答:指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。 6、什么叫数组的指针?什么叫指针数组的指针?

答:在C++语言中,数组的指针是指数组在内存中的起始地址。

指针变量数组和普通的一般变量数组一样,编译系统在处理指针数组说明时, 按照指定的存储类型为它在内存中分配一定的连续存储空间,这时指针数组名就表示该指针数组的存储首地址,即指针数组的指针。

7、什么叫二级指针变量?什么叫多级指针变量?

答:对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。我们把一个指向指针变量的指针变量,称为多级指针变量。

8、new运算符的作用是什么?delete运算符的作用是什么?

答:运算符new主要用于分配内存,并获得分配到的内存的首地址,通常需要将其赋给相应数据类型的指针。如果程序中不再需要由new分配的内存空间时,用运算符delete释放这些空间。

9、什么叫引用?

答:所谓引用是指给一个变量或一个数组起一个别名。使用引用进行运算的实质是操作原来的变量或数组本身的另一个使用名称。

10、const型指针有几种形式?其作用是什么? 答:const型指针主要有下面三种形式:

( a ) 常量化指针目标表达式 :常量化指针目标是限制通过指针改变其目标的数值。 ( b ) 常量化指针变量 :常量化指针变量,使得<指针变量>的地址值不能修改。但可以通过*<指针变量名称>可以修改指针所指向变量的数值。

( c ) 常量化指针变量及其目标表达式:常量化指针变量及其目标表达式,使得既不可以修改<指针变量>的地址,也不可以通过*<指针变量名称>修改指针所指向变量的值。

11、什么叫void型指针?其作用是什么?

void型的指针变量是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量或数组。

12、如说明 int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pa=a;

请给出访问第i+1个元数即a[i]的几种等价表达形式。 答:a[i],*(pa+i),*(a+i),pa[i] 13、请给出下列问题的计算结果:

(1)若int x=8, y(10), *p=&x ; 则经过 y += x+2, *p=++x+y- - ; 的运算之后,

cout<

(2)若int x(1), y=2, z(3), *pw=&z ; 则经过语句y+=*pw+1, x+=++y, *pw += x -y;

的运算, 则 x, y, z 的结果值各是什么? 答:8 7 4

(3)若int a[4]={1,2 ,3,4}; 则a[2]=a[0]+*(a+3)+a[1]++ 运算之后,a的各元素存放的是什么?

答:a[4]={1, 3, 7, 4}

(4)若说明int a[8]={7,6,5,4,3,2,1,0}, *p=&a[7]; 则经过表达式

*(p-1) += ( *p+=1, *(p - = 6) +=3, *(p+4) += 1 ); 运算后,则数组a各元素的值是什么? 答:10 9 5 4 3 3 1 1

(5)若说明int x, data[8]={1,2 ,3,4,5,6,7,8}; 则x=*(data+1)+*(&data[5]-2)之后,

x存放的数是什么? 答:6

(6)若说明int a=16; int &ra = a; 经过语句 a += 2; ra +=2 ; 执行之后,

表达式 ra+1 的结果是多少? 答:21

(7) 若说明int a[3]={8, 18, 28}; int (&ra)[3] = a;

经过语句 ra[0] +=12; a[1] +=2 ; 执行之后,则数组a各元素的值是什么? 答:20 20 28

(8) 若说明 int x=16 ; const int *px =&x; 经过语句 x=26; 则表达式 *px+4 的结果是多少?

答:30

(9) 若说明 int a=82 , b(28) ; const int * pa = &a; 则表达式 *px+2 的结果是多少?

答:30

(10) 若说明 int x=99; int * const px =&x ; 则表达式 *px 的结果是多少? 答: 100

经过语句 x += 1;

经过语句 pa = &b;

第5章 函数与宏

1、 请给出函数概念的基本描述。

答:函数就是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。 2、 什么叫函数原型?

答:函数原型是指由函数定义中抽取出来的能代表函数应用特征的部分,包括函数

的数据类型、函数名称、形式参数说明。 3、 什么叫函数的实参?什么叫函数的形参?

答:实参是在调用函数过程中传递给被调用函数的参数;形参是被调用函数接受调用函数传递过来的数据的参数。

4、 请说出函数参数为一般变量的复制传递方式、地址传递方式和引用方式的异同点。

答:复制传递方式是实参的数据拷贝给了形参变量,实参和形参是具有相同数据类型但存储空间是不同的两组空间。在复制传递方式下,被调用函数里对形参的操作不能改变实参的内容。

地址传递方式和复制传递方式正好相反,用函数的参数本身传给被调用函数。被调用函数中对形参的操作将直接改变实参的值。调用函数将实参的地址传送给被调用函数,被调用函数对该地址的目标操作即对实参本身的操作。按地址传递,实参为变量的地址,而形参为同类型的指针。

引用方式和地址传递方式的效果一样,但引用更直接、更方便。按引用传递,实参为变量,形参为同类型的引用。采用引用方式实参和形参使用的是相同的内存空间,只是名称不同而已。

5、 数组在函数间传递形式有哪些?并给以比较和解释。

答:数组在函数间的传递形式有复制传递方式、地址传递方式、引用方式和全局数组传递方式。

函数与函数之间数组的复制传递方式是调用函数将实参数组传递给被调用函数形参,形参接收是实参的地址。

函数与函数之间数组的地址传递方式是将调用函数中的实参数组的起始地址传递给被调用函数的指针变量形参。被调用函数中对形参地址的目标操作,相当于对实参本身的操作,将直接改变实参数组的值。地址传递方式,实参应该为数组的指针,而形参应为同类型的指针变量。另外,数组的地址传递方式不仅要把实参数组的指针作为参数传递给函数,同时还需要传递数组的长度。与引用方式不同的是被调用函数的形参应声明为数组同类型的指针变量。

函数与函数之间数组的引用传递方式需将被调用函数的形参说明为数组的引用形式。在被调用函数中,对形参进行操作就是对实参数组的直接操作。数组的引用方式和地址传递方式的作用效果基本一样,但引用更直接、更方便。按引用方式传递数组,形参为实参同类型的数组引用。但引用数组名不是指针变量,不能作为左值。

6、 什么叫函数指针?什么指针函数?

答:函数指针是一个函数执行代码的起始地址。指针函数是指一个函数的返回值为地址量的函数。 7、 什么叫内联函数?

答:内联函数是将很简单的函数\内嵌\到调用他的程序代码中,只样做的目的是为了节省了调用函数的开销。 8、 什么叫函数重载?

答:函数重载是指使用一个函数名称定义了多个完成不同功能的函数,这些函数的输入参数类型或个数不一样,相应的函数类型也有可能改变。 9、 什么叫预编译语句?

答:在C++程序的源代码中可以包括各种编译用的命令语句,这些语句都称为预编译语句。

10、 什么叫宏?谈谈带参数宏与内联函数之间的异同点.

答:宏是指定义一个标识符来代替一个字符序列。内联函数和宏都是在程序出现的地方展开,都不是通过函数调用实现的,是在调用该函数的程序处将它展开。内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能。宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的,宏在运行期间展开而内联函数在编译期间完成。

11、 指出下列函数说明语句有哪些错误并说出原因。 (1) char *volume ( int height, width, char background ) ;

答:函数的参数部分说明错误;width参数没有指出数据类型。 (2) double work ( double &matrix[10] ) ;

答:参数部分引用数组的说明形式错误;不符合引用数组的说明形式。 (3) void display ( int arr[ ][ ], int size ) ;

答:参数二维数组的说明不对;右下标大小不能为空。 (4) void sum ( int (&a) [ ] ) ;

答:不符合引用数组的说明形式;大小不能缺省。 (5) int fun( double a, int b = 0, int c );

答:缺省值位置说明错误;指定缺省值必须从右向左给出,不能跳跃指定缺省值。 (6) double Matrix ( double *m[] );

答:指针变量数组的说明形式不对;大小不能缺省。 (7) char * fetch ( int a= 24, int b, char c=0);

答:缺省值位置说明错误;指定缺省值必须从右向左给出,不能跳跃指定缺省值。 (8) void length( int &a [2 ] );

答:引用数组说明错误;不符合引用数组的说明形式。 12、 什么叫递归函数?简述其执行过程。

答:递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。 递归函数调用的执行过程分为两个阶段:

(1)递推阶段:从原问题出发,按递归公式递推,从未知到已知,最终达到递归终止条件。

(2)回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。

13、 阅读下列程序并给出运行结果。 (1) #include

int fun(int x,int y) {

return x*y; }

void main(void) {

int k=5;

cout<

运行结果是:10

(2) #include #include

void fun (int a, int b, double &s, double &t)

{

s=sqrt (a*a+b*b);

t=sqrt (a*a-b*b);

}

void main(void) {

double m, n;

fun (4,3,m,n); cout<

运行结果是:7.64575 (3) #include

int n=0;

int &fun (int x) //引用型函数 {

n -=x; return n; }

void main(void) {

fun(100) += 10;

cout<<\ }

输出结果是:n=-90 (4) #include \

int d=0; int fun( int p) {

static int g=10 ; g += ++d - p; printf(\,g); return ( g ); }

void main( void ) {

int d=10; printf(\,fun( fun(d) - fun(2) ) );

}

运行结果是:1,1,4,4 (5) #include \

int afox(int x,int &y,int *v,int *w) {

* v = - -x + y++;

*w= x - y; return(v);

}

void main(void) {

int a=3,b=3,c=3,d=3;

afox ( a,b,&c, &d );

cout<< a<< \;

}

运行结果是:3,4,6,-1

14、 已知三角形的三边,求三角形面积,将其编写成一个函数。

答:

#include #include

double area( double a,double b,double c,double s) // 求三角行的面积 {

double p;

p=sqrt(s*(s-a)*(s-b)*(s-c)); return p; }

void main() {

double x,y,z,q;

cout<<\请输入三角形三边的长度\

cin>>x>>y>>z; //输入三边长度

if(!(((x+y)>z)&&((x+z)>y)&&((y+z)>x))) //判断给出的三边能否构成三角形

cout<<\你输入的三边不能构成三角形\

else {

q=area(x,y,z,(x+y+z)/2);

cout<<\三角形面积是:Area=\ } }

15、 编写函数求两个整型参数a和b的最小公倍数。

答:

#include void num(int x,int y) {

int arg[100]; int m=0,n=0,j=0; for(int i=0;i<100;i++)

arg[i]=0;

m=n=x>y?x:y;

for (;n<=(x*y);n++) { {

if ((n%x==0)&&(n%y==0))

}

arg[j]=n;

j++; }

for(int k=0;k

if(arg[0]>arg[k]) {

t=arg[0]; arg[0]=arg[k];arg[k]=t; } }

cout<<\这两个数的最小公倍数是: \}

void main() {

}

int a,b;

cout<<\请输入两个整数:\cin>>a>>b; num(a,b);

16、 编写判断一个正整数是否为素数的函数。

答:

#include #include void main() {

int m, i, z; bool q=false; cout<<\请输入一个数:\ cin>>m;

z=(int)sqrt(m); //求m的平方根 for(i=2;i<=z;i++) {

if(m%i==0) //数m是否能被小于m平方根的数整除 {

q=true;

break;

}

}

if(q)

cout<<\你输入的数不是素数!\

else

cout<<\你输入的数是素数!\

}

17、 分析并指出下列函数或程序实现的功能。 (1) void Trans(int x) {

char a[10];

int i=0, rem;

do {

rem = x; x=x/16; if(rem<10)

a[i]=48+rem ; //'0' 字符的ASCII码为48

else

a[i]=65+rem ; //'A' 字符的ASCII码为65

i++; } while( x !=0 ) ;

while(i>0) cout<< a[i--]; cout<

实现的功能是:将a[i]中的元素转换成十六进制。 (2) #include double Test(int n)

{

double sign= -1, s (1); for(int i=2; i<=n; i++)

{ s += sign / (i*i); sign *= -1; }

return s;

}

void main(void) {

int a(7); cout<< Test(a) << endl;

}

实现的功能是:求公式

i?nn?1?(?1)i?11n2(3) double Calculate (double a, double b, char op)

{

switch(op)

{

case '+': return a+b ; case '-': return a-b ; case '*': return a*b ; case '/':

if(b==0) {

cout<<\ return(-9999.999999);

}

else

return a/b;

default:

cout<<\

return(-9999.999999);

} }

实现的功能是:两个数的加减乘除运算。

(4) #include #include const N=10;

int ToCompute(int x, int y)

{

int z;

cout<< x << '+' << y << '=' ; cin>>z; if(x+y==z)

return 1; else

return 0;

}

void main(void) {

int a, b, c= 0 ;

srand( 100 ); //初始化随机数序列

for(int i=0;i

{

a=rand() +1; //rand()函数产生0-32767之间的一个随机数 b=rand() +1; c += ToCompute (a,b);

}

cout<<\得分:\

}

实现的功能是:对20以内任意两个加发运算能力的测试。

18、 编写一个函数,要求将一个double型的一维数组和数组长度作为参数,并返回该数组中的正数之和。 答:

#include

double TestArray(double b[],int Size); void main() {

int n=0;

double a[100],r=0;

cout<<\请输入数组元素的个数(n小于100)n=\输入元素的个数

in>>n;

for(int i=0;i

cout<<\]=\

cin>>a[i]; }

r=TestArray(a,5); //调用函数TestArray, 将返回值赋给r

cout<< \; //输出r }

double TestArray(double b[], int Size) // 求数组中非负元素的和 {

double s=0; b++;

for(int i=0; i

{

if(b[i-1]<0) continue;

s += b[i-1]; }

return(s); } 19、 答:

#include

void Turarr(double arg[][],int a,int b) //数组转置 {

double k; for(int i=0;i

编写一个函数,能够实现将一个double型的二维矩阵转置的功能。

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

Top