函数指针部分习题与解答.docx

上传人:b****6 文档编号:7988422 上传时间:2023-01-27 格式:DOCX 页数:14 大小:24.35KB
下载 相关 举报
函数指针部分习题与解答.docx_第1页
第1页 / 共14页
函数指针部分习题与解答.docx_第2页
第2页 / 共14页
函数指针部分习题与解答.docx_第3页
第3页 / 共14页
函数指针部分习题与解答.docx_第4页
第4页 / 共14页
函数指针部分习题与解答.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

函数指针部分习题与解答.docx

《函数指针部分习题与解答.docx》由会员分享,可在线阅读,更多相关《函数指针部分习题与解答.docx(14页珍藏版)》请在冰豆网上搜索。

函数指针部分习题与解答.docx

函数指针部分习题与解答

课堂补充作业

1.1、有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。

源程序如下(8-15.c):

#include

intMax=0,Min=0;

voidmain()

{floataverage(intarray[],intn);

floatave;intscore[10];

inti;

for(i=0;i<10;i++)

scanf(“%f”,&score[i]);

ave=average(score,10);

printf("max=%d\nmin=%d\naverage=%6.2f\n",Max,Min,ave);

}

floataverage(intarray[],intn)

{inti;

floataver;intsum=array[0];

Max=Min=array[0];

for(i=1;i

{if(array[i]>Max)Max=array[i];

elseif(array[i]

sum=sum+array[i];}

aver=(float)sum/n;

return(aver);

}

1.2、在上例题的基础上,再求出超过平均值的人数(建议将数组中的数据用随机数)。

源程序如下(8-151.c):

#include

#include"stdlib.h"

intMax=0,Min=0,NUM=0;

voidmain()

{floataverage(intarray[],intn);

floatave;intscore[10];

inti;

randomize();

for(i=0;i<10;i++)

score[i]=random(100);

for(i=0;i<10;i++)

printf("%4d",score[i]);

printf("\n");

ave=average(score,10);

printf("max=%5d\nmin=%5d\nnum=%4d\naverage=%6.2f\n",Max,Min,NUM,ave);

}

floataverage(intarray[],intn)

{inti;

floataver;intsum=array[0];

Max=Min=array[0];

for(i=1;i

{if(array[i]>Max)Max=array[i];

elseif(array[i]

sum=sum+array[i];

}

aver=(float)sum/n;

for(i=0;i<10;i++)

if(array[i]>aver)NUM++;

return(aver);

}

1.3、如果再将上例题改为:

在函数中使用指针,请编写程序(提示:

函数中用指针形式、数组中的数据用随机数产生)

源程序(8-153.c)

include

#include"stdlib.h"

intMax=0,Min=0,NUM=0;

voidmain()

{floataverage(int*p,intn);

floatave;intscore[10];

inti;

randomize();

for(i=0;i<10;i++)

score[i]=random(100);

for(i=0;i<10;i++)

printf("%4d",score[i]);

printf("\n");

ave=average(score,10);

printf("max=%5d\nmin=%5d\nnum=%4d\naverage=%6.2f\n",Max,Min,NUM,ave);

}

floataverage(int*p,intn)

{inti;

floataver;intsum=array[0];

Max=Min=array[0];

for(i=1;i

{if(*(p+i)>Max)Max=array[i];

elseif(*(p+i)

sum+=*(p+i);

}

aver=(float)sum/n;

for(i=0;i<10;i++)

if(*(p+i)>aver)NUM++;

return(aver);

}

2、输入10个整数,将其中最小数与第一个数交换,把最大数与最后一个交换。

写三个函数分别完成:

(1)输入10个整数;

(2)进行处理;(3)输出10个数,用指针法处理。

源程序8-lt1.c(指针形式)

voidinput(int*a,intn)

{int*p;

for(p=a;p

scanf("%d",p);

}

voidoutput(int*a,intn)

{int*p;

for(p=a;p

printf("%5d",*p);

printf("\n");

}

voidinvert(int*a,intn)

{int*p1,*p2,*p;

inttemp;

p1=p2=a;

for(p=a+1;p

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

elseif(*p<*p2)p2=p;

if(p2==a+n-1&&p1==a)

{temp=*p1;*p1=*p2;*p2=temp;}

else

{temp=*p2;*p2=*a;*a=temp;

temp=*p1;*p1=*(a+n-1);*(a+n-1)=temp;}

}

#defineN10

main()

{intx[N];

intn=N;

input(x,n);

output(x,n);

invert(x,n);

output(x,n);

}

 

源程序8-lt1.c(函数形式)

voidinput(intx[],intn)

{inti;

for(i=0;i

scanf("%d",&x[i]);

}

voidoutput(intx[],intn)

{inti;

for(i=0;i

printf("%5d",x[i]);

printf("\n");

}

voidinvert(intx[],intn)

{inti,m,s;

inttemp;

m=s=0;

for(i=1;i

if(x[i]>x[m])m=i;

elseif(x[i]

printf("%d,%d\n",m,s);

if(s==n-1&&m==0)

{temp=x[m];x[m]=x[s];x[s]=temp;}

else

{temp=x[s];x[s]=x[0];x[0]=temp;

temp=x[m];x[m]=x[n-1];x[n-1]=temp;}

}

#defineN10

main()

{intx[N];

intn=N;

input(x,n);

output(x,n);

invert(x,n);

output(x,n);

}

3、编写函数length(char*s),函数返回指针s所指字符串的长度。

源程序8-lt2.c

s指向字符串首地址

intlength(char*s)

{

intn=0;

while(*(s+n)!

='\0')

n++;/*当s+n没有指向串尾,n增1,直到s+n指向串尾*/

returnn;

}

main()

{

charstr[]="thisisabook";

printf("%d\n",length(str));

}_

结果:

14

源程序8-lt2.c

intlength(char*s)

{

char*p=s;

while(*p)p++;

return(p-s);

}

char*gets(char*s)

main()

{

charstr[10];

gets(str);

printf("%d\n",length(str));

}

4、将字符串a复制到字符串b

源程序8-lt2-2.c

#include"stdio.h"

main()

{charb[15];

char*p2=b;

char*p1="Iamaboy.";

for(;*p1!

='\0';p1++,p2++)

*p2=*p1;

*p2='\0';

printf("strintais:

%s\n",*p1);

printf("strintbis:

%s\n",b);

}

5、已知存放在数组a中的数不相重复,在数组a中查找与值x相等的位置。

若找到,输出该值和该值在数组a中的位置;若没有找到,输出相应的信息。

查找技巧:

边界单元存放要查找的数,循环一定能结束,结束时的下标i就暗示着查找是否成功。

(边界单元:

最后元素之后的一个单元)。

本例采用顺序查找法进行数据查找。

源程序:

(指针形式8-lt3.c一般程序8-lt31.c)

#defineNUM20

intinput(int*a)

{inti,n;

printf("Enternumbertoelements,0

",NUM);

scanf("%d:

",&n);

for(i=0;i

scanf("%d",a+i);

returnn;

}

intsearch(int*a,intn,intx)

{inti,p;

i=0;

a[n]=x;

while(x!

=a[i])i++;

if(i==n)p=-1;

elsep=i;

returnp;

}

main()

{inta[NUM],x,n,p;

n=input(a);

printf("enterthenumbertosearch:

x=");

scanf("%d",&x);

p=search(a,n,x);

if(p!

=-1)printf("%dindexis:

%d\n",x,p);

elseprintf("%dcannotbefound!

\n",x);

}

6、有n个数,使其前面各数顺序向后移m位置,最后m个数变成最前面的m个数。

写一个函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数

源程序lt8-4.c

#include"stdlib.h"

#defineN10

main()

{voidmove(intarr[10],int,int);

intnum[N],n,m,i;

for(i=0;i

num[i]=random(100);

printf("howmanynumbers");

printf("%d\n",n=N);

for(i=0;i

printf("%4d",num[i]);

printf("\nhowmanyplaceyouwantmove?

");

scanf("%d",&m);

move(num,n,m);

printf("\n");

for(i=0;i<10;i++)

printf("%4d",num[i]);

printf("\n");

}

voidmove(intarr[],intn,intm)

{int*p,arr_end;

arr_end=*(arr+n-1);

for(p=arr+n-1;p>arr;p--)

*p=*(p-1);

*arr=arr_end;

m--;

if(m>0)move(arr,n,m);

}

7、有一字符串,包含n个字符。

写一函数,将此字符串中从第m个字符开始的全部字符复制成另一个字符串。

源程序:

lt5.c

#include"string.h"

voidmain()

{voidcopystr(char*,char*,int);

intm;

charstr1[20],str2[20];

printf("\ninputstring:

");

gets(str1);

printf("whichcharcterthatbegingocopy?

");

scanf("%d",&m);

if(strlen(str1)

");

else{copystr(str1,str2,m);

printf("result:

%s\n",str2);}

}

voidcopystr(char*p1,char*p2,intm)

{intn=0;

while(n

{n++;p1++;}

while(*p1!

='\0')

{*p2=*p1;

p1++;p2++;}

*p2='\0';

}

 

例9.8w数组中存放n个数,编写函数删除下标为k的元素中的值

程序ltp120.c

#include"stdlib.h"

#defineNUM15

intarrdel(int*,int,int);

voidarrout(int*,int);

intgetindex(intn);

main()

{intn,d,a[NUM]={21,13,24,15,26,27,28,29,30};

n=NUM;

printf("outputoldprimarydata:

\n");

arrout(a,n);

d=getindex(n);

n=arrdel(a,n,d);

printf("outputthedataafterprimary\n");

arrout(a,n);

}

voidarrout(intw[],intm)

{intk;

for(k=0;k

printf("%4d",w[k]));

printf("\n");

}

intarrdel(intw[],intn,intk)

{inti,;

for(i=k;i

w[i]=w[i+1];

n--;

returnn;

}

intgetindex(intn)

{inti;

do

{printf("\nentertheindex[0<=i<%d]",n);

scanf("%d",&i);

}while(i<0||i>n-1);

returni;

}

编写函数,对具有10整数的数组进行如下操作:

从第n个元素开始直到最后一个元素,依次向前移一位,输出移动后的结果。

(不考虑移出的元素)

程序xt928.c

#include"stdlib.h"

#include"stdio.h"

#defineNUM15

intmoves(int*,int,int);

voidarrout(int*,int);

main()

{intn=NUM;

inta[NUM],d,i;

for(i=0;i

a[i]=random(100);

printf("outputoldprimarydata:

\n");

arrout(a,n);

printf("howmovesthedata:

");

scanf("%d",&d);3

n=moves(a,n,d);

printf("outputthedataafterprimary\n");

arrout(a,n);

}

voidarrout(int*w,intm)

{inti;

for(i=0;i

printf("%4d",*(w+i));

printf("\n");

}

intmoves(int*w,intn,intm)

{inti;

for(i=m;i

*(w+i)=*(w+i+1);

n--;

returnn;

}

如果将移出的元素存放在数组最后moves函数如下:

intmoves(int*w,intn,intm)

{inti,end=*(w+m);

for(i=m;i

*(w+i)=*(w+i+1);

/*n--;*/

*(w+n-1)=end;

returnn;

}

22、写一函数,完成字符串逆序重放,要求主函数输入和输出字符串。

#include"stdio.h"

#include"string.h"

/*#include"ctype.h"*/

main()

{voidret(charx[],intm);

chars1[80];intn;

scanf("%s",s1);

n=strlen(s1);

ret(s1,n);

printf("%s",s1);

printf("\n");

}

voidret(charx[],intm)

{inti,j,t,k=(m-1)/2;

for(i=0;i

{j=m-1-i;

t=x[i];x[i]=x[j];x[j]=t;}

return;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1