C语言程序设计-第八章函数练习题【附答案】.docx
第八章函数习题第八章函数8.1选择题【题8.1】以下正确的说法是。建立函数的目的之一是A)提高程序的执行效率B)提高程序的可读性C)减少程序的篇幅D)减少程序文件所占内存【题8.2】以下正确的说法是。A) 用户若需调用标准库函数,调用前必须重新定义B) 用户可以重新定义标准库函数,若如此,该函数将失去原有含义C) 系统根本不允许用户重新定义标准库函数D) 用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调【题8.3】以下正确的函数定义形式是。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);【题8.4】以下正确的函数形式是。A) double fun(int x,int y) z=x+y; return z; B) fun(int x,y) int z; return z; C) fun(x,y) int x,y; double z; z=x+y; return z; D) double fun(int x,int y) double z; z=x+y; return z; 【题8.5】以下正确的说法是。在C语言中A)实参和与其对应的形参各占用独立的存储单元B)实参和与其对应的形参共占用一个存储单元C)只有当实参和与其对应的形参同名时才共占用存储单元D)形参是虚拟的,不占用存储单元【题8.6】若调用一个函数,且此函数中没有return语句,则正确的说法是。该函数A)没有返回值B)返回若干个系统默认值C)能返回一个用户所希望的函数值D)返回一个不确定的值【题8.7】以下不正确的说法是。C语言规定A)实参可以是常量、变量或表达式B)形参可以是常量、变量或表达式C)实参可以为任意类型D)形参应与其对应的实参类型一致【题8.8】以下正确的说法是。A) 定义函数时,形参的类型说明可以放在函数体内B) return后边的值不能为表达式C) 如果函数值的类型与返回值类型不一致,以函数值类型为准D) 如果形参与实参的类型不一致,以实参类型为准【题8.9】C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是。A) 地址传递B) 单向值传递C) 由实参传给形参,再由形参传回给实参D) 由用户指定传递方式【题8.10】以下程序有语法性错误,有关错误原因的正确说法是。main()int G=5,k;void prt_char(); k=prt_char(G); A) 语句void prt_char();有错,它是函数调用语句,不能用void说明B) 变量名不能使用大写字母C) 函数说明和函数调用语句之间有矛盾D) 函数名不能使用下划线【题8.11】C语言允许函数值类型缺省定义,此时该函数值隐含的类型是。A) float型B) int型C) long型D) double型【题8.12】C语言规定,函数返回值的类型是由。A) return语句中的表达式类型所决定B) 调用该函数时的主调函数类型所决定C) 调用该函数时系统临时决定D) 在定义该函数时所指定的函数类型所决定【题8.13】下面函数调用语句含有实参的个数为。func(exp1,exp2),(exp3,exp4,exp5);A)1B)2C)4D)5【题8.14】以下错误的描述是。函数调用可以A)出现在执行语句中B)出现在一表达式中C)做为一个函数的实参D)做为一个函数的形参【题8.15】以下程序的功能是计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值,请选择填空。#include <stdio.h>#include <math.h>main()float x,y,z,sum;scanf(“%f %f %f”,&x,&y,&z);sum=f(【1】)+f(【2】);printf(“sum=%fn”,sum);float f(float a,float b)float value;value=a/b;return(value);【1】 A)x-y,x+yB)x+y,x-yC)z+y,z-yD)z-y,z+y【2】 A)x-y,x+yB)x+y,x-yC)z+y,z-yD)z-y,z+y【题8.16】以下正确的描述是。在C语言程序中A)函数的定义可以嵌套,但函数的调用不可以嵌套B)函数的定义不可以嵌套,但函数的调用可以嵌套C)函数的定义和函数的调用均不可以嵌套D)函数的定义和函数的调用均可以嵌套【题8.17】以下程序是选出能被3整除且至少有一位是5的两位数,打印出所有这样的数及其个数。请选择填空。sub(int k,int n)int a1,a2;a2=【1】;a1=k-【2】;if(k%3=0&&a2=5)|(k%3=0&&a1=5)printf(“%d”,k);n+;return n;else return -1;main()int n=0,k,m;for(k=10;k<=99;k+)m=sub(k,n);if(m!=-1) n=m;printf(“nn=%d”,n);【1】 A)k*10B)k%10C)k/10D)k*10%10【2】 A)a2*10B)a2C)a2/10D)a2%10【题8.18】以下是有关汉诺塔问题的程序段,若在main函数中有调用语句hanoi(3,A,B,C);则符合程序段运行结果的选项是。void move(char getone,char putone)printf(“%c->%cn”,getone,putone);void hanoi(int n,char one,char two,char three)if(n=1) move(one,three);elsehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);A)A->CB)A->CC)A->CD)A->C A->B A->B A->B A->B C->B C->A C->B C->B B->A A->B A->C A->C C->B B->C B->A A->B A->C A->C B->C B->C A->B A->B A->C A->C【题8.19】若用数组名作为函数调用的实参,传递给形参的是。A) 数组的首地址B) 数组第一个元素的值C) 数组中全部元素的值D) 数组元素的个数【题8.20】已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为。int a34;f(a);A) f(int array6)B) f(int array3)C) f(int array4)D) f(int array25)【题8.21】若使用一维数组名作函数实参,则以下正确的说法是。A) 必须在主调函数中说明此数组的大小B) 实参数组类型与形参数组类型可以不匹配C) 在被调函数中,不需要考虑形参数组的大小D) 实参数组名与形参数组名必须一致【题8.22】折半查找法的思路是:先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值。如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;返回-1。请选择填空。binary(int a10,int m)int low=0,high=9,mid;while(low<=high)mid=(low+high)/2;if(m<amid) 【1】;else if(m>amid) 【2】;else return(mid);return(-1);【1】 A)high=mid-1B)low=mid+1C)high=mid+1D)low=mid-1【2】 A)high=mid-1B)low=mid+1C)high=mid+1D)low=mid-1【题8.23】以下正确的说法是。如果在一个函数中的复合语句中定义了一个变量,则该变量A) 只在该复合语句中有效B) 在该函数中有效C) 在本程序范围内均有效D) 为非法变量【题8.24】以下不正确的说法为。A) 在不同函数中可以使用相同名字的变量B) 形式参数是局部变量C) 在函数内定义的变量只在本函数范围内有效D) 在函数内的复合语句中定义的变量在本函数范围内有效【题8.25】以下程序的正确运行结果是。#define MAX 10int aMAX,i;main()printf(“n”); sub1(); sub3(a); sub2(); sub3(a);sub2()int aMAX,i,max;max=5;for(i=0;i<max;i+) ai=i;sub1()for(i=0;i<MAX;i+) ai=i+i;sub3(int a)int i;for(i=0;i<MAX;i+) printf(“%d”,ai);printf(“n”);A) 0 2 4 6 8 10 12 14 16 180 1 2 3 4B) 0 1 2 3 40 2 4 6 8 10 12 14 16 18 C) 0 1 2 3 4 5 6 7 8 90 1 2 3 4D) 0 2 4 6 8 10 12 14 16 180 2 4 6 8 10 12 14 16 18【题8.26】以下程序的正确运行结果是。#include <stdio.h>void num()extern int x,y;int a=15,b=10;x=a-b;y=a+b;int x,y;main()int a=7,b=5;x=a+b;y=a-b;num();printf(“%d,%dn”,x,y);A)12,2B)不确定C)5,25D)1,12【题8.27】凡是函数中未指定存储类型的局部变量,其隐含的存储类别为。A)自动(auto)B)静态(static)C)外部(extern)D)寄存器(register)【题8.28】在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。A)externB)registerC)autoD)static【题8.29】以下程序的正确运行结果是。main()int a=2,i;for(i=0;i<3;i+) printf(“%4d”,f(a);f(int a)int b=0;static int c=3;b+; c+;return(a+b+c);A)7 7 7B)7 10 13C)7 9 11D)7 8 9【题8.30】以下程序的正确运行结果是。#include <stdio.h>main()int k=4,m=1,p;p=func(k,m); printf(“%d”,p);p=func(k,m); printf(“%dn”,p);func(int a,int b)static int m=0,i=2;i+=m+1;m=i+a+b;return(m);A)8,17B)8,16C)8,20D)8,88.2填空题【题8.31】C语言规定,可执行程序的开始执行点是。【题8.32】在C语言中,一个函数一般由两个部分组成,它们是【1】和【2】。【题8.33】若输入的值是-125,以下程序的运行结果是。#include <math.h>main()int n;scanf(“%d”,&n);printf(“%d=”,n);if(n<0) printf(“-”);n=fabs(n);fun(n);fun(int n)int k,r;for(k=2;k<=sqrt(n);k+)r=n%k;while(r=0)printf(“%d”,k);n=n/k;if(n>1) printf(“*”);r=n%k;if(n!=1) printf(“%dn”,n);【题8.34】下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中错误的部分是【1】;改正后为【2】。void add(float a,float b)float c;c=a+b;return c;【题8.35】以下程序的运行结果是。main()int i=2,x=5,j=7;fun(j,6);printf(“i=%d;j=%d;x=%dn”,i,j,x);fun(int i,int j)int x=7;printf(“i=%d;j=%d;x=%dn”,i,j,x);【题8.36】以下程序的运行结果是。main()increment();increment();increment();increment()int x=0;x+=1;printf(“%d”,x);【题8.37】以下程序的运行结果是。#include <stdio.h>main()int a=1,b=2,c;c=max(a,b);printf(“max is %dn”,c);max(int x,int y)int z;z=(x>y)?x:y;return(z);【题8.38】以下程序的功能是根据输入的“y”(“Y”)与“n”(“N”),在屏幕上分别显示出“This is YES.”与“This is NO.”。请填空。#include <stdio.h>void YesNo(char ch)switch(ch)case y:case Y: printf(“nThis is YES.n”); 【1】;case n:case N: printf(“nThis is No.n”); 【2】;main()char ch;printf(“nEnter a char y,Yorn,N:”);ch=【3】;printf(“ch:%c”,ch);YesNo(ch);【题8.39】以下Check函数的功能是对value中的值进行四舍五入计算,若计算后的值与ponse值相等,则显示“Well done!”,否则显示计算后的值。已有函数调用语句Check(ponse,value);请填空。void Check(int ponse,float value)int val;val=【1】;printf(“计算后的值:%d”,val);if(【2】) printf(“nWELL DONE!n”);else printf(“nSorry the correct answer is %dn”,val);【题8.40】以下程序的功能是。#include <stdio.h>f(int n)int i,j,k;i=n/100; j=n/10-i*10; k=n%10;if(i*100+j*10+k=i*i*i+j*j*j+k*k*k) return n;else return 0;main()int n,k;printf(“output”);for(n=100;n<1000;n+)k=f(n);if(k!=0)printf(“%d”,k);printf(“n”);【题8.41】以下程序的功能是用二分法求方程的根,并要求绝对误差不超过0.001。请填空。#include <stdio.h>float f(float x)return(2*x*x*x-4*x*x+3*x-6);main()float m=-100,n=90,r;r=(m+n)/2;while(f(r)*f(n)!=0)if(【1】) m=r;else n=r;if(【2】) break;r=(m+n)/2;printf(“The is fangcheng jie is %6.3fn”,r);【题8.42】若输入一个整数10,以下程序的运行结果是。main()int a,e10,c,i=0;printf(“输入一整数n”);scanf(“%d”,&a);while(a!=0)c=sub(a);a=a/2;ei=c;i+;for(;i>0;i-) printf(“%d”,ei-1);sub(int a)int c;c=a%2;return c;【题8.43】以下程序的功能是计算下面函数的值。请填空。#include <stdio.h>#include <math.h>float f();main()float x,y,z,sum;printf(“ninput x,y,z:n”);scanf(“%f %f %f”,&x,&y,&z);sum=【1】;printf(“sum=%fn”,sum);float f(float a,float b,float c)float value;value=【2】;return(value);【题8.44】已有函数pow,现要求取消变量i后pow函数的功能不变。请填空。修改前的pow函数pow(int x,int y)int i,j=1;for(i=1;i<=y;+i) j=j*x;return(j);修改后的pow函数pow(int x,int y)int j;for(【1】;【2】;【3】) j=j*x;return(j);【题8.45】以下程序的运行结果是输出如下图形。请填空。 * * * * * * * * * * * * * * * * * * * * * * * *#include <stdio.h>void a(int i)int j,k;for(j=0;j<=7-i;j+) printf(“”);for(k=0;k<【1】;k+) printf(“*”);printf(“n”);main()int i;for(i=0;i<3;i+) 【2】;for(i=3;i>=0;i-) 【3】;【题8.46】以下程序的功能是求三个数的最小公倍数,请填空。#include <stdio.h>max(int x,int y,int z)if(x>y&&x>z) return(x);else if(【1】) return(y);else return(z);main()int x1,x2,x3,i=1,j,x0;printf(“Input 3 number:”);scanf(“%d %d %d”,&x1,&x2,&x3);x0=max(x1,x2,x3);while(1)j=x0*i;if(【2】) break;i=i+1;printf(“The is %d %d %d zuixiaogongbei is %dn”,x1,x2,x3,j);【题8.47】函数gongyu的作用是求整数num1和num2的最大公约数,并返回该值,请填空。gongyu(int num1,int num2)int temp,a,b;if(num1【1】num2) temp=num1; num1=num2; num2=temp; a=num1; b=num2;while(【2】) temp=a%b; a=b; b=temp; return(a);【题8.48】以下程序的运行结果是。main()int x=2,y=3,z=0;printf(“(1) x=%d y=%d z=%dn”,x,y,z);add(x,y,z);printf(“(3) x=%d y=%d z=%dn”,x,y,z);add(int x,int y,int z)z=x+y; x=x*x; y=y*y;printf(“(2) x=%d y=%d z=%dn”,x,y,z);【题8.49】下面函数pi的功能是:根据以下公式,返回满足精度(0.0005)要求的的值,请填空。#include <conio.h>#include <math.h>#include <stdio.h>double pi(double eps)double s,t; int n;for(【1】;t>eps;n+)s+=t;t=n*t/(2*n+1);return(【2】);main()double x;printf(“nPlease enter a precision:”);scanf(“%lf”,&x);printf(“neps=%lf,=%lf”,x,pi(x);【题8.50】下面是一个计算阶乘的程序。程序中的错误语句是【1】,应改为【2】。#include <stdio.h>double factorial(int);main()int n;printf(“Enter an integer:”);scanf(“%d”,&n);printf(“nn%d!=%lgnn”,n,factorial(n);double factorial(int n)double result=1.0l;while(n>1|n<170) result*=-n;return result;【题8.51】函数f中的形参a为一个10×10的二维数组,n的值为5,以下程序段的运行结果是。f(int a1010,int n)int i,j,k;j=n/2+1; a1j=1; i=1;for(k=2;k<=n*n;k+)i=i-1; j=j+1;if(i<1)&&(j>n) i=i+2; j=j-1; elseif(i<1) i=n;if(j>n) j=1;if(aij=0) aij=k;else i=i+2; j=j-1; aij=k; 【题8.52】下面函数func的功能是。#include <conio.h>#include <stdio.h>#include <stdlib.h>long func(long num)long k=1;num=labs(num);dok*=num%10;num/=10;while(num);return(k);main()long n;printf(“nPlease enter a number:”);scanf(“%ld”,&n);printf(“nThe product of its digits is %ld.”,func(n);【题8.53】以下程序的运行结果是。#include <stdio.h>main()printf(“FACT(5):%dn”,fact(5);printf(“FACT(1):%dn”,fact(1);fact(-5);fact(int value)if(value<0) printf(“FACT(-1):Error!n”); return(-1); else if(value=|value=0) return(1);else return(value*fact(value-1);【题8.54】以下程序的功能是用递归方法计算五位学生的年龄,请填空。递归公式如下:#include <stdio.h>age(int n)int c;if(n=1) c=10;else c=【1】;return(c);main()int n=5;printf(“age:%dn”,【2】);【题8.55】下面程序的功能是【1】,运行结果是【2】。long fib(int g)switch(g)case 0: return 0;case 1:case 2: return 1;return(fib(g-1)+fib(g-2);main()long k;k=fib(7);printf(“k=%dn”,k);【题8.56】以下程序的运行结果是。main()int i=5;printf(“%dn”,sub(i);sub(int n)int a;if(n=1) return 1;a=n+sub(n-1);return(a);【题8.57】以下程序是应用递归算法求某数a的平方根,请填空。求平方根的迭代公式如下:#include <math.h>double mysqrt(double a,double x0)double x1,y;x1=【1】;if(fabs(x1-x0)>0.00001) y=mysqrt(【2】);else y=x1;return y;main()double x;printf(“Enter x:”);scanf(“%lf”,&x);printf(“The sqrt of %f=%fn”,x,mysqrt(x,1.0);【题8.58】以下程序的运行结果是。#include <stdio.h>f(int a)int i=0;while(ai<=10)printf(“%d”,ai);i+;main()int a=1,5,10,9,11,7;f(a+1);【题8.59】以下程序的运行结果是。main()int a33=1,3,5,7,9,11,13,15,17; int sum;sum=func(a);printf(“nsum=%dn”,sum);func(int a3)int i,j,sum=0;for(i=0;i<3;i+)for(j=0;j<3;j+)aij=i+j;if(i=j) sum=sum+aij;return(sum);【题8.60】阅读下面程序,完成下列问题中的填空。问题(1)此程序在调用函数f后运行结果是【1】。(2)若将函数f中的for(j=i+1;j<4;j+)改为for(j=0;j<3-i;j+),则 程序的运行结果是【2】。f(int s4)int i,j,k;for(i=0;i<3;i+)for(j=i+1;j<4;j+) k=sij; sij=sji; sji=k; main()int s44,i,j;for(i=0;i<4;i+)for(j=0;j<4;j+)sij=i-j;f(s);for(i=0;i<4;i+)printf(“n”);for(j=0;j<4;j+)printf(“%4d”,sij);【题8.61】以下search函数的功能是利用顺序查找法从数组a的10个元素中对关键字m进行查找。顺序查找法的思路是:从第一个元素开始,从前向后依次与关键字比较,直到找到此元素或查找到数组尾部时结束。若找到,返回此元素的下标;若仍未找到,则返回值-1。请填空。#include <stdio.h>int search(int a10,int m)int i;for(i=0;i<=9;i+) if(【1】) return(i);return(-1);main()int