版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计,主讲:龚文引,第八讲:函数,提纲,函数的概念 函数的定义与调用 函数的递归调用 变量的作用域,问题,求200个同样数据类型但长度不一样的数组中元素的和?,#include void main() /* 定义200个数数组 */ /* 数组赋值 */ /* 每个数组分别求和 */ for (i=0;iy?x:y);,8.3 函数参数和函数的值,说明: 函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型 例如: 下面是3个函数的首行: int max(float x, float y) /* 函数值为整型 */ char letter(char c1, char
2、 c2) /* 函数值为字符型 */ double min(int x, int y) /* 函数值为双精度型 */ Void abc(int d) /* 空类型,无返回值 */,注意: 凡不加类型说明的函数,自动按整型处理,要求: 今后在定义函数时, 都必须加上类型说明.,8.3 函数参数和函数的值,说明: 在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致 如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准 对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型 对于不带回值的函数,应当用void定义函数为无类型(或称空类型),8.3 函数参
3、数和函数的值,例:返回值类型与函数类型不同,# include void main() int max(float x,float y); /* 函数的声明 */ float a, b; int c; scanf(%f%f, ,运行情况如下: 1.5 2.5 Max is 2,8.4 函数的调用,8.4.1 函数调用的一般形式 函数名 (实参表列) 说明 如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略 如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据 如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系
4、统按自左至右顺序求实参的值,有的系统则按自右至左顺序,8.4 函数的调用,例: 实参的求值顺序,#include void main() int f(int a,int b); /* 函数声明 */ int i=2,p; p=f(i,+i); /* 函数调用 */ printf(%dn,p); ,int f(int a,int b) /* 函数定义 */ int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,8.4 函数的调用,如果按自左至右顺序求实参的值,则函数调用相当于f(2,3),如果按自右至左顺序求实参的值,则函数调用相
5、当于f(3,3),对于函数调用 int i=2,p; p=f(i,+i);,8.4 函数的调用,8.4.2 函数调用的方式 按函数在程序中出现的位置来分 函数语句: 把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作 函数表达式: 函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如: c=2*max(a,b); 函数参数: 函数调用作为一个函数的实参。例如: m=max(a,max(b,c);,8.4 函数的调用,8.4.3 对被调用函数的声明和函数原型 在一个函数中调用另一函数(即被调用函数)需要具备的条件 首先被调用的
6、函数必须是已经存在的函数(是库函数或用户自己定义的函数) 如果使用库函数,还应该在本文件开头用#include 命令将调用有关库函数时所需用到的信息“包含”到本文件中来 如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明,8.4 函数的调用,函数原型的一般形式为: 函数类型 函数名(参数类型1, 参数类型2, ); 函数类型 函数名(参数类型1, 参数名1, 参数类型2, 参数名2, ); 声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法,8.4 函数
7、的调用,注意: 函数的“定义”和“声明”的区别: 函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。 函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,8.4 函数的调用,例:对被调用的函数作声明1,#include void main() float add (float x, float y); /* 对被调用函数add的声明 */ float a, b, c; scanf(%f,%f, ,8.4 函数的调用,例:对被调用的函数作声明2,#includ
8、e float add (float x, float y) /* 函数首部 */ float z; /* 函数体 */ z = x+y; return (z); void main() float a, b, c; scanf(%f,%f, ,8.4 函数的调用,例: 求自然数1100中的素数之和,#include #include int prime(int m) /* 定义函数 */ int i; for (i=2; i(int)sqrt(m); i+) /* 调用库函数 */ if (m%i = 0) return 0; return 1; void main () int i, su
9、m=0; for (i=1;i101;i+) if (prim(i) sum += i; /* 调用自定义函数 */ printf(The sum of all prime is %dn, sum); ,8.5 函数的嵌套调用,嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义,8.5 函数的嵌套调用,求多项式下面的值:,8.5 函数的嵌套调用,#include double fac(int n) /* 定义求整数n阶乘的函数 */ int i; double s=1; for(i=1;iai3次,其中i每次为不同的值), 则认为a数组大于b数组, 并分别统计出两个数组相应元素
10、大于、等于、小于的次数,8.7 数组作为函数参数,#include int large(int x, int y) if (x y) return 1; else if (x bi %d timesnai=bi %d timesnaik) printf(array a is larger than array bn); else if (nbi 4 times ai=bi 1 times aibi 5 times array a is smaller than array b,8.7 数组作为函数参数,8.7.2 数组名作函数参数 用数组名作函数参数时,此时形参应当用数组名或用指针变量 说明:
11、 用数组名作函数参数, 应在主调用函数和被调用函数分别定义数组 实参数组和形参数组类型应一致 形参数组可以不指定大小, 在定义数组时在数组名后面更一个空的方括号 数组名作实参, 传递的是实参数组的首地址. 如果形参数组元素发生变化将影响到实参数组.,8.7 数组作为函数参数,例: 有一个一维数组score, 内放10个学生成绩, 求平均成绩.,#include void main() float average (float array10); /* 函数声明 */ float score10, aver; int i; printf(input 10 scores:n); for(i=0;i
12、10;i+) scanf(%f, ,8.7 数组作为函数参数,float average (float array10) int i; float aver,sum=array0; for (i=1;i10;i+) sum += arrayi; aver = aver/10.0; return (aver); ,如果数组大小改变之后, 应该怎么办呢?,8.7 数组作为函数参数,例:形参数组不定义长度,#include void main() float average(float array, int n); float score_15=98.5, 97.9,1.5,60,55; float
13、 score_210=67.5,89.5,99,69.5,77, 89.5,76.5,54,60,99.5; printf(the average of class A is %6.2fn, average(score_1,5); printf(the average of class B is %6.2fn, average(score_2,10); ,8.7 数组作为函数参数,float average(float array, int n) int i; float aver, sum = array0; for (i=1;in;i+) sum = sum+arrayi; aver =
14、sum/n; return (aver); ,运行结果如下: the average of class A is 80.40 The average of class B is 78.20,8.7 数组作为函数参数,8.7.3 多维数组名作函数参数 用多维数组名作为函数实参和形参。在被调函数中对形参数组定义时可以指定每一维的大小, 也可以省略第一维的大小说明. 如: int array35; 或 int array5; 但不能把第二维以及其他更高维的大小说明省略. 如: int array; int array3;均不合法.,8.7 数组作为函数参数,例: 求3*4的矩阵中所有元素的最大值.,
15、int max_value(int array4) int i,j,k,max; max = array00; for(i=0;i max) max = arrayij; return (max); ,8.7 数组作为函数参数,#include void main() int 34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn“, max_value(a); ,运行结果如下: max value is 34,8.7 数组作为函数参数,#include void swap (int a, int b) int t; t = a; a =
16、 b; b = t; printf(swap: a=%d, b=%dn, a, b); void main () int a = 3, b = 5; swap (a, b); printf(main: a=%d, b=%dn, a, b); ,运行结果如下: swap: a=5, b=3 main: a=3, b=5,8.7 数组作为函数参数,#include void f (int b, int x) x+; b0 += 2; b1 += 3; ,void main () int a2 = 3, 4; int x = 5; f (a, x); printt(%d,%d,%dn, x, a0,
17、 a1); ,A) 5,2,4 B) 6,4,7 C) 6,2,4 D) 5,4,7,8.7 数组作为函数参数,/* n*n方阵转置 */ #include void transpose(int a33) int i, j, t; for (i=0;i3;i+) for (j=i+1;j3;j+) t = aij; aij = aji; aji = t; ,8.7 数组作为函数参数,void main() int x33 = 1, 2, 3, 4, 5, 6, 7, 8, 9; int i, j; printf(The original matrix is:n); for (i=0;i3;i+
18、) for (j=0;j3;j+) printf(%6d, xij); printf(n); transpose(x); printf(The transposed matrix is:n); for (i=0;i3;i+) for (j=0;j3;j+) printf(%6d, xij); printf(n); ,The original matrix is: 1 2 3 4 5 6 7 8 9 The transposed matrix is: 1 4 7 2 5 8 3 6 9,8.7 数组作为函数参数,/* n*n方阵转置, 考虑通用性, 采用一维数组处理 */ #include vo
19、id transpose(int a, int n) int i, j, t; for (i=0;in;i+) for (j=i+1;jn;j+) t = ai*n+j; ai*n+j = aj*n+i; aj*n+i = t; ,8.7 数组作为函数参数,void main() int x33 = 1, 2, 3, 4, 5, 6, 7, 8, 9; int i, j; printf(The original matrix is:n); for (i=0;i3;i+) for (j=0;j3;j+) printf(%6d, xij); printf(n); transpose( ,The o
20、riginal matrix is: 1 2 3 4 5 6 7 8 9 The transposed matrix is: 1 4 7 2 5 8 3 6 9,8.8 局部变量和全局变量,8.8.1 局部变量 内部变量:在一个函数内部定义的变量称内部变量。它只在本函数范围内有效,即:只有在本函数内才能使用这些变量,故称为“局部变量”,8.8 局部变量和全局变量,例: float f1(int a) /* 函数f1 */ int b,c; /* a、b、c有效 */ char f2(int x,int y) /* 函数f2 */ int i,j; /* x、y、i、j有效*/ void mai
21、n( ) /* 主函数 */ int m,n; /* m、n有效*/ ,8.8 局部变量和全局变量,说明: 主函数中定义的变量只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰 形式参数也是局部变量 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”,8.8 局部变量和全局变量,8.8.2 全局变量 外部变量:函数之外定义的变量称为外部变量。外部变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源
22、文件结束。所以也称全局变量. 说明: 全局变量可以为本文件中其他函数所公用 其有效范围是从定义变量的位置开始到本源文件结束,8.8 局部变量和全局变量,int p=1,q=5; /* 外部变量 */ float f1(int a) /* 定义函数f1 */ int b,c; char c1,c2; /* 外部变量*/ char f2 (int x, int y) /* 定义函数f2 */ int i,j; void main ( ) /* 主函数 */ int m,n; ,8.8 局部变量和全局变量,例:有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分,#includ
23、e float Max=0, Min=0; /*全局变量*/ void main() float average(float array, int n); float ave, score10; int i; for(i=0;i10;i+) scanf(%f, ,8.8 局部变量和全局变量,float average(float array, int n) /* 定义函数,形参为数组 */ int i; float aver, sum=array0; Max = Min = array0 for(i=1;i Max) Max = arrayi; else if(arrayi b?a:b; re
24、turn (c); ,运行结果为 8,8.9 变量的存储类别,8.9.1 动态存储方式与静态存储方式 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量 从变量值存在的时间角度来分,又可以分为静态存储方式和动态存储方式 静态存储方式:指在程序运行期间由系统分配固定的存储空间的方式。 动态存储方式:则是在程序运行期间根据需要进行动态的分配存储空间的方式 1.程序区 2.静态存储区 3.动态存储区,8.9 变量的存储类别,变量和函数有两个属性:数据类型和数据的存储类别。存储类别指的是数据在内存中存储的方式。 存储方式分为两大类:静态存储类和动态存储类。包含: 自动的(auto) 静态的
25、(static) 寄存器的(register) 外部的(extern) 根据变量的存储类别,可以知道变量的作用域和生存期,8.9 变量的存储类别,8.9.3 用static声明局部变量 当函数中的局部变量的值在函数调用结束后不消失而保留原值时,该变量称为静态局部变量 用关键字static进行声明,8.9 变量的存储类别,static变量使用举例,#include void Func(void); main() int i; for (i=0; i10; i+) Func(); /* 函数功能: 打印被调用的次数 函数入口参数: 无 函数返回值: 无 */ void Func(void) int
26、 times = 1; /*自动变量*/ printf(Func() was called %d time(s).n, times+); ,Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s). Func() was called 1 time(s)
27、. Func() was called 1 time(s). Func() was called 1 time(s).,8.9 变量的存储类别,static变量使用举例,#include void Func(void); main() int i; for (i=0; i10; i+) Func(); /* 函数功能: 打印被调用的次数 函数入口参数: 无 函数返回值: 无 */ void Func(void) static int times = 1; /*静态局部变量*/ printf(Func() was called %d time(s).n, times+); ,Func() was called 1 time(s). Func() was called 2 time(s). Func() was called 3 time(s). Func() was called 4 time(s). Func() was called 5 time(s). Func() was called 6 time(s). Func() was called 7 time(s). Func() was called 8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026零跑A10大定提车用户画像报告-电动汽车用户联盟
- 农村人居环境整治中农户付费意愿的异质性研究意义
- 报表生成作业指导书
- 2026年湖南省长沙市中考二模九年级历史试题附答案
- 重庆大学《电子技术基础》课件-第4章三相电路及其应用
- 2026年广东省初中学业水平模拟考试物理试卷(二)(含答案)
- 一级建造师考试(机电工程管理与实务)题库含答案(2025年大连)
- 2025年度一级建造师职业资格考试(水利水电工程管理与实务)复习题库含答案
- 石油工程应急预案
- 2025年执业医师考试综合真题及答案
- 股东分红决议文件标准范本
- 考核化验员管理办法
- 混凝土采购供货投标文件
- 浙二医院胸外科护士进修汇报
- 2025年国能考试题库春季
- 企业尽职免责管理办法
- DGTJ08-2323-2020 退出民防序列工程处置技术标准
- 党支部书记讲廉洁党课讲稿
- 猴痘培训课件
- 保税货物考试题及答案
- 北航叶轮机械原理课件第4章 轴流压气机气动设计
评论
0/150
提交评论