函数.docx
- 文档编号:24034430
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:49.61KB
函数.docx
《函数.docx》由会员分享,可在线阅读,更多相关《函数.docx(16页珍藏版)》请在冰豆网上搜索。
函数
1.函数
C函数从函数定义的角度可以划分为两类,即标准库函数和用户自定义函数。
1.1用户自定义函数,必须包含三个基本元素,声明函数,定义函数,调用函数。
#include"stdio.h"
intmain()
{
intm,n;
intfacm,facn,facmn,cmn;
intfactorial(int);/*声明求阶乘函数*/
printf("Pleaseinputmandn:
(m>n)\n");
scanf("%d,%d",&m,&n);
facm=factorial(m);/*调用求阶乘函数,求m的阶乘*/
facn=factorial(n);/*调用求阶乘函数,求n的阶乘*/
facmn=factorial(m-n);/*调用求阶乘函数,求m-n的阶乘*/
cmn=facm/(facn*facmn);
printf("cmn=%d\n",cmn);
return0;
}
intfactorial(intt)/*定义求阶乘函数*/
{
inti;
intf=1;
for(i=1;i<=t;i++)
{
f=f*i;
}
return(f);
}
1.2函数的分类还可以依据它是否有参数是否有一个返回值。
具体有以下四类。
(1)没有参数,没有返回值
(2)有参数,没有返回值
(3)有参数,有返回值
(4)没有参数,有返回值
举例
1.输出一个由大写字母H组成的4×20的方阵。
(没有参数,没有返回值)
#include"stdio.h"
intmain()
{
voidgraph();/*声明函数*/
inti;
for(i=1;i<=4;i++)
{
graph();/*调用函数*/
}
return0;
}
voidgraph()/*定义函数*/
{
printf("HHHHHHHHHHHHHHHHHHHH\n");
}
2.输出一个由指定字母组成的4×20的方阵。
(一个参数,没有返回值)
#include"stdio.h"
intmain()
{
inti;
charletter;
intline=4;/*行数*/
voidgraph(char);/*声明有一个参数,没有返回值的函数*/
printf("Pleaseinputacharacter:
\n");
scanf("%c",&letter);/*输入组成方阵的字母*/
for(i=1;i<=line;i++)
{
graph(letter);/*调用有一个参数,没有返回值的函数*/
}
return0;
}
voidgraph(charch)/*定义有一个参数,没有返回值的函数*/
{
intj;
intnum=20;/*每行20个字符*/
for(j=1;j<=num;j++)
{
printf("%c",ch);/*输出指定字符*/
}
printf("\n");
}
3.设计一个简易的计算器,能实现两个整数的加、减、乘和除的计算。
(加减乘除函数分别编制独立函数)
编程提示:
将要实现的加、减、乘和除四个功能,编写为add,sub,mul和div四个函数,在main函数中的简单界面进行计算的选择,调用对应函数。
/*主菜单的使用*/
/*通过主菜单的调用,了解大型程序设计雏形*/
#include"stdio.h"
#include"conio.h"
intmain()/*主函数*/
{
voidadd();/*声明加法功能函数*/
voidsub();/*声明减法功能函数*/
voidmul();/*声明乘法功能函数*/
voiddiv();/*声明除法功能函数*/
intchoose;
do
{
/*在屏幕上画一个主菜单*/
printf("/**************calculator**************/\n\n");
printf("1:
ADD\n\n");
printf("2:
SUB\n\n");
printf("3:
MUL\n\n");
printf("4:
DIV\n\n");
printf("0:
EXIT\n\n");
printf("/**********************************/\n\n");
printf("pleaseselect:
");
scanf("%d",&choose);/*输入选择项*/
switch(choose)
{
case1:
add();break;
case2:
sub();break;
case3:
mul();break;
case4:
div();break;
default:
return0;/*退出程序*/
}
}while
(1);
return0;
}
voidadd()
{
intx,y;
printf("\nPleaseinputtwodata:
");
scanf("%d%d",&x,&y);
printf("\n%d+%d=%d\n\n",x,y,x+y);
}
voidsub()
{
intx,y;
printf("\nPleaseinputtwodata:
");
scanf("%d%d",&x,&y);
printf("\n%d-%d=%d\n\n",x,y,x-y);
}
voidmul()
{
intx,y;
printf("\nPleaseinputtwodata:
");
scanf("%d%d",&x,&y);
printf("\n%d*%d=%d\n\n",x,y,x*y);
}
voiddiv()
{
intx,y;
printf("\nPleaseinputtwodata:
");
scanf("%d%d",&x,&y);
printf("\n%d/%d=%d\n\n",x,y,x/y);
}
练习
1.将程序继续修改,再加入两个参数,可以实现输出指定大小、指定字符的方阵。
编程提示:
main函数只需将构成方阵的相关信息作为实参,调用输出方阵的函数graph即可。
函数graph通过形参接收方阵的信息,实现输出方阵的细节问题。
通过参数的使用可以使函数变的通用性更好,因此在解决实际问题时多采用这种方法。
2.输入两个数,输出两个数中的最大值。
#include"stdio.h"
intmain()
{
}
intmax(intx,inty)/*定义max函数*/
{
return(t);/*t的值返回到main函数*/
}
3.下面程序的功能是:
根据输入的整数x和n,利用函数fact实现求xn。
例如:
输入:
2,3输出(2,3)=8
/*利用函数fact实现求x的n次方*/
#include"stdio.h"
intmain()
{
intfact(intx,intn);/*声明fact函数*/
intx;
intn;
printf("pleaseinputXandN(>=0):
");
scanf("%d,%d",&x,&n);
/*************************/
printf("(%d,%d)=%d",x,n,
(1));/*调用fact函数*/
return0;
}
intfact(intx,intn)/*定义fact函数求xn*/
{
inti,s;
/*************************/
(2)/*求累积变量的初始化*/
if(n==0)
return1;
for(i=1;i<=n;i++)/*用循环实现xn*/
s=s*x;
/*************************/
(3)/*返回结果xn*/
}
1.3函数的嵌套调用(在被调函数中又调用其它函数。
)
举例
计算
算法分析:
本题可编写三个函数,main函数实现两个数的输入与求和,squ函数计算平方,fac函数计算阶乘。
主函数首先调用squ函数计算平方值,然后在squ函数中以平方值为实参,调用fac计算其阶乘值,然后返回squ,再返回主函数。
#include"stdio.h"
intmain()
{
inti,s=0,num;
intsqu(int);/*声明函数squ*/
for(i=1;i<=2;i++)/*使用循环输入两个数*/
{
printf("Pleaseinput%dnumber\n",i);
scanf("%d",&num);
s=s+squ(num);/*调用函数squ*/
}
printf("s=%d\n",s);
return0;
}
intsqu(intp)/*定义函数squ*/
{
intk,r;
intfac(int);/*声明函数fac*/
k=p*p;
r=fac(k);/*调用函数fac*/
returnr;/*返回平方的阶乘*/
}
intfac(intq)/*定义函数fac*/
{
intc=1,i;
for(i=1;i<=q;i++)
{
c=c*i;
}
returnc;/*返回阶乘值*/
}
程序运行结果:
程序分析:
(1)程序中有三个函数,main、squ和fac。
main函数调用squ函数,squ函数调用fac函数。
在主调函数内需要声明被调函数。
(2)squ函数和fac函数都是有参有返回值的函数。
(3)main函数中,执行循环,依次把输入的值作为实参调用函数squ,执行squ函数先求出num2值,在squ函数中又调用fac函数,这时把num2的值作为实参去调fac函数,在fac函数中完成求num2!
的计算。
fac函数执行完毕把c值(即num2!
)返回给squ函数,再由squ函数返回主函数,实现累加。
(4)由于VC++整型数取值范围的限制,程序在运行中,如果输入13,则会产生溢出,可以考虑使用实型数进行修改此程序进行验证。
1.4递归调用(函数在执行过程中直接或间接对自身的调用)
递归解决某些问题时,能够使很复杂的问题,通过简单的递归关系得以解决,程序简洁、代码紧凑,能体现问题的规律性,但需要牺牲内存空间,使用堆栈来处理函数中间的返回值。
能够使用递归方法解决的问题,需要具备两个条件:
(1)递归的结束条件。
递归要有最简单的情况,符合这个情况,程序将结束递归调用。
(2)递归的规律。
把问题不断转换为简单的相同问题,这种转化要不断接近递归的结束条件。
举例
用递归法计算n!
。
算法分析:
将求阶乘转换为递归的两个条件。
(1)当n取值为0或1时,是求阶乘最简单的情况,阶乘为1。
递归的结束条件:
0!
和1!
为1。
(2)求n的阶乘可以转化为求n-1的阶乘,是向着结束条件的方向。
递归的规律:
n!
=(n–1)!
*n。
#include"stdio.h"
intmain()
{
intn,y;
intfac(int);/*声明fac函数*/
printf("Pleaseinputaintegralnumber:
\n");
scanf("%d",&n);
y=fac(n);/*调用fac函数*/
if(y<0)/*依据返回值的有效性判断输出*/
{
printf("n<0,inputerror\n");
}
else
{
printf("%d!
=%d\n",n,y);
}
}
intfac(intn)/*定义求阶乘函数*/
{
intf;
if(n<0||n>=13)/*处理无效数据*/
{
f=-1;
}
else
{
if(n==0||n==1)/*处理特殊数据*/
{
f=1;
}
else
{
f=fac(n-1)*n;/*直接递归调用*/
}
}
returnf;
}
1.5数组作函数参数
数组用作函数参数有两种形式,一是数组元素作函数参数,二是数组名作函数参数。
1.5.1数组元素作为函数实参
数组元素作为函数实参的使用与普通变量是完全相同的,在函数调用时,形参为对应数组元素类型的变量,把作为实参的数组元素的值传递给形参,实现单向的值传送。
举例
判断一个整型数组中指定元素的值,若大于0,则输出1,若小于等于0则输出0。
#include"stdio.h"
intmain()
{
inta[5],i,p,result;
intjudge(int);/*声明函数*/
printf("Pleaseinput5numbers:
\n");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("Pleaseinputtheposition:
\n");
scanf("%d",&p);
result=judge(a[p]);/*调用函数,数组元素作实参*/
printf("Thejudgmentresultis%d\n",result);
}
intjudge(intt)/*定义函数,整型变量作形参*/
{
if(t>0)
{
return1;
}
else
{
return0;
}
}
1.5.2数组名作函数参数
数组名作函数参数与数组元素作函数参数的不同点如下:
(1)从形式上看,数组元素作实参,形参要求是类型与数组类型一致的普通变量,可以认为对数组元素的处理是按普通变量对待的;数组名作实参,形参要求是和实参数组类型一致的数组。
(2)从内存单元的分配看,数组元素作实参、普通变量作形参时,形参变量和实参变量是由编译系统分配的两个不同的内存单元,数组元素是数组中的一个内存单元,形参是调用时另外分配的一个内存单元;数组名作实参、数组作形参时,编译系统不为形参数组分配内存单元,形参数组和实参数组占用同一段内存单元。
(3)从传递的内容看,数组元素作实参、普通变量作形参时,函数调用时把实参变量的值赋给形参变量,是值传递;数组名作实参、数组作形参时,数组名是数组的首地址,是把实参数组的首地址赋给形参数组,是地址传递,这样形参数组和实参数组首地址相同,所以形参数组不再分配内存单元,和实参数组占用一段内存单元。
这段内存单元在调用函数中用实参数组名使用,在被调函数中用形参数组名使用。
具体对比,浏览数组作函数参数.ppt
练习
求一维数组a中的最大元素及其下标。
#include"stdio.h"
intmax;/*思考:
max是什么类别的变量?
*/
fun(intarr[],intn)
{
intpos,i;
max=arr[0];
pos=0;
for(i=1;i if(max { /*************************/ /*************************/ } returnpos; } intmain() { inta[10]={1,4,2,7,3,12,5,34,5,9},mpos; /*************************/ /*************************/ printf("Themaxis: %d,posis: %d\n",max,mpos); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数
![提示](https://static.bdocx.com/images/bang_tan.gif)