实验8指针参考答案.docx

上传人:b****2 文档编号:314793 上传时间:2023-04-28 格式:DOCX 页数:27 大小:49.16KB
下载 相关 举报
实验8指针参考答案.docx_第1页
第1页 / 共27页
实验8指针参考答案.docx_第2页
第2页 / 共27页
实验8指针参考答案.docx_第3页
第3页 / 共27页
实验8指针参考答案.docx_第4页
第4页 / 共27页
实验8指针参考答案.docx_第5页
第5页 / 共27页
实验8指针参考答案.docx_第6页
第6页 / 共27页
实验8指针参考答案.docx_第7页
第7页 / 共27页
实验8指针参考答案.docx_第8页
第8页 / 共27页
实验8指针参考答案.docx_第9页
第9页 / 共27页
实验8指针参考答案.docx_第10页
第10页 / 共27页
实验8指针参考答案.docx_第11页
第11页 / 共27页
实验8指针参考答案.docx_第12页
第12页 / 共27页
实验8指针参考答案.docx_第13页
第13页 / 共27页
实验8指针参考答案.docx_第14页
第14页 / 共27页
实验8指针参考答案.docx_第15页
第15页 / 共27页
实验8指针参考答案.docx_第16页
第16页 / 共27页
实验8指针参考答案.docx_第17页
第17页 / 共27页
实验8指针参考答案.docx_第18页
第18页 / 共27页
实验8指针参考答案.docx_第19页
第19页 / 共27页
实验8指针参考答案.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验8指针参考答案.docx

《实验8指针参考答案.docx》由会员分享,可在线阅读,更多相关《实验8指针参考答案.docx(27页珍藏版)》请在冰点文库上搜索。

实验8指针参考答案.docx

实验8指针参考答案

C语言程序设计实验教学(8)

【实验目的】指针是C语言中非常重要的一章内容。

通过实验让学生掌握各类指针的定义与引用、指针作为函数参数的应用、字符指针的应用、函数指针的应用。

【实验要求】使用指针来完成变量的引用,编写程序将指针作为参数进行传递,理解指针的含义。

【实验课时】10.0

【实验内容】

1.上机编程实现用函数来将从键盘上输入的三个数按由小到大的顺序输出。

要求编写自定义函数swap()用于交换两个变量的值;且函数原型为:

voidswap(int*p1,int*p2);;并在main函数中用指针变量作为实际参数调用函数swap();

最后输出排序后的结果。

#include

main()

