版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 函数
第1章信息技术与计算机C语言程序设计1教学目标、要求了解:函数的定义函数的声明函数的调用(嵌套调用、递归调用)形式参数、实际参数和参数的传递局部变量和全局变量变量的存储类别(自动、静态、寄存器、外部)变量的作用域和生存期26.1问题的提出与程序示例计算机高级语言中的函数实际上是一个能完成某一独立功能的子程序,即程序模块。程序设计人员将大而复杂的程序分解为若干相对独立而功能单一的小程序块(函数)来进行编写,并通过在各个函数之间进行调用,来实现总体上的功能。设计C程序的过程,就是编写函数的过程,我们至少要编写一个main()函数。执行C程序,就是执行相应的main()函数,如果在执行过程中遇到其它函数,则调用其它函数,调用完后,返回到刚才调用函数的下一条语句继续执行,而其它函数也只有在执行main()函数的过程中被调用时才会执行。36.2函数基础函数定义就是定义函数所能实现的功能,即告诉编译系统函数所做的工作。函数声明即函数原型,就是告诉编译系统函数的名称、类型和形式参数表的构成。函数的调用在C语言中除main()由系统自动调用外,其它函数都是由main()直接或间接调用的。函数定义好之后,就可以通过调用的方式使用这个函数。如果函数定义在前,调用此函数在后,这种调用是合法的;但是如果函数定义在后,而调用此函数在前,就会产生编译错误。为使函数的调用不受函数定义位置的影响,可以在调用函数之前进行函数的声明。函数的调用过程分3步:1.参数传递;2.函数体的执行;3.返回。
在一个函数体内允许有一个或多个return语句,一旦执行到其中的某一个return语句时,直接返回调用位置继续往下执行。56.2函数基础形式参数是变量
程序在编译时,并不为形参分配内存单元,只有此函数被调用时,形参才临时占用存储空间,并从调用函数中相应实参获得值;当调用结束后,形参所占的存储单元有被释放。
实际参数是表达式(常量、变量或表达式)
与函数定义中的形参一一对应,即个数相等、次序一致且对应的数据类型相同或相容。函数从用户使用角度上看,可分为标准函数(库函数)和用户定义函数。6案例回放#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);getch();/*使程序暂停,按任一键继续*/}intmax(intx,inty)/*定义函数max()*/{intz;if(x>y)z=x;elsez=y;return(z);}7案例对比voidmain(){intmax(intx,inty);
/*函数说明,可以省略*/inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);getch();/*使程序暂停,按任一键继续*/}#include<stdio.h>/*定义一个函数max()*/intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}86.3函数的定义[类型说明符]函数名([形式参数表]){声明部分; 语句;
}省略类型说明符,C编译系统确认函数返回int数值;类型说明符为void,函数无返回值;省略形式参数表列,此函数为无参函数。函数不能嵌套定义,即所有函数都是平行的,定义函数时是相互独立的,没有从属关系,但是函数可以相互调用。6.3.1函数定义的形式
函数返回值的数据类型说明:96.3函数的定义6.3.2函数的返回值
函数的返回值是通过函数中的return语句获得的,一个函数只能返回一个值,但是函数中可以有一个以上的return语句。函数值的类型,在定义函数时指定(缺省值为int类型,不返回值为void类型)。如果函数值定义类型与return语句返回的表达式值类型不一致,以定义类型为准。如果被调用函数中没有return语句,函数返回一个不确定的值。106.4函数调用函数语句
函数名(实参表列);如:printf(“max=%d”,c);函数表达式
函数为表达式的一部分如:c=2*max(a,b);函数参数
函数的调用作为另一个函数的实参如:m=max(a,max(b,c));函数调用一般形式函数名(实际参数表);函数调用的语法格式
116.4函数调用函数的嵌套调用在调用一个函数的过程中,又调用了另一个函数。其关系如图所示。嵌套调用
12案例一、写出下列程序的运行结果1.#include<stdio.h>fun(inta,intb) {if(a>b)return(a); elsereturn(b);}voidmain(){intx=3,y=8,z=6,r; r=fun(fun(x,y),x*z); printf("%d\n",r);}结果:1813案例2.#include<stdio.h>intfun(intx,inty){return(y-x)*x;}voidmain() {inta=3,b=4,c=5,d; d=fun(fun(a,b),fun(a,c)); printf("%d\n",d);}结果:9146.5函数说明如果使用库函数,一般应在文件开头用#include命令将被调库函数所需的相关的信息“包含”到本源程序文件中。如果使用用户自定义函数,而且该函数与调用它的函数在同一个文件中,一般应在主调函数中对被调函数作声明(用函数的原型声明)。voidmain() voidmain(){floatadd(floatx,floaty); {floatadd(float,float); …… …… …… ……} }floatadd(floatx,floaty) floatadd(floatx,floaty){……} {……}156.5函数说明如果被调用函数的定义出现在主调函数之前,可以不作声明。如果在所有函数定义之前(在函数外部)已作了函数声明,则各主调函数不必对被调函数作声明。charletter(char,char);/*函数声明*/floatf(float,float);/*函数声明*/inti(float,float);/*函数声明*/voidmain(){……}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(floatj,floatk){……}166.6参数传递
回顾1.定义函数时,形式参数不占内存单元,只能函数发生调用时,形参才被分配内存单元,而调用结束后,形参所占的内存单元被释放。2.实参可以是常量、变量和表达式(值一定是确定的)。3.定义函数时,需指定形参的类型。4.形参和实参的类型相同或赋值兼容。6.6.1形参和实参参数传递—即虚实结合,调用函数将实际参数的信息传递给被调用函数的形式参数,使形式参数具有确切的含义。C语言规定,实参变量对形参变量的数据传递是单向传递,即值传递,(在内存中,实参单元和形参单元占用不同的内存单元)。176.6.2基本数据类型的形参
当形参的数据类型为基本数据类型时,参数传递方式为值传递,被调用函数本身不对实参进行操作,即使形参的值在函数中发生了变化,实参的值也完全不会影响,仍为调用前的值,这种传递方式减少了调用函数与被调用函数之间的数据依赖。例如:输入a,b两个整数,用函数实现按大小顺序输出。#include<stdio.h>voidswap(intx,inty){inttemp;
temp=x;x=y;y=temp;
}voidmain(){inta,b;scanf("%d,%d",&a,&b);if(a<b)swap(a,b);
printf("\n%d,%d\n",a,b);}x
y
186.6.3形参的数据类型是指针类型
程序中定义的变量,在编译时给变量分配内存单元,内存中的每一个字节的编号,称为地址,而内存单元中存放的内容称为数据。
如:inti=3,j=5,k;k=i+j;这种按变量名存取变量值的方式称为“直接访问”方式。也可以采用“间接访问”方式,即将变量i的地址存放到另一个变量中,这种用来存放另一个变量地址的变量称为指针变量。指针变量的值是指针即地址。指针数据类型
19指针变量的定义
格式:数据类型*变量名……;说明:
*表示变量名是指针变量。例如:inti,*p;指针所指对象地址2001H2002H内容ip00000000000000110010000000000001……pi2001H3*p&i2122H2123H20指针运算符
&——取地址运算符 优先级别2*——指针运算符(间接访问运算符) 自右向左#include<stdio.h>voidmain(){inta,b;
int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);}216.6参数传递指针变量作函数参数时,是将一个变量的地址传送到另一个函数中。是值传递。
可以实现被调函数对指针所指变量的修改。即通过传递指针变量的值,调用函数和被调用函数可以操作相同的存储单元。6.6.3形参的数据类型是指针类型
22案例例如:输入a,b两个整数,用函数实现按大小顺序输出。#include<stdio.h>voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidmain(){int*pt1,*pt2,a,b;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b)swap(pt1,pt2);printf("\n%d,%d\n",a,b);}23&apt1a5b9图示&bP2apt1&a5bpt2&b9在main()函数中p1&apt2&b59在swap()函数中24案例例如:输入a,b两个整数,用函数实现按大小顺序输出。#include<stdio.h>voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}voidmain(){int*pt1,*pt2,a,b;scanf("%d,%d",&a,&b);pt1=&a;pt2=&b;if(a<b)swap(pt1,pt2);printf("\n%d,%d\n",a,b);}25&bp2&ap1a5b9交换指针变量p1和p2的值,而不是变量a和b的值。图示&bp2a5b9&ap1pt2pt1266.7递归调用函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。1.C语言在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其自身。每调用一次就进入新的一层。2.为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。递归调用
几点说明
27案例1.用递归法计算n!。
1n=0,1 n×(n-1)! n>1n!=floatfac(intn){floatf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}voidmain(){intn;floaty;printf("inputaintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%15.0f",n,y);}28案例2.有5个人坐在一起,问第5个人多少岁?他说比第4人大2岁,第4人比第3人大2岁,以此类推,第1人10岁,求第5个人多大?age(n)=
10 n=1
age(n-1)+2 n>1分析:#include<stdio.h>age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return;}voidmain(){printf("%d\n",age(5));}29补充题3.编写程序将输入的十进制整数转换为二进制输出。#include<stdio.h>voidmain(){voidfun(int);intn;
scanf(“%d”,&n);fun(n);}voidfun(intn){if(n!=1)fun(n/2);printf(“%d”,n%2);}306.8变量的存储类别C语言中说明变量的类型,可以确定该变量占用内存空间的大小。在C语言中可以说明变量的存储类别,不同的存储类别可以确定一个变量的作用域和生存期。C语言中变量的存储类别自动变量(auto)、寄存器变量(register)、外部变量(extern)和静态变量(static)。用户存储空间程序区、静态存储区和动态存储区。自动变量和寄存器变量存放在动态存储区,外部变量和静态内部变量存放在静态存储区。316.8.1局部变量与全局变量局部变量在函数体内或分程序内定义,存储在动态存储区。在函数中定义的局部变量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。在复合语句中定义的局部变量,只在该复合语句中有效;退出复合语句后,也不能再使用。定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。局部变量
C语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此将C语言中的变量分为局部变量(内部变量)和全局变量(外部变量)。intf1(inta)
/*a,b,c仅限于函数f1()*/
{intb,c;
……}
intf2(intx)
/*x,y,z仅限于函数f2()*/
{inty,z;
……}
main()
/*m,n仅限于函数main()*/
{intm,n;
……}326.8.1局部变量与全局变量全局变量在函数外定义,存储在静态存储区。全局变量从变量定义处开始到本程序文件的末尾有效。如果在定义点之前或其他源程序文件中要引用该变量,则应该在引用处之前用extern对变量加以声明。定义而不初始化,则其值为0。如果初始化,则赋初值操作是在编译时进行的,且只赋值一次。全局变量
intp=1,q=5;floatf1(inta){intb,c;…………}charc1,c2;charf2(intx,inty){inti,j;…………}main(){intm,n;…………}a,b,c有效i,j,x,y有效m,n有效c1,c2有效p,q有效33案例1.写出下列程序的运行结果。 #include<stdio.h>
inta=3,b=5; max(inta,intb) {intc; c=a>b?a:b; return(c); } voidmain() {inta=8; printf("%d",max(a,b)); }结果:834案例2.输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。#include<stdio.h>ints1,s2,s3;intvs(inta,intb,intc){intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;}voidmain(){intv,l,w,h;clrscr();printf("\ninputlength,widthandheight
");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3);} 35案例1.写出下列程序的运行结果。#include<stdio.h>voidmain(){intmax(intx,inty);
externA,B;
/*外部变量说明*/printf("%d",max(A,B));}
intA=13,B=-8;intmax(intx,inty){intz;z=x>y?x:y;return(z);}结果:1336案例2.求a×b和am的值。/*file1.c*/#include<stdio.h>intA; voidmain(){intpower(int);intb=3,c,d,m; scanf("%d,%d",&A,&m);c=A*b;printf("%d*%d=%d\n",A,b,c);d=poewr(m);printf("%d**%d=%d\n",A,m,d);}/*file2.c*/externA;power(intn){inti,y=1; for(i=1;i<=n;i++)y=A*y;return(y);}376.8.2静态变量静态变量可以分为内部静态变量和外部静态变量。静态变量函数调用结束后不释放内存单元,保留其值。定义格式内部静态变量在函数体或分程序内定义,且在本函数体或分程序内有效(即用static声明的局部变量)。外部静态变量在函数体外定义,且在本源程序文件内有效(即用static声明的全部变量)。定义而不初始化,则其值为0。如果初始化,则赋初值操作是在编译时进行的,且只赋值一次。
static数据类型变量表;38案例#include<stdio.h>f(inta){autointb=0;staticintc=3;/*内部静态变量*/b++;c++;return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}结果:789
396.8.3寄存器变量一般情况下,变量的值存放在内存中,对于频繁使用的变量可以将其值存到CPU中的寄存器中,以提高执行的速度。定义格式寄存器变量的实现与硬件配置有关。只有很少的变量可以保存在寄存器中。register说明只适用于自动变量和函数的形参。
register
数据类型变量表;40总结C语言中的每个变量和函数都有两个属性:数据类型
数据的存储类别变量声明的一般格式[存储类别]类型说明符变量表;存储类别为auto、register、static和extern缺省值为auto41案例#include<stdio.h>intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;return(f);}voidmain(){inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));}例如:求n!42补充题1.以下程序的功能是计算函数的值,请选择填空。
F(x,y)=(x+y)/(x-y)+(z+y)/(z-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国内货物出售合同
- 2025年上海公司劳动合同模板(2篇)
- 2025国际货物买卖合同样板版
- 2025年上海市租房合同样本(2篇)
- 数字工作室租赁合同
- 楼房屋买卖合同
- 二零二五年度商业空间地板翻新与改造合同4篇
- 二零二五年度中小企业贷款居间服务合同
- 2025年度电子设备物品借款抵押技术开发合同
- 2025年度烧烤广场餐厅合伙经营与管理合同
- 重庆市2023-2024学年七年级上学期期末考试数学试题(含答案)
- 《七律二首 送瘟神》教案- 2023-2024学年高教版(2023)中职语文职业模块
- 2024年中考语文满分作文6篇(含题目)
- 2024年安全员之江苏省C2证(土建安全员)题库与答案
- 第一节-货币资金资料讲解
- 电力基建复工安全教育培训
- 2018注册环保工程师考试公共基础真题及答案
- 如何提高售后服务的快速响应能力
- Unit-3-Reading-and-thinking课文详解课件-高中英语人教版必修第二册
- 婚介公司红娘管理制度
- 煤矿电气试验规程
评论
0/150
提交评论