同步训练7-3答案
一、单项选择题
1.在说明语句:int (*p)(char c ,double d);中,下列说法正确是( C )。
A.*p表示的是指针变量p的值
B.*p表示的是函数地址
C.p表示的是函数入口地址
D.p表示的是函数名
2.以下程序段中在下划线处,正确的c语言数组最大值最小值调用语句是( A )。
int fun(int *x,int *y)
{………. return 0;}
int main( )
{
int a=10,b=20;
int (*p)(int *,int *); //定义变量p
p=fun;
;
return 0;
}
A.p(&a,&b); B.(*p)(*a,*b);
C.(*p)(a,b); D.*p(&a,&b);
3.在说明语句:int (*p)(char c ,double d);中,int 表示的是( D )。
A.函数指针变量p的类型
B.函数的类型
C.函数指针变量p所指向的地址中值的类型
D.函数指针变量p所指向的函数的返回值类型
4.以下程序段中在下划线处,不正确的调用语句是( C )。
int fun(int *x,int *y)
{……….return 0;}
void pro(int *p1,int *p2,int (*p)(int *,int *))
{ fun(p1,p2);}
int main( )
{
int a=10,b=20;
int (*p)(int *,int *); //定义变量p
p=fun;
;
return 0;
}
A.(*p)(&a,&b); B.p(&a,&b);
C.pro(&a,&b,fun()); D.pro(&a,&b,fun);
5.在说明语句:int *p( );中,标识符p代表是( A )。
A.一个返回值为指针型的函数名
B.一个用于指向整型数据的指针变量
C.一个用于指向一维数组的指针
D.一个用于指向函数的指针变量
二、填空题
1.以下程序通过函数指针p调用函数fun,请写出定义变量p的语句。
void fun(int *x,int *y)
{ ...... }
int main( )
{
int a=1,b=2;
void (*p)(int *,int *) ;
p=fun; p(&a,&b);
......
}
2.有函数int fun(int *)和int Pro (int *,int (*p)(int *)),main ()通过调用函数Pro实现调用函数fun,请把Pro()填写完整。
int Pro (int *p, int (*f)(int *) )
{
return f(p) ;
}
int main()
{
int a[10]={0};
Pro( a, fun );
…….
}
3.若有以下定义和语句,则*p[0]引用的数组元素 a[0] ;*(p[1]+1)引用的是数组元素 a[4] 。
int *p[3],a[9],i;
for (i=0;i<3;i++) p[i]=&a[3*i];
4.以下程序完成查某个数字在数组a中的位置的功能,请填空。
#include <stdio.h>
int *find(int a[ ],int n,int x)
{
int i=0;
while(i<n&&*a!=x)
a++ ,i++;
if(i<n) return a;
else return NULL;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p,x;
printf("寻哪个数?\n");
scanf("%d",&x);
p=find(a,10,x);
if(p!=NULL) printf("%d在a[%d]",x,p-a);
return 0;
}
三、程序设计题
1.设计一个函数,出N行M列的二维数组中的最大值和其地址,通过形参传回最大值,而最大值的地址由该函数return语句返回。在主函数中输出数组首址、最大值和其地址。
程序代码:
#include <stdio.h>
#define N 3
#define M 3
int *select(int a[N][M],int *n)
{
int i,j,row=0, colum=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum])
{
row=i;
colum=j;
}
*n=a[row][colum];
return a[0]+row*N+colum;
}
int main( )
{
int a[N][M]={99,311,423,6,1,15,9,17,20},max,*p;
p=select(a,&max);
printf("数组首址=%p,最大值=%d,其地址=%p\n",a[0],max,p);
return 0;
}
2.求M行N列二维数组中的最大值、最小值及所在的下标。所有输入输出在主函数中完成,使用函数指针作为函数参数调用求最大值、最小值的功能函数。
程序代码:
#include <stdio.h>
#define M 3
#define N 4
void fmax(int a[][N],int *l,int *r)
{
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]>a[*l][*r])
{
*l=i;
*r=j;
}
}
void fmin(int a[][N],int *l,int *r)
{
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]<a[*l][*r])
{
*l=i;
*r=j;
}
}
void pro(int a[][N],int *l,int *r,void (*f)(int [][N],int *,int *))
{
f(a,l,r);
}
int main( )
{
int a[M][N],i,j,line=0,row=0;
printf("请输入一个%d行%d列的数组:",M,N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
pro(a,&line,&row,fmax);
printf("最大值=%d,其下标为%d %d\n",a[line][row],line,row);
pro(a,&line,&row,fmin);
printf("最小值=%d,其下标为%d %d\n",a[line][row],line,row);
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论