C语言程序设计第六章 函 数

更新时间:2024-07-08 16:59:02 阅读量: 综合文库 文档下载

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

第六章 函 数

一、单项选择题

1.在C语言程序中,有关函数的定义正确的是( B )。 A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和函数的调用均不可以嵌套 D.函数的定义和函数的调用均可以嵌套

2.以下对C语言函数的有关描述中,正确的是( A )。

A.在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B.C函数既可以嵌套定义又可递归调用 C.函数必须有返回值,否则不能使用函数

D.C程序中有调用关系的所有函数必须放在同一个源程序文件中 3.函数调用语句f((e1,e2),(e3,e4,e5));中参数个数是( C )。 A. 5 A. auto

B. 4

C. 2

D. 1

D.无存储类型

4.C语言中函数的隐含存储类型是( C )。

B. static

C. extern

5.能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是( A )。 A. return这二个数

B. 形参用二个元素的数组 D. 用二个全局变量

C. 形参用二个这种数据类型的指针

A. void main( ) { char s[20]=―abcdefgh‖; fun(s); ?? } C. void main( ) { char s[20]=―abcdefgh‖; char *p=s; fun(p); ?? } 7.以下程序的输出结果是( C )。 fun(char **m)

{ ++m; printf(―%s\\n‖,*m); } void main( )

{ char *a[ ]={―BASIC‖,―FOXPRO‖,―C‖};

fun(a); }

A. BASIC

49

6.有一函数的定义如:void fun(char *s){??},则不正确的函数调用是( D )。

B. void main( ) { char s[20]=―abcdefgh‖; fun(&a[0]); ?? } D. void main( ) { char s[20]=―abcdefgh‖; fun(s[ ]); ?? } B. ASIC C. FOXPRO D. C

