实验8指针.docx
《实验8指针.docx》由会员分享,可在线阅读,更多相关《实验8指针.docx(26页珍藏版)》请在冰豆网上搜索。
实验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);
_______________________
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)
{}
运行结果如下:
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");
__________________________
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)/*交换两个字符串*/
{}
运行结果如下:
Inputthreelines:
Istudyveryhard.↙
Clanguageisveryinteresting.↙
Heisaprofessor.↙
Now,theorderis:
Clanguageisveryinteresting.
Heisaprofessor.
Istudyveryhard.
3.上机编程实现用函数来返回一维数组a中的最大值。
要求设计一个自定义函数max()函数原型为:
intmax(int*p,intn);;在main函数中用数组名a和数组的长度n作为实际参数调用函数max();
最后输出结果。
intmax(int*p,intn)
{}
main()
{inti,a[6];
for(i=0;i<6;i++)
scanf("%d",&a[i]);
printf("max=%d\n",________);}
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",_______);}
voidmax_min_value(intarray[10])
{int*max,*min,*p,*array_end;
array_end=________;
max=min=_______;
for(_________;_____________;________)
if(*p>*max)_________;
elseif(*p<*min)________;
*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(________;________;_____)
printf("%d",_____);}
运行结果如下:
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;iscanf("%d",______);
p=________;
invert(____,___);
printf("Now,thesequenceis:
\n");
for(i=0;iprintf("%5d",num[i]);
}
voidinvert(int*p,intm)
{
}
运行结果:
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;iscanf("%d",__________);
printf("Howmanyplaceyouwanttomove?
");/*后移多少个位置*/
scanf("%d",&m);
move(______,_____,____);/*调用move函数*/
printf("Now,theyare:
\n");
for(i=0;iprintf("%5d",number[i]);}
voidmove(intarray[20],intn,intm)/*循环后移-次的函数*/
{int*p,array_end;
array_end=__________;
for(__________;p>array;p--)
*p=_______;
*array=array_end;
______;
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",______,______,______);
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)
{}
/*用指向由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",______,______,______);
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])
{}
运行结果:
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(_____________)i++;
p=______;
while(_______)
{if(('A'<=*p)&&(*p<='Z'))upper++;
elseif(('a'<=*p)&&(*p<='z'))lower++;
elseif(*p=='')space++;
elseif(('0'<=*p)&&(*p<='9'))digit++;
elseother++;
________;}
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=________;
printf("Thelengthofstringis%d.\n",len);}
intlength(char*p)/*求字符中长度函数*/
{}
运行结果:
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:
");
________;
printf("Whichcharacterthatbegintocopy?
");
scanf("%d",&m);
if(_______printf("inputerror!
");
else
{copystr(_____,_____,__);
printf("result:
%s\n",_____);}
}
voidcopystr(char*p1,char*p2,intm)/*字符串部分复制函数*/
{intn;n=0;
while(n<_____)
{n++;______;}
while(______!
='\0')
{*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",_____);scanf("%s",______);
p1=______;p2=_______;
m=strcmp(p1,p2);
printf("result:
%d\n",____);
}
intstrcmp(char*p1,char*p2)/*两个字符串比较的函数*/
{inti;i=0;
while(_________________________________________)
i++;
if(___________________)return(0);/*相等时返回结果0*/
return(___________);/*不等时结果为第一个不等字符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=xx:
y;return(z);}
main()
{int(*p)(int,int);inta,b,m;
p=_____;
scanf("\n%d,%d",&a,&b);
m=__________;
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,____);
printf("max=");process(a,b,____);
printf("min=");process(a,b,____);}
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(xelsez=y;
return(z);}
process(intx,inty,int(*fun)())
{intresult;
result=__________;
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);/*声明fsin函数*/
floatfcos(float);/*声明fcos函数*/
floatfexp(float);/*声明fexp函数*/
intn=20;
printf("Inputa1,b1:
");/*输入求sinx定积分的下限和上限*/
scanf("%f,%f",&a1,&b1);
printf("Inputa2,b2:
");/*输入求cosx定积分的下限和上限*/
scanf("%f,%f",&a2,&b2);
printf("Inputa3,b3:
");/*输入求定积分的下限和上限*/
scanf("%f,%f",&a3,&b3);
p=fsin;
c=integral(p,a1,b1,n);/*求出sinx的定积分*/
printf("Theintegralofsin(x)is:
%f\n",c);
p=fcos;
c=integral(p,a2,b2,n);/*求出cosx的定积分*/
printf("Thtintegralofcos(x)is:
%f\n",c);
p=fexp;
c=integral(p,a3,b3,n);/*求出ex的定积分*/
printf("Theintegralofexp(x)is:
%f\n",c);
}
floatintegral(float(*p)(float),float