ch5例题习题实验.docx
《ch5例题习题实验.docx》由会员分享,可在线阅读,更多相关《ch5例题习题实验.docx(39页珍藏版)》请在冰豆网上搜索。
ch5例题习题实验
第五章函数
例题
5.1
#include
/*
函数功能:
计算平均数
函数入口参数:
整型x,存储第一个运算数
整型y,存储第二个运算数
函数返回值:
平均数
*/
intAverage(intx,inty)
{
intresult;
result=(x+y)/2;
returnresult;
}
main()
{
inta=12;
intb=24;
intave=Average(a,b);/*在这里进行函数调用*/
printf("Averageof%dand%dis%d.\n",a,b,ave);
}
5.2
#include
intAverage(intx,inty);/*声明Average()函数*/
main()
{
inta=12;
intb=24;
intave=Average(a,b);/*在这里进行函数调用*/
printf("Averageof%dand%dis%d.\n",a,b,ave);
}
/*
函数功能:
计算平均数
函数入口参数:
整型x,存储第一个运算数
整型y,存储第二个运算数
函数返回值:
平均数
*/
intAverage(intx,inty)
{
intresult;
result=(x+y)/2;
returnresult;
}
5.3
#include
Func()
{
printf("inFunc()\n");
}
main()
{
Func(1,2,3);
}
5.4
#include
main()
{
inta;
{
intb;
{
intc;
a=0;b=0;c=0;d=0;
}
a=0;b=0;c=0;d=0;
}
{
intd;
a=0;b=0;c=0;d=0;
}
a=0;b=0;c=0;d=0;
}
5.5
#include
main()
{
inta=1;
{
inta=2;
printf("IntheINNERblock,a=%d\n",a);
}
printf("IntheOUTERblock,a=%d\n",a);
}
5.6
#include
intAverage(intx,inty);/*声明Average()函数*/
main()
{
intx=12;
inty=24;
printf("Averageof%dand%dis%d.\n",x,y,Average(x,y));
}
/*
函数功能:
计算平均数
函数入口参数:
整型x,存储第一个运算数
整型y,存储第二个运算数
函数返回值:
平均数
*/
intAverage(intx,inty)
{
return(x+y)/2;
}
5.7
#include
intglobal;/*定义全局变量*/
voidGlobalPlusPlus(void);
main()
{
global=1;
printf("BeforeGlobalPlusPlus(),itis%d\n",global);
GlobalPlusPlus();
printf("AfterGlobalPlusPlus(),itis%d\n",global);
}
/*
函数功能:
对全局变量global加1,并打印加1之前与之后的值
函数入口参数:
无
函数返回值:
无
*/
voidGlobalPlusPlus(void)
{
printf("Before++,itis%d\n",global);
global++;
printf("After++,itis%d\n",global);
}
5.8
#include
voidGlobalPlusPlus(void);
main()
{
intglobal=1;
printf("BeforeGlobalPlusPlus(),itis%d\n",global);
GlobalPlusPlus();
printf("AfterGlobalPlusPlus(),itis%d\n",global);
}
/*
函数功能:
对局部变量global加1,并打印加1之前与之后的值
函数入口参数:
无
函数返回值:
无
*/
voidGlobalPlusPlus(void)
{
intglobal=1;
printf("Before++,itis%d\n",global);
global++;
printf("After++,itis%d\n",global);
}
5.9
#include
voidFunc(void);
main()
{
inti;
for(i=0;i<10;i++)
{
Func();
}
}
/*
函数功能:
打印被调用的次数
函数入口参数:
无
函数返回值:
无
*/
voidFunc(void)
{
staticinttimes=1;/*定义静态变量*/
printf("Func()wascalled%dtime(s).\n",times++);
}
5.10
getnum.prj文件:
getnum.c
main.c
----------------------------------------
getnum.h文件:
externunsignedintgetnumError;/*声明外部变量*/
intGetInt(void);
longGetLong(void);
floatGetFloat(void);
doubleGetDouble(void);
----------------------------------------
getnum.c文件:
#include"getnum.h"
#include
#include
#include
#include
#defineBUFFER_SIZE32/*输入缓冲区大小*/
enuminput_type{FLOAT,INT}inputType;/*输入类型*/
unsignedintgetnumError=0;/*非零表示出错*/
staticunsignedcharbuffer[BUFFER_SIZE];/*输入缓冲区*/
staticunsignedintpos=0;/*buffer中有效数据的末尾位置+1*/
staticunsignedchar*GetInput(void);
staticintIsValidChar(charch);
staticintHasDot(void);
/*
函数功能:
读取用户的int类型输入
函数入口参数:
无
函数返回值:
用户输入结果
*/
intGetInt(void)
{
return(int)GetLong();
}
/*
函数功能:
读取用户的long类型输入
函数入口参数:
无
函数返回值:
用户输入结果
*/
longGetLong(void)
{
inputType=INT;
returnatol(GetInput());/*把字符串转为数值类型*/
}
/*
函数功能:
读取用户的float类型输入
函数入口参数:
无
函数返回值:
用户输入结果
*/
floatGetFloat(void)
{
return(float)GetDouble();
}
/*
函数功能:
读取用户的double类型输入
函数入口参数:
无
函数返回值:
用户输入结果
*/
doubleGetDouble(void)
{
inputType=FLOAT;
returnatof(GetInput());/*把字符串转为数值类型*/
}
/*
函数功能:
读取用户输入的字符串,限制必须是整数或者浮点数
函数入口参数:
无
函数返回值:
数据缓冲区
*/
staticunsignedchar*GetInput(void)
{
charc='\0';
pos=0;
while((c=getch())!
='\r')/*回车输入结束*/
{
if(c=='\b')/*输入退格符*/
{
if(pos>0)
{
pos--;
printf("\b\b");/*删除前一个字符*/
}
else
putchar('\a');/*响铃,提醒没有字符可删除*/
}
elseif(pos<(BUFFER_SIZE-1))/*防止越界并为'\0'预留空间*/
{
if(IsValidChar(c))/*合法字符保存并回显*/
{
buffer[pos++]=c;
putchar(c);
}
else
putchar('\a');/*响铃,提醒输入非法字符*/
}
else/*达到buffer上界*/
{
putchar('\a');
}
}
buffer[pos]='\0';
putchar('\n');
if(pos>0)
getnumError=0;
else
getnumError=1;/*用户什么都没有输入*/
returnbuffer;
}
/*
函数功能:
判断当前输入的字符是否合法
函数入口参数:
无
函数返回值:
非0表示合法,0表示非法
*/
staticintIsValidChar(charch)
{
intresult;/*判断结果*/
if(ch>='0'&&ch<='9')/*数字全部接收*/
result=1;
elseif(pos==0&&(ch=='-'||ch=='+'))/*第一个字符可以是正负号*/
result=1;
elseif(ch=='.'&&inputType==FLOAT&&!
HasDot())/*只有浮点数能输入一次小数点*/
{
result=1;
}
else/*其余情况皆非法*/
result=0;
returnresult;
}
/*
函数功能:
判断是否已经输入了小数点
函数入口参数:
无
函数返回值:
非0表示已经输入,0表示还未输入
*/
staticintHasDot(void)
{
inti;
for(i=0;i='.';i++)
;
return(i}
----------------------------------------
main.c文件:
#include
#include"getnum.h"
main()
{
doublef;
printf("TestGetDouble().\n");
do
{
printf("Inputanumber:
");
f=GetDouble();
if(getnumError!
=0)
printf("Youinputnothing.\n");
else
printf("Whatyouinputis%lf.\n",f);
}while(f!
=-1);/*输入-1退出*/
}
5.11
#include
intFactorial(intx);
main()
{
intx;
while
(1)/*无限循环*/
{
printf("Pleaseinputx(-1toquit):
");
scanf("%d",&x);
if(x==-1)
break;/*循环出口*/
else
printf("Thefactorialof%dis%d.\n",x,Factorial(x));
}
}
/*
函数功能:
计算x的阶乘
函数入口参数:
整型x
函数返回值:
整型的结果
*/
intFactorial(intx)
{
inti,result;
for(i=1;i<=x;i++)
result*=i;
returnresult;
}
习题
习题答案
5.1
5.2
5.3
#include
intSquare(inti)
{
returni*i;
}
main()
{
inti=0;
i=Square(i);
for(;i<3;i++)
{
staticinti=1;
i+=Square(i);
printf("%d,",i);
}
printf("%d\n",i);
}
5.4
#include
main()
{
intn,ret;
printf("Inputn:
");
scanf("%d",&n);
ret=IsPrimeNumber(n);
if(ret!
=0)
{
printf("%disaprimenumber\n",n);
}
else
{
printf("%disnotaprimenumber\n",n);
}
}
/*
函数功能:
判断参数是否是素数
函数入口参数:
number为整型数,要求为正整数
函数返回值:
非0值表示是素数,否则不是素数
*/
intIsPrimeNumber(intnumber)
{
inti;
if(number<=1)/*负数、0和1都不是素数*/
return0;
for(i=2;i<=sqrt(number);i++)
{
if((number%i)==0)/*被整除,不是素数*/
return0;
}
return1;
}
-------------------------------------------------
#include
main()
{
intn,ret;
printf("Inputn:
");
scanf("%d",&n);
ret=IsPrimeNumber(n);
if(ret!
=0)
{
printf("%disaprimenumber\n",n);
}
else
{
printf("%disnotaprimenumber\n",n);
}
}
/*
函数功能:
判断参数是否是素数
函数入口参数:
number为整型数,要求为正整数
函数返回值:
非0值表示是素数,否则不是素数
*/
intIsPrimeNumber(intnumber)
{
inti,flag=1;/*标志变量置为真,假设是素数*/
if(number<=1)/*负数、0和1都不是素数*/
flag=0;
for(i=2;i<=sqrt(number);i++)
{
if((number%i)==0)/*被整除,不是素数*/
flag=0;
}
returnflag;
}
5.5
#include
unsignedlongFactorial(unsignedintnumber);
main()
{
unsignedintm,k;
doublep;
do{
printf("Pleaseinputm,k(m>=k>0):
");
scanf("%u,%u",&m,&k);
}while(mp=(double)Factorial(k)/Factorial(m-k);
printf("p=%f\n",p);
}
/*
函数功能:
计算参数的阶乘
函数入口参数:
无符号整型
函数返回值:
运算结果
*/
unsignedlongFactorial(unsignedintnumber)
{
unsignedlongi,result=1;
for(i=2;i<=number;i++)
result*=i;
returnresult;
}
5.6
#include
intMaxCommonFactor(inta,intb);
main()
{
inta,b,x;
printf("Inputa,b:
");
scanf("%d,%d",&a,&b);
x=MaxCommonFactor(a,b);
printf("MinCommonMultiple=%d\n",x);
}
/*
函数功能:
计算两个正整数的最大公约数
函数入口参数:
两个整型数
函数返回值:
最大公约数;-1表示没有最大公约数
*/
intMaxCommonFactor(inta,intb)
{
if(a<=0||b<=0)/*保证输入的参数正确*/
return-1;
while(a!
=b)
{
if(a>b)
{
a=a-b;
}
elseif(b>a)
{
b=b-a;
}
}
returna;
}
5.7
#include
intCommonFactors(inta,intb);
main()
{
intsub;
while((sub=CommonFactors(100,50))>0)
{
staticintcounter=1;
printf("Commonfactor%dis%d\n",counter++,sub);
}
}
/*
函数功能:
指明计算哪两个数的公约数
函数入口参数:
两个整型数
函数返回值:
公约数
*/
intCommonFactors(inta,intb)
{
staticintnum1=-1;
staticintnum2=-1;
staticintcurFactor;
if(a<0||b<0)
return-1;
if(num1!
=a||num2!
=b)/*使用了新的参数*/
{
num1=a;
num2=b;
curFactor=a>b?
b:
a;/*curFactor置为两个数中较小的那个*/
}
while(curFactor>0)
{
if(a%curFactor==0&&b%curFactor==0)
{
returncurFactor--;/*如果不减1,则下次还会测试这个数*/
}
curFactor--;
}
return-1;
}
5.8
cmnfctr.h文件:
voidCalcCommonFactorOf(intnum1,intnum2);
intNextCommonFactor(void);
----------------------------------------------
main.c文件:
#include
#include"cmnfctr.h"
main()
{
intsub;
CalcCommonFactorOf(100,50);
while((sub=NextCommonFactor())>0)
{
staticintcounter=1;
printf("Commonfactor%dis%d\n",counter++,sub);
}
}
----------------------------------------------
cmnfctr.c文件:
staticinta,b;
staticintcurFactor;
/*
函数功能:
指明计算哪两个数的公约数
函数入口参数:
两个整型数
函数返回值:
无
*/
voidCalcCommonFactorOf(intnum1,intnum2)
{
a=num1;
b=num2;
curFactor=a>b?
b:
a;/*curFactor置为两个数中较小的那个*/
}
/*
函数功能:
得到下一个公约数
函数入口参数:
无
函数返回值:
下一个公约数;-1表示再也没有新的公约数
*/
intNextCommonFactor(void)
{
if(a<=0||b<=0)/*保证输入