C语言习题及答案第十章.docx

上传人:b****3 文档编号:3651341 上传时间:2022-11-24 格式:DOCX 页数:14 大小:19.03KB
下载 相关 举报
C语言习题及答案第十章.docx_第1页
第1页 / 共14页
C语言习题及答案第十章.docx_第2页
第2页 / 共14页
C语言习题及答案第十章.docx_第3页
第3页 / 共14页
C语言习题及答案第十章.docx_第4页
第4页 / 共14页
C语言习题及答案第十章.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C语言习题及答案第十章.docx

《C语言习题及答案第十章.docx》由会员分享,可在线阅读,更多相关《C语言习题及答案第十章.docx(14页珍藏版)》请在冰豆网上搜索。

C语言习题及答案第十章.docx

C语言习题及答案第十章

10-2定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r.

解:

inta,b,c,d,e,f,x,y,z;

int*p,*q,*r;

p=&a;q=&b;r=&c;

p=&d;q=&e;r=&f;

p=&x;q=&y;r=&z;

printf(“%l,%l,%l”,p,q,r);

printf(“%d,%d,%d”,*p,*q,*r);

思考:

指针也是一种数据类型吗?

他可以不依赖其它数据类型而独立存在吗?

10-3应用指针,实现10个整数从打到小的排序输出。

解:

#include"stdio.h"

voidmain()

{

inti,j,a[10],*p,t;

printf("请输入10个整数:

\n");

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

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

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

{

p=&a[i];

for(j=i+1;j<10;j++)

if(a[j]>*p)p=&a[j];

t=*p;*p=a[i];a[i]=t;

}

printf("排序后的数组为:

\n");

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

printf("%d,",a[i]);

}

思考:

指针变量的值可以由键盘输入确定吗?

它与其所指类型的变量值之间的关系如何?

10-4应用指针,求n个数的最小值和最大值。

解:

#include"stdio.h"

#defineL100

voidmain()

{

inti,n,a[L],*max,*min;

printf("请确定欲输入数据的个数(<100):

");

scanf("%d",&n);

printf("下面请依次输入%d的个数\n",n);

for(i=0;i

{

printf("第%d的个数:

",i+1);

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

}

max=min=&a[0];

for(i=0;i

{

if(a[i]>*max)max=&a[i];

if(a[i]<*min)min=&a[i];

}

printf("最大值=%4d,最小值=%4d\n",*max,*min);

}

思考:

指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计?

10-5应用指针,编写下列字符串处理函数:

(1)字符串的复制函数。

(2)字符串的连接函数。

解:

#include"stdio.h"

voidcopy_string(char*from,char*to)

{

for(;*from!

='\0';from++,to++)

*to=*from;

*to='\0';

}

voidlink_string(char*from,char*to)

{

for(;*to!

='\0';to++);

for(;*from!

='\0';from++,to++)

*to=*from;

*to='\0';

}

voidmain()

{

chara[16]="Iamateacher.";

charb[40]="youareastudent.";

printf("复制与连接之前:

\nstring_a=%s\nstring_b=%s\n",a,b);

copy_string(a,b);

printf("复制之后:

\nstring_a=%s\nstring_b=%s\n",a,b);

link_string(a,b);

printf("连接之后:

\nstring_a=%s\nstring_b=%s\n",a,b);

}

思考:

字符指针与字符数组的主要区别是什么?

字符数组名代表什么?

它与字符指针有何本质的区别?

此程序连接之后的输出结果是什么?

10-6应用指针,求一矩阵中行为最大,列为最小的元素。

解:

#include"stdio.h"

#defineN5

voidmain()

{

inti,j,a[N][N],*p,(*q)[N],max_min,k,n,flag=0;

printf("请输入数组的个元素的值:

\n");

for(i=0;i

for(j=0;j

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

for(i=0;i

{

printf("\n");

for(j=0;j

printf("%d",a[i][j]);

}

for(i=0;i

{

k=0;

p=&a[i][0];max_min=*p;

for(j=0;p=a[i]+N;p++,j++);

if(max_min<*p){max_min=*p;k=j;}

q=a;n=0;

for(;q

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;i

scanf("%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;i

a[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;j

scanf("%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(x

return1;

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;j

if((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是什么类型?

函数名是否也具有变量的特性?

它存放着什么?

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

当前位置:首页 > 工程科技 > 能源化工

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

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