C语言习题及答案第十章Word格式.docx
《C语言习题及答案第十章Word格式.docx》由会员分享,可在线阅读,更多相关《C语言习题及答案第十章Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
,&
a[i]);
9;
{
a[i];
for(j=i+1;
j<
j++)
if(a[j]>
*p)p=&
a[j];
t=*p;
*p=a[i];
a[i]=t;
}
排序后的数组为:
%d,"
a[i]);
}
指针变量的值可以由键盘输入确定吗?
它与其所指类型的变量值之间的关系如何?
10-4应用指针,求n个数的最小值和最大值。
#defineL100
inti,n,a[L],*max,*min;
请确定欲输入数据的个数(<
100):
"
n);
下面请依次输入%d的个数\n"
n);
n;
第%d的个数:
"
i+1);
max=min=&
a[0];
if(a[i]>
*max)max=&
a[i];
if(a[i]<
*min)min=&
}
最大值=%4d,最小值=%4d\n"
*max,*min);
指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计?
10-5应用指针,编写下列字符串处理函数:
(1)字符串的复制函数。
(2)字符串的连接函数。
voidcopy_string(char*from,char*to)
for(;
*from!
='
\0'
;
from++,to++)
*to=*from;
*to='
voidlink_string(char*from,char*to)
*to!
to++);
chara[16]="
Iamateacher."
charb[40]="
youareastudent."
复制与连接之前:
\nstring_a=%s\nstring_b=%s\n"
a,b);
copy_string(a,b);
复制之后:
link_string(a,b);
连接之后:
字符指针与字符数组的主要区别是什么?
字符数组名代表什么?
它与字符指针有何本质的区别?
此程序连接之后的输出结果是什么?
10-6应用指针,求一矩阵中行为最大,列为最小的元素。
#defineN5
inti,j,a[N][N],*p,(*q)[N],max_min,k,n,flag=0;
请输入数组的个元素的值:
N;
for(j=0;
a[i][j]);
i++)//输出数组元素的值
a[i][j]);
k=0;
a[i][0];
max_min=*p;
p=a[i]+N;
p++,j++);
if(max_min<
*p){max_min=*p;
k=j;
q=a;
n=0;
q<
a+N;
q++,n++)
if(max_min>
*(*q+k))break;
if(n==N)
flag=1;
\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个数的最大公约数和最小公倍数。
#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)//求两个数的最小公倍数
t=gys(x,y);
returnx*y/t;
intn,i,a[N],*p=a;
intt1=*p,t2=*p;
//用t1记最大公约数,t2记最小公倍数
请确定数据的个数n(<
50):
请输入%d个数据的值:
//intt1=*p,t2=*p;
n-1;
t1=gys(t1,*(p+i+1));
t2=gbs(t2,*(p+i+1));
最大公约数为%d,最小公倍数为%d:
t1,t2);
“t1=gys(t1,*(p+i+1))”语句的功能是什么?
能否用数组小标元素直接处理?
试比较之。
10-9有N个人围成一圈,顺序编号,从第一个人开始按1、2、3顺序报数,凡报到3的人退出圈子,然后从出圈的下一个人开始重复此过程。
应用指针,输出出圈序列。
#defineN100
inta[N],i,k,n,m,*p;
请输入人数(<
100):
a[i]=i+1;
//为每个人编号
p=a;
i=0;
//小标计数标量
k=0;
//1,2,3报数时的计数变量
m=0;
//退出人数的计数器的变量
while(m<
n)
if(*(p+i)!
=0)k++;
if(k==3)
*(p+i));
*(p+i)=0;
//将退出的编号置为0
m++;
i++;
if(i==n)i=0;
//报数到尾后,i应恢复为0
此题不用指针也可以完成,应做哪些修改?
此题不用数组是否也可以实现其计算过程?
10-10应用指针,完成数组的关系运算。
对于数组a、b,a>
b成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,a<
b、a=b类似定义。
#defineN2
inta[2][N],t[2]={0,0};
inti,j,*p1,*p2;
2;
请输入第%d个数组的元素\n"
if(i==0)p1=a[0],p2=a[1];
elsep1=a[1],p2=a[0];
if(*(p1+j)>
*(p2+j))
t[i]++;
if(t[0]>
t[1])
第一个数组大于第二个数组\n"
elseif(t[0]==t[1])
第一个数组等于第二个数组\n"
else
第一个数组小于第二个数组\n"
思考:
程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?
在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?
10-11应用指针编写程序,判断空间中的一个点是否在一立方体内。
structpoint
floatx;
floaty;
floatz;
intflag(floatx,intlz,floaty)
if(x<
y&
&
y<
x+lz)
return1;
return0;
structpointpld,yp;
//pld、yp分别表示立方体左下角和空间中的任一点
int(*p)(float,int,float),lch;
请输入立方体左下角坐标和棱长:
%f,%f,%f,%d"
pld.x,&
pld.y,&
pld.z,&
lch);
请输入空间中的一点坐标:
%f,%f,%f"
pld.z);
p=flag;
//建立函数指针关联
if((*p)(pld.x,lch,yp.x)&
(*p)(pld.y,lch,yp.y)&
(*p)(pld.z,lch,yp.z))
此点在立方体内\n"
此点不在立方体内\n"
函数flag()的功能是什么?
若要判断空间中的点是否在一长方体内,程序应如何修改?
10-12应用指针,定义一个函数strcmp(),实现两个字符串s1和s2的比较。
如果s1=s2,则返回值为0;
如果s1!
=s2,则返回它们它们第一个不同字符ASCII码差值,并且若s1>
s2,则输出正值,是s1<
s2,则输出负值。
inti,resu;
voidstrcmp(char*p1,char*p2);
char*s1,*s2;
请输入字符串1:
gets(s1);
请输入字符串2:
gets(s2);
strcmp(s1,s2);
%s与%s比较的结果是%d\n"
s1,s2,resu);
voidstrcmp(char*p1,char*p2)
*p1==*p2&
(*p1!
p1++,p2++);
if(*p1=='
*p2=='
)resu=0;
resu=*p1-*p2;
在主函数main()中,为何要加语句“voidstrcmp(char*p1,char*p2);
”?
指针增加、减少及其它运算从理论上讲一般是可行的,但在指针运算从理论运算时,应注意哪些情况的发生?
10-13输入10个国家的名称,排序输出。
(1)用指针数组的实现。
(2)用指向指针的指针实现。
(1)/*用指针数组实现*/
string.h"
malloc.h"
inti,j;
char*cm[10],*t=(char*)malloc(20);
请输入各个国家的名称(<
20个字符):
cm[i]=(char*)malloc(20);
gets(cm[i]);
if((strcmp(cm[i],cm[j]))>
0)
strcpy(t,cm[i]);
strcpy(cm[i],cm[j]);
strcpy(cm[j],t);
排序后为:
\n"
%s\n"
cm[i]);
(2)/*用指向指针的指针实现*/
#defineN10
char*cm[N],**p=cm;
//p借用cm的第一个存储单元
char*t=(char*)malloc(20);
//交换时的中介指针变量
N-1;
{
*p=cm[i];
*p=cm[0];
p++;
*p++);
指针数组在处理哪些问题时更有效?
指向指针的指针有何特点?
在使用时应注意哪些问题?
在字符串输入语句“gets(cm[i]);
”前加“cm[i]=(char*)malloc(20);
”语句的作用是什么?
10-14定义一个用二分法解下列方程通用的函数。
(1) 1−x+x3=0。
(2) sin(x)−x=0。
(3) ex −=0。
math.h"
floatf1(),f2(),f3();
floatinit();
floata,b,e;
请输入函数f1(x)的求解区间与精度要求(a,b,e):
%f,%f,%f,"
a,&
b,&
e);
init(f1,a,b,e);
请输入函数f2(x)的求解区间与精度要求(a,b,e):
init(f2,a,b,e);
请输入函数f3(x)的求解区间与精度要求(a,b,e):
init(f3,a,b,e);
floatf1(x)
floatx;
floatf;
f=x*x*x-x+1;
returnf;
floatf2(x)
f=sin(x)-x;
floatf3(x)
f=exp(x)-sqrt(x);
floatinit(fun,a,b,e)
float(*fun)(),a,b,e;
intk=0;
charsig;
floatc,d;
if(fun(a)*fun(b)>
此区间无解!
return0;
次数区间a断点区间b断点近似解c函数值符号\n"
d=fabs(b-a);
while(d>
e)
c=(a+b)/2.0;
if(fun(c)<
0)sig='
-'
;
elsesig='
+'
%3d%15.6f%15.6f%15.6f%c\n"
k,a,b,c,sig);
if(fun(c)*fun(a)<
b=c;
a=c;
d=fabs(b-a);
k++;
returnc;
在函数floatinit(fun,a,b,e)中,参数fun是什么类型?
函数名是否也具有变量的特性?
它存放着什么?