




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、5.1 5.1 函数的基本概念函数的基本概念 1) 除除main外外, 其它为系统函数、自编函数其它为系统函数、自编函数, 系统函数:系统函数:由系统提供,放在不同的头文由系统提供,放在不同的头文 件中,用户可调用。件中,用户可调用。 自编函数:自编函数:由用户按语法规则编写。由用户按语法规则编写。C程序由一个程序由一个main和任意个函数组成。和任意个函数组成。 2) 除除main函数函数外外,其它函数可相互调用其它函数可相互调用main ( )abcdxz3)函数不可嵌套定义函数不可嵌套定义,但可以嵌套调用。但可以嵌套调用。4)函数分为有参与无参函数函数分为有参与无参函数5)程序从程序从m
2、ain开始执行开始执行,最后又回到最后又回到main函函 数结束。数结束。例5.1 int max(int a,int b) if(ab)return a; else return b;void main() int max(int a,int b); int x,y,z; printf(input two numbers:n); scanf(%d%d,&x,&y); z=max(x,y); printf(maxmum=%d,z);返回类型符返回类型符 函数名函数名( ) 说明部分说明部分 语句语句 1. 无参函数无参函数定义形式定义形式 注意:注意:返回类型符表示函数的返回值
3、类型。返回类型符表示函数的返回值类型。例:void Hello() printf (Hello,world n); 这里, Hello为函数名, Hello函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。类型标识符类型标识符 函数名函数名(形参表列形参表列) 形参说明形参说明 说明部分说明部分 语句语句 2. 有参函数有参函数 定义形式定义形式例例: 求二数之最大值求二数之最大值 int max (x, y) int x, y; int z; z=xy? x:y; return (z); 用用return, 语句,返回函数的值。语句,返回函数的值。或:或: int m
4、ax (int x, int y) int z; z=xy? x:y; return (z); 5.3函数的调用 5.3.15.3.1形式参数和实际参数形式参数和实际参数 函数的参数分为形参和实参两种。 形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。 实参出现在主调函数中,发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 形参与实参形参与实参调用时调用时: 实参值实参值单向单向传递传递形参。形参。 函数被调用时,临时分配单元给形参函数被调用时,临时分配单元给形参,调用完调用完毕,毕, 这些单元被释放。这些单元被释放。注注: 实
5、参可为表达式实参可为表达式,只传递表达式的值。只传递表达式的值。实参实参: 出现在调用函数中,出现在调用函数中, 形参形参: 出现被调用函数中。出现被调用函数中。 实参、形参类型一致。实参、形参类型一致。 可在形参表列中对形参说明。可在形参表列中对形参说明。例5.3:void main() int k,n; printf(input numbern); scanf(%d,&n); k=s(n); printf(n=%d,k=%dn,n,k);int s(int m) m=m+1 return m;本程序运行时,输入5,运行结果为:n=5,k=6在执行函数过程中,形参m的值变为6。返回主
6、函数之后,输出实参n的值仍为5。可见实参的值不随形参的变化而变化。思考:程序做如下改动,会出现什么问题?如果将程序第7行改为printf(n=%d,k=%d,m=%d,n,k,m); 如果将程序第6行改为k=s(n,n);如果删除程序中的scanf(%d,&n);例5.4:请分析程序的运行结果。#includestdio.hvoid main()int a=3,b=5; swap(a,b); printf(a=%d,b=%dn,a,b);swap(int x,int y)int temp; temp=x;x=y;y=temp; printf(x=%d,y=%dn,x,y);5.3.2函
7、数的调用 语言中,函数调用的一般形式为: 函数名(【实际参数表】) 对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。函数调用的方式一般有两种:函数表达式: 函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。函数语句: 函数调用的一般形式加上分号即构成函数语句例5.5求二实数之和求二实数之和 #include float add( float x, float y) /*函数定义函数定义*/ float z; z=x+y; return z; main ( ) float a, b
8、, c; scanf(“%f, %f”,&a, &b); c=add(a, b); /*函数调用函数调用*/ printf (sum= %f;c); 其中c=add(a,b)是一个赋值表达式,把add的返回值赋予变量c。例5.6#includestdio.hvoid printstar() printf(n*n);void print_message() printf(How do you do !n);void main()printstar(); print_message(); printstar();程序运行结果为:*How do you do !*函数printsta
9、r和print_message都没有返回值,调用时函数名后直接加分号作为语句 5.3.3 5.3.3 函数声明:函数声明:一般的函数被调用之前必须做出说明:一般的函数被调用之前必须做出说明:例例1: 求二实数之和求二实数之和 #include main ( ) float add( ); /*函数说明函数说明*/float a, b, c; scanf(“%f, %f”,&a, &b); c=add(a, b); /*函数调用函数调用*/ printf (sum= %f;c); 说明格式:说明格式:类型符类型符 函数名函数名( );float add( float x, flo
10、at y); /*函数定义函数定义*/ float z; z=x+y; return z;可省略函数说明的几种情况:可省略函数说明的几种情况: 当返回值为整型、字符型。当返回值为整型、字符型。 函数的定义放在函数的定义放在main()函数之前。()函数之前。例例2: 求二实数之和求二实数之和( (将例将例1 1程序改写如下程序改写如下:):) #include float add( float x, float y); /*函数定义函数定义*/ float z; z=x+y; return z; main ( ) float a, b, c; scanf(“%f, %f”,&a, &a
11、mp;b); c=add(a, b); /*函数调用函数调用*/ printf (sum= %f;c); 5.3.4 5.3.4 函数返回值函数返回值变量等 通过通过return语句将返回值传给函数名语句将返回值传给函数名,可有可有多个多个return. 返回值类型为函数类型。返回值类型为函数类型。 一般一般return中的返中的返回值类型应与函数定义时的类型一致,回值类型应与函数定义时的类型一致, 不一致时不一致时,以函数定义类型为准。以函数定义类型为准。 return (表达式表达式);由函数名只能得到一个返回值。由函数名只能得到一个返回值。 不返回函数值的函数,可以明确定义为不返回函数值
12、的函数,可以明确定义为“空空类型类型”,类型说明符为,类型说明符为“void”void”。函数被定义为。函数被定义为空类型后,函数中的空类型后,函数中的returnreturn语句不能带有表达式语句不能带有表达式例5.8: #include main ( ) int s; s=f(); printf(%d,s); int f()int i=1,sum=0; do sum=sum+i; i+; while (i=100);return sum;思考:如何考虑将函数设计为有参数或无参数函数的通用性如何设定函数的返回值100211001ii例5.9: #include main ( ) int m,
13、s; scanf(“%d”,&m); s=f(m); printf(%d,s); int f(int n)int i=1,sum=0; do sum=sum+i; i+; while (i=n);return sum;nini211函数不能嵌套定义,但可以嵌套调用。函数不能嵌套定义,但可以嵌套调用。a( ) : :调用b : :b( ) : : : : : main : :调用a : :嵌套调用嵌套调用 : 调用一个函数的过程中又调用调用一个函数的过程中又调用另一函数另一函数例5.11计算s=52!+82!本题可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数
14、f2。long f1(int p) int k; long r; long f2(int); k=p*p; r=f2(k); return r;long f2(int q) long c=1; int i; for(i=1;i=q;i+) c=c*i; return c;main() int i; long s=0; for (i=5;i=8;i=i+3) s=s+f1(i); printf(ns=%ldn,s);例例5.12 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int
15、 y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; ret
16、urn(r1)当条件成立当条件成立,调用递归调用递归,否则结束。否则结束。例例5.13: 求求n!1. 从数学上定义从数学上定义2. 程序程序: #include long fac(int n) /*函数定义函数定义, 计算计算n!*/ long f; if (n0) printf(input error!n); else if (n= = 0 n= =1)f =1; else f =n fac(n 1); return (f); main ( ) int n; long y; printf(input a integer! ) scanf (%d, &n); y=fac(n); /*
17、函数调用函数调用, 计算计算n!*/ printf(%d!=%15ld, n, y);3. 执行过程执行过程: 设设: 输入输入 5 (n=5)第一次调用:第一次调用:y=fac(5) 返回:返回:y=5fac(4)main ( ) y=5 fac(4); fac(4) f=4 fac(3); return f; fac(3) f=3 fac(2); return f; fac=4!n=4n=3fac=3!fac(2) f=2 fac(1); return f;fac(1) f=f (1); return f;n=1fac=1n=2fac=2!简化表示为:简化表示为:n=1n=2n=3n=4f
18、ac=4!fac=3!fac=2!fac=1n=5 当变成机器代码时当变成机器代码时,将其拉成直线将其拉成直线(线性程线性程序代码序代码)。例5.14递归计算x的y次方#include int power(int x, int y) /* 计算x 的 y 次方的递归函数 */ if(y = 0) return 1; /* 任何不等于0的数的0次方为1 */ return x*power(x, y-1); void main() int x, y; printf(请输入 x 和 y :); scanf(%d%d, &x, &y); printf(%d%d = %dn, x, y,
19、 power(x, y);例5.15: 汉诺塔(Hanoi)问题BC问题: 将A塔上n个盘子移至C(借助于B)。 移动时,保证三个塔始终是大盘在下,小盘在上。An个盘子必须用递归方式解决1) 先将A塔n 1个盘子借助于C移至B上2) 将A上剩下的一个移至C上.3) 将B上n 1个盘子借助于A移至C上.可以看到: 1)、3)为同一问题,都为n 1个盘子借助于一个 空塔移至另一塔上。程序如下:#include void move (char getone,char putone) /*函数定义函数定义*/ printf(“ %c %cn ”, getone, putone);void hanoi
20、(int n, char one, char two, char three) /*将将n个盘从个盘从one借助借助two,移到移到three*/ if (n= =1) move (one, three); else hanoi (n1, one, three, two); move (one, three); /*函数调用函数调用*/ hanoi (n1, two, one, three); main ( ) int m; printf ( input the number of diskes :); scanf( %d ,&m); printf( The step to movin
21、g %3d diskes:n , m); hanoi (m, A, B, C); /*函数调用函数调用*/运行情况如下: input the number of diskes:3 The step to moving 3 diskes: A C A B C B A C B A B C A C在程序中有两个函数: move (getone, putone) 表示从getone 塔移一个盘子至putone塔 hanoi(n, one, two, three) 表示n个盘子从one塔借助于two塔(空)移至three塔。 调用时塔用字符常量A , B , C 表示。5.65.6变量的存储类别和作用域
22、变量的存储类别和作用域 5.6.15.6.1局部变量与全局变量局部变量与全局变量一、局部变量一、局部变量 凡在函数凡在函数(含含main 函数函数)内部定义的变量称为内部定义的变量称为局部变量。局部变量。局部性局部性: 局部变量仅在函数内部有效。局部变量仅在函数内部有效。1. 不同的函数可具有同名的变量不同的函数可具有同名的变量,它们占不同的内它们占不同的内存单元存单元,互不影响。互不影响。2. 形参为局部变量。形参为局部变量。 3. 在复合语句中可定义仅复合语句中有效的临时在复合语句中可定义仅复合语句中有效的临时变量。变量。float f1( a ) 函函 数数f1int a ; int b
23、, c; a ,b ,c有有 效效 char f2(x,y) 函函 数数f2int x,y; int i, j; x, y, i, j 有有 效效 main() 主主 函函 数数 int m,n; m, n 有有 效效二、全局变量二、全局变量例例: int p=1, q=5; float f1(a) int a; int b, c; char c1, c2; p,q的作用范围的作用范围c1, c2的作用范围的作用范围 一个源文件中一个源文件中,在所有函数之外定义的变量为在所有函数之外定义的变量为全局变量。全局变量。有效性有效性: 自定义位置开始至文件结尾全部有效。自定义位置开始至文件结尾全部有
24、效。 char f2(x,y); int c, y; int i, j; main ( ) 1. 全局变量所作用到的函数,相当于这些函数的公全局变量所作用到的函数,相当于这些函数的公共变量。于是共变量。于是,当一个函数对其值进行改变后当一个函数对其值进行改变后,另另一个函数使用该变量的值亦相应改变。一个函数使用该变量的值亦相应改变。好处好处: 函函数之间值传递。数之间值传递。2. 不要随意使用全局变量。一是始终占据内存单不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减元;二是由于函数依赖于外部定义的变量,减少了通用性。少了通用性。3. 不在作用域内函数。若使用全
25、局不在作用域内函数。若使用全局(外外)变量,需在变量,需在函数体内加上函数体内加上extern保留字。保留字。4. 全局和局部变量同名时全局和局部变量同名时,局部变量有效。局部变量有效。 float f1 (x) int x; extern int a, b; int a0,b= 1; main ( ) a, b作用域例5.16#include int max (int x, int y) int z; z = xy ? x : y; return z; void main ( ) extern int a, b; /* 全局变量外部说明 */ printf (%dn, max (a,b);
26、int a = 10, b = 5; /* 全局变量定义 */例5.17输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。int s1,s2,s3;int vs( int a,int b,int c) int v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v;main() int v,l,w,h; printf(ninput length,width and heightn); scanf(%d%d%d,&l,&w,&h); v=vs(l,w,h); printf(nv=%d,s1=%d,s2=%d,s3=
27、%dn,v,s1,s2,s3);分析:为何将s1,s2,s3定义为全局变量?例5.18 外部变量与局部变量同名。int a=3,b=5; /*a,b为外部变量*/max(int a,int b) /*形参a,b为内部变量*/int c; c=ab?a:b; return(c);main()int a=8; /*a为内部变量*/printf(%dn,max(a,b);变量的存储类别变量的存储类别变量的存储类别变量的存储类别程序区程序区静态存储区静态存储区动态存储区动态存储区数据数据,变量存放变量存放内存分配内存分配表达了一个变量存在的时间。表达了一个变量存在的时间。静态存储变量静态存储变量: 存
28、放于静态存储区存放于静态存储区,在程序整个运行在程序整个运行过程中过程中,始终占据固定的内存单元。始终占据固定的内存单元。动态存储变量动态存储变量: 存放于动态存储区存放于动态存储区,根据程序的运根据程序的运行状态行状态(如:函数调用如:函数调用)而临时分配而临时分配的单元,且单元并不固定。的单元,且单元并不固定。变量又可分为四种具体形式变量又可分为四种具体形式2. 静态静态(static)变量变量3. 寄存器型变量寄存器型变量4. 外部外部(extern)变量变量 前面学习的局部、全局变量均以上述方式中前面学习的局部、全局变量均以上述方式中的一种形式存储。的一种形式存储。1. 自动型变量自动
29、型变量(auto) 局部变量既可以静态方式局部变量既可以静态方式 , 又可以动态方式存储。又可以动态方式存储。动态方式动态方式: auto int a, b;局部变量局部变量 则则: a, b为自动型,存入动态区。在该函数被为自动型,存入动态区。在该函数被调用时才分配单元,函数调用结束时释放。调用时才分配单元,函数调用结束时释放。 auto一般省略。以前用到的变量均为一般省略。以前用到的变量均为auto型型,除除static外。外。 若定义时赋初值,则程序运行中仅在第一次调若定义时赋初值,则程序运行中仅在第一次调用时赋初值,第二次调用不再赋初值,而是使用时赋初值,第二次调用不再赋初值,而是使用
30、上一次调用的值。用上一次调用的值。则则: a, b存入静态区。存入静态区。 函数中的函数中的a, b始终占据固定始终占据固定存储单元。存储单元。 静态方式静态方式: static int a, b;#include int fac (n) /*函数定义函数定义*/ int n; static int f=1; f=f n; return(f); main ( ) int i; for (i=1; ib)?a:bmain() int x,y,max; printf(input two numbers: ); scanf(%d%d,&x,&y); max=MAX(x,y); pri
31、ntf(max=%dn,max);例5.29使用宏定义,计算半径为2、4、6、8、10时圆的面积和圆的周长 #include #define PI 3.141592653#define AREA(R) PI*(R)*(R)#define PERI(R) 2*PI*(R)void main() int r; for(r=2; r=10; r+=2) printf(半径=%2d, 圆面积=%ft, r, AREA(r); printf(圆周长=%fn, PERI(r); 5.7.2 5.7.2 文件包含文件包含 C语言允许在一个文件预编译时语言允许在一个文件预编译时,将另一个文件将另一个文件原封不
32、动地包含进来。原封不动地包含进来。 当一组符号常量的定义为公用时,可作为一个当一组符号常量的定义为公用时,可作为一个独立的文件被其它文件包含。独立的文件被其它文件包含。目的目的: 当函数不在一个文件中,既可用当函数不在一个文件中,既可用link连接编译连接编译后的后的obj文件,也可用文件,也可用“ 文件包含文件包含”方式。方式。格式格式: # include 文件名文件名# include f2.c main ( ) 例例: :f1.cf2.c:预编译后预编译后::main ( ) f1.c为为f2.c中的内容中的内容再进行正式编译再进行正式编译1. 一个一个include只能写一个文件,包含多个文件需多只能写一个文件,包含多个文件需多个个inclu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年执业药师之中药学综合知识与技能题库综合试卷A卷附答案
- 七年级数学教学设计用同位角第三直线判定平行线教学设计
- 体液潴留的临床护理
- 枕叶癫痫的临床护理
- 《市场趋势分析》课件
- 十二指肠结核的临床护理
- 人教版九年级化学上册-《如何正确书写化学方程式》思维导图课件
- 上海十五中考试卷及答案
- 山东省初中省考试卷及答案
- 纺织员工培训与技能提升考核试卷
- ISOTS 22163专题培训考试
- 六年级下册数学课件-第4单元 比例 整理和复习 人教版(共21张PPT)
- JJF(鲁) 142-2022 称重式雨量计校准规范
- Adobe-Illustrator-(Ai)基础教程
- 程序的运行结果PPT学习教案
- 圆柱钢模计算书
- 合成宝石特征x
- 查摆问题及整改措施
- 年度研发费用专项审计报告模板(共22页)
- 隧道工程隧道支护结构设计实用教案
- 得力打卡机破解Excel工作表保护密码4页
评论
0/150
提交评论