第八章 函数
8.1 选择题
【题8.1】以下正确的说法是 。
建立函数的目的之一是 A)提高程序的执行效率
B)提高程序的可读性
C)减少程序的篇幅
D)减少程序文件所占内存
【题8.2】以下正确的说法是 。
用户若需调用标准库函数,调用前必须重新定义用户可以重新定义标准库函数,若如此,该函数将失去原有含义系统根本不允许用户重新定义标准库函数用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调
【题8.3】以下正确的函数定义形式是 。
double fun(int x,int y)
double fun(int x;int y)
double fun(int x,int y);
double fun(int x,y);
【题8.4】以下正确的函数形式是 。
double fun(int x,int y)
{ z=x+y; return z; }
fun(int x,y)
{ int z; return z; }
fun(x,y)
{ int x,y; double z; z=x+y; return z; }
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】以下正确的说法是 。
定义函数时,形参的类型说明可以放在函数体内
return后边的值不能为表达式如果函数值的类型与返回值类型不一致,以函数值类型为准如果形参与实参的类型不一致,以实参类型为准
【题8.9】C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是 。
地址传递单向值传递由实参传给形参,再由形参传回给实参由用户指定传递方式
【题8.10】以下程序有语法性错误,有关错误原因的正确说法是 。
main()
{
int G=5,k;
void prt_char();
… …
k=prt_char(G);
… …
}
语句void prt_char();有错,它是函数调用语句,不能用void说明变量名不能使用大写字母函数说明和函数调用语句之间有矛盾函数名不能使用下划线
【题8.11】C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 。
float型
int型
long型
double型
【题8.12】C语言规定,函数返回值的类型是由 。
return语句中的表达式类型所决定调用该函数时的主调函数类型所决定调用该函数时系统临时决定在定义该函数时所指定的函数类型所决定
【题8.13】下面函数调用语句含有实参的个数为 。
func((exp1,exp2),(exp3,exp4,exp5));
A)1 B)2 C)4 D)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=%f\n”,sum);
}
float f(float a,float b)
{
float value;
value=a/b;
return(value);
}
【1】 A)x-y,x+y B)x+y,x-y C)z+y,z-y D)z-y,z+y
【2】 A)x-y,x+y B)x+y,x-y C)z+y,z-y D)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*10 B)k%10 C)k/10 D)k*10%10
【2】 A)a2*10 B)a2 C)a2/10 D)a2%10
【题8.18】以下是有关汉诺塔问题的程序段,若在main函数中有调用语句hanoi(3,‘A’,‘B’,‘C’);则符合程序段运行结果的选项是 。
void move(char getone,char putone)
{
printf(“%c-->%c\n”,getone,putone);
}
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
A)A-->C B)A-->C C)A-->C D)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】若用数组名作为函数调用的实参,传递给形参的是 。
数组的首地址数组第一个元素的值数组中全部元素的值数组元素的个数
【题8.20】已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为 。
int a[3][4];
f(a);
f(int array[][6])
f(int array[3][])
f(int array[][4])
f(int array[2][5])
【题8.21】若使用一维数组名作函数实参,则以下正确的说法是 。
必须在主调函数中说明此数组的大小实参数组类型与形参数组类型可以不匹配在被调函数中,不需要考虑形参数组的大小实参数组名与形参数组名必须一致
【题8.22】折半查找法的思路是:先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值。如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;返回-1。请选择填空。
binary(int a[10],int m)
{
int low=0,high=9,mid;
while(low<=high)
{
mid=(low+high)/2;
if(m<a[mid]) 【1】;
else if(m>a[mid]) 【2】;
else return(mid);
}
return(-1);
}
【1】 A)high=mid-1 B)low=mid+1 C)high=mid+1 D)low=mid-1
【2】 A)high=mid-1 B)low=mid+1 C)high=mid+1 D)low=mid-1
【题8.23】以下正确的说法是 。
如果在一个函数中的复合语句中定义了一个变量,则该变量只在该复合语句中有效在该函数中有效在本程序范围内均有效为非法变量
【题8.24】以下不正确的说法为 。
在不同函数中可以使用相同名字的变量形式参数是局部变量在函数内定义的变量只在本函数范围内有效在函数内的复合语句中定义的变量在本函数范围内有效
【题8.25】以下程序的正确运行结果是 。
#define MAX 10
int a[MAX],i;
main()
{
printf(“\n”); sub1(); sub3(a); sub2(); sub3(a);
}
sub2()
{
int a[MAX],i,max;
max=5;
for(i=0;i<max;i++) a[i]=i;
}
sub1()
{
for(i=0;i<MAX;i++) a[i]=i+i;
}
sub3(int a[])
{
int i;
for(i=0;i<MAX;i++) printf(“%d”,a[i]);
printf(“\n”);
}
0 2 4 6 8 10 12 14 16 18
0 1 2 3 4
0 1 2 3 4
0 2 4 6 8 10 12 14 16 18
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4
0 2 4 6 8 10 12 14 16 18
0 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,%d\n”,x,y);
}
A)12,2 B)不确定 C)5,25 D)1,12
【题8.27】凡是函数中未指定存储类型的局部变量,其隐含的存储类别为 。
A)自动(auto) B)静态(static)
C)外部(extern) D)寄存器(register)
【题8.28】在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是 。
A)extern B)register C)auto D)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 7 B)7 10 13 C)7 9 11 D)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(“%d\n”,p);
}
func(int a,int b)
{
static int m=0,i=2;
i+=m+1;
m=i+a+b;
return(m);
}
A)8,17 B)8,16 C)8,20 D)8,8
8.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(“%d\n”,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=%d\n”,i,j,x);
}
fun(int i,int j)
{
int x=7;
printf(“i=%d;j=%d;x=%d\n”,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 %d\n”,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’,‘Y’or‘n’,‘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 %d\n”,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.3f\n”,r);
}
【题8.42】若输入一个整数10,以下程序的运行结果是 。
main()
{
int a,e[10],c,i=0;
printf(“输入一整数\n”);
scanf(“%d”,&a);
while(a!=0)
{
c=sub(a);
a=a/2;
e[i]=c;
i++;
}
for(;i>0;i--) printf(“%d”,e[i-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=%f\n”,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 %d\n”,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=%d\n”,x,y,z);
add(x,y,z);
printf(“(3) x=%d y=%d z=%d\n”,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=%d\n”,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(“\n\n%d!=%lg\n\n”,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 a[10][10],int n)
{
int i,j,k;
j=n/2+1; a[1][j]=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; }
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else { i=i+2; j=j-1; a[i][j]=k; }
}
}
【题8.52】下面函数func的功能是 。
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
long func(long num)
{
long k=1;
num=labs(num);
do{
k*=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):%d\n”,fact(5));
printf(“FACT(1):%d\n”,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:%d\n”,【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=%d\n”,k);
}
【题8.56】以下程序的运行结果是 。
main()
{
int i=5;
printf(“%d\n”,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=%f\n”,x,mysqrt(x,1.0));
}
【题8.58】以下程序的运行结果是 。
#include <stdio.h>
f(int a[])
{
int i=0;
while(a[i]<=10)
{
printf(“%d”,a[i]);
i++;
}
}
main()
{
int a[]={1,5,10,9,11,7};
f(a+1);
}
【题8.59】以下程序的运行结果是 。
main()
{
int a[3][3]={1,3,5,7,9,11,13,15,17}; int sum;
sum=func(a);
printf(“\nsum=%d\n”,sum);
}
func(int a[][3])
{
int i,j,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
a[i][j]=i+j;
if(i==j) sum=sum+a[i][j];
}
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 s[][4])
{
int i,j,k;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{ k=s[i][j]; s[i][j]=s[j][i]; s[j][i]=k; }
main()
{
int s[4][4],i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
s[i][j]=i-j;
f(s);
for(i=0;i<4;i++)
{
printf(“\n”);
for(j=0;j<4;j++)
printf(“%4d”,s[i][j]);
}
}
【题8.61】以下search函数的功能是利用顺序查找法从数组a的10个元素中对关键字m进行查找。顺序查找法的思路是:从第一个元素开始,从前向后依次与关键字比较,直到找到此元素或查找到数组尾部时结束。若找到,返回此元素的下标;若仍未找到,则返回值-1。请填空。
#include <stdio.h>
int search(int a[10],int m)
{
int i;
for(i=0;i<=9;i++) if(【1】) return(i);
return(-1);
}
main()
{
int a[10],m,i,no;
…
no=search(【2】);
if(【3】) printf(“\nOK FOUND!%d”,no+1);
else printf(“\nSorry Not Found!”);
}
【题8.62】已定义一个含有30个元素的数组s,函数fav1的功能是按顺序分别赋予各元素从2开始的偶数,函数fav2则按顺序每五个元素求一个平均值,并将该值存放在数组w中。请填空。
#define SIZE 30
fav1(float s[])
{
int k,i;
for(k=2,i=0;i<SIZE;i++)
{
【1】;
k+=2;
}
}
fav2(float s[],float w[])
{
float sum;
int k,i;
sum=0.0;
for(k=0,i=0;i<SIZE;i++)
{
sum+=s[i];
if((i+1)%5==0)
{
w[k]=sum/5;
【2】;
k++;
}
}
}
main()
{
float s[SIZE],w[SIZE/5],sum;
int i,k;
fav1(s);
fav2(s,w);
}
【题8.63】以下程序的运行结果是【1】,其算法是【2】。
main()
{
int a[5]={5,10,-7,3,7},i,t,j;
sort(a);
for(i=0;i<=4;i++) printf(“%d”,a[i]);
}
sort(int a[])
{
int i,j,t;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
【题8.64】以下程序的运行结果是【1】,其算法是【2】。
main()
{
int a[5]={9,6,8,3,-1},i,t,j,p;
sort(a);
for(i=0;i<=4;i++) printf(“%d”,a[i]);
}
sort(int a[])
{
int i,j,t,p;
for(j=0;j<4;j++)
{
p=j;
for(i=j;i<=4;i++)
if(a[i]<a[p]) p=i;
t=a[p]; a[p]=a[j]; a[j]=t;
}
}
【题8.65】函数del的作用是删除有序数组a中的指定元素x。已有调用语句n=del(a,n,x);其中实参n为删除前数组元素的个数,赋值号左边的n为删除后数组元素的个数。请填空。
del(int a[],int n,int x)
{
int p,i;
p=0;
while(x>=a[p]&&p<n) 【1】;
for(i=p-1;i<n;i++) 【2】;
n=n-1;
return n;
}
【题8.66】以下程序的运行结果是 。
#include <stdio.h>
func(int array[][4],int m)
{
int i,j,k;
k=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]<m)
k=k+array[i][j];
return(k);
}
main()
{
static int a[3][4]={{1,13,5,7},{2,4,26,8},{10,1,3,12}};
int i,j,m;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) printf(“%4d”,a[i][j]);
printf(“\n”);
}
m=10;
printf(“\nthe value is %d\n”,func(a,m));
}
【题8.67】函数swap(int x,int y)可完成对x和y值的交换。在运行调用函数中的如下语句后,a[0]和a[1]的值分别为【1】,原因是【2】。
a[0]=1; a[1]=2;
swap(a[0],a[1]);
【题8.68】函数swap(arr,n)可完成对arr数组从第1个元素到第n个元素两两交换。在运行调用函数中的如下语句后,a[0]和a[1]的值分别为【1】,原因是【2】。
a[0]=1; a[1]=2;
swap(a,2);
【题8.69】以下程序可计算10名学生1门课成绩的平均分,请填空。
float average(float array[10])
{
int i;
float aver,sum=array[0];
for(i=1;【1】;i++) sum+=【2】;
aver=sum/10;
return(aver);
}
main()
{
float score[10],aver;
int i;
printf(“\ninput 10 scores:”);
for(i=0;i<10;i++)
scanf(“%f”,&score[i]);
aver=【3】;
printf(“\naverage score is %5.2f\n”,aver);
}
【题8.70】函数yahui能够按以下形式构成一个杨辉三角形,请填空。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
… … … … … …
#define N 11
yahui(int a[][N])
{
int i,j;
for(i=1;i<N;i++) { a[i][1]=1; a[i][i]=1; }
for(【1】;i<N;i++)
for(j=2;【2】;j++)
a[i][j]=【3】+a[i-1][j];
}
【题8.71】下面程序的功能是:从键盘输入一个整数m(4≤m≤20),则输出如下的整数方阵(存入二维数组aa)。例如,若输入“4”和“5”,则分别输出
16 9 4 1 25 16 9 4 1
9 4 1 16 16 9 4 1 25
4 1 16 9 9 4 1 25 16
1 16 9 4 4 1 25 16 9
1 25 16 9 4
请改正程序中的错误语句,使它能得出正确的结果。改正后的语句是【1】和【2】。(注意:不得增行或删行,也不得更改程序的结构。)
#include <conio.h>
#include <stdio.h>
#define M 20
void aMatrix(int n,int xx[][M])
{
int i,j;
for(j=0;j<n;j++)
xx[0][j]=(n-j)*(n-j);
for(i=1;i<n;i++)
{
for(j=0;j<n;j++) /* 错误语句【1】 */
xx[i][j]=xx[i-1][j+1];
xx[i][n-1]=xx[i-1][0];
}
}
main()
{
int aa[M][M],i,j,m;
printf(“\nPlease enter an integer number between 4 and 20:”);
scanf(“%d”,&m);
aMatrix(m,aa);
printf(“\nThe %d*%d matrix generated:”,m,m);
for(i=0;i<m;i++)
{
printf(“\n”);
for(j=0;j<m;j++)
printf(“%4f”,(*(aa+i))[j]); /* 错误语句【2】 */
}
}
【题8.72】以下程序运行结果是 。
main()
{
int a=1,b=2,c=3;
++a;
c+=++b;
{
int b=4,c;
c=b*3;
a+=c;
printf(“first:%d,%d,%d\n”,a,b,c);
a+=c;
printf(“second:%d,%d,%d\n”,a,b,c);
}
printf(“third:%d,%d,%d\n”,a,b,c);
}
【题8.73】以下程序的运行结果是 。
#include <stdio.h>
int k=1;
main()
{
int i=4;
fun(i);
printf(“(1) %d,%d\n”,i,k);
}
fun(int m)
{
m+=k; k+=m;
{
char k=‘B’;
printf(“(2) %d\n”,k-‘A’);
}
printf(“(3) %d,%d\n”,m,k);
}
【题8.74】以下程序的运行结果是 。
int x1=30,x2=40;
main()
{
int x3=10,x4=20;
sub(x3,x4);
sub(x2,x1);
printf(“%d,%d,%d,%d\n”,x3,x4,x1,x2);
}
sub(int x,int y)
{
x1=x;
x=y;
y=x1;
}
【题8.75】以下程序的运行结果是 。
int i=0;
main()
{
int i=5;
reset(i/2); printf(“i=%d\n”,i);
reset(i=i/2); printf(“i=%d\n”,i);
reset(i/2); printf(“i=%d\n”,i);
workover(i); printf(“i=%d\n”,i);
}
workover(int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf(“i=%d\n”,i);
return(i);
}
reset(int i)
{
i=i<=2?5:0;
return(i);
}
【题8.76】以下程序的运行结果是 。
int a=5; int b=7;
main()
{
int a=4,b=5,c;
c=plus(a,b);
printf(“A+B=%d\n”,c);
}
plus(int x,int y)
{
int z;
z=x+y;
return(z);
}
【题8.77】以下程序的运行结果是 。
int a=3,b=5;
max(a,b)
{
int c;
c=a>b?a:b;
return(c);
}
main()
{
int a=8;
printf(“%d”,max(a,b));
}
【题8.78】以下程序的运行结果是 。
int x;
main()
{
x=5;
cube();
printf(“%d\n”,x);
}
cube()
{
x=x*x*x;
}
【题8.79】以下程序的运行结果是 。
main()
{
incx();
incy();
incx();
incy();
incx();
incy();
}
incx()
{
int x=0;
printf(“x=%d\t”,++x);
}
incy()
{
static int y=0;
printf(“\ny=%d\n”,++y);
}
【题8.80】以下程序的运行结果是 。
main()
{
increment();
increment();
increment();
}
increment()
{
static int x=0;
x+=1;
printf(“%d”,x);
}
【题8.81】以下程序的运行结果是 。
int n=1;
main()
{
static int x=5; int y;
y=n;
printf(“MAIN:x=%2d y=%2d n=%2d\n”,x,y,n);
func();
printf(“MAIN:x=%2d y=%2d n=%2d\n”,x,y,n);
func();
}
func()
{
static int x=4; int y=10;
x=x+2;
n=n+10;
y=y+n;
printf(“FUNC:x=%2d y=%2d n=%2d\n”,x,y,n);
}
【题8.82】以下程序的功能是 。
int fac(int n)
{
static int f=1;
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf(“%d!=%d\n”,i,fac(i));
}
8.3 编程题
【题8.83】已有变量定义和函数调用语句:int a=1,b=-5,c;c=fun(a,b);fun函数的作用是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun函数。
fun(int x,int y)
{ }
【题8.84】已有变量定义和函数调用语句:int x=57; isprime(x);函数isprime()用来判断一个整型数是否为素数,若是素数,函数返回1,否则返回0。请编写isprime函数。
isprime(int a)
{ }
【题8.85】已有变量定义和函数调用语句:int a,b; b=sum(a);函数sum()用以求,和数作为函数值返回。若a的值为10,经函数sum的计算后,b的值是55。请编写sum函数。
sum(int n)
{ }
【题8.86】已有变量定义语句double a=5.0; int n=5;和函数调用语句mypow(a,n);用以求a的n次方。请编写double mypow(double x,int y)函数。
double mypow(double x,int y)
{ }
【题8.87】以下程序的功能是用牛顿法求解方程f(x)=cosx-x=0。已有初始值x0=3.1415/4,要求绝对误差不超过0.001,函数f用计算迭代公式中的值,请编写f函数。牛顿迭代公式是:
即:
#include <stdio.h>
#include <math.h>
#define PI 3.1415
float f(float x0)
{ }
main()
{
int t=0,k=100,n=0;
float x0=PI/4,x1;
while(n<k)
{
x1=f(x0);
if(fabs(x0-x1)<0.001) { t=1; break; }
else { x0=x1; n=n+1; }
}
if(t==1) printf(“\nFangcheng geng is %10.5f”,x1);
else printf(“\nSorry,not found!”);
}
【题8.88】已有函数调用语句c=add(a,b);请编写add函数,计算两个实数a和b的和,并返回和值。
double add(double x,double y)
{ }
【题8.89】以下程序的功能是应用弦截法求方程的根,其中f函数可根据指定的x的值求出方程的值;函数xpoint可根据x1和x2求出f(x1)和f(x2)的连线与x轴的交点;函数root用来求区间(x1,x2)的实根,请编写root函数。
#include <math.h>
float root(float x1,float x2)
{ }
float f(float x) /* 略 */
{ … }
float xpoint(float x1,float x2) /* 略 */
{ … }
main()
{
float x1,x2,f1,f2,x;
do{
printf(“input x1,x2:\n”);
scanf(“%f %f”,&x1,&x2);
printf(“x1=%5.2f,x2=%5.2f\n”,x1,x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf(“A root of equation is %8.4f”,x);
}
【题8.90】以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);请编写p函数。递归公式如下:
float p(int n,int x)
{ }
【题8.91】以下程序的功能是应用下面的近似公式计算e的n次方。函数f1用来计算每项分子的值,函数f2用来计算每项分母的值。请编写f1和f2函数。
(前20项的和)
float f2(int n)
{ }
float f1(int x,int n)
{ }
main()
{
float exp=1.0;
int n,x;
printf(“Input a number:”);
scanf(“%d”,&x);
printf(“%d\n”,x);
exp=exp+x;
for(n=2;n<=19;n++)
exp=exp+f1(x,n)/f2(n);
printf(“\nThe is exp(%d)=%8.4f\n”,x,exp);
}
运行结果:Input a number:3
The is exp(3)=20.0855
【题8.92】a是一个2×4的整型数组,且各元素均已赋值。函数max_value可求出其中的最大元素max,并将此值返回主调函数。今有函数调用语句max=max_value(a);请编写max_value函数。
max_value(int arr[][4])
{ }
【题8.93】输入若干整数,其值均在1至4的范围内,用-1作为输入结束标志,请编写函数f用于统计每个整数的个数。
#define M 50
main()
{
int a[M],c[5]={0},i,n,x;
n=0;
printf(“Enter 1 or 2 or 3 or 4,to end with -1\n”);
scanf(“%d”,&x);
while(x!=-1)
{
if(x>=1&&x<=4) { a[n]=x; n++; }
scanf(“%d”,&x);
}
f(a,c,n);
printf(“Output the result:\n”);
for(i=1;i<=4;i++) printf(“%d:%d\n”,i,c[i]);
printf(“\n”);
}
f(int a[],int c[],int n)
{ }
8.1 选择题
【题8.1】以下正确的说法是 。
建立函数的目的之一是 A)提高程序的执行效率
B)提高程序的可读性
C)减少程序的篇幅
D)减少程序文件所占内存
【题8.2】以下正确的说法是 。
用户若需调用标准库函数,调用前必须重新定义用户可以重新定义标准库函数,若如此,该函数将失去原有含义系统根本不允许用户重新定义标准库函数用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调
【题8.3】以下正确的函数定义形式是 。
double fun(int x,int y)
double fun(int x;int y)
double fun(int x,int y);
double fun(int x,y);
【题8.4】以下正确的函数形式是 。
double fun(int x,int y)
{ z=x+y; return z; }
fun(int x,y)
{ int z; return z; }
fun(x,y)
{ int x,y; double z; z=x+y; return z; }
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】以下正确的说法是 。
定义函数时,形参的类型说明可以放在函数体内
return后边的值不能为表达式如果函数值的类型与返回值类型不一致,以函数值类型为准如果形参与实参的类型不一致,以实参类型为准
【题8.9】C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是 。
地址传递单向值传递由实参传给形参,再由形参传回给实参由用户指定传递方式
【题8.10】以下程序有语法性错误,有关错误原因的正确说法是 。
main()
{
int G=5,k;
void prt_char();
… …
k=prt_char(G);
… …
}
语句void prt_char();有错,它是函数调用语句,不能用void说明变量名不能使用大写字母函数说明和函数调用语句之间有矛盾函数名不能使用下划线
【题8.11】C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 。
float型
int型
long型
double型
【题8.12】C语言规定,函数返回值的类型是由 。
return语句中的表达式类型所决定调用该函数时的主调函数类型所决定调用该函数时系统临时决定在定义该函数时所指定的函数类型所决定
【题8.13】下面函数调用语句含有实参的个数为 。
func((exp1,exp2),(exp3,exp4,exp5));
A)1 B)2 C)4 D)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=%f\n”,sum);
}
float f(float a,float b)
{
float value;
value=a/b;
return(value);
}
【1】 A)x-y,x+y B)x+y,x-y C)z+y,z-y D)z-y,z+y
【2】 A)x-y,x+y B)x+y,x-y C)z+y,z-y D)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*10 B)k%10 C)k/10 D)k*10%10
【2】 A)a2*10 B)a2 C)a2/10 D)a2%10
【题8.18】以下是有关汉诺塔问题的程序段,若在main函数中有调用语句hanoi(3,‘A’,‘B’,‘C’);则符合程序段运行结果的选项是 。
void move(char getone,char putone)
{
printf(“%c-->%c\n”,getone,putone);
}
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
A)A-->C B)A-->C C)A-->C D)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】若用数组名作为函数调用的实参,传递给形参的是 。
数组的首地址数组第一个元素的值数组中全部元素的值数组元素的个数
【题8.20】已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为 。
int a[3][4];
f(a);
f(int array[][6])
f(int array[3][])
f(int array[][4])
f(int array[2][5])
【题8.21】若使用一维数组名作函数实参,则以下正确的说法是 。
必须在主调函数中说明此数组的大小实参数组类型与形参数组类型可以不匹配在被调函数中,不需要考虑形参数组的大小实参数组名与形参数组名必须一致
【题8.22】折半查找法的思路是:先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值。如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;返回-1。请选择填空。
binary(int a[10],int m)
{
int low=0,high=9,mid;
while(low<=high)
{
mid=(low+high)/2;
if(m<a[mid]) 【1】;
else if(m>a[mid]) 【2】;
else return(mid);
}
return(-1);
}
【1】 A)high=mid-1 B)low=mid+1 C)high=mid+1 D)low=mid-1
【2】 A)high=mid-1 B)low=mid+1 C)high=mid+1 D)low=mid-1
【题8.23】以下正确的说法是 。
如果在一个函数中的复合语句中定义了一个变量,则该变量只在该复合语句中有效在该函数中有效在本程序范围内均有效为非法变量
【题8.24】以下不正确的说法为 。
在不同函数中可以使用相同名字的变量形式参数是局部变量在函数内定义的变量只在本函数范围内有效在函数内的复合语句中定义的变量在本函数范围内有效
【题8.25】以下程序的正确运行结果是 。
#define MAX 10
int a[MAX],i;
main()
{
printf(“\n”); sub1(); sub3(a); sub2(); sub3(a);
}
sub2()
{
int a[MAX],i,max;
max=5;
for(i=0;i<max;i++) a[i]=i;
}
sub1()
{
for(i=0;i<MAX;i++) a[i]=i+i;
}
sub3(int a[])
{
int i;
for(i=0;i<MAX;i++) printf(“%d”,a[i]);
printf(“\n”);
}
0 2 4 6 8 10 12 14 16 18
0 1 2 3 4
0 1 2 3 4
0 2 4 6 8 10 12 14 16 18
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4
0 2 4 6 8 10 12 14 16 18
0 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,%d\n”,x,y);
}
A)12,2 B)不确定 C)5,25 D)1,12
【题8.27】凡是函数中未指定存储类型的局部变量,其隐含的存储类别为 。
A)自动(auto) B)静态(static)
C)外部(extern) D)寄存器(register)
【题8.28】在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是 。
A)extern B)register C)auto D)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 7 B)7 10 13 C)7 9 11 D)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(“%d\n”,p);
}
func(int a,int b)
{
static int m=0,i=2;
i+=m+1;
m=i+a+b;
return(m);
}
A)8,17 B)8,16 C)8,20 D)8,8
8.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(“%d\n”,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=%d\n”,i,j,x);
}
fun(int i,int j)
{
int x=7;
printf(“i=%d;j=%d;x=%d\n”,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 %d\n”,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’,‘Y’or‘n’,‘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 %d\n”,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.3f\n”,r);
}
【题8.42】若输入一个整数10,以下程序的运行结果是 。
main()
{
int a,e[10],c,i=0;
printf(“输入一整数\n”);
scanf(“%d”,&a);
while(a!=0)
{
c=sub(a);
a=a/2;
e[i]=c;
i++;
}
for(;i>0;i--) printf(“%d”,e[i-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=%f\n”,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 %d\n”,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=%d\n”,x,y,z);
add(x,y,z);
printf(“(3) x=%d y=%d z=%d\n”,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=%d\n”,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(“\n\n%d!=%lg\n\n”,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 a[10][10],int n)
{
int i,j,k;
j=n/2+1; a[1][j]=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; }
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else { i=i+2; j=j-1; a[i][j]=k; }
}
}
【题8.52】下面函数func的功能是 。
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
long func(long num)
{
long k=1;
num=labs(num);
do{
k*=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):%d\n”,fact(5));
printf(“FACT(1):%d\n”,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:%d\n”,【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=%d\n”,k);
}
【题8.56】以下程序的运行结果是 。
main()
{
int i=5;
printf(“%d\n”,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=%f\n”,x,mysqrt(x,1.0));
}
【题8.58】以下程序的运行结果是 。
#include <stdio.h>
f(int a[])
{
int i=0;
while(a[i]<=10)
{
printf(“%d”,a[i]);
i++;
}
}
main()
{
int a[]={1,5,10,9,11,7};
f(a+1);
}
【题8.59】以下程序的运行结果是 。
main()
{
int a[3][3]={1,3,5,7,9,11,13,15,17}; int sum;
sum=func(a);
printf(“\nsum=%d\n”,sum);
}
func(int a[][3])
{
int i,j,sum=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
a[i][j]=i+j;
if(i==j) sum=sum+a[i][j];
}
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 s[][4])
{
int i,j,k;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{ k=s[i][j]; s[i][j]=s[j][i]; s[j][i]=k; }
main()
{
int s[4][4],i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
s[i][j]=i-j;
f(s);
for(i=0;i<4;i++)
{
printf(“\n”);
for(j=0;j<4;j++)
printf(“%4d”,s[i][j]);
}
}
【题8.61】以下search函数的功能是利用顺序查找法从数组a的10个元素中对关键字m进行查找。顺序查找法的思路是:从第一个元素开始,从前向后依次与关键字比较,直到找到此元素或查找到数组尾部时结束。若找到,返回此元素的下标;若仍未找到,则返回值-1。请填空。
#include <stdio.h>
int search(int a[10],int m)
{
int i;
for(i=0;i<=9;i++) if(【1】) return(i);
return(-1);
}
main()
{
int a[10],m,i,no;
…
no=search(【2】);
if(【3】) printf(“\nOK FOUND!%d”,no+1);
else printf(“\nSorry Not Found!”);
}
【题8.62】已定义一个含有30个元素的数组s,函数fav1的功能是按顺序分别赋予各元素从2开始的偶数,函数fav2则按顺序每五个元素求一个平均值,并将该值存放在数组w中。请填空。
#define SIZE 30
fav1(float s[])
{
int k,i;
for(k=2,i=0;i<SIZE;i++)
{
【1】;
k+=2;
}
}
fav2(float s[],float w[])
{
float sum;
int k,i;
sum=0.0;
for(k=0,i=0;i<SIZE;i++)
{
sum+=s[i];
if((i+1)%5==0)
{
w[k]=sum/5;
【2】;
k++;
}
}
}
main()
{
float s[SIZE],w[SIZE/5],sum;
int i,k;
fav1(s);
fav2(s,w);
}
【题8.63】以下程序的运行结果是【1】,其算法是【2】。
main()
{
int a[5]={5,10,-7,3,7},i,t,j;
sort(a);
for(i=0;i<=4;i++) printf(“%d”,a[i]);
}
sort(int a[])
{
int i,j,t;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
【题8.64】以下程序的运行结果是【1】,其算法是【2】。
main()
{
int a[5]={9,6,8,3,-1},i,t,j,p;
sort(a);
for(i=0;i<=4;i++) printf(“%d”,a[i]);
}
sort(int a[])
{
int i,j,t,p;
for(j=0;j<4;j++)
{
p=j;
for(i=j;i<=4;i++)
if(a[i]<a[p]) p=i;
t=a[p]; a[p]=a[j]; a[j]=t;
}
}
【题8.65】函数del的作用是删除有序数组a中的指定元素x。已有调用语句n=del(a,n,x);其中实参n为删除前数组元素的个数,赋值号左边的n为删除后数组元素的个数。请填空。
del(int a[],int n,int x)
{
int p,i;
p=0;
while(x>=a[p]&&p<n) 【1】;
for(i=p-1;i<n;i++) 【2】;
n=n-1;
return n;
}
【题8.66】以下程序的运行结果是 。
#include <stdio.h>
func(int array[][4],int m)
{
int i,j,k;
k=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]<m)
k=k+array[i][j];
return(k);
}
main()
{
static int a[3][4]={{1,13,5,7},{2,4,26,8},{10,1,3,12}};
int i,j,m;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) printf(“%4d”,a[i][j]);
printf(“\n”);
}
m=10;
printf(“\nthe value is %d\n”,func(a,m));
}
【题8.67】函数swap(int x,int y)可完成对x和y值的交换。在运行调用函数中的如下语句后,a[0]和a[1]的值分别为【1】,原因是【2】。
a[0]=1; a[1]=2;
swap(a[0],a[1]);
【题8.68】函数swap(arr,n)可完成对arr数组从第1个元素到第n个元素两两交换。在运行调用函数中的如下语句后,a[0]和a[1]的值分别为【1】,原因是【2】。
a[0]=1; a[1]=2;
swap(a,2);
【题8.69】以下程序可计算10名学生1门课成绩的平均分,请填空。
float average(float array[10])
{
int i;
float aver,sum=array[0];
for(i=1;【1】;i++) sum+=【2】;
aver=sum/10;
return(aver);
}
main()
{
float score[10],aver;
int i;
printf(“\ninput 10 scores:”);
for(i=0;i<10;i++)
scanf(“%f”,&score[i]);
aver=【3】;
printf(“\naverage score is %5.2f\n”,aver);
}
【题8.70】函数yahui能够按以下形式构成一个杨辉三角形,请填空。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
… … … … … …
#define N 11
yahui(int a[][N])
{
int i,j;
for(i=1;i<N;i++) { a[i][1]=1; a[i][i]=1; }
for(【1】;i<N;i++)
for(j=2;【2】;j++)
a[i][j]=【3】+a[i-1][j];
}
【题8.71】下面程序的功能是:从键盘输入一个整数m(4≤m≤20),则输出如下的整数方阵(存入二维数组aa)。例如,若输入“4”和“5”,则分别输出
16 9 4 1 25 16 9 4 1
9 4 1 16 16 9 4 1 25
4 1 16 9 9 4 1 25 16
1 16 9 4 4 1 25 16 9
1 25 16 9 4
请改正程序中的错误语句,使它能得出正确的结果。改正后的语句是【1】和【2】。(注意:不得增行或删行,也不得更改程序的结构。)
#include <conio.h>
#include <stdio.h>
#define M 20
void aMatrix(int n,int xx[][M])
{
int i,j;
for(j=0;j<n;j++)
xx[0][j]=(n-j)*(n-j);
for(i=1;i<n;i++)
{
for(j=0;j<n;j++) /* 错误语句【1】 */
xx[i][j]=xx[i-1][j+1];
xx[i][n-1]=xx[i-1][0];
}
}
main()
{
int aa[M][M],i,j,m;
printf(“\nPlease enter an integer number between 4 and 20:”);
scanf(“%d”,&m);
aMatrix(m,aa);
printf(“\nThe %d*%d matrix generated:”,m,m);
for(i=0;i<m;i++)
{
printf(“\n”);
for(j=0;j<m;j++)
printf(“%4f”,(*(aa+i))[j]); /* 错误语句【2】 */
}
}
【题8.72】以下程序运行结果是 。
main()
{
int a=1,b=2,c=3;
++a;
c+=++b;
{
int b=4,c;
c=b*3;
a+=c;
printf(“first:%d,%d,%d\n”,a,b,c);
a+=c;
printf(“second:%d,%d,%d\n”,a,b,c);
}
printf(“third:%d,%d,%d\n”,a,b,c);
}
【题8.73】以下程序的运行结果是 。
#include <stdio.h>
int k=1;
main()
{
int i=4;
fun(i);
printf(“(1) %d,%d\n”,i,k);
}
fun(int m)
{
m+=k; k+=m;
{
char k=‘B’;
printf(“(2) %d\n”,k-‘A’);
}
printf(“(3) %d,%d\n”,m,k);
}
【题8.74】以下程序的运行结果是 。
int x1=30,x2=40;
main()
{
int x3=10,x4=20;
sub(x3,x4);
sub(x2,x1);
printf(“%d,%d,%d,%d\n”,x3,x4,x1,x2);
}
sub(int x,int y)
{
x1=x;
x=y;
y=x1;
}
【题8.75】以下程序的运行结果是 。
int i=0;
main()
{
int i=5;
reset(i/2); printf(“i=%d\n”,i);
reset(i=i/2); printf(“i=%d\n”,i);
reset(i/2); printf(“i=%d\n”,i);
workover(i); printf(“i=%d\n”,i);
}
workover(int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf(“i=%d\n”,i);
return(i);
}
reset(int i)
{
i=i<=2?5:0;
return(i);
}
【题8.76】以下程序的运行结果是 。
int a=5; int b=7;
main()
{
int a=4,b=5,c;
c=plus(a,b);
printf(“A+B=%d\n”,c);
}
plus(int x,int y)
{
int z;
z=x+y;
return(z);
}
【题8.77】以下程序的运行结果是 。
int a=3,b=5;
max(a,b)
{
int c;
c=a>b?a:b;
return(c);
}
main()
{
int a=8;
printf(“%d”,max(a,b));
}
【题8.78】以下程序的运行结果是 。
int x;
main()
{
x=5;
cube();
printf(“%d\n”,x);
}
cube()
{
x=x*x*x;
}
【题8.79】以下程序的运行结果是 。
main()
{
incx();
incy();
incx();
incy();
incx();
incy();
}
incx()
{
int x=0;
printf(“x=%d\t”,++x);
}
incy()
{
static int y=0;
printf(“\ny=%d\n”,++y);
}
【题8.80】以下程序的运行结果是 。
main()
{
increment();
increment();
increment();
}
increment()
{
static int x=0;
x+=1;
printf(“%d”,x);
}
【题8.81】以下程序的运行结果是 。
int n=1;
main()
{
static int x=5; int y;
y=n;
printf(“MAIN:x=%2d y=%2d n=%2d\n”,x,y,n);
func();
printf(“MAIN:x=%2d y=%2d n=%2d\n”,x,y,n);
func();
}
func()
{
static int x=4; int y=10;
x=x+2;
n=n+10;
y=y+n;
printf(“FUNC:x=%2d y=%2d n=%2d\n”,x,y,n);
}
【题8.82】以下程序的功能是 。
int fac(int n)
{
static int f=1;
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf(“%d!=%d\n”,i,fac(i));
}
8.3 编程题
【题8.83】已有变量定义和函数调用语句:int a=1,b=-5,c;c=fun(a,b);fun函数的作用是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun函数。
fun(int x,int y)
{ }
【题8.84】已有变量定义和函数调用语句:int x=57; isprime(x);函数isprime()用来判断一个整型数是否为素数,若是素数,函数返回1,否则返回0。请编写isprime函数。
isprime(int a)
{ }
【题8.85】已有变量定义和函数调用语句:int a,b; b=sum(a);函数sum()用以求,和数作为函数值返回。若a的值为10,经函数sum的计算后,b的值是55。请编写sum函数。
sum(int n)
{ }
【题8.86】已有变量定义语句double a=5.0; int n=5;和函数调用语句mypow(a,n);用以求a的n次方。请编写double mypow(double x,int y)函数。
double mypow(double x,int y)
{ }
【题8.87】以下程序的功能是用牛顿法求解方程f(x)=cosx-x=0。已有初始值x0=3.1415/4,要求绝对误差不超过0.001,函数f用计算迭代公式中的值,请编写f函数。牛顿迭代公式是:
即:
#include <stdio.h>
#include <math.h>
#define PI 3.1415
float f(float x0)
{ }
main()
{
int t=0,k=100,n=0;
float x0=PI/4,x1;
while(n<k)
{
x1=f(x0);
if(fabs(x0-x1)<0.001) { t=1; break; }
else { x0=x1; n=n+1; }
}
if(t==1) printf(“\nFangcheng geng is %10.5f”,x1);
else printf(“\nSorry,not found!”);
}
【题8.88】已有函数调用语句c=add(a,b);请编写add函数,计算两个实数a和b的和,并返回和值。
double add(double x,double y)
{ }
【题8.89】以下程序的功能是应用弦截法求方程的根,其中f函数可根据指定的x的值求出方程的值;函数xpoint可根据x1和x2求出f(x1)和f(x2)的连线与x轴的交点;函数root用来求区间(x1,x2)的实根,请编写root函数。
#include <math.h>
float root(float x1,float x2)
{ }
float f(float x) /* 略 */
{ … }
float xpoint(float x1,float x2) /* 略 */
{ … }
main()
{
float x1,x2,f1,f2,x;
do{
printf(“input x1,x2:\n”);
scanf(“%f %f”,&x1,&x2);
printf(“x1=%5.2f,x2=%5.2f\n”,x1,x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf(“A root of equation is %8.4f”,x);
}
【题8.90】以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);请编写p函数。递归公式如下:
float p(int n,int x)
{ }
【题8.91】以下程序的功能是应用下面的近似公式计算e的n次方。函数f1用来计算每项分子的值,函数f2用来计算每项分母的值。请编写f1和f2函数。
(前20项的和)
float f2(int n)
{ }
float f1(int x,int n)
{ }
main()
{
float exp=1.0;
int n,x;
printf(“Input a number:”);
scanf(“%d”,&x);
printf(“%d\n”,x);
exp=exp+x;
for(n=2;n<=19;n++)
exp=exp+f1(x,n)/f2(n);
printf(“\nThe is exp(%d)=%8.4f\n”,x,exp);
}
运行结果:Input a number:3
The is exp(3)=20.0855
【题8.92】a是一个2×4的整型数组,且各元素均已赋值。函数max_value可求出其中的最大元素max,并将此值返回主调函数。今有函数调用语句max=max_value(a);请编写max_value函数。
max_value(int arr[][4])
{ }
【题8.93】输入若干整数,其值均在1至4的范围内,用-1作为输入结束标志,请编写函数f用于统计每个整数的个数。
#define M 50
main()
{
int a[M],c[5]={0},i,n,x;
n=0;
printf(“Enter 1 or 2 or 3 or 4,to end with -1\n”);
scanf(“%d”,&x);
while(x!=-1)
{
if(x>=1&&x<=4) { a[n]=x; n++; }
scanf(“%d”,&x);
}
f(a,c,n);
printf(“Output the result:\n”);
for(i=1;i<=4;i++) printf(“%d:%d\n”,i,c[i]);
printf(“\n”);
}
f(int a[],int c[],int n)
{ }