《C语言程序设计》-任正云-电子教案 第6章 函数

上传人:E**** 文档编号:89433914 上传时间:2019-05-25 格式:PPT 页数:51 大小:697KB
返回 下载 相关 举报
《C语言程序设计》-任正云-电子教案 第6章 函数_第1页
第1页 / 共51页
《C语言程序设计》-任正云-电子教案 第6章 函数_第2页
第2页 / 共51页
《C语言程序设计》-任正云-电子教案 第6章 函数_第3页
第3页 / 共51页
《C语言程序设计》-任正云-电子教案 第6章 函数_第4页
第4页 / 共51页
《C语言程序设计》-任正云-电子教案 第6章 函数_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《《C语言程序设计》-任正云-电子教案 第6章 函数》由会员分享,可在线阅读,更多相关《《C语言程序设计》-任正云-电子教案 第6章 函数(51页珍藏版)》请在金锄头文库上搜索。

1、第六章 函数,6.1 函数概述 源程序是由函数组成的,1.从函数定义的角度看,函数可分为库函数和用户自定义 函数两种。,(1)库函数:由系统提供,用户无需定义,也不必在程序 中作类型说明,只需在程序前包含有该函数原型的头文件即 可在程序中直接调用。如程序中调用printf()函数,在源文 件的开头处就必须添加这样的命令: #include “stdio.h“ 该命令必须以#include开头,空格后加相应的头文件名,头文 件名需要用一对尖括号或双括号括起来。,(2)用户自定义函数:由用户按需要编写的函数。对于用户 自定义函数,不仅要在程序中定义函数本身,而且在主调函 数模块中还必须对该被调函数

2、进行类型说明,然后才能使用。,2.语言的函数兼有其它语言中的函数和过程两种功能,从 这个角度看,又可把函数分为有返回值函数和无返回值函数 两种,3.从主调函数和被调函数之间数据传送的角度看又可分为 无参函数和有参函数两种。,4.语言提供了极为丰富的库函数,这些库函数又可从功能角 度作以下分类。,(1)字符类型函数:用于对字符按ASCII码分类:字母,数字,控 制字符,分隔符,大小写字母等。 (2)转换函数:用于字符或字符串的转换;在字符量和各类数字 量(整型,实型等)之间进行转换;在大、小写之间进行转换。 (3)目录路径函数:用于文件目录和路径操作。 (4)诊断函数:用于内部错误检测。 (5)

3、图形函数:用于屏幕管理和各种图形功能。 (6)输入输出函数:用于完成输入输出功能。 (7)接口函数:用于与DOS、BIOS和硬件的接口。 (8)字符串函数:用于字符串操作和处理。 (9)内存管理函数:用于内存管理。 (10)数学函数:用于数学函数计算。 (11)日期和时间函数:用于日期、时间转换操作。 (12)进程控制函数:用于进程管理和控制。 (13)其它函数:用于其它各种功能。,C是模块化程序设计语言,C程序结构,C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用,6.2函数的定义与声明,【例6.1】

4、输入三个整数,求三个整数中的最大值。 #include “stdio.h“ void main() /* 主函数 */ int n1,n2,n3,nmax; int max3(int x,int y,int z); /* 函数的声明 */ printf(“n1,n2,n3=“); scanf(“%d,%d,%d“, ,int max3(int x,int y,int z) /* 函数的定义 */ int m; if (xy) m=x; else m=y; if (zm) m=z; return m; ,6.2.1 函数的定义 一般格式,合法标识符,函数返回值类型 缺省int型 无返回值void

