c程序设计第十章答案武汉理工大学张晓勇版文档格式.docx
- 文档编号:21093381
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:53
- 大小:26.85KB
c程序设计第十章答案武汉理工大学张晓勇版文档格式.docx
《c程序设计第十章答案武汉理工大学张晓勇版文档格式.docx》由会员分享,可在线阅读,更多相关《c程序设计第十章答案武汉理工大学张晓勇版文档格式.docx(53页珍藏版)》请在冰豆网上搜索。
p2=&
if(a<
b)
{p=p1;
p1=p2;
p2=p;
a=%d,b=%d\n"
max=%d,min=%d\n"
*p1,*p2);
10.3指针变量作为函数参数。
voidswap(int*p1,int*p2);
pointer_2=&
b)swap(pointer_1,pointer_2);
\n%d,%d\n"
voidswap(int*p1,int*p2)
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
由于单向传送的值传递方式,形参值的改变不能使实参的值随之改变。
10.4输入a,b,c这三个整数,按大小顺序输出。
voidexchange(int*q1,int*q2,int*q3);
inta,b,c,*p1,*p2,*p3;
%d,%d,%d"
b,&
c);
p3=&
c;
exchange(p1,p2,p3);
\n%d,%d,%d\n"
a,b,c);
voidexchange(int*q1,int*q2,int*q3)
voidswap(int*pt1,int*pt2);
if(*q1<
*q2)swap(q1,q2);
*q3)swap(q1,q3);
if(*q2<
*q3)swap(q2,q3);
voidswap(int*pt1,int*pt2)
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
注意这个交换过程,要理解一下,由于函数单向传送的值传递方式,除了这种方法(运用指针变量做参数)可以得到多个变化的值,还有就是借助全局变量如:
inta,b;
voidexchange(intx,inty);
b)exchange(a,b);
voidexchange(intx,inty)
a=y;
b=x;
这个地方要多理解一下。
引用一个数组元素,可以用:
(1)下标法,如啊a[i]形式;
(2)指针法,如*(a+i)或*(p+i)。
其中a是数组名,p是指向数组元素的指针变量,其初值p=a。
inta[10];
int*p,i;
for(i=0;
i<
10;
i++)
scanf("
%d"
a[i]);
\n"
);
for(p=a;
p<
(a+10);
p++)
%d"
*(p));
这是用指针法引用一个数组的元素。
p=a;
p++);
i++,p++)
*p);
第二个循环之前的p=a;
这个语句的作用。
10.7将数组a中的n个元素按相反的顺序存放。
voidinv(intx[],intn);
inti,a[10]={3,7,9,11,0,6,7,5,4,2};
Theoriginalarray:
printf("
a[i]);
inv(a,10);
Thearrayhasbeeninverted:
voidinv(intx[],intn)
inttemp,i,j,m=(n-1)/2;
=m;
{
j=n-1-i;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
return;
下面这个程序和上面的运行情况一致。
voidinv(int*x,intn);
voidinv(int*x,intn)
int*p,temp,*i,*j,m=(n-1)/2;
i=x;
j=x+n-1;
p=x+m;
for(;
=p;
i++,j--)
temp=*i;
*i=*j;
*j=temp;
全部用指针来编的意义相同的程序:
inti,arr[10]={3,7,9,11,0,6,7,5,4,2};
int*p=arr;
p=arr;
inv(p,10);
for(p=arr;
arr+10;
例10.9用选择法对10个整数按由大到小的顺序排序
voidsort(intx[],intn);
inti,a[10],*p;
sort(p,10);
Thearrayhasbeensorted:
for(p=a,i=0;
voidsort(intx[],intn)
inti,j,k,t;
n-1;
{
k=i;
for(j=i+1;
j<
n;
j++)
if(*(x+j)>
*(x+k))k=j;
if(k!
=i)
{
t=*(x+i);
*(x+i)=*(x+k);
*(x+k)=t;
}
这个程序里的数组元素引用和函数调用(用数组名做函数参数)都是通过指针来引用和调用的。
10.10输出二维数组有关的值。
#defineFORMAT"
inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
printf(FORMAT,a,*a);
printf(FORMAT,a[0],*(a+0));
printf(FORMAT,&
a[0],&
a[0][0]);
printf(FORMAT,a[1],a+1);
a[1][0],*(a+1)+0);
printf(FORMAT,a[2],*(a+2));
a[2],a+2);
printf(FORMAT,a[1][0],*(*(a+1)+0));
例10.11用指针变量输出二维数组元素的值。
int*p;
for(p=*a;
a[0]+12;
if((p-a[0])%4==0)printf("
%4d"
注意一下这个程序的指针:
#include<
int(*p)[4],i,j;
%d%d"
i,&
j);
a[%d,%d]=%d\n"
i,j,*(*(p+i)+j));
10.13用指向数组的指针做函数参数。
voidaverage(float*p,intn);
voidsearch(float(*p)[4],intn);
floatscore[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average(*score,12);
intn;
pleaseinputtheNO."
);
n);
search(score,n-1);
voidaverage(float*p,intn)
float*p_end=p+n-1;
floatsum=0,aver;
=p_end;
sum=sum+(*p);
aver=sum/n;
average=%5.2f\n"
aver);
voidsearch(float(*p)[4],intn)
inti;
thescoreofNO.%dare\n"
n);
4;
%5.2f"
*(*(p+n)+i));
}
10.14查找有一门以上不及格的学生。
floatscore[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};
search(score,3);
inti,j,flag;
for(j=0;
flag=0;
if(*(*(p+j)+i)<
60.00)flag=1;
if(flag==1)
printf("
NO.%dfails,hisscoresare:
j+1);
for(i=0;
*(*(p+j)+i));
在该程序中要注意其中蕴含的那个算法。
在函数search中,flag是最为标志不及格的变量。
先将flag=0若发现某一学生有一门不及格,则使flag=1.
10.19用函数调用实现字符串的复制。
(1)用字符数组作参数
voidcopy_string(charfrom[],charto[]);
char*a="
Iamateacher."
;
char*b="
youareastudent."
\nstringa:
%s\nstringb:
%s\n"
copystringatostringb:
copy_string(a,b);
stringa:
voidcopy_string(charfrom[],charto[])
inti=0;
while(from[i]!
='
\0'
)
to[i]=from[i];
i++;
to[i]='
(2)形参用字符指针变量
voidcopy_string(char*from,char*to);
char*a;
a="
charb[]="
voidcopy_string(char*from,char*to)
*from!
=0;
from++,to++)
*to=*from;
*to='
1,指针变量的值是可以改变的。
2,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。
程序如下:
Ilovechina!
"
thesixthcharecteris%c\n"
a[5]);
a[i]!
%c"
10.5.1用函数指针变量调用函数
intmax(int,int);
int(*p)(int,int);
inta,b,c;
p=max;
c=(*p)(a,b);
a=%d,b=%d,max=%d\n"
intmax(intx,inty)
intz;
z=(x>
y)?
x:
y;
returnz;
10.5.2用指向函数的指针作函数参数。
intmin(int,int);
intadd(int,int);
voidprocess(int,int,int(*fun)(int,int));
pleaseenteraandb:
max="
process(a,b,max);
min="
process(a,b,min);
add="
process(a,b,add);
intmin(intx,inty)
if(x<
y)z=x;
elsez=y;
intadd(intx,inty)
z=x+y;
return(z);
voidprocess(intx,inty,int(*fun)(int,int))
intresult;
result=(*fun)(x,y);
%d\n"
result);
注:
有了以上基础,就可以编写出较为复杂的程序。
如下面这个程序:
math.h>
floatintegral_f1(floatx,floaty);
floatintegral_f2(float,float);
floatintegral_f3(float,float);
floatintegral_f4(float,float);
floatintegral_f5(float,float);
floatintegral(float,float,float(*fun)(float,float));
floata,b;
%f,%f"
\ntheintegralof1+xbetween%fand%f=%f"
a,b,integral(a,b,integral_f1));
\ntheintegralof3+2xbetween%fand%f=%f"
a,b,integral(a,b,integral_f2));
\ntheintegralofexp(x)+1between%fand%f=%f"
a,b,integral(a,b,integral_f3));
\ntheintegralof(1+x)^2between%fand%f=%f"
a,b,integral(a,b,integral_f4));
\ntheintegralofx^3between%fand%f=%f"
a,b,integral(a,b,integral_f5));
floatintegral_f1(floatx,floaty)
floatz;
z=(y+y*y/2)-(x+x*x/2);
floatintegral_f2(floatx,floaty)
z=(y*y+3*y)-(x*x+x*3);
floatintegral_f3(floatx,floaty)
z=(y+exp(y))-(x+exp(x));
floatintegral_f4(floatx,floaty)
z=(pow((y+1),3)-pow((x+1),3))/3;
floatintegral_f5(floatx,floaty)
z=(pow(y,4)-pow(x,4))/4;
floatintegral(floatx,floaty,float(*fun)(float,float))
floatresult;
return(result);
这个程序是和前面的10.5.2这个程序(用指向函数的指针作函数参数)大致相同的,只有较小的差别,注意观察和思考。
10.6返回指针值的函数。
程序为:
floatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
float*search(float(*pointer)[4],intn);
float*p;
inti,m;
pleaseenterthenumberofthestudent:
m);
Thescoresof
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 第十 答案 武汉理工大学 张晓勇版