{voidswap(int*p1,int*p2);

intn1,n2,n3;int*p1,*p2,*p3;

printf("Inputthreeintegersn1,n2,n3:

");

scanf("%d,%d,%d",&n1,&n2,&n3);

p1=&n1;p2=&n2;p3=&n3;

if(n1>n2)swap(p1,p2);

if(n1>n3)swap(p1,p3);

if(n2>n3)swap(p2,p3);

printf("Now,theorderis:

%d,%d,%d\n",n1,n2,n3);}

voidswap(int*p1,int*p2)

{intp;

p=*p1;*p1=*p2;*p2=p;}

运行结果如下:

Inputthreeintegersn1,n2,n3:

34,21,25↙

Now,theorderis:

21,25,34

 

2.上机编程实现用函数来将从键盘上输入的三个字符串按由小到大的顺序输出。

要求编写自定义函数swap()用于交换两个变量的值;且函数原型为:

voidswap(char*p1,char*p2);;并在main函数中用字符数组名作为实际参数调用函数swap();

最后输出排序后的结果。

#include

#include

main()

{voidswap(char*p1,char*p2);

charstr1[20],str2[20],str3[20];

printf("Inputthreestrings:

\n");

gets(str1);gets(str2);gets(str3);

if(strcmp(str1,str2)>0)swap(str1,str2);

if(strcmp(str1,str3)>0)swap(str1,str3);

if(strcmp(str2,str3)>0)swap(str2,str3);

printf("Now,theorderis:

\n");

printf("%s\n%s\n%s\n",str1,str2,str3);}

voidswap(char*p1,char*p2)/*交换两个字符串*/

{charp[20];

strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}

 

运行结果如下:

Inputthreelines:

Istudyveryhard.↙

Clanguageisveryinteresting.↙

Heisaprofessor.↙

Now,theorderis:

Clanguageisveryinteresting.

Heisaprofessor.

Istudyveryhard.

3.上机编程实现用函数来返回一维数组a中的最大值。

要求设计一个自定义函数max()函数原型为:

intmax(int*p,intn);;在main函数中用数组名a和数组的长度n作为实际参数调用函数max();

最后输出结果。

intmax(int*p,intn)

{inti,max;max=p[0];

for(i=1;i

if(max

returnmax;}

main()

{inti,a[6];

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

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

printf("max=%d\n",max(a,6));}/*或者用max(&a[0],6)*/

4.上机编程实现从键盘上输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。

请编写3个函数:

(1)输入10个数;input()函数原型为:

voidinput(int*);;

(2)进行处理;max_min_value()函数原型为:

voidmax_min_value(int*);(3)输出10个数。

output()函数原型为:

voidoutput(int*);

解:

输入输出函数的N-S图见图10.1。

交换函数的N-S图见图10.2。

 

#include

main()

{voidinput(int*);voidmax_min_value(int*);voidoutput(int*);

intnumber[10];

input(number);max_min_value(number);output(number);}

voidinput(intarray[10])

{inti;

printf("input10numbers:

");

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

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

voidmax_min_value(intarray[10])

{int*max,*min,*p,*array_end;

array_end=array+10;

max=min=array;

for(p=array+1;p

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

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

*p=array[0];array[0]=*min;*min=*p;

*p=array[9];array[9]=*max;*max=*p;}

voidoutput(intarray[10])

{int*p;

printf("Now,theyare:

");

for(p=array;p<=array+9;p++)

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

 

运行结果如下:

input10numbers:

322456781983644296↙

Now,theyare:

124567832636442998

5.编写一函数,函数原型为:

voidinvert(char*p,intm);,实现将n个数按输入顺序的逆序存放,并输出。

#include

main()

{voidinvert(int*p,intm);

inti,n;int*p,num[20];

printf("\ninputn:

");

scanf("%d",&n);

printf("pleaseinputthesenumbers:

\n");

for(i=0;i

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

p=&num[0];

invert(p,n);

printf("Now,thesequenceis:

\n");

for(i=0;i

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

}

 

voidinvert(int*p,intm)

{inti;inttemp,*p1,*p2;

for(i=0;i

{p1=p+i;p2=p+(m-1-i);

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

}

 

运行结果:

inputn:

10↙

pleaseinputthesenumbers:

10987654321↙

Now,thesequenceis:

12345678910

6.在主函数中输入n个整数,编写一函数move(),是n个整数循环向后移一个位置,函数原型为:

voidmove(int*,int,int);再通过函数的递归调用实现将前面各数顺序向后移m个位置,使得最后m个数变成最前面m个数,(效果见图10.3)。

并在主函数中输出调整后的n个数。

 

#include

main()

{intnumber[20],n,m,i;

voidmove(intarray[20],intn,intm);

printf("\nHowmanynumbers?

");/*共有多少个数*/

scanf("%d",&n);

printf("Input%dnumbers:

\n",n);/*输入n个数*/

for(i=0;i

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

printf("Howmanyplaceyouwanttomove?

");/*后移多少个位置*/

scanf("%d",&m);

move(number,n,m);/*调用move函数*/

printf("Now,theyare:

\n");

for(i=0;i

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

 

voidmove(intarray[20],intn,intm)/*循环后移-次的函数*/

{int*p,array_end;

array_end=*(array+n-1);

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

*p=*(p-1);

*array=array_end;

m--;

if(m>0)move(array,n,m);/*递归调用,当循环次数m减至0时,停止调用*/

}

 

运行结果:

Howmanynumbers?

8↙

Input8numbers:

1243656782711↙

Howmanyplaceyouwanttomove?

4↙

Now,theyare:

8271112436567

7.在主函数中输入二维数组a[3][3],编写一函数move(),将一个3×3的矩阵转置。

函数原型为:

voidmove(int*,);并在主函数中输出转置后的矩阵。

/*用指向数组元素的列指针变量实现*/

#include

main()

{inta[3][3],*p,i;voidmove(int*pointer);

printf("\nInputmatrix:

\n");

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

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

p=&a[0][0];

move(p);

printf("Now,matrix:

\n");

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

printf("%d%d%d\n",a[i][0],a[i][1],a[i][2]);}

 

voidmove(int*pointer)

{inti,j,t;

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

for(j=0;j

{t=*(pointer+3*i+j);

*(pointer+3*i+j)=*(pointer+3*j+i);

*(pointer+3*j+i)=t;}}

 

/*用指向由3个元素组成的一维数组的行指针变量实现*/

#include

main()

{inta[3][3],(*p)[3],i;voidmove(int(*pointer)[3]);

printf("\nInputmatrix:

\n");

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

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

p=&a[0];

move(p);

printf("Now,matrix:

\n");

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

printf("%d%d%d\n",a[i][0],a[i][1],a[i][2]);}

 

voidmove(int(*pointer)[3])

{inti,j,t;

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

for(j=0;j

{t=*(*(pointer+i)+j);

*(*(pointer+i)+j)=*(*(pointer+j)+i);

*(*(pointer+j)+i)=t;}}

运行结果:

Inputmatrix:

l23↙

456↙

789↙

Now,matrix:

147

258

369

8.编程实现在main函数中输入一行文字,找出其中大写字母、小写字母、空格、数字及其他字符各有多少。

#include

main()

{intupper=0,lower=0,digit=0,space=0,other=0,i=0;

char*p,s[80];

printf("Inputstring:

");

while((s[i]=getchar())!

='\n')i++;

p=&s[0];

while(*p!

='\n')

{if(('A'<=*p)&&(*p<='Z'))upper++;

elseif(('a'<=*p)&&(*p<='z'))lower++;

elseif(*p=='')space++;

elseif(('0'<=*p)&&(*p<='9'))digit++;

elseother++;

p++;}

printf("upperercase:

%d\n",upper);

printf("lowerercase:

%d\n",lower);

printf("digit:

%d\n",digit);

printf("space:

%d\n",space);

printf("other:

%d\n",other);

}

运行结果:

Inputstring:

Todayis2000/1/1↙

upperercase:

1

lowerercase:

6

digit:

6

space:

2

other:

2

9.编写一个函数,求一个字符串的长度函数原型为:

intlength(char*p,);在main函数中输入字符串,并输出其长度。

#include

main()

{intlen;charstr[20];

intlength(char*p);

printf("Inputstring:

");

scanf("%s",str);

len=length(str);

printf("Thelengthofstringis%d.\n",len);}

 

intlength(char*p)/*求字符中长度函数*/

{intn;n=0;

while(*p!

='\0')

{n++;

p++;}

return(n);}

 

运行结果:

Inputstring:

China↙

Thelengthofstringis5.

10.在main函数中输入一字符串,包含n个字符。

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

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

#include

#include

main()

{intm;charstr1[20],str2[20];

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

printf("Inputstring:

");

gets(str1);

printf("Whichcharacterthatbegintocopy?

");

scanf("%d",&m);

if(strlen(str1)

printf("inputerror!

");

else

{copystr(str1,str2,m);

printf("result:

%s\n",str2);}

}

 

voidcopystr(char*p1,char*p2,intm)/*字符串部分复制函数*/

{intn;n=0;

while(n

{n++;p1++;}

while(*p1!

='\0')

{*p2=*p1;p1++;p2++;}

*p2='\0';

}

 

运行结果:

Inputstring:

reading-room↙

Whichcharacterthatbegintocopy?

9↙

result:

room

11.编写一函数,实现两个字符串的比较。

即自己写一个strcmp函数,函数原型为:

intstrcmp(char*p1,char*p2);,设p1指向字符串s1,p2指向字符串s2。

要求:

当s1=s2时,返回值为0。

当s1不等于s2时,返回它们二者的第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二字母不同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如果s1

#include

main()

{intstrcmp(char*p1,char*p2);

intm;charstr1[20],str2[20],*p1,*p2;

printf("Inputtwostrings:

\n");

scanf("%s",str1);scanf("%s",str2);

p1=&str1[0];p2=&str2[0];

m=strcmp(p1,p2);

printf("result:

%d\n",m);

}

 

intstrcmp(char*p1,char*p2)/*两个字符串比较的函数*/

{inti;i=0;

while(*(p1+i)==*(p2+i)&&*(p1+i)!

='\0'&&*(p2+i)!

='\0')

i++;

if(*(p1+i)=='\0'&&*(p2+i)=='\0')return(0);/*相等时返回结果0*/

return(*(p1+i)-*(p2+i));/*不等时结果为第一个不等字符ASCII码的差值*/

}

 

运行情况如下:

①Inputtwostrings:

CHINA↙

Chen↙

Result:

-32

②Inputtwostrings:

hello!

hello!

Result:

0

③Inputtwostings:

dog↙

cat↙

result:

1

12.用函数指针变量来调用函数min(),求变量a,b中的最小值。

(需要注意的是:

在用指针变量调用函数之前,应先将函数入口地址赋给指针变量)

min(intx,inty)

{intz;z=x

x:

y;return(z);}

main()

{int(*p)(int,int);inta,b,m;

p=min;

scanf("\n%d,%d",&a,&b);

m=(*p)(a,b);

printf("\na=%d,b=%d,min=%d\n",a,b,m);}

13.设计一函数process()原型为:

intprocess(intx,inty,int(*fun)());,调用它时,每次实现不同的功能:

(用函数的指针变量来调用函数)

(1)求a和b之和。

(2)指a,b中大者。

(3)求a,b中小者。

main()

{intadd(),max(),min();inta,b;

printf("pleaseinputaandb:

\n");

scanf("%d,%d",&a,&b);

printf("sum=");process(a,b,add);

printf("max=");process(a,b,max);

printf("min=");process(a,b,min);}

add(intx,inty)

{intz;z=x+y;return(z);}

max(intx,inty)

{intz;

if(x>y)z=x;

elsez=y;

return(z);}

min(intx,inty)

{intz;

if(x

elsez=y;

return(z);}

process(intx,inty,int(*fun)())

{intresult;

result=(*fun)(x,y);

printf("%d\n",result);}

14.设计一个用矩形法求定积分的通用函数,分别求:

(说明:

sin()、cos()、exp()已在系统的数学函数库中,程序开头要用#include)。

说明:

sin、cos和exp是系统提供的数学函数。

在程序中定义3个函数fsin、fcos和fexp分别用来计算sin(x)、cos(x)和exp(x)的值,在main函数中要声明这3个函数。

在main函数中定义p为指向函数的指针变量,定义形式是“float(*p)(float)”,表示p指向的函数有一个实型形参,p可指向返回值为实型的函数。

在main函数中有“p=fsin;”,表示将fsin函数的人口地址赋给p。

在调用integral函数时,用p作为实参,把fsin函数的人口地址传递给形参p(形参p也定义为指向函数的指针变量),这样形参P也指向fsin函数,(*p)(x)就相当于fsin(x)。

fsin(x)的值就是sinx的值。

因此通过调用integral函数求出了sinx的定积分。

求其余两个函数定积分的情况与此类似。

#include

#include

main()

{floatintegral(float(*p)(float),floata,floatb,intn);

floata1,b1,a2,b2,a3,b3,c,(*p)(float);

floatfsin(float);

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2