C语言例题第六章.docx
- 文档编号:3733105
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:23
- 大小:33.78KB
C语言例题第六章.docx
《C语言例题第六章.docx》由会员分享,可在线阅读,更多相关《C语言例题第六章.docx(23页珍藏版)》请在冰豆网上搜索。
C语言例题第六章
第六章
【例6.1】定义一个函数,求两个数中的较大数。
#include
intmax(inta,intb)
{
intt;
if(a>b)t=a;
elset=b;
return(t);
}
【例6.2】编制程序,调用求两个数中的较大数的函数求两个数的最大值。
程序代码如下:
#include
intmax(inta,intb)
{
intt;
if(a>b)t=a;
elset=b;
return(t);
}
main()
{
intx,y,z;
printf("inputtwonumbers:
\n");
scanf("%d,%d",&x,&y);
z=max(x,y);
printf("maxmum=%d\n",z);
}
程序执行结果为:
inputtwonumbers:
1020↙
maxmum=20
【例6.3】编写程序,求s=s1+s2+…+s10的和。
其中:
(n=1,2,3,…,10)
程序代码如下:
#include
floatsum(intm)/*定义求Si的函数,形参为整型变量m,函数返回值为实型*/
{
inti;
floats=0;
for(i=1;i<=m;i++)s=s+1/i;
returns;
}
main()
{
inti;
floats=0;
for(i=1;i<=n;i++)s=s+sum(i);/*函数调用出现在表达式中*/
printf(“s=%f”,s);
}
【例6.4】编写程序,求任意数x的n次幂。
程序代码如下:
#include
voidpower(floatx,intn);/*定义函数求x的n次幂,没有返回值*/
{
inti;
floatp=1;
for(i=1;i<=n;i++)
p=p*x;
printf(“%f的%d次方为:
%f\n”,x,n,p);
}
main()
{
floatx;
intn;
printf(“请输入x=?
n=?
\n”);
scanf(“%f,%d”,&x,&n);
power(x,n);/*以函数语句的方式调用函数*/
}
【例6.5】编写程序,交换两个参数的值。
程序代码如下:
#include
main()
{
inta=3,b=9;
voidswap(intx,inty);/*预先说明swap函数*/
printf("exchangebefore:
a=%d,b=%d\n",a,b);
swap(a,b);/*调用swap函数*/
printf("afterexchange:
a=%d,b=%d\n",a,b);
}
voidswap(intx,inty)/*swap函数定义*/
{
intz;
z=x;x=y;y=z;/*交换形参x和y的值*/
printf("changeinfunction:
x=%d,y=%d\n",x,y);
}
程序执行结果:
exchangebefore:
a=3,b=9
changeinfunction:
x=9,y=3
afterexchange:
a=3,b=9
【例6.6】编程计算s=1!
+2!
+3!
+……+10!
程序代码如下:
#include
longf2(intn)/*定义求n的阶乘函数*/
{
longt=1;
inti;
for(i=1;i<=n;i++)t=t*i;
returnt;
}
longf1(intp)/*定义求n个数的和函数*/
{
inti;
longsum=0;
for(i=1;i<=p;i++)
sum+=f2(i);/*调用求阶乘函数累加到和*/
returnsum;
}
main()
{
longs;
s=f1(10);/*调用求和函数*/
printf("s=%ld\n",s);
}
【例6.7】编制程序,用递归法计算n!
。
n!
的递归定义形式如下:
n!
=1(n=0,1)
n*(n-1)!
(n>1)
程序代码如下:
#include
longfac(intn)/*定义求n的阶乘的递归函数*/
{
longf;
if(n<0)printf("n<0,inputerror");
elseif(n==0)f=1;
elsef=n*fac(n-1);
return(f);
}
main()
{
intn;
longy;
printf("\ninputainteagernumber:
\n");
scanf("%d",&n);
y=fac(n);
printf("%d!
=%ld",n,y);
}
【例6.8】Hanoi塔问题
Hanoi塔游戏据说来源于布拉玛神庙。
游戏的装置是:
一块板上有三根针A,B,C。
A针上套有64个大小不等的圆盘,大的在下,小的在上。
如图6-5所示。
游戏的目标是要把这64个圆盘从A针移动C针上,规定每次只能移动一个圆盘,移动可以借助B针进行。
但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。
求移动的步骤。
#include
viodmove(intn,inta,intb,intc)/*定义移动圆盘的递归过程函数*/
{
if(n==1)printf("%d-->%d\n",a,c);/*n=1,将圆盘从A直接移动到C*/
else
{
move(n-1,a,c,b);/*把n-1个圆盘从A借助于C移动到B*/
printf("%d-->%d\n",a,c);/*将A上的最后一个圆盘移到C上*/
move(n-1,b,a,c);/*把n-1个圆盘从B借助于A移动到C*/
}
}
main()
{intn;
printf("inputn=:
\n");
scanf("%d",&n);
move(n,1,2,3);/*调用移动圆盘递归函数*/
}
当n=3时程序运行的结果为:
inputn=:
3↙
1→3
1→2
3→2
1→3
2→1
2→3
1→3
【例6.9】在复合语句中定义变量举例。
#include
main()
{
inti=2,j=3,k;/*主函数体内定义的局部变量*/
k=i+j;
{
intk=8;/*复合语句定义的局部变量*/
printf("k=%d\n",k);
}
printf("k=%d\n",k);
}
程序执行结果为:
k=8
k=5
【例6.10】输入长方体的长宽高l,w,h。
求体积及三个面的面积s1、s2和s3。
程序代码如下:
#include
ints1,s2,s3;/*定义全程变量分别存放长方体三个面的面积*/
intvs(inta,intb,intc)/*定义求体积函数*/
{
intv;
v=a*b*c;/*计算体积*/
s1=a*b;s2=b*c;s3=a*c;/*计算三个面的面积*/
return(v);
}
main()
{
intv,l,w,h;
printf("inputlength,widthandheight:
\n");
scanf("%d%d%d",&l,&w,&h);
v=vs(l,w,h);/*调用函数返回体积值*/
printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
}
【例6.11】外部变量与局部变量同名举例。
#include
inta=3,b=5;/*a,b为全局变量*/
max(inta,intb)/*a,b为形参,是局部变量,与全局变量同名*/
{
intc;
c=a>b?
a:
b;
return(c);
}
main()
{
inta=8;/*a为局部变量,与全局变量a同名*/
printf("max=%d\n",max(a,b));
}
程序执行结果为:
max=8
【例6.12】全局变量的说明举例。
#include
intvs(inty,intw)
{
externinth;/*全局变量声明*/
intv;
v=y*w*h;
return(v);
}
main()
{
externintw;/*全局变量声明*/
inty=5;
printf(“v=%d”,vs(y,w));
}
inty=3,w=4,h=5;/*全局变量定义*/
程序执行结果为:
v=100
【例6.13】分析下面程序中auto变量值的变化。
#include
voidf1()
{
inta=0;
printf(“a=%d\n”,a);
a++;
}
main()
{
inti;
for(i=0;i<3;i++)f1();
}
程序的执行结果都为:
a=0
【例6.14】修改上例f1函数中的a为静态局部变量,再观察运行结果。
voidf1()
{
staticinta=0;/*定义静态局部变量a*/
printf(“a=%d\n”,a);
a++;
}
main同上例(此处略)。
程序执行结果为:
a=0
a=1
a=2
分析:
由于a为静态局部变量,只在编译时赋了一次初值,以后每次调用结束后都保留了本次运算的结果,所以输出结果依次为0,1,2。
【例6.15】求sum=1!
+2!
+3!
+4!
+5!
的值。
程序代码如下:
#include
intfac(intn)
{
staticintf=1;/*定义静态局部变量f*/
f=f*n;
return(f);
}
main()
{
inti,sum;
for(i=1;i<=5;i++)sum+=fac(i)
printf("sum=%d\n",sum);
}
程序执行结果为:
sum=153
【例6.16】编写程序计算s=12+22+32+…+102的值。
程序代码如下:
#include
intsquare(intn)
{
registerinti,s=0;/*定义寄存器变量*/
for(i=1;i<=n;i++)s+=i*i;
return(s);
}
main()
{
printf("s=%d\n",square(10));
}
程序执行结果为:
s=385
分析:
由于在循环体内反复计算i和s的值,因此将它们说明为寄存器变量,提高了程序执行的效率。
【例6.17】设一个程序由两个源程序文件file1.c和file2.c组成,分析下列程序。
/*file1.c*/
longf1(intn)/*定义求n!
函数*/
{
inti;
longfac=1;
for(i=1;i<=n;i++)fac=fac*i;
return(fac);
}
main()
{
externlongf2(intm);/*函数声明,f2在文件file2.c中*/
intn;
printf(“inputn=\n”);
scanf(“%d”,&n);
printf("s=%ld\n",f2(n));
}
/*file2.c*/
longf2(intm)/*定义求m个数的和函数*/
{
externlongf1(intn);/*函数声明,f1在文件file1.c中*/
longs=0;
inti;
for(i=1;i<=m;i++)
s=s+f1(i);
returns;
}
【例6.18】编写程序,实现用函数指针变量调用“输入n个数,求其中的最大数”的函数。
程序代码如下:
#include
intmax(intn1)/*定义求n个数的最大值函数*/
{
inti,x,m1;
printf("pleaseinput%dmumbers:
\n",n1);
scanf("“%d",&x);
m1=x;
for(i=1;i { scanf("%d",&x); if(x>m1)m1=x; } return(m1); } main() {int(*pf)();/*定义函数指针变量*/ intm,n; pf=max;/*函数指针变量pf指向max函数的入口地址*/ printf("inputn=? \n"); scanf("%d",&n); m=(*pf)(n);/*通过函数指针变量pf调用max函数,返回值赋值给m*/ printf("themaxmumberis: %d",m); } 程序执行结果为: inputn=? 5↙ pleaseinput5mumbers: 122681915↙ themaxmumberis: 26 【6.19】用指针作参数实现两个数据的交换。 程序代码如下: #include voidswap(int*x,int*y)/*形参为指针变量*/ { intt; t=*x;*x=*y;*y=t; } main() { inta,b; printf("inputa,b: \n"); scanf("%d,%d",&a,&b); swap(&a,&b);/*用a,b的地址作为实参调用函数*/ printf("a=%d,b=%d\n",a,b); } 程序执行结果如下: inputa,b: 3,9↙ a=9,b=3 例6.19是用指针变量作形参,地址作实参的情况。 也可以用指针变量作为实参调用函数。 例如,对上例中swap函数不变,修改main函数如下: main() { inta,b; int*p1=&a,*p2=&b;/*定义指针变量分别指向a,b*/ printf("inputa,b: \n"); scanf("%d,%d",&a,&b); swap(p1,p2);/*用指针变量p1,p2作为实参调用函数*/ printf("a=%d,b=%d\n",a,b); } 【例6.20】输入a、b、c三个整数,按从大到小的顺序输出。 #include voidswap(int*p1,int*p2) { intp; p=*p1;*p1=*p2;*p2=p; } main() { inta,b,c*pa,*pb,*pc;/*定义三个指针变量pa,pb,pc*/ pa=&a,pb=&b,pc=&c;/*三个指针变量分别指向a,b,c*/ printf("inputa,b,c: \n"); scanf("%d,%d,%d",&a,&b,&c); if(*pa<*pb)swap(pa,pb);/*用指针变量作实参调用函数swap*/ if(*pa<*pc)swap(pa,pc); if(*pb<*pc)swap(pb,pc); printf("\n%d,%d,%d\n",a,b,c); } 程序执行结果如下: inputa,b,c: 6,3,9↙ 9,6,3 【例6.21】假定一个数组中存放的是学生5门课的成绩,编写程序,判断数组中各元素的值,若大于等于60则输出“pass”,否则输出“bad”。 程序代码如下: #include voidgrade(intx) { if(x>=60)printf("%d--pass\n",x); elseprintf("%d--bad\n",x); } main() { inta[5],i; printf("input5numbers: \n"); for(i=0;i<5;i++)scanf("%d",&a[i]);/*数组输初值*/ for(i=0;i<5;i++)grade(a[i]);/*依次以数组元素作实参调用函数grade*/ } 程序执行结果为: input5numbers: 8060597145 80--pass 60--pass 59--bad 71--pass 45--bad 【例6.22】编制程序,用选择法对5个整数排序。 程序代码如下: #include voidsort(inta[],intn)/*定义排序函数,形参为数组名*/ { inti,j,k,m; for(i=0;i {k=i;/*k记录数组中的最元素下标*/ for(j=i+1;j if(a[j]>a[i])k=j; if(k! =i) {m=a[i];a[i]=a[k];a[k]=m; } } } main() { int*p,i,a[5]; p=a;/*数组a的首地址赋值给指针变量p*/ printf("input5numberstoA: \n"); for(i=0;i<5;i++)scanf("%d",p+i);/*数组输入初值*/ sort(p,5);/*指针作实参调用函数*/ printf("theresultaftersort\n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 例题 第六