第5章函数习题与答案.docx

上传人:b****6 文档编号:5838915 上传时间:2023-01-01 格式:DOCX 页数:29 大小:34.52KB
下载 相关 举报
第5章函数习题与答案.docx_第1页
第1页 / 共29页
第5章函数习题与答案.docx_第2页
第2页 / 共29页
第5章函数习题与答案.docx_第3页
第3页 / 共29页
第5章函数习题与答案.docx_第4页
第4页 / 共29页
第5章函数习题与答案.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

第5章函数习题与答案.docx

《第5章函数习题与答案.docx》由会员分享,可在线阅读,更多相关《第5章函数习题与答案.docx(29页珍藏版)》请在冰豆网上搜索。

第5章函数习题与答案.docx

第5章函数习题与答案

第5章函数习题及解答

一.选择题。

1.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是

A)函数调用可以作为独立的语句存在

B)函数调用可以作为一个函数的实参

C)函数调用可以出现在表达式中

D)函数调用可以作为一个函数的形参

答案:

D

解析:

本题综合考查函数的调用方式。

函数的形参和实参具有以下特点:

①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

因此,形参只有在函数内部有效。

函数调用结束返回主调函数后则不能再使用该形参变量。

②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。

因此应预先用赋值,输入等办法使实参获得确定值。

③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。

④函数调用中发生的数据传送是单向的。

即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。

因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

2.有以下程序

intfun(intx,inty)

{return(x+y);}

main()

{inta=2,b=5,c=8;

printf("%d\n",fun((int)fun(a+c,b),a-c));

}

程序运行后的输出结果是

A)编译出错

B)9

C)21

D)9.0

答案:

B

解析:

本题考查函数的综合知识。

首先,我们可以利用强制转换类型转换运算符将一个表达式转换成所需类型。

如:

(double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。

本题可按部就班地逐步运算:

fun((int)fun(a+c,b),a-c)

fun((int)fun(10,5),2-8)

fun((int)15.000000,-6)

fun(15,-6)

9

3.若有以下调用语句,则不正确的fun函数的首部是

main()

{…

inta[50],n;

fun(n,&a[9]);

}

A)voidfun(intm,intx[])

B)voidfun(ints,inth[41])

C)voidfun(intp,int*s)

D)voidfun(intn,inta)

答案:

D

解析:

函数定义的一般形式为:

类型说明符函数名()

{

类型说明

语句

}

根据fun函数的调用语句可知,fun函数的第二个参数是一个地址值。

4.以下说法正确的是

A)C语言程序总是从第一个的函数开始执行

B)在C语言程序中,要调用函数必须在main()函数中定义

C)C语言程序总是从main()函数开始执行

D)C语言程序中的main()函数必须放在程序的开始部分

答案:

C

解析:

C语言的程序是由主函数main()开始运行,由主函数来调用其他函数,所以,选项A)错误。

C语言中定义的函数必须是并列的,不能在一个函数中定义其他函数,选项B)错。

函数必须先定义后使用,在调用函数以前要定义函数,而main()函数不必放在最前面,故选项D)错。

5.以下程序中函数sort的功能是对a数组中的数据进行由大到小的排序

voidsort(inta[],intn)

{inti,j,t;

for(i=0;i

for(j=i+1;j

if(a[i]

}

main()

{intaa[10]={1,2,3,4,5,6,7,8,9,10},i;

sort(&aa[3],5);

for(i=0;i<10;i++)printf("%d,",aa[i]);

printf("\n");

}

程序运行后的输出结果是

A)1,2,3,4,5,6,7,8,9,10,

B)10,9,8,7,6,5,4,3,2,1,

C)1,2,3,8,7,6,5,4,9,10,

D)1,2,10,9,8,7,6,5,4,3,

答案:

C

解析:

C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式。

指针变量作函数参也要遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

6.在调用函数时,如果实参是简单的变量,它与对应形参之间的数据传递方式是

A)地址传递

B)单向值传递

C)由实参传形参,再由形参传实参

D)传递方式由用户指定

答案:

B

解析:

如果实参是简单变量,它与对应形参之间的数据传递方式是由实参传给形参,而形参值的改变不能改变实参的值。

7.以下叙述中正确的是

A)构成C程序的基本单位是函数

B)可以在一个函数中定义另一个函数

C)main()函数必须放在其他函数之前