8.函数的功能是交换x和y中的值;且通过正确调用返回交换结果。不能正确执行此功能的函数是( B )。 A. funa(int *x, int *y) { int i,*p=&i; *p=*x; *x=*y; *y=*p } C. funa(int *x, int *y) { int p; p=*x; *x=*y; *y=p; } } } D. funa(int *x, int *y) { *x=*x+*y; *y=*x-*y; *x=*x-*y; B. funa(int x, int y) { int t; t=x; x=y; y=t; 9.要求函数的功能是在一维数组a中查找x值:若找到则返回所在的下标值,否则返回0;数放在a[1]到a[0]中。不能正确执行此功能的函数是( C )。 B. funa(int *a, int n, int x) A. funa(int *a, int n, int x) { int k; { *a=x; for(k=1;k<=n;k++) while(a[n]!=x) n--; if(a[k]==x) return(k); return(n); return(0); } } C. funa(int a[ ], int n, int x) D. funa(int a[ ], int n, int x) { int *k; { int k=0; do k++; a[0]=k; k=a+n; while((k

sub1(char a, char b){ char c; c=a; a=b; b=c; } sub1(char *a, char b){ char c; c=a; *a=b; b=c; } sub1(char *a, char *b){ char c; c=*a; *a=*b; *b=c; } void main( ) { char a,b;

a=?A‘; b=?B‘; sub3(&a, &b); putchar(a); puchar(b); a=?A‘; b=?B‘; sub2(&a, b); putchar(a); puchar(b); a=?A‘; b=?B‘; sub1(a, b); putchar(a); puchar(b); }

A. BABBAB

B. ABBBBA

C. BABABA

D. BAABBA

二、填充题

1.变量的作用域主要取决于变量 局部变量或是全程变量 ,变量的生存期既取决于变量 局部变量或是全程变量 ,又取决于变量 存储类型 。

2.从变量的存储类型来说, 外部声明型 变量不允许初始化。 自动型 变量、 寄存器型 变量和 静态型 变量可以初始化。其中变量如果不进行初始化,则 自动型

50

变量和 寄存器型 变量的初值不确定,而 静态型 变量初值为0。 3.静态型内部变量的作用域是 所定义的函数或复合语句内 。

4.函数中的形参和调用时的实参都是数组名时,传递方式为 地址传递 ,都是变量时,传递方式为 值传递 。

5.函数的形式参数的作用域为 函数内部 ,全局的外部变量和函数体内定义的局部变量重名时, 局部 变量优先。

6.若自定义函数要求返回一个值,则应在该函数体中有一条 return 语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符 void 。

7.若函数的形式参数是指针类型,则实参可以是 变量地址 、 指针 或 数组名 。 8.函数的参数为char *类型时,虚参与实参结合的传递方式为 地址传递 。 9.函数的实参为常量时,虚参与实参结合的传递方式为 值传递 。 10.对下列递归函数,函数调用f(3)的返回值是 9 。

int f(int n) { return((n==0)?1:f(n-1)+2); }

11.函数f定义如下,调用f(“1475”)的返回值为 17 。

int f (char *s) { int k=0; while (*s)k+=*s++-?\\0‘; return k; }

12.函数change定义如下,a=0、b=5,执行change (a,b)后a、b的值分别为 10,5 。

void change (int a, int b) { int t=0; t=a; a=b; b=t; }

13.已知三角形边长a、b、c和s=(a+b+c)/2,计算其面积的算术表达式为 sqrt (s*(s-a)*(s-b)*(s-c)) 。

14.已知方程ax2+bx+c=0系数a、b、c且存在两个实根,计算其中一个实根的算术表达式为 (-b+sqrt(b*b-4*a*c))/(2*a) 。

15.p为本金,r为5年期存款年利率,计算存款p元5年到期时本金、利息总和的算术表达式为 p*pow (1+r,5) 。

16.将数学式(x+1)e2x写作算术表达式为 (x+1)*exp(2*x) 。

17.调用find函数求实参数组中最大值,再调用find函数求实参数组中最下值。

#include void main ( )

{ float s,a[7]={2,6,3,8,3,12,9}; float find (float*, int, int);

s=find(a,7,1); printf(―%f\\n‖,s) ; s=find(a,7,-1) ; printf(―%f\\n‖,s); }

float find(float *p, int n, int flag) { int i; float t,fh;

if(flag>=0) fh=1; else fh=-1; t=*p ; for(i=1;it*fh) t=*(p+i;) return t ; }

51

18.对数组按值从大到小的顺序排序后输出。

#include void main ( )

{ float a[7]={2,6,3,8,3,12,9}; void sort (float*, int); sort(a,7) ; for(int i=0;i<7;i++) printf(―%f‖,a[i]); printf(―\\n‖); }

void sort (char *p, int n) { int i,j,k; float t; for(i=o;i

k=i;

for(j=i+1;j*(p+k) k=j; if(k!=i)

{ t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; } } }

19.下列函数求任意阶多项式a0+a1X+a2X2+…+anXn的值并返回多项式的值。

float sum(float *a, int n) { float y,t=1; int I; scanf(―%f‖,&x); y=*a;

for(I=1;I<=n;I++){ t=t*x; y+=*(a+I)*t; } return y; }

20.下列函数在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。

#include

void find (float *p, int *max, int *min, int n) { int k; float t;

*max=*p; *min=*p; for(k=1;k

if( t>*max ) *max=t; if(t<*min) *min=t; } }

52

21.下列函数用于任意方阵(行数等于列数的二维数组)转置。

void mt(float *a, int n ) 如数组:1 { int i,j; float t; 2 for(i=0;i

22.下列程序读入六个字符串,排序后输出。

#include #include void sort(char *a[ ], int n) { int i,j,k; char *temp; for(i=0;i

for(j=i+1;j

if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } // 指针数组元素交换 } }

void main ( )

{ char *name[6], ch[6][30]; int k; for(k=0; k<6; k++) name[k]=ch[k];

for(k=0; k<6; k++) gets(name[k]); sort(name,6); for(k=0; k<6; k++) puts(name[k]); }

23.下列函数用矩形公式求f(x)在[a,b]的定积分:先M等积分区间求得积分近似值,在2M等份近似值,再4M等份求得近似值,……,当两次积分近似值之差的绝对值小于eps时返回计算结果。

float sum (float a,float b, int m, float eps) { float h,s1=0,s2,x; int i, flag=1; while(flag){

s2=0; x=a; h=(b-a)/m; for(I=1;I<=m;I++){

s2+=(f(x)+f(x+h))*h/2; x=x+h; }

if(fabs(s1-s2)

53

11 3 3 5 2 3 4 5

4 6 7 4 2 -4 4

-2 5 2 -7 4 6 7

-4 5

24.若给fun函数的形参s传递字符串:“∪∪6354abc”(其中“∪”表示空格字符),则函数的返回值是 6354 。 #include long fun(char s[ ]) { long n; int sign; for(; isspace(*s); s++); sign=(*s==?-‘)?-1:1; if(*s==?+‘||*s==?-‘) s++;

for(n=0;isdigit(*s);s++) n=10*n+(*s-?0‘); return(sign *n); }

fun函数中,先由for(; isspace(*s); s++);转过字符串中的先导空格字符,系统函数isspace(*s)是判断空格字符的。若有字符‘-’,sign放-1,否则放1,移过字符‘-’或‘+’。从此取出字符串中的数字字符(系统函数isdigit(*s)是判断数字字符的)其它字符不要,变成整数后,按位乘10相加(n=n*10+(*s-?0‘)),最后返回数sign *n值。 25.下面函数要求计算两个整数x、y之和,并通过形参z传回该和值,请填空。

void add (int x, int y, int *z ) { *z =x+y; return; } 由于不用return返回值,因此z必须为指针 int *z ,调用时用add(a,b,&c)使z指向实参c,相加结果放 *z =x+y,即放实参c。

26.以下函数用来在w数组中插入x。n所指向的存储单位中存放w数组中字符个数。 数组w中的字符已按从小到大的顺序排列,插入后数组w中的字符仍有序。请填空。 Void fun (char *w, char x, int *n) { int i,p=0; w[*n]=x;

while(x>w[p]) p++;

for(i=*n;i>p;i--) w[i]= w[i-1] ; w[p]=x; ++*n; }

w中从0算起有n指向数个字符,则w[*n]是空的,先把x中的字符放w[*n]。找出按序x中字符应放的位置p。(while (x[p]) p++),从最后一个字符w[i=*n](即要插入的字符)开始向前移位(w[I]= w[i-1] )直到位p,则就把最后一个字符(即要插入的字符)插入到了p位。

27.函数my_cmp( )的功能是比较字符串s和t的大小,当s等于t时返回0,否则返回s和t的第一个不同字符的ASCII码差值,即当s>t时返回正值,当s

my_cmp (char *s, char *t) { while (*s==*t)

{ if (*s==?\\0‘) return (0); ++s, ++t; } return ( *s-*t ); }

54

28.以下程序是把字符串中的内容按逆序输出,但不要改变串中的内容,请填空。

void inverp (char *a) { if(!*a) return; inverp (a+1); printf(―%c‖,*a); }

该递归函数的出口是if,因此,在此要填入遇到字符串结束标志时返回。字符串结束标志的方式有四种:*a==?\\0‘,*a==0或!*a。由于if中已有求反运算符!,故可填入:*a或填(*a!=?\\0‘),(*a!=NULL),(*a!=0)。显然%c*后要填入 a 。

三、程序分析题

1.阅读程序,写出函数的主要功能。 void ch (int *p1, int *p2) { int p;

if (*p1>*p2) (p=*p1; *p1=*p2; *p2=p;) }

函数的功能是能把p1和p2所指的实参数据交换。 2.阅读函数,写出函数的主要功能。 float av (float a[ ], int n) { int i; float s;

for (i=0,s=0;i

函数的功能:求出n个实数的平均值。 3.阅读下面程序,写出运算结果。 unsigned fun6 (unsigned num) { unsigned k=1;

do { k*=nuum; num/=10; } while (num); return k; }

void main ( ) { unsigned n=26; printf(―%d\\n‖,fun6(n)); }

运算结果:把一个无符号整数一位一位取出相乘。结果为12。 4.阅读下面程序,写出运算结果,并说明原因。 #include void main ( )

{ int a[ ]={3,8,4,2},i,x=0; for(i=0;i<4;i++)

{ sub(a,x); printf(―=‖,x); } }

55

sub (int *s, int y) { static int t=0; y=s[t]; t++; }

程序运算结果:0 0 0 0,这是因为sub(a,x)的调用x对应y,是值调用,y的值并不返回给x,四次调用x都是0。

5.阅读下面程序,写出运算结果,并说明函数的功能。 #include void main ( ) { int m,row,col; int a[3][3]={50,-30,90,

35,45,-85, -17,57,97};

func (a,&m,&row,&col,3,3); printf (―%d,%d,%d\\n‖,m,row,col); }

func (int a[ ][ ], int *x, int *y, int *z, int m, int n) { int i,j,*x=a[0][0]; for(i=0;i

{ *x=a[i][j]; *y=i; *z=j; }

}

程序运算结果:-85,1,2。

该函数的功能是求二维数组中最小元素值及它的行列下标。由于有三个数据要返回,因此用三个整数指针,而调用这个函数时,用了三个整数的地址。 6.阅读下面程序,写出运算结果。 #include void main ( )

{ printf(―]\\n‖,fun(4)); } fun (int n) { int t;

if((n==0)||(n==1)) t=3; else t=n*fun (n-1) return t; }

求fun (4),可用推展和回溯法读递归函数计算结果为:72。 7.阅读下面程序,写出运算结果。 #include

void main ( ) 运行时输入:5 –7 3 输出结果:3 { int a,b,c; }; 5 3 –7 find (int, int, int);

56

scanf (―%d%d%d‖,&a,&b,&c);

printf (―%d\\n%d,%d,%d\\n‖,find (a,b,c),a,b,c); }

int find (int a, int b,int c) { int u,s,t;

u=((u=(a>b)?a:b)>c)?u:c; t=((t=(a

8.阅读下面程序,写出运算结果。

#include

void fun1(int n, int a[ ][3]) 输出结果: 1 4 2 { for(int i=0;i

for(int j=0;j

void main ( )

{ int a[3][3]={{6,4,2},{8,6,4},{9,6,3}}; fun1(3,a);

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

for(int j=0;j<3;j++) printf(―%d‖,a[i][j]); printf(―\\n‖); } }

9.阅读下面程序,写出运算结果。

#include int fun3(int m) { int i;

if(m==2||m==3) return 1; 输出结果: 2,3,5,7 if(m<2||m%2==0) return 0;

for(i=3;i

void main ( ) { int n;

for(n=1;n<10;n++)

if(fun3(n)==1) printf(―%d ‖,n); }

10.阅读下面程序,写出运算结果。

#include

void sub(int *a, int *b, int *c,m,n)

{ int i,j; 输出结果: 1 5 3 8 4 9 –4 6 for(i=0;i

57

1 1 1 3 2 1

for(j=0;j

void main ( )

{ int i,x[5]={1,5,3,8,4},y[3]={9,-4,6},z[8]; sub(x,y,z,5,3);

for(i=0;i<8;i++) printf(―%d ‖,z[i]); printf(―\\n‖); }

11.阅读下面程序,写出运算结果。

#include

void sort(char *a[ ], int n) 输出结果: afternoon { int i,j,k; char *temp; evening for(i=0;i

if(strcmp(a[j],a[k])<0) k=j; if(k!=i){

temp=a[i]; a[i]=a[k]; a[k]=temp; } }

}

void main ( ) { char *name[4];

ch[4][15]={―morning‖,―afternoon‖,―night‖,―evening‖}; int k;

for(k=0;k<4;k++) name[k]=ch[k]; sort(name,4); for(k=0;k<4;k++)

printf(―%s\\n‖,name[k]); }

12.阅读下面程序,写出运算结果。

#include ―stdio.h‖

void pline (char *a, char c, int l, int n) { int i;

for(i=1;i

int i; void (*pf)(char*, char, int, int); pf=pline;

for(i=1;i<5;i++){

(*pf)(a,?$‘,5-i,2*i-1); puts(a); } }

58

13.阅读下面程序,写出运算结果。

#include ―stdio.h‖

int binary (int x, int a[ ], int n) 输出结果: 1 { int low=0,high=n-1,mid; while(low<=high){ mid=(low+high)/2; if(x>a[mid]) high=mid-1; else if(x

void main ( )

{ static int a[ ]={4,0,2,3,1}; int i,t,j; for(i=1;i<5;i++){ t=a[i]; j=i-1;

while(j>=0&&t>a[j]){ a[j+1]=a[j]; j--; } a[j+1]=t; }

printf(―%d\\n‖,binary(3,a,5)); }

14.阅读下面程序,写出运算结果。

#include

#include void main ( )

{ double f (double, int); printf(―\\n‖,f(2.0,14)); }

double f (double x, int n) { double t; if(n==1) t=x; else {

if(n/2*2==n) t=x*f(x,n/2); else t=x*pow(f(x,n/2),2.0); } return t; }

15.阅读下面程序,写出运算结果。

#include double x,u,v

double t (double a,double(*f)(double))

59

输出结果: 256.000000 { return(*f)(a*a); } double f(double x) { return 2.0*x; } double g(double x) { return 2.0+x; } void main ( )

{ x=4.0; u=t(x,f); v=t(x,g); printf(―u=%5.3fv=%5.3f\\n‖,u,v); }

四、程序设计题

1.编一个名为root的函数,求方程ax2+bx+c=0的b2-4ac,并作为函数的返回值。其中的a、b、c作为函数的形式参数。 解:float root (float a, float b, float c)

{ return (b*b-4*a*c); }

2.编一个函数,若有参数y为闰年,则返回1,否则返回0。 解:int year (int y)

{ if ((y%4==0&&y0!=0)||y@0==0) return 1; else return 0; }

3.编一个无返回值、名为root2的函数,要求如下: 形式参数:a,b,c单精度实型,root单精度实型数组名。

功能:计算ax2+bx+c=0的两个实根(设b2-4ac>0)存入root[2]中。 解:#include

void root2 (float root[2], float a, float b, float c) { float p;

p=sqrt(b*b-4*a*c); root[0]=(-b+p)/(2*a); root[1]=(-b-p)/(2*a); }

4.编一个无返回值、名为max_min的函数,对两个整数实参能求出它们的最大公约数和最小公倍数并显示。

解:void max_min (int m, int n)

{ int a=m, b=n, t, r;

if(m

printf(―%d 和 %d 的最大公约数是%\\n‖,a,b,n); printf(―%d 和 %d 的最小公倍数是%\\n‖,a,b,a*b/n); }

60

5.编一个能判断一个整数是否是素数的函数,并用它求出3到100之间的所有素数。 解:#include void main ( )

#include { int a;

int prime (int m) for(a=3; a<=100; a++) { int k,i; if(prime(a) printf(―=‖,a); k=sqrt(m); printf(―\\n‖); for(i=2;i<=k;i++) } if(m%i==0) return 0; return 1; }

6.编一个名为days的函数,要求如下: 形式参数:整数y,m,d分别表示年、月、日。 功能:计算该日是该年的第几天。 返回值:整数第几天。 解:int days (int y, int m, int d)

{ int n; switch (1)

{ case 1: n=0; if(m==1) break; case 2: n=n+31; if(m==2) break; case 3: n=n+28; if(m==3) break; case 4: n=n+31; if(m==4) break; case 5: n=n+30; if(m==5) break; case 6: n=n+31; if(m==6) break; case 7: n=n+30; if(m==7) break; case 8: n=n+31; if(m==8) break; case 9: n=n+31; if(m==9) break; case 10: n=n+30; if(m==10) break; case 11: n=n+31; if(m==11) break; case 12: n=n+30; } n=n+d; if(m>2)

if((y%4==0&&y0!==0)||(y@0==0)) return n; }

7.编一个无返回值,名为trus的函数,要求如下:形式参数:s1[2][3], s2[3][2] 整型数组。 功能:将s1数组转置后存入s2数组中。 解:void trus (int s1[2][3], int s2[3][2])

{ int i,j;

for(i=0;i<2;i++) for(j=0;j<3;j++) s2[j][i]=s1[i][j]; }

61

n=n+1;

8.编一个名为countc函数,要求如下:

形式参数:array存放字符串的字符型数组名。 功能:统计array数组中大小写字母的数目。 返回值:字符串中大小写字母的数目。 解:include

int countc (char array[ ]) { int i,n=0;

for(i=0;i

if(array[i]<=?A‘&&array[i]>=?Z‘) n++; return n; }

9.编一个名为link函数,要求如下:

形式参数:s1[40],s2[40],s3[80]存放字符串的字符型数组。 功能:将s2连接到s1后存入s3中。 返回值:连接后字符串的长度。 解:include

int link (char s1[40], char s2[40], char s3[80]) { int i,k,n=0;

for(i=0;i

for(i=0;i

10.编一个函数,返回一维实型数组前n个元素的最大数、最小数和平均值。数组、n和最大数、最小数、平均值均作为函数的形式参数,本函数无返回值(用指针方法实现)。 解:void fun (float a[ ], int n, float *max, float *min, float *vag)

{ int i;

*vag=a[0]; *max=a[0]; *min=a[0]; for(i=1;i

{ if(a[i]>*max) *max=a[i]; if(a[i]<*min) *min=a[i]; *vag=*vag+a[i]; }

*vag=*vag/n; }

11.编一个函数,用“冒泡法”对字符数组中的字符按由小到大顺序排列。 要求字符数组作为形参。 解:void sortc (char a[ ])

{ int n,i,j; char ch;

62

n=strlen(a); for(i=0;ia[j+1])

{ ch=a[j]; a[j]=a[j+1]; a[j+1]=ch; }

}

12.编一个函数,能将十六进制转换成十进制。 形参:字符指针,指向放十六进制数的字符数组 返回值:十进制整数 解:#include

int tv (char *s) { int m,n=0; while(*s!=?\\0‘)

{ if(isalpha(*s)) *s=toupper(*s); switch(*a){

case ?F‘: m=15; break; case ?E‘: m=14; break; case ?D‘: m=13; break; case ?C‘: m=12; break; case ?B‘: m=11; break; case ?A‘: m=10; break; default: m=*s-48; }

n=n*16+m; s++; } return n; }

13.用递归法将一个整数转换成字符串。

解:#include < string.h> void convert (char *b) // 倒置数组

char a[255]; // 全局数组 { int l,i; void contw (int m) // 递归转换 char c,*p;

{ int n; l=strlen(b); p=b+l-1; static int i=1; for(i=1,b++; i

63

void main ( ) { int n;

void contw (int m); void convert (char *b); printf(―输入一整数:‖); scanf(―%d‖,&n);

if(n<0) {a[0]=?-‘; n=-m; } else a[0]=? ‘; contw(n); convert(a);

printf(―字符串:%s\\n‖,a); return; }

64

void main ( ) { int n;

void contw (int m); void convert (char *b); printf(―输入一整数:‖); scanf(―%d‖,&n);

if(n<0) {a[0]=?-‘; n=-m; } else a[0]=? ‘; contw(n); convert(a);

printf(―字符串:%s\\n‖,a); return; }

64

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

Top