C++函数数组及指针章习题指导Word文档下载推荐.docx
《C++函数数组及指针章习题指导Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++函数数组及指针章习题指导Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
iostream>
f(inta)
{intb=0;
staticintc=3;
b++;
c++;
return(a+b+c);
}
intmain()
{inta=2,I;
for(I=0;
I<
3;
I++)
cout<
<
f(a)<
endl;
A.7B.7C.7D.7
87109
971311
注意静态局部变量c的特点:
在编译时候只赋一次初值,以后每次调用函数时不再重新赋初值而是保留上次函数调用结束时的值,故本题选A。
例题5:
编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是26个英文字母。
本题要掌握判断字符是大写或者小写字母的方法,程序代码如下:
charch;
fun(charch)
{intI;
if((ch>
=’a’)&
&
(ch<
=’z’))
I=1;
elseif((ch>
=’A’)&
=’Z’))I=2;
elseI=3;
returnI;
{intI;
”请输入一个字符:
”;
cin>
>
ch;
I=fun(ch);
If(I==1)
”是小写字母!
”<
elseif(I==2)
”是大写字母!
elsecout<
”是其他字符!
例题6:
使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和浮点型数的两点间距离。
本题要求我们理解函数重载,另外两点间距离公式为:
d=sqrt((x1-x2)2+(y1-y2)2),程序代码如下:
#include”iostream.h”
#include”math.h”
doublefunc(int,int,int,int),func(double,double,double,double);
voidmain()
{cout<
func(2,2,5,5)<
”,”;
func(2.2,2.2,5.5,5.5)<
doublefunc(intx1,inty1,intx2,inty2)
{returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
doublefunc(doublex1,doubley1,doublex2,doubley2)
5.3教材习题分析与解答
1.选择题
(1)以下正确的说法是()。
A.用户若需要调用标准函数,调用前必须重新定义
B.用户可以直接调用所有标准库函数
C.用户可以定义和标准库函数重名的函数,但是在使用时调用的是系统库函数
D.用户可以通过文件包含命令将系统库函数包含到用户源文件中,然后调用系统库函数
D
(2)如果一个函数无返回值,定义时它的函数类型应是()。
A.任意B.intC.voidD.无
(3)关于函数返回值的的描述正确的是()。
A.函数返回表达式的类型一定与函数的类型相同
B.函数返回值的类型决定了返回值表达式的类型
C.当函数类型与返回值表达式类型不同,将对返回值表达式的值进行类型转换
D.函数返回值类型就是返回值表达式类型
(4)下列哪个不是重载函数在调用时选择的依据()。
A.参数类型B.参数个数C.函数类型D.函数名
(5)在参数传递过程中,对形参和实参的要求是()。
A.函数定义时,形参一直占用存储空间B.实参可以是常量、变量或表达式
C.形参可以是常量、变量或表达式D.形参和实参类型和个数都可以不同
(6)下列各类变量,哪个不是局部变量()。
A.register型变量B.外部static变量
C.auto型变量D.函数形参
(7)在C++语言中,关于参数默认值的描述正确的是()。
A.只能在函数定义时设置参数默认值
B.设置参数默认值时,应当从右向左设置
C.设置参数默认值时,应当全部设置
D.设置参数默认值后,调用函数不能再对参数赋值
(9)预处理命令以()开头。
A.*B.#C./D.:
(10)对数组名作函数的参数,下面描述正确的是(B)。
A.数组名作函数的参数,调用时将实参数组复制给形参数组
B.数组名作函数的参数,主调函数和被调函数共用一段存储单元
C.数组名作参数时,形参定义的数组长度不能省略
D.数组名作参数,不能改变主调函数中的数据
2.分析程序并写出结果
(1)#include<
voidfun();
intn=5;
{intn=10;
n<
fun();
voidfun()
}
运行结果:
10
5
(2)#include<
usingnamespacestd;
{inti;
for(i=0;
i<
5;
i++)fun();
{staticintm=0;
m++<
1
2
3
4
(3)#include<
iomanip.h>
voidfun(intarray[],intn);
{inta[10]={5,8};
inti;
fun(a,10);
for(i=0;
10;
i++)
cout<
setw(4)<
a[i];
voidfun(intarray[],intn)
{ inti;
for(i=2;
n;
array[i]=array[i-1]+array[i-2];
581321345589144233377
(5)#include<
intadd(intx,inty=8);
{ inta=4;
add(a)<
cout<
add(a,add(a))<
intadd(intx,inty)
{ returnx+y;
12
16
(6)#include<
intfun(doublea,doubleb);
fun(2.5,3.5)<
intfun(doublea,doubleb)
{ returna*b;
8
(7)#include<
string>
voidfun(charstring[]);
{charstr[20]="
thisisabook"
;
cout<
str<
fun(str);
voidfun(charstring[])
{inti;
strlen(string);
if(string[i]>
='
a'
&
string[i]<
z'
)string[i]-=32;
thisisabook.
THISISABOOK.
3.编写函数将化氏温度转换为摄氏温度,公式为C=(F-32)*5/9;
并在主函数中调用。
#include<
floatfun(floatf)
{floatc;
c=5.0/9*(f-32);
//注意这里是5.0/9,不能写成5/9
returnc;
intmain()
{floatx;
"
请输入一个温度值"
x;
转换值为"
fun(x)<
4.分别利用非递归和递归的方法编写函数求斐波那契数列第n项。
斐波那契数列具有这样的特点,数列的第一项和第二项都等于1,从第三项开始每项的数值都等于它前面两项之和。
非递归:
floatfeb(intn0,intn1)
{returnn0+n1;
{inta=1,b=1,c,i;
a<
'
\t'
b<
for(i=3;
=20;
{c=feb(a,b);
cout<
c<
if(i%5==0)cout<
a=b;
b=c;
}}
递归:
floatfeb(intn)
{if(n==0)return1;
elseif(n==1)return1;
elsereturnfeb(n-1)+feb(n-2);
voidmain()
{for(inti=0;
20;
{cout<
feb(i)<
if(i%5==4)cout<
}}
5.编写函数将字符串按逆序存放。
string.h>
{inti,n;
chars[100],temp;
inputstring:
gets(s);
n=strlen(s);
n/2;
{temp=s[i];
s[i]=s[n-i-1];
s[n-i-1]=temp;
Now,string:
puts(s);
6.编写函数实现字符串拷贝功能。
{chars1[80],s2[80];
inti;
Inputs2:
s2;
=strlen(s2);
i++)s1[i]=s2[i];
s1:
s1<
8.编写函数利用递归的方法计算x的n阶勒让德多项式的值。
该公式如下:
{intx,n;
floatp(int,int);
inputn&
x:
cin>
'
x<
pn(x)=:
p(n,x);
floatp(intn,intx)
{if(n==0)return
(1);
elseif(n==1)return(x);
elsereturn(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);
9.利用重载编写求整数绝对值和求实数绝对值两个函数。
floatfabnum(floatnum1)
{floatnum;
if(num1>
=1e-6)num=num1;
elsenum=-num1;
returnnum;
intfabnum(intnum2)
{intnum;
if(num2>
=0)num=num2;
elsenum=-num2;
{floatnum1;
intnum2;
Pleaseinputafloatnumber:
num1;
AbsoluteValueis:
fabnum(num1)<
Pleaseinputaintnumber:
num2;
fabnum(num2)<
10.利用全局变量并编写函数统计数组中奇数和偶数的个数。
intoddnum=0,evennum=0;
{intn,i,a[100];
Entern:
inputarraya:
Arrayais:
{if(a[i]%2==0)oddnum++;
elseevennum++;
Thenumberofevenis:
evennum<
Thenumberofoddis:
oddnum<
5.4补充习题
1.1.
空题:
(1)C++语言程序由构成,其至少包含,C++语言编写的程序总是从
开始,到结束。
(2)在函数中使用语句返回值。
(3)函数的形参在未被调用之前分配空间,函数的形参的要和实参的相同。
(4)函数调用一般分为和,前者的特点是,后者的特点是。
(5)函数的递归分为和,递归由与两部分组成。
2.编程题:
(1)设计两个求面积的函数:
area();
//求圆面积,需传递一个参数
//求矩形面积,需传递两个参数
然后自行输入数据进行测试。
(2)编写一个函数求满足以下条件的最大的n:
12+22+32+…+n2<
1000
(3)编写一个函数判定一个字符在一个字符串中出现的次数,如果该字符不出现,则返回值为0。
(4)在主程序中提示输入n,编写函数用递归的方法求1+2+…+n的和。
(5)输入一个整数m,判断它能否被3整除,要求利用带参的宏来实现该程序。
指针
1知识点
掌握指针、地址、指针类型、空指针(NULL)等概念;
2.2.
掌握指针变量的定义和初始化、指针的间接访问、指针的加减运算、指针变量比较运算和指针表达式;
3.3.
掌握指针与数组、函数、字符串等的联系;
4.4.
掌握动态空间操作(new,delete);
5.5.
掌握引用参数的使用。
例题1:
若有以下定义,则说法错误的是()。
inta=100,*p=&
a;
A.声明变量p,其中*表示p是一个指针变量
B.变量p经初始化,获得变量a的地址
C.变量p只可以指向一个整形变量
D.变量p的值为100
有指针变量定义可知A、C说法是正确的,故不能选。
在语句中&
p=a,表示指针变量取得变量a地址,B说法也正确,也不能选择。
D中不能说变量p的值为100,应该*p的值为100,所以选择D。
例题2:
若有以下定义,则赋值正确的是()。
inta,b,*p;
floatc,*q;
A.p=&
cB.q=pC.p=NULLD.q=newint
指针变量使用规定,不同类型的指针变量不能赋值,也不能取得普通变量地址,故A、B不正确,不能选择。
因为q是float类型指针变量,不能申请int类型地址,D不正确,也不能选择。
因为任何类型的指针变量都能取得NULL指针,所以C正确。
例题3:
如果x是整型变量,则合法的形式是()。
A.&(x+5)B.*x C.&
*x D.*&
x
因为C++语言表达式没有地址,A不正确。
C++语言普通变量不能用*运算,因此B和C也不正确。
x表示变量x的地址,*&
x是x地址的值,所以D正确。
例题4:
若要建立如下关系,错误的语句组是()。
A.B.C.D.
int*p=&
x,x;
intx,p=&
int*p,x=10;
int*p,x;
*p=10;
*p=&
p=&
x;
x=10;
在变量类型说明语句中*表示变量是指针变量,在其他语句中,*称为指针运算,用于访问指针所指向的对象的值,&
称为取地址运算,用来得到一个对象的地址。
故B、C、D都是正确的,不能选择。
A中指针变量p取不到x地址,因为x还没有定义,所以选择A。
例题5:
若有语句inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
则()不是对a数组元素的正确引用(其中0≤i<
10)。
A.p[i] B.*(*(a+i))C.a[p-a]D.*(&
a[i])
指针就变量p取得数组a的首地址,由指针与数组关系知,p[i]表示数组元素第i+1元素值,p[i]=a[i]正确,故A不能选。
*(a+i)表示一维数组a第i+1元素值,*(*(a+i)表示对第i+1元素值再取值是错误操作,所以选B。
a[p-a]=a[0]正确,故不能选择C。
*(&
a[i])也正确(见上题),也不能选D。
例题7:
写出下列程序运行结果:
{int*pn,n=10,m=20;
float*pf,px=3.14159,py=2.71828;
pn=&
*pn+=m;
”n现在的值是:
”<
*pn<
pf=&
px;
py+=5*(*pf);
”py现在的值是:
py<
运行结果是:
n现在的值是:
30
pf现在的值是:
18.4262
指针是通过在变量前加一个“*”来定义,使用用“*”加变量名存取指针所指的值,用运算“&
”取变量的地址,但是不能存取无指向的指针所指向内容,这样会导致系统故障。
例题8:
{intI,*p,a[]={10,20,30,40,50,60};
p=a;
”a[“<
”]=”<
a[I]<
’\t’<
”*(a+”<
”)=”<
*(a+I)
”*(p+”<
*(p+I)<
”p[“<
p[I]<
a[0]=10*(a+0)=10*(p+0)=10p[0]=10
a[1]=20*(a+1)=20*(p+1)=20p[1]=20
a[2]=30*(a+2)=30*(p+2)=30p[2]=30
a[3]=40*(a+3)=40*(p+3)=40p[3]=40
a[4]=50*(a+4)=50*(p+4)=50p[4]=50
a[5]=60*(a+5)=60*(p+5)=60p[5]=60
分析程序根据指针与数组关系,引用数据可以有四种不同的表示方法:
使用数组下标变量;
使用数据固有的指针——数组名间接引用;
使用指向数组的指针的间接引用;
使用指向数组的指针下标引用。
例题10:
iostram>