一、选择题
1. 以下对C语言函数的描述中,正确的是(A
)。
A. C语言程序由一个或一个以上的函数组成
B. 函数既可以嵌套定义又可以递归定义
C. 函数必须有返回值,否则不能使用函数
D. C程序中调用关系的所有函数必须放在同一个程序文件中
2. 关于函数的参数,下面说法正确的是( B
)。
A. 形参可以是表达式,实参也可以是表达式
B. 形参可以是变量,实参可以是表达式
C. 形参是表达式,实参是变量
D. 形参是变量,实参也必须是变量
3. C语言的编译系统对宏命令的处理是( D
)。
A. 在程序运行时进行的
B. 在程序连接时进行的
C. 和程序中的其它他语句同时进行编译的
D. 在对源程序中的其他成分正式编译之前进行的
4. 在C语言中,函数返回值的类型最终取决于( A
)。
A. 函数定义时在函数首部所说明的函数类型
B. return语句中表达式值的类型
C. 调用函数时主函数所传递的实参类型
D. 函数定义时形参的类型
5. 函数调用时,下列说法中不正确的是( A
)。
A. 若用值传递方式,则形参不予分配内存单元
B. 实参和形参可以同名
C. 主调函数的被调函数可以不在同一个文件中 D. 函数间传送数据可以使用外部全局变量
二、填空题
- 一个完整的C函数包括
函数说明部分和函数体
。 - 变量从存在的时间来分可分为
静态变量和动态变量
。 - 从变量的作用域角度,变量可分为
全局变量和 局部 变量
。 - 表达式sqrt(81)和pow(5,3)值分别是
9
和125
。 - 函数内定义的动态变量在函数
调用
时才生成。 - 编译预处理命令必须以
#
开头。 - 已有宏定义“#define M(y) y*y”和宏调用“k=M(5+1);”,则执行宏调用后k的值为
11
。
三、写出下列程序的运行结果
1.
#include<stdio.h>
#define f(x) x*x
void main()
{
int i;
i=f(4+4)/f(2+2); //注:作宏展开
printf("%d\n",i);
}
运行结果:28
2.
#include<stdio.h>
#define SUM(x,y) (x)*y
void main()
{
int a=3,b=4,c;
c=SUM(a++,b++);
printf("%d,%d,%d\n",a,b,c);
}
运行结果:4,5,12
3.
#include<stdio.h>
void fun(int a,int b,int c)
{c=a*a+b*b;}
void main()
{
int x=22;
fun(4,2,x);
printf("%d\n",x);
}
运行结果:22
4.
#include<stdio.h>
int func(int a,int b)
{
int c;
c=a+b;
return c;
}
void main()
{
int x=6,r;
r=func(x,x+=2);
printf("%d\n",r);
}
运行结果:16
5.
#include<stdio.h>
int d=1;
void fun(int p)
{
int d=5;
d+=p++;
printf("%d",d);
}
void main()
{
int a=3;
fun(a);
printf("%d\n",d);
}
运行结果:81
6.
#include<stdio.h>
int d=1;
int fun(int p)
{
static int d=5;
d+=p;
printf("%4d",d);
return d;
}
void main()
{
int a=3;
printf("%4d\n",fun(a+fun(d)));
}
运行结果: 6 15 15
7.
#include<stdio.h>
long fib(int n)
{
if(n>2)
return(fib(n-1)+fib(n-2));
else
return (2);
}
void main()
{
printf("%d\n",fib(3));
}
运行结果: 4
8.
#include<stdio.h>
void fun()
{
static int a=0;
a+=2;
printf("%d\t",a);
}
void main()
{
int cc;
for(cc=1;cc<4;cc++)
fun();
printf("\n");
}
运行结果: 2 4 6
四、程序填空题
1. 程序的功能是计算s=1!+2!+3!+…+n!。
#include<stdio.h>
long fun(int n)
{
int i;
long s= 1 ;
for(i=1;i<=n;i++)
s= s*i ;
return s;
}
void main()
{
long s=0;
int k,n;
scanf("%d",&n);
for(k=1;k<=n;k++)
s= s+fun(k) ;
printf("%ld\n",s);
}
2. 补充函数fun,该函数的功能是判断一个数的个位数字和百位数字之和是否等于十位数字,是则返回1,否则返回0。
#include<stdio.h>
long fun(int n)
{
int g,s,b;
g=n%10;
s=n/10%10;
b= n/100 ;
if( g+b==s )
return 1;
else
return 0;
}
void main()
{
int num;
printf("输入数据:\n");
scanf("%d",&num);
if(fun(num))
printf("结果是:yes!\n");
else
printf("结果是:no!\n");
}
5. 寻找并输出2000以内的亲密数对。亲密数对的定义为:若正整数a的所有因子(不包括a)和为b,b的所有因子(不包括b)和为a,且a≠b,则称a和b为亲密数对。
#include<stdio.h>
int f(int x)
{
int i,y=0;
for(i=1; i<x ;i++)
if(x%i==0)y+=i;
return y;
}
void main()
{
int i,j;
for(i=2;i<=2000;i++)
{
j=f(i);
if( i ==f(j)&& i<j )
printf("%d,%d\n",i,j);
}
}
答案:220,284
1184,1210
五、编写程序
1. 已知Fibonacci数列为1,1,2,3,5,8,13,……,试用递归法编写求Fibonacci数的函数,在主函数中输入一个自然数,输出不小于该自然数的最小的一个Fibonacci数。
源程序:
#include<stdio.h>
int fib(int n)
{
int f;
if(n==1||n==0) f=1;
else f=fib(n-1)+fib(n-2);
return f;
}
void main()
{
int i,m,result;
printf("请输入一个自然数:");
scanf("%d",&m);
i=1;
while((result=fib(i))<m) i++;
printf("满足条件的数为%d\n",result);
}
2. 已知某数列为
求F(0)到F(10)中的最大值和最小值,以及值等于0的个数。
源程序:
#include<stdio.h>
int f(int n)
{
int c;
if(n==1||n==0) c=1;
else if(n==2)c=0;
else c=f(n-1)-3*f(n-2)+2*f(n-3);
return c;
}
void main()
{
int i,max,min,zero=0;
max=min=f(0);
for(i=0;i<=10;i++)
{
if(max<f(i))max=f(i);
if(min>f(i))min=f(i);
if(f(i)==0)zero++;
}
printf("最大值为:%d,最少值为:%d,值为0的数有%d个。\n",max,min,zero);
}
运行结果:最大值为:31,最少值为:-11,值为0的数有2个。
3. 编写一个函数“change(x,r)”,将十进制的数x转换成r(1<r<10)进制后输出。
源程序:
#include<stdio.h>
void change(int x,int r)
{int c;
c=x%r;
if(x/r!=0)change(x/r,r);
printf("%d",c);
}
void main()
{int x,r;
printf("请输入一个十进制整数x和所要转换的进制r:");
scanf("%d,%d",&x,&r);
printf("十进制整数%d转换成的%d进制数为:",x,r);
if(x<0)
{printf("-");x=-x;}
change(x,r);
printf("\n");
}
4. 已知某一正整数,其各位数字均为素数,而且各位数字之和也为素数。例如,232的各位数字2,3,2及各位数字之和2+3+2=7均为素数。编写程序找出1100中满足条件的所有正整数,并将结果按每行5个输出。
源程序:
#include<stdio.h>
int prime(int x)
{
int i;
for(i=2;i<x;i++)
if(x%i==0)break;
return i==x;
}
void main()
{
int i,j,n=0,t;
for(i=1;i<1000;i++)
{
j=i;t=0;
while(j!=0&&prime(j%10))
{
t=t+j%10;
j=j/10;
}
if((j==0)&&prime(t))
{
if(n%5==0)printf("\n");
printf("%5d",i);
n++;
}
}
printf("\n");
}
5. 已知:
将f定义成递归函数,计算x=3.1、n=15及x=8.1、n=10时的f值。
源程序:
#include<stdio.h>
#include<math.h>
float f(float x,int n)
{
float c;
if(n==1)c=sqrt(1+x);
else c=sqrt(n+f(x,n-1));
return c;
}
void main()
{
float f1,f2;
f1=f(3.1,15);
f2=f(8.1,10);
printf("f(3.1,15)=%.3f\n",f1);
printf("f(8.1,10)=%.3f\n",f2);
}
运行结果:f(3.1,15)=4.388
f(8.1,10)=3.676
6. 编写一个函数“digit(n,k)”,它返回数n从右边开始的第k个数字的值。例如,“digit(123456,2)”返回值为5,“digit(258,4)”返回值为-1。
源程序:
#include<stdio.h>
int digit(long n,int k)
{
int i=1;
while(i<k&&n!=0)
{n=n/10;i++;}
if(n==0)return -1;
else return (n%10);
}
void main()
{
long x;
int m;
printf("输入一个整数x和要返回的数字位数m:");
scanf("%ld,%d",&x,&m);
printf("结果为:%d\n",digit(x,m));
}
7. 利用从两个数中找较大数的函数(或宏),实现从3个数中找出最大数。使用带参数的宏完成。
源程序:
#include<stdio.h>
#define max(a,b) a>b?a:b
#define PR(x) printf("3个数中的最大数为:%f\n", x)
int main()
{ float a,b,c,t;
printf("输入三个数:");
scanf("%f,%f,%f",&a,&b,&c);
t=max(a,b);t=max(t,c);
PR(t) ;
}