一、选择题
1、以下正确的说法是( A )
A) 实参可以是常量、变量或表达式 B) 实参类型不必同形参类型一致
C) 形参可以是常量、变量或表达式 D) 实参顺序与形参顺序无关
2、以下函数首部的定义形式的正确的是( B )
A) int fun(int x; int y) B) int fun(int x, int y) C) int fun(int x, y) D) int fun(int x, int y);
3、以下描述正确的是( B )
A) 如果形参和实参的类型不一致,应以实参类型为准
B) 如果函数值类型与返回值类型不一致,应以函数值类型为准
C) return语句后不能是表达式
D) 定义函数时,可以省略不写形参的类型,只写形参名
4、下列关于函数的描述错误的是( D )
A) c程序是由函数组成的 B) c程序中的函数是各自的
C) main函数可以调用其它的函数 D) 在main函数中可以嵌套定义别的函数
5、关于C语言的主函数描述正确的是 ( )B
A) C程序可以有多个main函数 B) C程序有且只有一个main函数
C) C程序可以没有main函数 D) C程序不一定从main函数开始执行
6、若定义的函数有返回值,则以下关于该函数调用的叙述错误的是( )D
A) 函数调用可作为的语句存在 B) 函数调用可作为一个函数的实参
C) 函数调用可以出现在表达式中 D) 函数调用可作为一个函数的形参
7、以下对于return语句的作用叙述不正确的是( )C
A) 可以将函数值返回给主调函数 B) 可以将程序流程返回到主调函数
C) 一个函数只能有一个return语句 D) 一个函数可以没有return语句
8、C语言规定,函数返回值的类型是由( D )决定的。
A) return语句中表达式的类型 B) 调用该函数的主调函数的类型
C) 调用该函数时系统临时 D) 在定义函数时所指定的函数值类型
9、在C语言程序中,若对函数类型未加显式说明,则函数的隐含类型为( )A
A) int B) double C) void D) float
10、若函数定义如下,则函数返回值的数据类型是( )A
float fun(int x)
{ int y=x+2;
return(y);
}
A) float B) int C) 不能确定 D) 编译出错
11、以下正确的函数形式是( )D
A) double fun(int x, int y) B) void fun(int x, y)
{ z = x + y; { int z;
return z; return z;
} }
C) double fun(x, y) D) double fun(int x, int y)
{ double z = x + y; { double z = x + y;
return z; return z;
} }
12、函数调用时,若参数为“值传递”方式,则下列描述错误的是( B )
A) 实参可以是表达式 B) 实参与形参共用同一内存单元
C) 调用时为形参分配内存单元 D) 实参与形参类型应一致
13、若函数定义如下,假设将常数1.6传给x,则函数的返回值是( )B
int fun(float x)
{ float y=x+2;
return(y);
}
A) 3.6 B) 3 C) 4 D) 3.0
14、设有如下的函数,则函数返回值的类型是( ) C
ggg(float x)
{ return(x*x); }
A) 与参数x的类型相同 B) void C) int D) 无法确定
15、有以下程序,则执行后输出的结果是( )A
#include "stdio.h"
void fun(int k,int n)
{ int t;
t=k; k=n; n=t;
}
void main()
{ int k=1, m=2;
fun(k, m);
printf("%d,%d\\n", k,m);
}
A) 1,2 B) 2,1 C) 1,1 D) 2,2
16、以下程序运行后的输出结果是 ( ) D
#include "stdio.h"
int fun(int a, int b)
{ if (a>b) return(a);
else return(b);
}
void main( )
{ int x=3, y=8, z=6, r;
r=fun( fun(x, y), 2*z);
printf("%d\\n", r);
}
A) 3 B) 6 C) 8 D) 12
*********************************数组作函数参数*********************************
17、对于一维数组名作函数实参,以下描述正确的是( A )
A) 必须在主调函数中说明此数组的大小
B) 实参数组类型与形参数组类型可以不一致
C) 函数调用时是将实参数组中的所有元素值复制到形参数组中
D) 实参数组名与形参数组名必须保持一致
18、数组名作参数时,以下叙述正确的是( )B
A) 函数调用时是将实参数组的所有元素传给形参
B) 函数调用时是将实参数组的首地址传给形参
C) 函数调用时是将实参数组的第1个元素传给形参
D) 函数调用时是将实参数组所有元素的地址传给形参
19、已有如下数组定义和函数调用语句,则fun函数的形参数组的正确定义方法是( C )
int a[3][4];
fun(a);
A) fun( int a[][6]) B) fun(int a[3][] C) fun(int a[][4]) D) fun(int a[][])
20、有以下程序,则执行后的结果为( )C
#include "stdio.h"
void fun(int b[], int n)
{ for(int i=0;i } void main() { int x, a[5]={2,3,4,5,6}; f (a, 5); printf("%d\n a[1]); } A) 2 B) 3 C) 4 D) 5 ***********************************嵌套和递归*********************************** 21、以下描述错误的是( ) D A) C程序中,函数可以直接或间接的调用自己 B) 函数调用时,函数名必须与所调用的函数名字完全一致 C) 函数声明语句中的类型必须与函数返回值的类型一致 D) 实参数可以与形参个数不一致 22、关于递归函数的叙述错误的是( )C A) 递归函数是自己调用自己 B) 递归函数占用较多的存储空间 C) 递归函数的运行速度很快 D) 递归函数的运行速度一般比较慢 23、关于递归函数的叙述错误的是( A ) A) 用递归函数求n! 比用循环求n! 的速度快 B) 递归函数经常使用if结构 C) 递归函数运行时占用较多的存储空间 D) 通常递归函数的代码比较简洁 24、下列的结论中正确的是( ) B A) 所有的递归程序均可以采用非递归算法实现 B) 只有部分递归程序可以用非递归算法实现 C) 所有的递归程序均不可以采用非递归算法实现 D) 以上三种说法都不对 25、关于二分搜索以下说法错误的是( )B A) 二分搜索算法可以用循环语句实现 B) 二分搜索对数据排列没有要求 C) 二分搜索算法可以用递归函数实现 D) 二分搜索体现了分治法的思想 ****************************局部和全局变量及存储类别**************************** 26、以下描述错误的是( D ) A) 在不同的函数中可以使用相同名字的变量 B) 函数定义中的形参是局部变量 C) 在一个函数内部定义的变量只能在该函数内使用 D) 在一个函数内的复合语句中定义变量在整个函数范围内有效 27、以下对局部变量描述正确的是 ( ) D A) 在函数内部定义的变量 B) 在main函数中定义的变量是局部变量 C) 形式参数也是局部变量 D)局部变量在程序的全部执行过程中一直占用存储单元 28、在一个源文件中定义的全局变量的作用域为( )D A)本文件的全部范围 B)本程序的全部范围 C)本函数的全部范围 D)从定义该变量的位置开始到本文件结束 29、以下关于局部变量和全局变量的叙述错误的是( )D A) main函数中定义的变量是局部变量 B) 局部变量可以与全局变量重名 C) 在所有函数外定义的变量是全局变量 D) 形式参数不是局部变量 30、阅读下列程序,则执行后输出的结果是( )A #include "stdio.h" int k=1; void fun(int k) { k++; k=k*6; } void main() { fun(k); printf("%d\\n k); } A) 1 B) 2 C) 6 D) 12 31、对于函数中的局部变量来说,默认的存储类型是( A ) A) auto B) static C) extern D) register 32、C语言中,默认的函数的存储类别是( C ) A) auto B) static C) extern D) 函数没有存储类别 33、程序中定义的全局变量存放在以下哪个存储区 ( ) C A) 堆存储区 B) 栈存储区 C) 静态存储区 D) 程序代码区 34、设在C程序中有2个文件f1.cpp和f2.cpp,若要定义一个只允许在f1.cpp中所有函数使用的全局变量,则该变量的存储类别应该是 ( ) D A) extern B) register C) auto D) static 35、以下叙述不正确的是( )B A) 在C语言中,若整型变量做函数参数,调用函数时是把实参的值传送给形参 B) 在C的函数中,应该尽量多的使用全局变量 C) 在C语言中,函数的返回值使用return语句返回 D) 在C语言中,函数可以嵌套调用 二、填空题 1、用户自定义函数,必须先 定义 后使用。 2、C语言程序的基本单位是函数,C语言程序从 开始执行。main函数 3、用户自定义函数包括两个部分: 声明部分 和执行部分,这两部分的顺序不能颠倒。 4、从函数定义的角度看,函数可以分为标准库函数和 自定义函数 两种。 5、对于有返回值的函数来说,通常函数体内包含有 return 语句。 6、当一个函数的返回值类型缺省时,意味着该函数的返回值类型为 int 型。 7、数组名作函数参数时,实际上是将实参数组的 传给形参。 首地址 8、调用带参数的函数时,实参必须和形参 数量 相同, 顺序 一致。 9、C语言函数自己调用自己的方式称之为函数的 。递归 10、用递归求解问题的两个特点是 和 。 递归的结束条件 求解问题的递归方式 11、变量的作用域和生存期是分别从 空间 和 时间 的角度来体现变量的特性。 12、变量的存储类型可分为 静态存储 和 动态存储 两种,具体的存储类型有四种:auto, static , register , extern 。 13、一个已编译的C程序在运行时将占用4块内存区域: 、 、 、栈存储区。静态存储区 程序代码区 堆存储区 14、根据函数能否被其他源文件中的函数调用,可分为内部函数和 。外部函数 三、阅读程序题 1、写出程序的输出结果。 #include "stdio.h" void fun(int a, int b) { int s; s=a*b/2; a++; b++; printf("s=%d\n s); } void main( ) { int a=10,b=16; fun(a, b); printf("a=%d, b=%d\n a, b); } 输出结果: s=80 a=10, b=16 2、写出函数func的功能,假设输入x和y的值为18和24,写出程序的运行结果。 #include int fun(int a, int b); void main ( ) { int x, y, z; scanf(“%d %d”, &x, &y); z=fun(x, y); printf(“z=%d”,z); } int fun(int a, int b) { int r,t; if(a{ t=a; a=b; b=t; } while(b!=0) { r=a%b; a=b; b=r; } return(a); } 函数功能:求两个数的最大公约数 运行结果:z=6 3、写出程序的输出结果。 #include "stdio.h" int fun1( ) { int k=20; return k; } int fun2( ) { int a=15; return a; } void fun3(int a, int b) { int k; k=(a-b)*(a+b); printf("k=%d\\n", k); } void main( ) { fun3( fun1(), fun2() ); } 输出结果: k=175 4、写出程序的输出结果。 #include float fun(int x, int y) { return(x+y); } void main() { int a=2,b=5,c=8; printf("%3.0f\\n", fun( (int)fun(a+c, b), a-c) ); } 输出结果:_ _ 9 5、写出fun1和fun2函数的功能和程序的运行结果。(5 分) #include int fun1(int x) { int i, t=1; for(i=1; i<=3; i++) t=t*x; return(t); } int fun2(int n) { int i, s=0; for(i=1; i<=n; i++) s=s+fun1(i); return(s); } void main( ) { int y; y=fun2 ( 3 ); printf("y= %d\\n", y ); } fun1函数的功能是:求x! fun2函数的功能是:求1!+2!+… +n!累加和 程序运行结果是:y=36 6、写出程序的功能, 假设输入为:4↙,请写出输出结果。(难度3颗星) #include #define M 6 void main( ) { int n, i, j, pos, a[M]={ 1, 3, 5, 7, 9}; scanf("%d", &n); if (n>a[M-2]) a[M-1]=n; else { for(pos=0; pos for(j=M-1; j>pos ; j--) a[j]=a[j-1]; a[pos]=n; } for( i=0; i } 功能:在有序数组中插入一个数,并保持其有序性 输出结果:1 3 4 5 7 9 7、写出程序的运行结果和函数fun所实现的功能。 #include #define N 3 #define M 4 void fun(int x[N][M]) { int i, j, p; for(i=0; i for(j=1; j } } void main( ) { int a[N][M]={1, 5, 7, 4, 2, 6, 4, 3, 8, 2, 3, 1}; fun(a) ; } 运行结果: line0: 7 line1: 6 line2: 8 函数fun所实现的功能:找出二维数组中每行中的最大值 8、写出下面程序的输出结果。 #include int fun(int n) { if(n==1) return 1; else return fun(n-1)+n; //该递归函数功能是计算1~n的和 } void main() { int i, sum=0; for(i=1;i<=3;i++) sum=sum+fun(i); printf("sum=%d\\n",sum); } 输出结果:sum=10 9、写出下面程序的输出结果。 #include char str[]="ABCDEFGH"; void fun(int i) { printf("%c str[i]); if(i<3) { i=i+2; fun(i); } } void main() { int i=0; fun(i); printf("\\n"); } 输出结果:ACE 10、写出程序的运行结果。 #include int k=1; void fun(int x) { int k; k=x+1; printf ("k=%d\\n", k); } void main( ) { k++; printf ("k=%d\\n", k); fun(k); printf ("k=%d\\n", k); } 运行结果: k=2 k=3 k=2 11、写出程序的输出结果。 #include int a=3; void main() { int s=0; { int a=5; s+=a++; } s+=a++; printf("s=%d, a=%d\\n s, a); } 输出结果:s=8, a=4 12、写出程序的输出结果。 #include void dec( ) { static int x=5; x=x-1; printf("%d x); } void main( ) { int k; for(k=0; k<3; k++) dec( ); } 输出结果:4 3 2 13、写出程序的输出结果。 #include "stdio.h" void f1( ) { static int i=1; i++; printf("%d\\n i); } void main( ) { int i=0; printf("%d\\n i); f1( ); f1( ); printf("%d\\n i); } 输出结果: 0 2 3 0 15、写出程序的运行结果。 #include int fun(int a) { int b=1; static int c=2; b++; c++; return(a+b+c); } void main( ) { int a=3, x1, x2; x1=f(a); x2=f(a); printf(“x1=%d, x2=%d\\n”,x1,x2); } 运行结果: x1=8, x2=9 16、写出下面程序的输出结果。 #include int x=3; void fun( ) { static int x=1; x*=x+1; printf("x=%d\\n ",x); } void main( ) { int i; for(i=1; i } 输出结果: i=1: x=2 i=2: x=6 17、写出程序的运行结果。 #include int fun(int a) { static int f=1; f=f*a; return(f); } void main( ) { int i, a=3; for(i=1; i<=3; i++) printf(“%d\\n”, fun(a)); } 运行结果: 3 9 27 18、写出下面程序的输出结果。(选做题,难度4颗星) #include void fun(int a[], int i, int j) { int t; if(i fun(a, i+1, j-1); } } void main() { int i,a[5]={1,2,3,4,5}; fun(a, 0, 4); for(i=0;i<5;i++) printf("%d, a[i]); printf("\\n"); } 输出结果: 5, 4, 3, 2, 1, 19、写出函数fun1和fun2的功能及程序的运行结果。(选做题,难度5颗星) #include void fun1 (int a[], int p, int r); int fun2 (int a[], int p, int r); void main( ) { int i, a[10]={3,6,1,0,9,4,8,5,2,7}; fun1(a, 0, 9); for(i=0; i<10; i++) printf("%3d", a[i]); printf("\\n"); } void fun1 (int a[], int p, int r) { if (p fun1 (a, p, q-1); fun2 (a, q+1, r); } } int fun2 (int a[], int p, int r) { int i=p, j=r+1, x=a[p], t; while (1) { while (a[++i] if (i>=j) break; t=a[i]; a[i]=a[j]; a[j]=t; } a[p]=a[j]; a[j]=x; return j; } 运行结果:0 1 2 3 4 5 6 7 8 9 fun1的功能:将数组按中间值分成两组分别进行排序 fun2的功能:找出数组中间值的下标 四、程序填空题 1、下面的递归函数是完成1~n的累加,请填写完整。 int fun(int k) { int sum; if (k<=0) printf("error\n"); if (k= =1) ; else ; return(sum); } return(1); sum=k+fun(k-1); 2、下面的函数是完成1~n的累乘,请填写完整。 int fun(int k) { if (k<=0) printf ("error!\n"); if ( ) return 1 ; else ; } k==1 return k*a(k-1); 3、编程计算公式 p=k!/(m-k)!,要求编写一个求阶乘的函数func,请在main函数中输入m、k的值,然后通过调用函数计算p,最后输出p的值。 # include float func(int n); void main ( ) { int m, k; float p; scanf (“%d%d”,&m,&k ); p= ; printf(“p=%f \\n”, p); } float func(int n) { int i; float value; value= ; for ( ) { } return ( ); } func(k)/ func(m-k) 1 i=1;i #include int search(int a[],int n,int x ) { int low,high,mid; low=0; high=n-1; while( ) { mid=(low+high)/2; if(a[mid]==x) return ; else if(a[mid]>x) ; else ; } return -1; } low<=high mid high=mid-1 low=mid+1 五、编程题 1、编程实现输入一组整数,对这组数进行降序排列,然后输出结果,要求定义2个函数,一个函数实现输入数据,另一个函数实现排序,最后在main函数中输出排序后的结果。 #include #define N 10 void input(int a[]); void sort(int a[]); void main() { int i,x[N]; input(x); sort(x); for(i=0;i printf("\\n"); } void input(int a[]) { printf("请输入%d个整数:", N); for(int i=0;i } void sort(int a[]) { int i,j,k,t; for(i=0; i for(j=i+1; j if(k!=i) { t=a[k]; a[k]=a[i]; a[i]=t; } } } 2、编程输出10~n(n>10)之间所有素数的和,要求编写函数fun1判断某个数是否为素数,编写函数fun2实现累加求和,在主函数中输入n,输出最后的计算结果。 #include int fun1( int a ) { int i; for(i=2;i return 1; } int fun2(int n) { int i, s=0; for(i=10;i<=n;i++) if(fun1(i)) s=s+i; return s; } void main() { int n; scanf("%d",&n); printf("%d\\n", fun2(n)); } 3、利用泰勒级数公式,计算sin(x)的值,要求最后一项的绝对值小于10-5,要求编写3个函数分别计算正弦函数,幂函数和阶乘函数。 #include #include double factorial(int n); double power(double x,int n); double sinfun(double x); void main() { double x,value; printf("input x:"); scanf("%lf &x); value=sinfun(x); printf("sin(%.2lf)=%lf\\n x, value); } double factorial(int n) { double f=1; for(int i=2; i<=n; i++) f=f*i; return(f); } double power(double x,int n) { double y=1; for(int i=1; i<=n; i++) y=y*x; return(y); } double sinfun(double x) { double v=0,term; int k=1, f=1; do { term=f*power(x,k)/factorial(k); v=v+term; k=k+2; f=-f; }while(fabs(term)>=1e-5); return(v); } 4、编写函数求字符串1在字符串2中首次出现的位置,如果字符串1未出现过则返回-1。 例如:字符串1为“do”, 字符串2为“how do you do?”,则返回值应该为4。(难度4颗星) #include #include int strlocation(char str1[],char str2[]); void main() { char s1[20],s2[100]; int n=-1; printf("输入字符串2:"); gets(s2); printf("输入字符串1(即要在字符串2中查找的):"); gets(s1); n=strlocation(s1,s2); if(n==-1) printf("字符串2中没有出现过字符串1!\\n"); else printf("字符串2中首次出现字符串1的位置是%d\\n",n); } int strlocation(char str1[],char str2[]) { int i,len1,len2; char str3[20]; len1=strlen(str1); len2=strlen(str2); if(len1>len2) return(-1); else { for(i=0;i<=len2-len1;i++) { strncpy(str3,str2+i,len1); str3[len1]='\\0'; if(strcmp(str1,str3)==0) return(i); } return(-1); } } 5、编写递归函数计算 #include #include int Cfun(int m,int n); void main() { int m,n,C; printf("input m,n:"); scanf("%d%d",&m,&n); C=Cfun(m,n); printf("C=%d\\n",C); } int Cfun(int m,int n) { if(m<0||n<0) { printf("m or n error!\\n"); exit(0); } if(m==n || n==0) return(1); else return(m*Cfun(m-1,n)/(m-n)); }