D)所有被调用的函数一定要在调用之前进行定义

答案:

A

解析:

本题综合考查C语言的概念部分,关于C语言,我们应该了解以下必须要掌握的基础知识:

①C程序是由函数构成的。

②一个函数由两部分组成:

函数的首部和函数体。

③一个C程序总是从main函数开始执行的,而不论main函数的整个程序中的位置如何(main函数可以放在程序最开始,也可以放在程序最后,或写在一些函数之前,在另一些函数之后)。

④C程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上。

每个语句和数据定义的最后必须有一个分号。

8.若有函数内部说明:

inta[3][4];则数组a中各元素

A)可在程序的运行阶段得到初值0

B)可在程序的编译阶段得到初值0

C)不能得到确定的初值

D)可在程序的编译或运行阶段得到初值0

答案:

C

解析:

我们可以把二维数组的常量表达式看做是矩阵或者表格的行数与列数,要注意每个元素有两个下标,第一个是方括号中的下标代表行号,称行下标;第二个是方括号中的下标代表列号。

行下标和列下标总是从0开始的,二维数组在不赋初值时,不能得到确定。

9.有以下函数

charfun(char*p)

{returnp;}

该函数的返回值是

A)无确切的值

B)形参p中存放的地址值

C)一个临时存储单元的地址

D)形参p自身的地址值

答案:

B

解析:

本题考查函数返回值的知识。

函数返回值是通过函数中的return语句获得,return语句中的表达式的值就是所求函数的值。

此表达式的值必须与函数首部所说明的类型一致。

若类型不一致,则以函数值的类型为准,由系统进行转换。

10.以下正确的说法是

A)定义函数时,形参的类型说明可以放在函数体内

B)return后边的值不能为表达式

C)如果函数值的类型与返回值类型不一致,以函数值类型为准

D)如果形参与实参类型不一致,以实参类型为准

答案:

C

解析:

选项A)中定义函数时,形参的类型说明应该放在形参表列内说明。

老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第1行的括号内指定形参的类型,而在括号外单独指定。

选项B)中return后面的值可以是一个表达式。

选项D)中实参与形参的类型应相同或赋值兼容。

如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参类型为准。

11.有以下程序

intf(intn)

{if(n==1)return1;

elsereturnf(n-1)+1;}

main()

{inti,j=0;

for(i=1;i<3;i++)j+=f(i);

printf("%d\n",j);}

程序运行后的输出结果是

A)4

B)3

C)2

D)1

答案:

B

解析:

在main函数中,对f

(1)和f

(2)的值进行了累加。

f

(1)=1

f

(2)=f

(1)+1=2

最后,j的值为1+2=3

12.在C语言中,变量的隐含存储类别是

A)auto

B)static

C)extern

D)无存储类别

答案:

A

解析:

auto变量:

无static声明的局部变量。

用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。

是动态存储方式。

大多数变量是自动变量。

用static声明的局部变量是静态局部变量。

函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。

用extern声明外部变量,外部变量即全局变量,可以用extern声明来改变全局变量的作用域,实际上,关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,它属于动态存储方式。

13.若有以下程序

#include

voidf(intn);

main()

{voidf(intn);

f(5);

}

voidf(intn)

{printf("%d\n",n);}

则以下叙述中不正确的是

A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f

B)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f

C)对于以上程序,编译时系统会提示出错信息:

提示对f函数重复说明

D)函数f无返回值,所以可用void将其类型定义为无返回值型

答案:

C

解析:

C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:

①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。

②如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。

③如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。

在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:

函数类型函数名(参数类型1,参数类型2)或函数类型函数名(参数类型1参数名1,参数类型2参数名2)

14.有如下程序

longfib(intn)

{if(n>2)return(fib(n-1)+fib(n-2));

elsereturn

(2);

}

voidmain()

{printf(“%d\n”,fib(3));

该程序的输出结果是

A)2B)4C)6D)8

答案:

B

15.有如下函数调用语句

func(rec1,rec2+rec3,(rec4,rec5));

该函数调用语句中,含有的实参个数是

A)3B)4C)5D)有语法错

答案:

A

16.C语言允许函数值类型缺省定义,此时该函数隐含的类型是________。

A)float型B)int型C)long型D)double型

答案:

B

17.以下存储类型只有在使用时才为该类型变量分配内存的是________。