5、,函数体,例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); ,例 无参函数 printstar( ) printf(“*n“); 或 printstar(void ) printf(“*n“); ,例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); ,6.2.2 函数的返回值 返回语句 形式: return(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 说明: 函数

6、中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数,例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,printstar() printf(“*“); main() int a; a=printstar(); printf(“%d“,a); ,例 函数带回不确定值,输出:10,void printstar() printf(“*“); main() int a; a=printstar();

7、 printf(“%d“,a); ,编译错误!,例 函数返回值类型转换,main() float a,b; int c; scanf(“%f,%f“, ,6.2.3 函数声明 对被调用函数要求: 必须是已存在的函数 库函数: #include 用户自定义函数: 函数类型说明 函数声明 一般形式: 函数类型 函数名(形参类型 形参名, ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数声明不同 函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数声明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在

8、主调函数之前 有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明,例 函数声明举例,6.3函数的调用 6.3.1函数调用的一般形式 函数名(实参表); 说明: 1.无参函数调用没有参数,但是“()”不能省略,有参函数若包含多个参数,各参数用“;”分隔,实参参数个数与形参参数个数相同,类型一致或赋值兼容。 2.函数调用可以出现的位置。,(1)以单独语句形式调用(注意后面要加一个分号,构成语句)。以语 句形式调用的函数可以有返回值,也可以没有返回值。 例如: printf(“max=%d“,nmax); swap(x,y);

9、 puts(s);,(2)在表达式中调用(后面没有分号)。在表达式中的函数调用必须有返 回值。 例如: if (strcmp(s1,s2)0) nmax=max(n1,n2,n3);,调用函数时需要注意下列事项: 被调用函数必须是已经存在的函数(库函数和用户自定义 函数); 如调用库函数,在文件的开头必须使用#include命令将库 函数相应的头文件包含进来; 如调用用户自定义函数,在调用之前必须对其进行声明。,6.3.2 函数参数及其传递方式 形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者,main() int

10、 a,b,c; scanf(“%d,%d“, ,说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,例 计算x的立方,#include float cube(float x) return(x*x*x); main() float a, product; printf(“Please input value of a:“); scanf(“%f“, ,x,1.2,1.2,1.728,参数传递方式 值传递方式 方式:函数调用时,为形参分配单元,

11、并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递,例 交换两个数,#include main() int x=7,y=11; printf(“x=%d,ty=%dn“,x,y); printf(“swapped:n“); swap(x,y); printf(“x=%d,ty=%dn“,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; ,地址传递 方式:函数调用时,将数据的存储地址作为参数传递给形参 特点: 形参与实参占用同样的存储单元 “双向”传递 实参和形参

12、必须是地址常量或变量,6.3.4 函数的嵌套调用 嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数,例 求三个数中最大数和最小数的差值,#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() int a,b,c,d; scanf(“%d%d%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=x

13、y?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); ,6.3.5递归调用 定义:函数直接或间接的调用自身叫函数的递归调用,说明 C编译系统对递归函数的自调用次数没有限制 每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x) int y,z; z=f(y); . return(2*z); ,例 求n的阶乘,#include int fac(int n) int f; if(n0) printf(“n0,da

14、ta error!“); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f); main() int n, y; printf(“Input a integer number:“); scanf(“%d“, ,例 Hanoi塔问题,void move(char getone, char putone) printf(“%c-%cn“,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three); else hanoi(n-1,one,

15、three,two); move(one,three); hanoi(n-1,two,one,three); main() int m; printf(“Input the number of disks:“); scanf(“%d“, ,6.4 局部变量和全局变量 概述 变量是对程序中数据的存储空间的抽象,函数调用时为其分配内存单元,10,程序中使用变量名对内存操作,变量的属性 数据类型:变量所持有的数据的性质(操作属性) 存储属性 存储器类型:寄存器、静态存储区、动态存储区 生存期:变量在某一时刻存在-静态变量与动态变量 作用域:变量在某区域内有效-局部变量与全局变量 变量的存储类型 auto -自动型 register-寄存器型 static -静态型 extern -外部型 变量定义格式: 存储类型 数据类型 变量表;,如: int sum; auto int a,b,c; register int i; static float x,y;,6.4 局部变量和全局变量 概述 变量是对程序中数据的存储空间的抽象,局部变量与全局变量 局部变量-内部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号