C语言例题第六章Word文档格式.docx
《C语言例题第六章Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言例题第六章Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
printf(“s=%f”,s);
【例6.4】编写程序,求任意数x的n次幂。
voidpower(floatx,intn);
/*定义函数求x的n次幂,没有返回值*/
{
floatp=1;
i++)
p=p*x;
printf(“%f的%d次方为:
%f\n”,x,n,p);
floatx;
intn;
printf(“请输入x=?
n=?
\n”);
scanf(“%f,%d”,&
n);
power(x,n);
/*以函数语句的方式调用函数*/
【例6.5】编写程序,交换两个参数的值。
inta=3,b=9;
voidswap(intx,inty);
/*预先说明swap函数*/
exchangebefore:
a=%d,b=%d\n"
a,b);
swap(a,b);
/*调用swap函数*/
afterexchange:
voidswap(intx,inty)/*swap函数定义*/
intz;
z=x;
x=y;
y=z;
/*交换形参x和y的值*/
changeinfunction:
x=%d,y=%d\n"
x,y);
程序执行结果:
a=3,b=9
x=9,y=3
【例6.6】编程计算s=1!
+2!
+3!
+……+10!
longf2(intn)/*定义求n的阶乘函数*/
longt=1;
i++)t=t*i;
returnt;
}
longf1(intp)/*定义求n个数的和函数*/
longsum=0;
=p;
sum+=f2(i);
/*调用求阶乘函数累加到和*/
returnsum;
longs;
s=f1(10);
/*调用求和函数*/
s=%ld\n"
s);
【例6.7】编制程序,用递归法计算n!
。
n!
的递归定义形式如下:
n!
=1(n=0,1)
n*(n-1)!
(n>
1)
longfac(intn)/*定义求n的阶乘的递归函数*/
longf;
if(n<
0)printf("
n<
0,inputerror"
elseif(n==0)f=1;
elsef=n*fac(n-1);
return(f);
longy;
\ninputainteagernumber:
%d"
y=fac(n);
%d!
=%ld"
n,y);
【例6.8】Hanoi塔问题
Hanoi塔游戏据说来源于布拉玛神庙。
游戏的装置是:
一块板上有三根针A,B,C。
A针上套有64个大小不等的圆盘,大的在下,小的在上。
如图6-5所示。
游戏的目标是要把这64个圆盘从A针移动C针上,规定每次只能移动一个圆盘,移动可以借助B针进行。
但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。
求移动的步骤。
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*/
/*将A上的最后一个圆盘移到C上*/
move(n-1,b,a,c);
/*把n-1个圆盘从B借助于A移动到C*/
main()
{intn;
inputn=:
move(n,1,2,3);
/*调用移动圆盘递归函数*/
当n=3时程序运行的结果为:
inputn=:
3↙
1→3
1→2
3→2
2→1
2→3
【例6.9】在复合语句中定义变量举例。
inti=2,j=3,k;
/*主函数体内定义的局部变量*/
k=i+j;
{
intk=8;
/*复合语句定义的局部变量*/
k=%d\n"
k);
k=8
k=5
【例6.10】输入长方体的长宽高l,w,h。
求体积及三个面的面积s1、s2和s3。
ints1,s2,s3;
/*定义全程变量分别存放长方体三个面的面积*/
intvs(inta,intb,intc)/*定义求体积函数*/
intv;
v=a*b*c;
/*计算体积*/
s1=a*b;
s2=b*c;
s3=a*c;
/*计算三个面的面积*/
return(v);
intv,l,w,h;
inputlength,widthandheight:
%d%d%d"
l,&
w,&
h);
v=vs(l,w,h);
/*调用函数返回体积值*/
\nv=%d,s1=%d,s2=%d,s3=%d\n"
v,s1,s2,s3);
【例6.11】外部变量与局部变量同名举例。
inta=3,b=5;
/*a,b为全局变量*/
max(inta,intb)/*a,b为形参,是局部变量,与全局变量同名*/
intc;
c=a>
b?
a:
b;
return(c);
inta=8;
/*a为局部变量,与全局变量a同名*/
max=%d\n"
max(a,b));
max=8
【例6.12】全局变量的说明举例。
intvs(inty,intw)
externinth;
/*全局变量声明*/
v=y*w*h;
externintw;
inty=5;
printf(“v=%d”,vs(y,w));
inty=3,w=4,h=5;
/*全局变量定义*/
v=100
【例6.13】分析下面程序中auto变量值的变化。
voidf1()
inta=0;
printf(“a=%d\n”,a);
a++;
for(i=0;
3;
i++)f1();
程序的执行结果都为:
a=0
【例6.14】修改上例f1函数中的a为静态局部变量,再观察运行结果。
staticinta=0;
/*定义静态局部变量a*/
main同上例(此处略)。
a=1
a=2
分析:
由于a为静态局部变量,只在编译时赋了一次初值,以后每次调用结束后都保留了本次运算的结果,所以输出结果依次为0,1,2。
【例6.15】求sum=1!
+2!
+3!
+4!
+5!
的值。
intfac(intn)
staticintf=1;
/*定义静态局部变量f*/
f=f*n;
inti,sum;
=5;
i++)sum+=fac(i)
sum=%d\n"
sum);
sum=153
【例6.16】编写程序计算s=12+22+32+…+102的值。
intsquare(intn)
registerinti,s=0;
/*定义寄存器变量*/
i++)s+=i*i;
return(s);
s=%d\n"
square(10));
s=385
由于在循环体内反复计算i和s的值,因此将它们说明为寄存器变量,提高了程序执行的效率。
【例6.17】设一个程序由两个源程序文件file1.c和file2.c组成,分析下列程序。
/*file1.c*/
longf1(intn)/*定义求n!
函数*/
longfac=1;
i++)fac=fac*i;
return(fac);
externlongf2(intm);
/*函数声明,f2在文件file2.c中*/
printf(“inputn=\n”);
scanf(“%d”,&
f2(n));
/*file2.c*/
longf2(intm)/*定义求m个数的和函数*/
externlongf1(intn);
/*函数声明,f1在文件file1.c中*/
longs=0;
s=s+f1(i);
【例6.18】编写程序,实现用函数指针变量调用“输入n个数,求其中的最大数”的函数。
intmax(intn1)/*定义求n个数的最大值函数*/
inti,x,m1;
pleaseinput%dmumbers:
n1);
“%d"
x);
m1=x;
n1;
if(x>
m1)m1=x;
return(m1);
{int(*pf)();
/*定义函数指针变量*/
intm,n;
pf=max;
/*函数指针变量pf指向max函数的入口地址*/
printf("
inputn=?
\n"
scanf("
m=(*pf)(n);
/*通过函数指针变量pf调用max函数,返回值赋值给m*/
themaxmumberis:
m);
5↙
pleaseinput5mumbers:
122681915↙
26
【6.19】用指针作参数实现两个数据的交换。
#include<
voidswap(int*x,int*y)/*形参为指针变量*/
intt;
t=*x;
*x=*y;
*y=t;
inta,b;
inputa,b:
a,&
b);
swap(&
/*用a,b的地址作为实参调用函数*/
程序执行结果如下:
3,9↙
a=9,b=3
例6.19是用指针变量作形参,地址作实参的情况。
也可以用指针变量作为实参调用函数。
例如,对上例中swap函数不变,修改main函数如下:
int*p1=&
a,*p2=&
/*定义指针变量分别指向a,b*/
swap(p1,p2);
/*用指针变量p1,p2作为实参调用函数*/
【例6.20】输入a、b、c三个整数,按从大到小的顺序输出。
voidswap(int*p1,int*p2)
intp;
p=*p1;
*p1=*p2;
*p2=p;
inta,b,c*pa,*pb,*pc;
/*定义三个指针变量pa,pb,pc*/
pa=&
a,pb=&
b,pc=&
c;
/*三个指针变量分别指向a,b,c*/
inputa,b,c:
%d,%d,%d"
b,&
c);
if(*pa<
*pb)swap(pa,pb);
/*用指针变量作实参调用函数swap*/
*pc)swap(pa,pc);
if(*pb<
*pc)swap(pb,pc);
\n%d,%d,%d\n"
a,b,c);
inputa,b,c:
6,3,9↙
9,6,3
【例6.21】假定一个数组中存放的是学生5门课的成绩,编写程序,判断数组中各元素的值,若大于等于60则输出“pass”,否则输出“bad”。
voidgrade(intx)
=60)printf("
%d--pass\n"
x);
elseprintf("
%d--bad\n"
inta[5],i;
input5numbers:
5;
i++)scanf("
a[i]);
/*数组输初值*/
i++)grade(a[i]);
/*依次以数组元素作实参调用函数grade*/
input5numbers:
8060597145
80--pass
60--pass
59--bad
71--pass
45--bad
【例6.22】编制程序,用选择法对5个整数排序。
voidsort(inta[],intn)/*定义排序函数,形参为数组名*/
inti,j,k,m;
n-1;
{k=i;
/*k记录数组中的最元素下标*/
for(j=i+1;
j<
n;
j++)
if(a[j]>
a[i])k=j;
if(k!
=i)
{m=a[i];
a[i]=a[k];
a[k]=m;
int*p,i,a[5];
p=a;
/*数组a的首地址赋值给指针变量p*/
input5numberstoA:
p+i);
/*数组输入初值*/
sort(p,5);
/*指针作实参调用函数*/
theresultaftersort\n"
while(p<
a+5)
%d"
*p);
p++;
12345
54321
【例6.23】编制程序,利用原数组空间实现数组的逆置。
即将数组的第1个元素放到最后一个位置,第2个元素放到倒数第2个位置…,最后一个元素放到第1个位置。
voidfun(intb[10])/*定义数组逆置函数,形参为数组名*/
intl,r,t;
l=0;
r=9;
while(l<
r)
{t=b[l];
b[l]=b[r];
b[r]=t;
l++;
r--;
inta[10];
input10numberstoarray:
10;
fun(a);
/*数组名作实参调用函数*/
nowthearrayis:
3d%"
a[i]);
【例6.24】编制程序,输入a、b、c三个整数,调用函数返回求其中的最大数的地址。
int*max(intx,inty,intz)/*定义整型指针型函数max*/
int*pmax;
/*定义指针变量pmax*/
y)pmax=&
x;
/*pmax指向x,y中的大者*/
elsepmax=&
y;
if(z>
*pmax)pmax=&
z;
return(pmax);
/*返回指向整型变量的指针*/
inta,b,c,*p;
p=max(a,b,c);
/*函数返回结果赋值给整型指针变量*/
tnemaxis:
*p=%d\n"
12,99,28↙
*p=99
【例6.25】编写程序,显示命令行上的参数。
main(intargc,char*argv[])
{inti=0;
while(argc>
{++i;
%s\n"
argv[i]);
argc--;
argv++;
将该程序以文件名testexe命名,经连接编译后的可执行文件为test.exe。
在DOS下运行时输入以下命令:
testexeTurbocfoxproC++
则程序执行结果为:
Turboc
foxpro
C++
6.11习题
6-1单项选择题
1.下列叙述中正确的是()
A.C语言编译时不检查语法B.C语言的子程序有过程和函数两种
C.C语言的函数可以嵌套定义D.C语言所有函数都是外部函数
2.在一个C语言程序中()
A.main函数必须出现在所有函数之前B.main函数可以在任何地方出现
C.main函数必须出现在所有函数之后D.main函数必须出现在固定位置
3.以下叙述中正确的是()
A.全局变量的作用域一定比局部变量的作用域范围大
B.静态(static)类别变量的生存期贯穿于整个程序的运行期间
C.函数的形参都属于全局变量
D.未在定义语句中赋初值的auto变量和static变量的初值都是随机值
4.下列关于函数的说法中错误的是()
A.C语言中的函数只有static和extern两种类型
B.C语言中允许函数的递归调用
C.调用函数时,C语言要求形参与实参的个数类型完全一致
D.C语言函数的缺少数据类型是空类型(void型)
5.C语言规定,各个函数之间()
A.允许直接递归调用也允许间接递归调用
B.不允许直接递归调用也不允许间接递归调用
C.允许直接递归调用,不允许间接递归调用
D.不允许直接递归调用,允许间接递归调用
6.在以下函数调用语句中,函数fun1参数的个数为()
fun1(x,10,(x,10),fun2(y,10,(y,10)));
A.8B.4C.5D.编译出错
7.以下所列的各函数首部中,正确的是()
A.voidplay(var:
In