A)auto和staticB)auto和registerC)register和staticD)static和extern

答案:

B

18.设有以下函数:

fun(intx)

{

inty=0;

staticintz=2;

y++;z++;

return(x+y+z);

}

若在下面主程序中调用该函数,则输出结果是________。

main()

{

intx=3,k;

for(k=1;k<=3;k++)

printf("%d\n",fun(x));

}

A)7B)7C)7D)7

89107

911137

答案:

A

19.运行下面程序:

intff(intn)

{

staticintf=1;

f=f*n;

returnf;

}

main()

{

intk;

for(k=1;k<4;k++)

printf("%d\n",ff(k));

}

则输出结果是________。

A)1B)1C)1D)1

2222

6633

244

答案:

B

20.以下程序有语法性的错误,有关错误原因的正确说法是________。

main()

{intG,k;

voidprt_char(int);

......

k=prt_charf(G)

......

}

A)语句voidprt_char();有错,它是函数调用语句,不能用void说明B)变量名不能用大写字母

C)函数说明和函数调用语句之间有矛盾;

D)函数名不能使用下划线。

答案:

C

二.填空题。

1.设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部【1】。

要求形参名为b。

main()

{doubles[10][22];

intn;┆

fun(s);

}

答案:

【1】voidfun(doubles[][22])

解析:

本题中,为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。

这系统就保证不使函数带回任何值,二维数组的第一维可以省略。

2.阅读下面程序,则程序执行后的结果为【2】。

  #include"stdio.h"

  main()

  {inta=4,b=6,c=7;

  floatd,fun(int,int,int);

  d=fun(a,b,c);

  printf("%f\n",d);

  }

  floatfun(inta,intb,intc)

  {doubles;

  s=a%b*c;

  returns;

  }

  

 答案:

【2】28.000000

3.当调用函数时,实参是一个数组名,则向函数传递的是【3】。

答案:

【3】数组的首地址。

解析:

在函数中,可以通过指针变量来引用调用函数中对应的数组元素,此操作是通过传递数组的首地址来实现。

4.现有如下程序,则程序的输出结果为【4】。

  #include"stdio.h"

  intf(inta,intb)

  {intc;

  if(a>0&&a<10)c=(a+b)/2;

  elsec=a*b/2;

  returnc;

  }

  main()

  {inta=8,b=20,c;

  c=f(a,b);

  printf("%d\n",c);

  }

  答案:

【4】14

5.现有如下程序段,则程序段的输出结果为【5】。

  #include"stdio.h"

  intfun()

  {staticintk;

  returnk;

  }

  main()

  {intm;

  m=fun();

  printf("%d\n",m);

  }

 答案:

【5】0

三.完善程序题。

1.下面的函数fun的功能是将形参x的值转换成二进制数,所得二进制数的每一位放在一维数组中返回,二进制的最低位放在下标为0的元素中,其他依次类推,请填空。

  fun(intx,intb[])

  {intk=0,r;

  do

  {r=x%2;

  b[【1】]=r;

  x/=【2】;

  }while(x);

  }

 答案:

【1】k++【2】2

2.函数fun的功能是:

根据以下公式求p的值,结果由函数值返回。

m与n为两个正数且要求m>n。

请填空完善函数fun()的功能。

例如:

m=12,n=8时,运行结果应该是495.000000。

#include

#include

floatfun(intm,intn)

{inti;

doublep=1.0;

for(i=1;i<=m;i++)【3】;

for(i=1;i<=n;i++)【4】;

for(i=1;i<=m-n;i++)p=p/i;

returnp;}

main()

{clrscr();

printf("p=%f\n",fun(12,8));}

答案:

【3】p=p*i【4】p=p/i

解析:

本题中,欲求p的值,需要先求m,n,m-n的阶乘值,可用循环语句实现。

