if(max_min>*(*q+k))break;
if(n==N)
{
flag=1;
printf("\n满足条件的元素为第%d行第%d列的:
%d\n",i+1,k+1,max_min);
}
}
if(flag!
=1)printf("\n没有满足条件的元素!
");
}
思考:
此题与习题8-13类似,请比较这两种不同方式表示的程序,它们各有何特点?
10-7应用指针,完成复数的加,减运算。
解:
(略,参见习题9-13。
)
10-8应用指针,求n个数的最大公约数和最小公倍数。
解:
#include"stdio.h"
#defineN50
intgys(intx,inty)//求两个数的最大公约数
{
intt;
if(y>x){t=x;x=y;y=t;}
while(y!
=0)
{
t=x%y;
x=y;
y=t;
}
returnx;
}
intgbs(intx,inty)//求两个数的最小公倍数
{
intt;
t=gys(x,y);
returnx*y/t;
}
voidmain()
{
intn,i,a[N],*p=a;
intt1=*p,t2=*p;//用t1记最大公约数,t2记最小公倍数
printf("请确定数据的个数n(<50):
");
scanf("%d",&n);
printf("请输入%d个数据的值:
\n",n);
for(i=0;iscanf("%d",&a[i]);
//intt1=*p,t2=*p;//用t1记最大公约数,t2记最小公倍数
for(i=0;i{
t1=gys(t1,*(p+i+1));
t2=gbs(t2,*(p+i+1));
}
printf("最大公约数为%d,最小公倍数为%d:
\n",t1,t2);
}
思考:
“t1=gys(t1,*(p+i+1))”语句的功能是什么?
能否用数组小标元素直接处理?
试比较之。
10-9有N个人围成一圈,顺序编号,从第一个人开始按1、2、3顺序报数,凡报到3的人退出圈子,然后从出圈的下一个人开始重复此过程。
应用指针,输出出圈序列。
解:
#include"stdio.h"
#defineN100
voidmain()
{
inta[N],i,k,n,m,*p;
printf("请输入人数(<100):
");
scanf("%d",&n);
for(i=0;ia[i]=i+1;//为每个人编号
p=a;
i=0;//小标计数标量
k=0;//1,2,3报数时的计数变量
m=0;//退出人数的计数器的变量
while(m{
if(*(p+i)!
=0)k++;
if(k==3)
{
printf("%d,",*(p+i));
*(p+i)=0;//将退出的编号置为0
k=0;
m++;
}
i++;
if(i==n)i=0;//报数到尾后,i应恢复为0
}
}
思考:
此题不用指针也可以完成,应做哪些修改?
此题不用数组是否也可以实现其计算过程?
10-10应用指针,完成数组的关系运算。
对于数组a、b,a>b成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,a
解:
#include"stdio.h"
#defineN2
voidmain()
{
inta[2][N],t[2]={0,0};
inti,j,*p1,*p2;
for(i=0;i<2;i++)
{
printf("请输入第%d个数组的元素\n",i+1);
for(j=0;jscanf("%d",&a[i][j]);
}
for(i=0;i<2;i++)
{
if(i==0)p1=a[0],p2=a[1];
elsep1=a[1],p2=a[0];
for(j=0;j{
if(*(p1+j)>*(p2+j))
t[i]++;
}
}
if(t[0]>t[1])
printf("第一个数组大于第二个数组\n");
elseif(t[0]==t[1])
printf("第一个数组等于第二个数组\n");
else
printf("第一个数组小于第二个数组\n");
}
思考:
程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?
在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?
10-11应用指针编写程序,判断空间中的一个点是否在一立方体内。
解:
#include"stdio.h"
structpoint
{
floatx;
floaty;
floatz;
}
intflag(floatx,intlz,floaty)
{
if(xreturn1;
return0;
}
voidmain()
{
structpointpld,yp;//pld、yp分别表示立方体左下角和空间中的任一点
int(*p)(float,int,float),lch;
printf("请输入立方体左下角坐标和棱长:
");
scanf("%f,%f,%f,%d",&pld.x,&pld.y,&pld.z,&lch);
printf("请输入空间中的一点坐标:
");
scanf("%f,%f,%f",&pld.x,&pld.y,&pld.z);
p=flag;//建立函数指针关联
if((*p)(pld.x,lch,yp.x)&&(*p)(pld.y,lch,yp.y)&&(*p)(pld.z,lch,yp.z))
printf("此点在立方体内\n");
else
printf("此点不在立方体内\n");
}
思考:
函数flag()的功能是什么?
若要判断空间中的点是否在一长方体内,程序应如何修改?
10-12应用指针,定义一个函数strcmp(),实现两个字符串s1和s2的比较。
如果s1=s2,则返回值为0;如果s1!
=s2,则返回它们它们第一个不同字符ASCII码差值,并且若s1>s2,则输出正值,是s1解:
#include"stdio.h"
inti,resu;
voidmain()
{
voidstrcmp(char*p1,char*p2);
char*s1,*s2;
printf("请输入字符串1:
");
gets(s1);
printf("请输入字符串2:
");
gets(s2);
strcmp(s1,s2);
printf("%s与%s比较的结果是%d\n",s1,s2,resu);
}
voidstrcmp(char*p1,char*p2)
{
for(;*p1==*p2&&(*p1!
='\0');p1++,p2++);
if(*p1=='\0'&&*p2=='\0')resu=0;
else
resu=*p1-*p2;
}
思考:
在主函数main()中,为何要加语句“voidstrcmp(char*p1,char*p2);”?
指针增加、减少及其它运算从理论上讲一般是可行的,但在指针运算从理论运算时,应注意哪些情况的发生?
10-13输入10个国家的名称,排序输出。
(1)用指针数组的实现。
(2)用指向指针的指针实现。
解:
(1)/*用指针数组实现*/
#include"stdio.h"
#include"string.h"
#include"malloc.h"
voidmain()
{
inti,j;
char*cm[10],*t=(char*)malloc(20);
printf("请输入各个国家的名称(<20个字符):
\n");
for(i=0;i<10;i++)
{
cm[i]=(char*)malloc(20);
gets(cm[i]);
}
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if((strcmp(cm[i],cm[j]))>0)
{
strcpy(t,cm[i]);
strcpy(cm[i],cm[j]);
strcpy(cm[j],t);
}
printf("排序后为:
\n");
for(i=0;i<10;i++)
printf("%s\n",cm[i]);
}
(2)/*用指向指针的指针实现*/
#include"stdio.h"
#include"string.h"
#include"malloc.h"
#defineN10
voidmain()
{
inti,j;
char*cm[N],**p=cm;//p借用cm的第一个存储单元
char*t=(char*)malloc(20);//交换时的中介指针变量
printf("请输入各个国家的名称(<20个字符):
\n");
for(i=0;i{
cm[i]=(char*)malloc(20);
gets(cm[i]);
}
for(i=0;i{
*p=cm[i];
for(j=i+1;jif((strcmp(cm[i],cm[j]))>0)
{
strcpy(t,cm[i]);
strcpy(cm[i],cm[j]);
strcpy(cm[j],t);
}
}
*p=cm[0];p++;
printf("排序后为:
\n");
for(i=0;i<10;i++)
printf("%s\n",*p++);
}
思考:
指针数组在处理哪些问题时更有效?
指向指针的指针有何特点?
在使用时应注意哪些问题?
在字符串输入语句“gets(cm[i]);”前加“cm[i]=(char*)malloc(20);”语句的作用是什么?
10-14定义一个用二分法解下列方程通用的函数。
(1) 1−x+x3=0。
(2) sin(x)−x=0。
(3) ex −=0。
解:
#include"stdio.h"
#include"math.h"
voidmain()
{
floatf1(),f2(),f3();
floatinit();
floata,b,e;
printf("请输入函数f1(x)的求解区间与精度要求(a,b,e):
");
scanf("%f,%f,%f,",&a,&b,&e);
init(f1,a,b,e);
printf("请输入函数f2(x)的求解区间与精度要求(a,b,e):
");
scanf("%f,%f,%f,",&a,&b,&e);
init(f2,a,b,e);
printf("请输入函数f3(x)的求解区间与精度要求(a,b,e):
");
scanf("%f,%f,%f,",&a,&b,&e);
init(f3,a,b,e);
}
floatf1(x)
floatx;
{
floatf;
f=x*x*x-x+1;
returnf;
}
floatf2(x)
floatx;
{
floatf;
f=sin(x)-x;
returnf;
}
floatf3(x)
floatx;
{
floatf;
f=exp(x)-sqrt(x);
returnf;
}
floatinit(fun,a,b,e)
float(*fun)(),a,b,e;
{
intk=0;charsig;
floatc,d;
if(fun(a)*fun(b)>0)
{
printf("此区间无解!
\n");
return0;
}
printf("次数区间a断点区间b断点近似解c函数值符号\n");
d=fabs(b-a);
while(d>e)
{
c=(a+b)/2.0;
if(fun(c)<0)sig='-';
elsesig='+';
printf("%3d%15.6f%15.6f%15.6f%c\n",k,a,b,c,sig);
if(fun(c)*fun(a)<0)
b=c;
else
a=c;
d=fabs(b-a);
k++;
}
returnc;
}
思考:
在函数floatinit(fun,a,b,e)中,参数fun是什么类型?
函数名是否也具有变量的特性?
它存放着什么?