已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 函数习题解答一、 选择题1下列关于函数定义的描述中,错误的是( )。 A定义函数时函数的存储类型可以省略B定义函数时函数名和函数类型必须指明C定义函数时必需有函数体D定义函数时必需指明函数参数 【答】D2下列关于函数(原型)声明的描述中,错误的是( )。A函数声明可放在函数体内,也可放在函数体外B函数声明既要给出函数名和类型,又要指出函数参数C函数调用前必须给出被调函数的函数声明,否则出错D被调函数的定义在主调函数前面时,可以不用函数声明 【答】C 3以下正确的定义函数首部的形式是( )。Afloat func(int n;float x)Bfloat func(int n,float x);Cfloat func(int n;float x);Dfloat func(int n,float x) 【答】D4下列关于函数参数的描述中,错误的是( )。A定义函数时可以有参数,也可以没有参数B在传值调用时,实参只能是变量名,不可以是表达式C函数的形参在该函数被调用前是没有确定值的D要求函数的形参和对应的实参个数应相等、类型应赋值兼容 【答】B5下列说法中,不正确的是( )。 A实参可以为任意类型 B形参与对应实参的类型要赋值兼容 C形参可以是常量、变量或表达式 D实参可以是常量、变量或表达式【答】C6下面函数调用语句中,实参的个数是( )。 func(n1,n2+n3,func(n4,n5,n6);A6 B5 C4 D3 【答】D7设有下面函数调用语句,则其所调函数fun中形参的个数是( )。 fun(f(n1,n2),n3,n4 + n5);A5 B4 C3 D2【答】C8下面说法中正确的是( )。 A实参占用存储单元,形参不占用存储单元 B相对应的实参与形参共用同一存储单元 C相对应的实参与形参同名时,它们共用同一存储单元D相对应的实参与形参占用不同的存储单元【答】D9实参为简单变量,其与对应形参之间的数据传递方式为( )。 A 由用户另外指定传递方式 B 双向值传递 C 单向值传递D 地址传递【答】C10实参用数组名,则传递给对应形参的是( )。 A数组的地址 B数组的长度 C数组中每一个元素的地址 D数组中每一个元素的值【答】A11下列关于函数调用的描述中,错误的是( )。 A在函数调用中,形参是变量名,实参可以是变量、常量和表达式 B在函数调用中,形参是指针时,实参必须是地址值C在传址调用方式中,可以在被调用函数中改变调用函数的参数值D在传值调用方式中,可以在被调用函数中改变调用函数的参数值 【答】D12下列关于函数返回值的论述中,错误的是( )。 A函数返回值能够实现函数间的数据传递 B函数返回值是由return实现的 C函数返回的值和值的类型是由返回语句中表达式的值和类型决定的 D一个函数可有多条返回语句,但只可有一个返回值 【答】C13函数返回值的类型由( )。 A调用该函数的函数类型决定 Breturn语句中表达式的类型决定 C主函数决定 D该函数的函数类型决定【答】D14下列关于函数的论述中正确的是( )。A不允许函数嵌套定义,但允许函数嵌套调用B不允许函数嵌套调用,但允许函数嵌套定义C函数的定义和调用都允许嵌套D函数的定义和调用都不允许嵌套【答】A15下列关于函数调用的论述中不正确的是( )。A函数间允许嵌套调用 B函数间允许间接递归调用 C函数间允许直接递归调用 D函数间不允许直接递归调用【答】C16以下说法不正确的是( )。A所有的形式参数都是局部变量B不同函数中允许说明并使用相同名字的变量C函数内定义的变量其有效范围不超出该函数D函数内的复合语句中说明的变量在该函数范围内有效【答】D17在本程序中能被所有函数使用的变量,其存储类别是( )。Aauto(自动) Bstatic(静态) Cregister(寄存器) Dexern(外部)【答】 D18在函数中未说明存储类别的局部变量,其隐含的存储类别是( )。Aauto(自动) Bstatic(静态) Cregister(寄存器) Dexern(外部)【答】A19下列关于变量的论述中,不正确的是( )。A外部变量定义与外部变量声明,两者的含义不同B外部变量与静态外部变量的存储类型不同(即它们被分配的存储区不同)C在同一函数中,既可使用本函数中的局部变量又可使用与局部变量不同名的全局变量D在同一程序中,外部变量与局部变量同名时,则在局部变量作用范围内外部变量不起作用【答】 B 20运行以下程序, 其输出结果是( )。void swap28(int n0,int n1) int temp;temp=n0;n0=n1;n1=temp;void swapl4(int n) int temp; temp=n0; n0=n1; n1=temp; void main() int a2=2,8,b2=1,4;swap28(a0,a1); swapl4(b); printf(“d d d dn”,a0,a1,b0, b1);A2814 B2841 C8241 D8214【答】 B二、填空题1若自定义函数要求返回一个值,则在该函数体中应有一条 【1】 语句;若自定义函数要求不返回值,则在该函数说明时加一类型说明符 【2】 。【答案】【1】带有表达式的return【2】void2函数调用时的实参与对应的形参都是数组时,参数传递方式为 【1】 ;都是普通变量时,参数传递方式为 【2】 。【答案】【1】传地址【2】传值3静态局部变量的作用域是 【1】 。【答案】【1】定义它的函数或复合语句的内部4函数形参的作用域是 【1】 。全局的外部变量与函数体内定义的局部变量同名时,在函数体内, 【2】 变量起作用。【答案】【1】整个函数体内【2】局部5下列函数sub( )的功能是求两个参数的差,并将差值返回调用函数。该函数中错误的部分是 【1】 ,改正后应为 【2】 。void sub(double x, double y) double z;z= x y;return z;【答案】【1】void sub(double x, double y)【2】double sub(double x, double y)6. 为了使下面程序能够正确运行,程序的第2行应填写的内容是 【1】 ,当输入的数值为66和99时,该程序输出的结果是 【2】 。 #include 【1】 main() double x1,x2; scan(“lf,lf”,&x1,&x2) ;printf(“%lfn”,max(x2,x1) ;getch( ) ;double max(double y1,double y2)return(y1y2 ? y1y2 : y2-y1);【答案】【1】double max(double ,double ) ;【2】 33.000000 7. 下面程序,在函数sum( ) 中求(m + n)3 + (m - n)3的值,在主函数中为m、n输入10、7,并输出计算结果,请填空。#includevoid main()int m,n; 【1】 printf(“Please input m,n:”);scanf(“d,d”, 【2】 );printf(”The sum=dn”,sum(m,n);int sum(int i,int j)int k;k= 【3】 ;return k;【答案】【1】int sum( );【2】&m,&n【3】(i+j)3+(i-j)3 8. 下面程序功能是求两个浮点数的和,程序内容如下, 请填空。 #includedouble add(double x,double y,double p)p=x+y; 【1】 void main() double a=55.44, b=44.55 ; double k; add(a,b, 【2】 );printf(“2lfn”,k);【答案】【1】return(p); 【2】k 注:输出的k值是不确定的!9下面程序的运行结果是 【1】 。#includevoid func(int br) int i=1; while(bri=10) printf(%5d,bri); i+; void main() int ar=2,4,8,10,8,4,11,9,7; func(ar + 1); printf(n); getch();【答案】【1】 8 10 8 410. 函数acopyb将整型数组aarra的内容逆序复制到整型数组barra中(-32768作为数组元素值的结束标志),请填空。#includevoid acopyb(int aa ,int ba ) int i=0,j=0; while(aaj!=-32768) j+; baj=aaj; j-; while(aai!=-32768) 【2】 j-; i+; void main() static int aarra=1,3,5,7,9,2,4,6,8,10,-32768; int barra20; int i=0; acopyb( 【1】 ); while(barrai!=-32768) printf(%3d, 【3】 );printf(n); getch();【答案】【1】aarra ,barra 【2】baj=aai;【3】barrai+11. 在 【1】 处填写适当内容,使下面程序的输出结果为264。#includeint func(int m, int n) return (m * n);void main() int a=3,b=11,c=8,d; d=func(func( 【1】 ),c); printf(%dn,d); getch();【答案】【1】a ,b或者b , a12下面程序的输出结果为 【1】 。#include #define N 10void output(int *p,int n) int i; for(i=0;in; i+) printf(%5d,*p+); printf(n);void main() int xN,i, *q; for(i=0;iN;i+) xi=2*i; q=x;output(q,N);for(i=0;iN; i+) printf(%5d,xi);【答案】【1】0 2 4 6 8 10 12 14 16 18 0 2 4 6 8 10 12 14 16 1813. 函数small()从5x5矩阵(即从5行、5列二维数组)中,找出主对角线上元素的最小值。在主函数中为数组输入数据。请填写适当内容。 #include int small(int a55) int i,vm; vm = a00; for(i =1;i aii) vm = 【1】 return(vm);void main() int i,j,vmin; int array55; for(i = 0;i 5;i+) for(j = 0;j 5;j+) scanf(”%d”, 【2】 ); vmin = small(array); printf(”vmin = %dn”, vmin);【答案】【1】aii;【2】&arrayij14. 函数max_value()求3x4矩阵所有元素中的最大值。请在下面程序中【1】 、 【2】处填写适当内容。 #includevoid main( ) int max_value(int array4); int a34=(1,3,5,7,2,4,6,8,15,17,34,12); printf(”max value is %dn”, 【1】 ); int max_value(int array4) int i,j,max; max = array00;for(i = 0;i 3;i+) for(j = 0;j max)【2】 =arrayij;return(max);【答案】【1】max_value(a)【2】max15下面程序的功能是调用选择排序法函数select( ),对数组中的整数按从小到大的顺序排列,请填写适当内容。#includevoid main( )void select(int a,int n); int b10,i;printf(Input 10 numbers:);for(i = 0;i 10;i+) scanf(%d, 【1】 );printf(n);select( 【2】 ,10); for(i = 0;i 10;i+) printf(%d,bi); void select(int a,int n) int i,j,k,temp;for(i = 0;i n - 1;i+) k = i; for(j = i+1;j n;j+) if(aj ak) k=j; if(k 【3】 i) temp = ak; ak = 【4】 ; ai = temp; 【答案】【1】&bi【2】b【3】!=【4】ai16下面程序的运行结果是 【1】 ,函数sort( )采用的算法是 【2】 。#include #define M 5#define N 6void sort(int a,int n)int i, j,temp; for(i=0;in-1;i+) for (j=i+1;jn;j+) if(ai aj) temp = ai; ai = aj; aj = temp; for(i=0;in;i+) printf(%5d,ai); printf(n);void main() int i;int x=7,3,9,5,1;int y=46,55,91,64,82,73;sort(x,M);sort(y,N);for(i=0;iM;i+) printf(%5d,xi);printf(n);for(i=0;iN;i+) printf(%5d,yi);printf(n);【答案】【1】 9 7 5 3 1 91 82 73 64 55 46 9 7 5 3 1 91 82 73 64 55 46【2】函数sort( )采用的是冒泡排序法。17下面程序的功能是利用函数的递归调用求1!+2!+3!+ +9!,请填写适当内容。#includelong int fracsum(int n)if(n=1)return ( 1 );elsereturn (n* 【1】 );void main() int i=1;long int sum;sum= 【2】 while(i=9) sum+= 【3】 ;i+; printf(%ldn,sum ); 【答案】【1】fracsum( n-1)【2】0【3】fracsum(i)18下面程序的功能是 【1】 ,程序运行结果是 【2】 。#include void main( ) int fib(int n); int i; for(i=0;i10;i+) if(i%5=0) printf(n) ;printf(%10d,fib(i); printf(n); getch(); int fib(int n) if(n=0 | n=1) return n; else return fib(n-2)+fib(n-1);【答案】【1】计算斐波那契(Fibonacci)数列前10项的值。【2】 0 1 1 2 35 8 13 21 3419运行下面程序,函数func( )中输出的结果是 【1】 ,主函数中输出的结果是【2】 。#includeint n=10;int func(int p)n += p;p += n;printf(%d,%dn,p,n);return (n);void main() int m=6, pand=8; pand=func(m); printf(n%d,%d,%dn,m,pand,n); getch();【答案】【1】22 16【2】6 16 1620运行下面程序,输出的结果是 【1】 。#includeint m,n;int fun( ) m=88; n=99; return ( n);void main() int m=55, n=66; printf(n%d,%d,%d,%dn,m, fun( ), m, n); getch();【答案】【1】 55,99,55,6621运行下面程序,输出的结果是 【1】 。#includeint m=9;int func(int a, int b ) int m=1; printf(n%dn,+m); return (a*b-m);void main() int x=2, y=35; printf(n%dn,func(x,y)/m); getch();【答案】【1】2 和 722运行下面程序,函数fun( )中输出的结果是 【1】 ,主函数中输出的结果是【2】 。#include void fun(int s) static int i=0;int j; do si+=si+1;while( +i3 );for(j=0;j5;j+) printf(%d,sj); printf(n);void main() int i,a10=0,1,2,3,4; for(i=1;i3;i+) fun(a); for(i=0;i5;i+) printf(%d,ai); printf(n); getch();【答案】【1】13534 13574【2】1357423运行下面程序,输出的结果是 【1】 。#includeint n=98;int fun() static int n=1; n+=2; return (n); void main() n+=2; printf(n%d, %dn,+n,fun() ); printf(n%d, %dn,n+,fun() ); getch();【答案】【1】101, 3 101, 5三、程序设计题1 输入任意3个整数,利用函数的嵌套调用,求出3个数中的最小值。参考程序代码如下:#include void main() int mintwo(int, int); /*函数声明 */ int minthree(int,int,int); /*函数声明 */ int x,y,z,min; printf(nPlease input three integer:n); scanf(%d,%d,%d,&x,&y,&z); min=minthree(x,y,z); printf(nMin is %d,min);int mintwo(int a,int b) return(ab?a:b); /*使用条件表达式,并将计算结果返回 */int minthree(int a,int b,int c) int z; z=mintwo(a,b); /*嵌套调用函数mintwo()*/ z=mintwo(z,c); return(z);2 由键盘输入两个整数,编写两个函数,分别求这两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。参考程序代码如下:#include long int gcd(long int,long int); /* 函数声明 */long int lcm(long int,long int); /* 函数声明 */void main() long int a,b; printf( n Please enter the integer a,b :); scanf(%ld,%ld,&a,&b); printf(na=%ld,b=%ldn,a,b); printf(The greatest common divisor of );printf( %ld and %ld is %ldn,a,b,gcd(a,b); /*调用函数gcd()求最大公约数*/ printf(The least common multiple of );printf( %ld and %ld is %ldn,a,b,lcm(a,b); /*调用函数lcm()求最小公倍数 */long int gcd(long int a,long int b) long int item, c; if(a b) item=a;a=b;b=item; do c=a%b; a=b; b=c; while(c!=0); return a; /* 返回a 与 b的最大公约数 */long int lcm(long int a,long int b) long int item, i; if(a b) item=a; a=b; b=item; for(i=1; ; i+) item=i*a; if(item % b = 0) return item; /* 返回a 与 b的最小公倍数 */ 3编写一个函数,用阶乘倒数之和求e的近似值,即e = 1 + 1/2!+ 1/3!+ + 1/n! 。参考程序代码如下:#include void main() long int fac(int n); /*求阶乘函数fac()的声明*/ long int n, i; float e=0, p; printf(nPlease input a integer:); scanf(%ld,&n); if(n0) printf(n Negative argument!n); exit(-1); /*正常退出*/ for(i=1;i=n;i+) p=fac(i); /*函数调用 */ e=e+1.0/p; /*求和*/ printf(n sum: %15.12fn,e);long int fac(int n) /*求阶乘的递归函数定义*/ if(n=0n = 1) /* 递归结束条件*/ return(1); return (n*fac(n-1); /*递归调用*/4 求方程ax+ bx + c = 0的根,用三个函数分别求当b- 4ac大于0、等于0和小于0时的根并输出结果。从主函数输入a、b、c的值。参考程序代码如下:#include #include void solut(double,double,double); /* 以下4行均为函数声明 */void solut1(double,double,double);void solut2(double,double);void solut3(double,double,double);void main() double a,b,c; /*为了不失一般性,一元二次方程的系数设置为double型*/ printf( Please enter a,b,c :n); scanf(%lf,%lf,%lf,&a,&b,&c); printf(na=%lf,b=%lf,c=%lfn,a,b,c); if(a = 0) printf(The eguation is not quadratic !n); else solut(a,b,c);void solut(double a,double b,double c) double disc; disc=b*b-4*a*c; if(disc 0) solut1(disc,a,b); /* 调用函数solut1,求两个不等实根 */ else if( disc = 0 ) solut2(a,b); /* 调用函数solut2,求两个相等实根 */ else solut3(disc,a,b); /* 调用函数solut3,求虚根 */void solut1(double disc,double a,double b) double x1,x2; x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(Has distinct real roots:nx1= %lf,x2= %lfn,x1,x2);void solut2(double a,double b) double x1,x2; x1=x2=-b/(2*a); printf(Has two equal roots:n x1= %lf,x2= %lfn,x1,x2);void solut3(double disc,double a,double b) double realp,imagp; realp=-b/(2*a); imagp=sqrt(-disc)/(2*a); printf(Has two complex roots:n); printf(%lf + %lfin,realp,imagp); printf(%lf - %lfin,realp,imagp);5 编写程序,使能对分数进行加、减、乘、除四则运算的练习。即要求:对输入的两个分数可以进行加、减、乘、除运算的选择,并将运算结果以分数形式输出。参考程序一代码如下:#include long int a,b,c,d,x,y,z; /* 定义全局变量 */char op;void main() int fxz( ), fhj( ); /* 两个无参函数声明 */ printf(P1ease input two data for example b/a,d/c n); scanf(%ld/%ld%c%ld/%ld,&b,&a,&op,&d,&c); if(a=0 | c=0)exit(0); fsz(); /* 函数调用 */ fhj(); /* 函数调用 */ printf(n%ld / %ld %c %ld / %ld= %ld / %ld,b,a,op,d,c,y,x);int fsz( ) /* 定义选择四则运算函数,该函数对全局变量进行操作 */ if(op=+) y=b*c+d*a; x=a*c; return; if(op=-) y=b*c-d*a; x=a*c; return; if(op=*) y=b*d; x=a*c; return; if(op=/) y=b*c; x=a*d; return;int fhj( ) /* 定义将结果分数进行化简的函数,该函数对全局变量进行操作 */ int i; /* 整型变量i为局部变量,只在本函数内有效*/ z=x; if(xy) z=y; i=z; while(i1) if(x%i=0 & y%i=0) x=x/i; y=y/i; continue; i-; 参考程序二代码如下:#include void main( ) void fhj(int *,int * ); /* 函数声明 */ int a,b,c,d,x,y; /* 定义局部变量 */ int number; printf(P1ease input two data for example b/a,d/c n); scanf(%d/%d,%d/%d,&b,&a,&d,&c); /* 由用户输入两个分数 */ if(a=0 | c=0)exit(0); printf(nn); printf( 1-addn); printf( 2-subn); printf( 3-multn); printf( 4-divin); printf(P1ease your select?); scanf(%d ,&number); /* 由用户选择要进行哪种计算 */ printf( The result is :);switch(number) case 1: y=b*c+d*a; x=a*c; /* 进行加法运算 */ fhj(&y,&x ); /* 调用化简函数调用 */ printf(n%d/%d + %d/%d=%d/%dn,b,a,d,c,y,x); break; case 2: y=b*c-d*a; x=a*c; /* 进行减法运算 */ fhj(&y,&x ); /* 调用化简函数调用 */ printf(n%d/%d - %d/%d=%d/%dn,b,a,d,c,y,x); break; case 3: y=b*d; x=a*c; /* 进行乘法运算 */ fhj(&y,&x ); /* 调用化简函数调用 */ printf(n%d/%d * %d/%d=%d/%dn,b,a,d,c,y,x); break; case 4: y=b*c; x=a*d; /* 进行除法运算 */ fhj(&y,&x ); /* 调用化简函数调用 */ printf(n%d/%d / %d/%d=%d/%dn,b,a,d,c,y,x); break; void fhj(int *y,int *x ) /* 定义化简函数fhj(),形参为指针变量 */ int i,z; z=*x; if(*x *y) z =*y; i=z; while(i1) if(*x%i=0 & *y%i=0) *x=*x/i; *y=*y/i; continue; i-; 6 写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。参考程序代码如下:#include #include int isprime(int n) /*定义判断素数的函数 */ int i; for(i=2; isqrt(double)n);i+) if(n%i=0) return 0; return 1;void main() int number,is; printf(nPlease a number:n); scanf(%d,&number); is=isprime(number); /* 调用判断素数的函数 */ if(is=1) printf(%d is prime!,number); /* 输出是素数的信息*/ else printf(%d is not prime!,number); /* 输出不是素数的信息*/7 编写程序输出如下“万年历”功能:当用户输入年份时能输出该年的日历,在日历上能够看出某天是星期几,可以显示任意一年任意一天,并能够知道是否是闰年等。参考程序代码如下:#includevoid main() int i,j,day,year,temp,temp_i; long int Year_days; long int sumdays(int year); /* 函数声明 */ int IsLeapYear(int year); /* 函数声明 */ int month_day=0,31,28,31,30,31,30,31,31,30,31,30,31,29, everyday614; /* 数组everyday用于保存计算所得的日历 */ printf(Please enter the year?); scanf(%d, &year); Year_days=sumdays(year); /* 调用函数sumdays()计算天数 */ for(temp=1;temp=6;temp+) /* 分 6 次输出12个月的日历*/ for(i=0;i6;i+) for(j=0;j14;j+) everydayij=0; switch(temp) /* 一行输出两个月份 */ case 1:printf(nntJanuary %dtttFebruary %dn,year,year);break; case 2:printf(nntM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中语文复习:初中生必背古诗词
- 河北省2025-2026学年高一化学上学期第一次月考含解析新人教版
- 1301综采工作面回撤方案及安全技术措施
- 论文评审意见16例
- 物料管理的生命周期管理与产品开发
- 无刷电机电磁噪音振动的最主要原因分析和有效解决途径
- 学术期刊论文标准格式
- 浅析银行上门收款服务工作之操作风险
- 临床路径模拟教学对医患沟通能力提升的效果评价
- 门脉高压症专业知识讲座课件
- 城市居民委员会组织法(2025修订)解读课件
- 2025年江苏省公安厅遴选考试真题及答案
- 新护士岗前培训考试试题及答案
- 2025年超星尔雅学习通《环境地理学》考试备考题库及答案解析
- 2025年呼和浩特铁路局集团招聘备考题库(406人)附答案
- 2025至2030中国多肽类药物行业项目调研及市场前景预测评估报告
- 公家车安全行车培训课件
- 2025能源管理体系建设指导材料之22:9绩效评价-9.1能源绩效和能源管理体系的监视、测量、分析和评价(编制-2025A0)
- 柴油供货协议合同范本
- 磁粉探伤培训教材
- 车间生产主任年终工作总结
评论
0/150
提交评论