3.下面函数的功能是将一个字符串的内容颠倒过来,请填空。

  voidfun(charstr[])

  {inti,j,【5】;

  for(i=0,j=【6】;i

{k=str[i];

  str[i]=str[j];

  str[j]=k;

  }

  }

答案:

【5】k【6】strlen(str)-1

4.下面函数是一个求阶乘的递归调用函数。

请填空。

  intfun(intk)

  {if(k==1)【7】;

  elsereturn(【8】);

  }

答案:

【7】return1【8】k*fun(k-1)

5.下列给定程序中,函数fun()的功能是:

通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。

请填空完善函数fun()的功能。

例如变量a初值为8,b初值为3,程序运行后a中的值为3,b中的值为8。

试题程序:

#include

#include

intfun(int*x,inty)

{

【9】t;

t=*x;*x=y;

return(t);

}

main()

{inta=3,b=8;

printf("%d%d\n",a,b);

b=fun(【10】,b);

printf("%d%d\n",a,b);

}

答案:

【9】int【10】&a

【解析】填空1:

根据题目的意思,这里应该是声名一个新的变量t,由后面的赋值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型是int)。

填空2:

根据题目的意思,此处是子函数的返回语句,由C语言的知识,每个语句的结尾都应该使用";"。

填空3:

fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号"&"是取地址操作)。

四.阅读程序题。

1.阅读下面程序,在程序执行后的结果为

阅读下面程序,则执行后的结果为

  #include"stdio.h"

  main()

  {fun3(fun1(),fun2());

  }

  fun1()

  {intk=20;

  returnk;

  }

  fun2()

  {inta=15;

  returna;

  }

  fun3(inta,intb)

  {intk;

  k=(a-b)*(a+b);

  printf("%d\n",k);

  }

  A)0

  B)184

  C)175

  D)编译不通过

  答案:

C

2.阅读下列程序,则运行结果为

#include"stdio.h"

fun()

{staticintx=5;

x++;

returnx;}

main()

{inti,x;

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

x=fun();

printf("%d\n",x);}

答案:

8

【命题目的】考查对于静态存储类型的局部变量的掌握情况。

【解题要点】在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久的存储单元,即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元,静态局部变量的初值是在编译的时候赋予的,在程序执行期间不再赋予初值。

【错解分析】本题由于连续三次调用函数fun(),三次对静态变量x进行操作,x的值应依次为6,7,8。

【考点链接】对未赋予初值的静态局部变量,C编译程序自动给它赋初值0。

3.阅读下面程序,则执行后的结果为

#include"stdio.h"

longfun(intn)

{if(n>2)

return(fun(n-1)+fun(n-2));

elsereturn

(2);}

main()

{printf("%ld\n",fun(5));}

答案:

10

【命题目的】考查对于函数的递归的掌握情况。

【解题要点】这是使用递归算法求著名的菲波拉奇数列,并要熟悉函数的递归方法的调用。

【考点链接】递归的函数调用必须要有使递归结束的条件。

4.阅读下面程序,则程序的执行结果为

#include"stdio.h"

main()

{inta=30,b=20,z;

z=fun(a+b,a-b);

printf("%d\n",z);

}

fun(inta,intb)

{intz;

z=a/b;

returnz;

}

答案:

5

【命题目的】考查对于函数的调用和返回值的掌握情况。

【解题要点】函数调用的时候,函数名字必须与所调用的函数名完全一致,形参与实参类型要一致,在没有给出函数返回值类型的情况下,默认为整形,当返回值为整型的函数放到主函数后面时,可以不需要事先说明就调用这个函数。

【考点链接】retrun既可以返回一个普通常量,也可以返回一个指针变量。

5.阅读下面程序,则程序的执行结果为

main()

{inti=2,p;

intj,k;

j=i;

k=++i;

p=f(j,k);

printf("%d",p);

}

intf(inta,intb)

{intc;

if(a>b)c=1;

elseif(a==b)c=0;

elsec=-1;

return(c);

}

答案:

-1

解析:

函数调用相当于f(2,3),程序运算应得结果为“-1”。

五.编写程序题。

1.请编一个函数voidfun(inttt[M][N],intpp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。

二维数组中的数已在主函数中给出。

【解析】本题中函数的功能是求出二维数组中每列的最大元素。

首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。

#include

#include

#defineM3

#defineN4

voidfun(inttt[M][N],intpp[N])

{

inti,j,max;

for(j=0;j

{

max=tt[0][j];/*假设各列中的第一个元素最大*/

for(i=0;i

if(tt[i][j]>max)/*如果各列中的其他元素比最大值还大,

则将这个更大的元素看做当前该列中最大的元素*/

max=tt[i][j];

pp[j]=max;/*将各列的最大值依次放入pp数组中*/

}

}

main()

{

intt[M][N]={{68,32,54,12},{14,24,88,5

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1