C语言程序设计第3版何钦铭 颜 晖 第5章函数.docx
《C语言程序设计第3版何钦铭 颜 晖 第5章函数.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭 颜 晖 第5章函数.docx(12页珍藏版)》请在冰豆网上搜索。
![C语言程序设计第3版何钦铭 颜 晖 第5章函数.docx](https://file1.bdocx.com/fileroot1/2023-1/26/78d362e6-4e7a-462a-9afd-3add19f01c12/78d362e6-4e7a-462a-9afd-3add19f01c121.gif)
C语言程序设计第3版何钦铭颜晖第5章函数
第5章函数
【练习5-1】使用函数求1到n之和:
输入一个正整数n,输出1~n之和。
要求自定义和调用函数sum(n)求1~n之和。
若要计算m~n(m试编写相应程序。
解答:
#include
intsum(intn);
intmain(void)
{
intn;
intsum;
printf("Entern:
")
scanf("%d",&n);
printf("sum=%d\n",sum(n));
return0;
}
intsum(intn)
{
intresult,i;
result=0;
for(i=1;i<=n;i++)
result=result+i;
returnresult;
}
若要计算m~n(mscanf("%d%d",&m,&n);
printf("sum=%d\n",sum(m,n));
同时在函数定义时需设置2个形参:
intsum(intm,intn)
{
intresult,i;
result=0;
for(i=m;i<=n;i++)
result=result+i;
returnresult;
}
【练习5-2】使用函数找最大值:
输入2个数,输出其中较大的数。
要求定义和调用函数max(a,b)找出并返回a、b中较大的数。
试编写相应程序。
解答:
#include
doublemax(doublea,doubleb);
intmain(void)
{
inta,b;
printf(“Inputaandb:
”);
scanf("%lf%lf",&a,&b);
printf("max=%lf\n",max(a,b));
return0;
}
doublemax(doublea,doubleb)
{
if(a>b)
returna;
else
returnb;
}
【练习5-3】数字金字塔:
输入一个正整数n,输出n行数字金字塔。
试编写相应程序。
解答:
#include
intmain(void)
{
intn,i,j;
printf(“Entern:
”);
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=n-i;j++)
printf("");
for(j=1;j<=i;j++)
printf("%d",i);
putchar('\n');
}
return0;
}
【练习5-4】思考:
若把例5-9中静态变量f定义成普通局部变量,还能实现计算n!
吗?
请上机检验。
若把f换成全局变量又会如何?
解答:
若把例5-9中静态变量f定义成普通局部变量,无法实现计算n!
,因为函数返回后f单元被系统回收,不再保存原有数据。
若把f换成全局变量,则能实现计算n!
,因为f的作用范围和生命周期一直存在。
习题5
一、选择题
1.在C语言程序中,若对函数类型未加显式说明,则函数的隐含类型为D。
A.voidB.doubleC.charD.int
2.下列程序的输出结果是D。
fun(inta,intb,intc)
{c=a*b;}
intmain(void)
{intc;
fun(2,3,c);
printf(”%d\n”,c);
return0;
}
A.0B.1C.6D.无法确定
3.建立自定义函数的目的之一是B(优先)、C。
A.提高程序的执行效率B.提高程序的可读性
C.减少程序的篇幅D.减少程序文件所占内存
4.以下正确的函数定义形式是A。
A.doublefun(intx,inty)B.doublefun(intx;inty)
C.doublefun(intx,inty);D.doublefun(intx,y)
5.以下不正确的说法是C。
A.实参可以是常量、变量或表达式
C.形参可以是常量、变量或表达式
B.实参可以是任何类型
D.形参应与对应的实参类型一致
6.以下正确的说法是D。
A.实参与其对应的形参共同占用一个存储单元
B.实参与其对应的形参各占用独立的存储单元
C.只有当实参与其对应的形参同名时才占用一个共同的存储单元
D.形参是虚拟的,不占用内存单元
二、填空题
1.下列程序的输出结果为2357。
#include
intfun3(intm);
intmain(void)
{intn;
for(n=1;n<10;n++)
if(fun3(n)==1)printf("%d",n);
return0;
}
intfun3(intm)
{inti;
if(m==2||m==3)return1;
if(m<2||m%2==0)return0;
for(i=3;iif(m%i==0)return0;
return1;
}
2.输入若干个正整数,判断每个数从高位到低位各位数字是否按值从小到大排列,请根据题意,将程序补充完整。
#include
intfun1(intm);
intmain(void)
{intn;
scanf("%d",&n);
while(n>0){
if(fun1(n))
printf("%d中各位数字按从小到大排列\n",n);
scanf("%d",&n);
}
}
intfun1(intm)
{intk;
k=m%10;
while(m)
if(m/10%10>k)
return0;
else{m=m/10;k=m%10;}
return1;
}
3.下列函数输出一行字符:
先输出kb个空格,再输出n个指定字符(由实参指定)。
请根据题意,将程序补充完整。
#include
voidprint(intkb,intn,charzf)
{inti;
for(i=1;i<=kb;i++)
printf(“”);
for(i=1;i<=n;i++)
printf(“%c”,zf);
}
三、程序设计题
1.使用函数计算分段函数的值:
输入x,计算并输出下列分段函数f(x)的值。
要求定义和调用函数sign(x)实现该分段函数。
试编写相应程序。
1x>0
f(x)=0x=0
-1x<0
解答:
#include
intmain(void)
{
intsign(intx);
intx,y;
scanf("%d",&x);
y=sign(x);
printf("sign(%d)=%d\n",x,y);
return0;
}
intsign(intx)
{
inty;
if(x>0)y=1;
elseif(x==0)y=0;
elsey=-1;
returny;
}
2.使用函数求奇数和:
输入一批正整数(以零或负数为结束标志),求其中的奇数和。
要求定义和调用函数even(n)判断数的奇偶性,当n为偶数时返回1,否则返回0。
试编写相应程序。
解答:
#include
inteven(intn);
intmain(void)
{
intn,sum;
scanf("%d",&n);
sum=0;
while(n>0){
if(even(n)==0)sum=sum+n;
scanf("%d",&n);
}
printf("Thesumoftheoddnumbersis%d.\n",sum);
return0;
}
inteven(intn)
{
inty;
if(n%2==0)y=1;
elsey=0;
returny;
}
3.使用函数计算两点间的距离:
给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。
要求定义和调用函数dist(x1,y1,x2,y2)计算两点之间的距离。
试编写相应程序。
解答:
#include
#include
doubledist(doublex1,doubley1,doublex2,doubley2);
intmain(void)
{
doublex1,y1,x2,y2;
printf("Enterx1andy1:
");
scanf("%lf%lf",&x1,&y1);
printf("Enterx2andy2:
");
scanf("%lf%lf",&x2,&y2);
printf("Distance=%.2lf",dist(x1,y1,x2,y2));
return0;
}
doubledist(doublex1,doubley1,doublex2,doubley2)
{
doubledistance;
distance=sqrt(pow(fabs(x2-x1),2)+pow(fabs(y2-y1),2));
returndistance;
}
4.利用函数计算素数个数并求和:
输入两个正整数m和n(1<=m,n<=500),统计并输出m和n之间的素数的个数以及这些素数的和。
要求定义并调用函数prime(m)判断m是否为素数。
试编写相应程序。
解答:
#include
#include
intprime(intm);
intmain(void)
{
intm,n,sum,count;
printf("Inputm:
");
scanf("%d",&m);
printf("Inputn:
");
scanf("%d",&n);
sum=0;
count=0;
for(;m<=n;m++){
if(prime(m)==1){
sum=sum+m;
count++;
}
}
printf("%d和%d之间素数的个数:
%d\n",m,n,count);
printf("%d和%d之间素数的和:
%d\n",m,n,sum);
return0;
}
intprime(intm)
{
inti;
for(i=2;i<=sqrt(m);i++)
if(m%i==0)return0;
if(i>h&&m!
=1)return1;
}
5.使用函数统计指定数字的个数:
读入一个整数,统计并输出该数中“2”的个数。
要求定义并调用函数countdigit(number,digit),它的功能是统计整数number中数字digit的个数。
例如,countdigit(12292,2)的返回值是3。
试编写相应程序。
解答:
#include
intcountdigit(intnumber,intdigit);
intmain(void)
{
intnumber,digit;
printf("Enteraninteger:
");
scanf("%d",&number);
printf("Numberofdigit");
scanf("%d",&digit);
printf(":
%d",countdigit(number,digit));
return0;
}
intcountdigit(intnumber,intdigit)
{
inta,count;
if(number<0)number=-number;
while(number>0){
a=number;
if(number%10==digit)
count++;
number=number/10;
}
returncount;
}
6.使用函数输出水仙花树:
输入两个正整数m和n(1<=m,n<=1000),输出m~n之间所有满足各位数字的立方和等于它本身的数。
要求定义并调用函数is(number),判断number的各位数字之立方和是否等于它本身。
试编写相应程序。
解答:
#include
intis(intnumber);
intmain(void)
{
inti,m,n;
printf("Inputmandn:
");
scanf("%d%d",&m,&n);
printf("result:
\n");
for(i=m;i<=n;i++)
if(is(i)!
=0)
printf("%d\n",i);
return0;
}
intis(intnumber)
{
intdigit,sum,temp;
temp=number;
sum=0;
while(temp!
=0){
digit=temp%10;
temp=temp/10;
sum=sum+digit*digit*digit;
}
returnsum==number;
}
7.使用函数求余弦函数的近似值:
输入精度e,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e。
要求定义和调用函数funcos(e,x)求余弦函数的近似值。
试编写相应程序。
cosx=x0/0!
-x²/2!
+x4/4!
-x6/6!
+…
解答:
#include
#include
doublefuncos(doublee,doublex);
intmain(void)
{
doublee,sum,x;
printf("Inputeandx:
");
scanf("%lf%lf",&e,&x);
sum=funcos(e,x);
printf("cos%lf=%lf\n",x,sum);
return0;
}
doublefuncos(doublee,doublex)
{
intflag,i;
doubleitem,sum,tmp,power;
flag=1;
power=1;
tmp=1;
i=0;
item=1;
sum=0;
while(fabs(item)>=e){
item=flag*power/tmp;
sum=sum+item;
power=power*x*x;
tmp=tmp*(i+1)*(i+2);
flag=-flag;
i=i+2;
}
returnsum;
}