第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.

Slides:



Advertisements
Similar presentations
第8章 函数 信息管理系.
Advertisements

第五章 函数 本章学习重点:  函数的定义与函数声明;  函数的调用;  函数的嵌套调用与递归调用;  数组作为函数参数;
第一章 C语言概述 计算机公共教学部.
Oracle数据库 Oracle 子程序.
6.4 字符串与指针 1. 用字符数组存放一个字符串.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第8讲 函数 8.1 函数的定义与调用 8.2 函数的参数 8.3 函数重载与递归 8.4 标识符作用域与变量的存储特性.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第1章 程序设计和C语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C语言的发展及其特点 1.4 最简单的C语言程序
第5章 函数及变量的存储类别 5.0 概述 5.1函数的定义 5.2函数调用 5.3变量的作用域和存储类别 5.4内部函数和外部函数
由C程序结构所知,一个完整的C语言程序是由一个且只能有一个main()函数(又称主函数)和若干个其他函数组合而成的。而前面各章仅学习main()函数的编程,本章将介绍其他函数的编程,包括其他函数的定义、调用、参数传递及变量的作用域等。
授课老师:龚涛 信息科学与技术学院 2017年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C语言程序设计基础 刘新国.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
第7章 函 数 本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归
《C++程序设计》 主讲教师:张玉宏.
走进编程 程序的顺序结构(二).
C程序设计 谭浩强 著 清华大学出版社.
第八章 函数.
辅导课程六.
第7章 函 数 为什么要使用函数? 函数定义、调用、声明 局部变量和全局变量 变量的存储类别 内部函数和外部函数 函数的嵌套调用和递归调用
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
第二章 Java语言基础.
第七章 函数 西安工程大学.
实验九 函数嵌套、函数参数 第27讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
THE C PROGRAMMING LANGUAGE
C语言复习2----函数.
程序设计基础(C程序设计) 主讲:吴华洋 Mobile: Office:
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
第7章 函 数 7.1 函数的定义与调用 7.2 函数的嵌套调用与递归调用 7.3 数组作为函数参数 7.4 内部变量与外部变量
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
C语言程序设计.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数.
目录 7.1 用户自定义函数的种类 7.2 函数的定义 7.3 被调函数的声明 7.4 函数的调用 7.5 函数的嵌套调用
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
主讲:相方莉.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华。 10.1 地址和指针的概念 内存中的每一个字节都有一个地址。
C程序设计.
第5章 函 数.
第4章 Excel电子表格制作软件 4.4 函数(一).
第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
第九节 赋值运算符和赋值表达式.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第9章 预处理命令.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C程序设计 复习 1、计算机系统的组成 外部设备:输入、输出设备(同人打交道《十进制》)
计算机编程 信息管理与工程学院 2014年9月.
Presentation transcript:

第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用

在程序设计中,常将一些常用功能模块编写成函数,放在库中供调用,减少重复工作量。 main() {printstar();print_message();printstar();} printstar() {printf(“***************\n”);} print_message() { printf(“ I am a student.\n”);}

说明: 1、一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,不是以函数为单位进行编译 2、一个C程序由一个或多个源程序文件组成。分别编写、分别编译。一个源文件可为多个C程序公用。 3、C程序执行是从main开始的,调用其它函数后流程回到main函数,在main函数中结束整个程序的运行

4、所有函数都是并行的,定义时相互独立,不能嵌套定义,但可互相调用,不能调用main函数 5、从用户使用的角度,函数有两种 (1)标准函数,即库函数,由系统提供 (2)用户自己定义的函数,解决用户专门问题

6、函数形式看,函数分为两类 (1)无参函数 (2)有参函数,调用函数与被调用函数之间有参数传递

§8.2 函数定义的一般形式 1、无参函数的定义形式 类型说明符 函数名() {说明部分 语句} “类型说明符”指定函数值的类型,即函数带回来的值的类型.如果不带回函数值,也可以不写类型标识符

2、有参函数的定义形式 类型说明符 函数名(形式参数表列) {说明部分 语句} 例如: int max(int x, int y) { int z; z=x>y?x:y; return(z);}

3、可以有“空函数”的定义形式 类型说明符 函数名() { } 空函数的作用 4、对形参声明的传统形式

§8.3 函数参数和函数的值 8.3.1 形式参数和实际参数 主调函数与被调用函数之间有数据传递关系. 在定义函数时函数名后面的括弧中的变量名称为“形式参数”(简称“形参”),在调用函数时,函数名后面括弧中的表达式称为“实际参数”(简称“实参”)

main() { int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“Max is %d”,c);} int max(int x, int y) { int z; z=x>y?x:y; return(z);}

关于形参与实参的说明: 1、在定义函数中指定的形参变量,它们并不占内存单元。只有在被调用时形参才分配内存单元,在调用结束后,形参所占内存单元也被释放。

2、实参可以是常量、变量和表达式,如 max(3,a+b) 但要求有确定的值.在调用时实参的值赋给形参(如果形参是数组名,则传递的是数组首地址而不是变量的值.) 3、在被定义的函数中,必须指定形参的类型 4、实参与形参的类型应一致。但字符型与整形可以互相通用。

5、C语言规定,实与形的数据传递是“值传递”,单向传递即实传给形,而不能由形参传值给实参。 在调用函数时,给形参分配存储单元,并传值,调用结束后,形参单元释放,而实参单元不变。 a b 实参 a b x y 形参 x y 形实结合 结合后 2 3 2 3 2 3 10 15

8.3.2 函数的返回值 通常希望通过函数调用能得到一个确定的值,这就是函数的返回值。 1、函数的返回值是通过函数中的return语句获得的,将被调用函数中的一个确定值带回主调函数中。有时没return语句 return语句的几个语法规则 2、函数值的类型。在定义函数时进行定义。不加类型定义的,一律按整型处理

3、如果函数值类型与return语句中表达式类型不一致,则以函数类型为准 5、为了明确“不带回值”,可以用“void”定义“无类型”(或称“空类型”)

§8.4 函数的调用 8.4.1 函数调用的一般形式 函数调用的一般形式为: 函数名(实参序列); 对无参函数 对有参函数,实参与形参有个数上相等,顺序与类型上一致,但应注意求值顺序

main() { int i=2,p; p=f(i,++i); printf(“%d”,p);} /*p是多少?*/ int f(int a,int b) {int c; if(a>b)c=1; else if(a==b)c=0; else c=-1; return c;}

8.4.2 函数调用的方式 按函数在程序中出现的位置分为三种 1、函数语句。要求完成一个操作而不带回值。如: printstar(); 2、函数表达式。函数调用出现在表达式中,如:c=2*max (a,b); 3、函数参数。函数调用作为函数的实参 如:m=max(a,max(b,c)); 又如: printf(“%d”,max(a,b));

8.4.3 对被调函数的说明 在一个函数中调用另一个函数需要具备什么条件呢? 1、首先要已经存在,即已定义 2、如果使用库函数,则应使用#include命令。 如: #include “stdio.h” 3、如果使用用户自己定义的函数,而且在同一个文件中,一般还应在主调函数中对被调用函数作声明,即向编译系统声明将要调用此函数

main() {float add(float x,float y); float a,b,c; .......} float add(float x,float y) { float z; ...... }

(2)被调用函数的定义出现在主调函数之前,可以不声明 形式为: 函数类型 函数名(......); 注意: 对函数的“定义”和“声明”不是一回事 C语言规定: (1)如果函数是int或char时,可以不声明 (2)被调用函数的定义出现在主调函数之前,可以不声明

float add(float x,float y) { float z; ...... } main() {/*float add(float x,float y);*/ float a,b,c; .......}

(3)如果已在所有函数定义之前,即在文件开头, 在函数外部作了说明.

float add(float x,float y) main() {/*float add(float x,float y);*/ float a,b,c; .......} { float z; ...... }

§8.5 函数的嵌套调用 C语言的函数定义都是相互平行的、独立的,也就是说在定义函数时,一个函数内不能包含另一个函数,即不允许嵌套定义。但允许嵌套调用,即调用一个函数过程中,又调用另一个函数。 例:用弦截法求方程的根

§8.6 函数的递归调用 在调用一个函数时出现直接或间接地调用该函数本身,称为函数的递归调用,这是C语言的特点之一。如: int f(int x) { int y,z; ∶   z=f(y); ∶ return(2*z);}

如: #include "stdio.h" int f(int n) { int m; if(n==1)m=1; else m=n*f(n-1); return(m); }

注意:递归程序分析方法 void main() { int n,m; scanf("%d",&n); m=f(n); printf("%d\n",m); } 递归过程可以分为两个阶段:一是“回推”;二是“递推”。 注意:递归程序分析方法

§8.7 数组作为函数参数 可以用变量做函数参数,此外数组元素也可以做函数实参,其用法与变量相同,数组名也可以做实参和形参,传递的是整个数组。 一、数组元素做函数实参 见书中例题,与变量相同、单向传递、值传递 二、可以用数组名作为函数参数,此时实参和虚参都应用数组名

void sub(int a[10],int n) {int i,b; for(i=0;i<n/2;i++){b=a[i];a[i]=a[n-1-i]; a[n-1-i]=b;}} main() {int b[10]={0,1,2,3,4,5,6,7,8,9},m=10; sub(b,m); for(i=0;i<m;i++)printf(“%d”,b[i]); }

说明: 1、形参数组大小可以不指定 2、数组名做函数参数时,不是“值传送”,不是单向传递,而是“地址传递”。 三、用多维数组名作为函数参数 注意多维数组元素在内存中的存放顺序

§8.8 局部变量和全局变量 8.8.1 局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是在本函数才能使用它们。如

float f1(int a ) {int b,c; a,b,c有效 ……} main() { float a,m,n; a,m,n有效 8.8.2 全局变量 程序的编译单位是源程序文件,一个源文件包含一个或若干个函数。在函数内

定义的变量是局部变量,而在函数之外定义的变量是外部变量,外部变量是全局变量。全局变量可以为本文件中其它函数所共用。它的有效范围为:从定义变量的位置开始到本源文件结束。 int a; main() {sub();printf(“%d\n”,a);} sub() {a=5;} 在第三行加上int a=3;后的结果如何?

在一个函数中既可使用局部变量,也可使用全局变量。 说明: (1)全局变量的作用是增加了函数间的数据联系的渠道。 (2)不在必要时不使用全局变量,原因有三。 (3)在同一源文件中,如全局变量与局部变量同名,以局部变量说明为准。

§8.9 变量的存贮类别 8.9.1 动态存贮方式与静态存贮方式 从变量作用域(空间角度): 从变量存在的时间(时间角度):静态和动态 §8.9 变量的存贮类别 8.9.1 动态存贮方式与静态存贮方式 从变量作用域(空间角度): 从变量存在的时间(时间角度):静态和动态 静态存贮:是指在程序运行期间分配固定的方式 动态存贮:是指在程序运行期间根据需要进行动态的分配的方式

内存中供用户使用的存贮空间情况: 1、程序区 2、静态存贮区 3、动态存贮区 数据分别放在静态和动态存贮区中。 全局变量分配在静态区,程序开始执行时分配,执行完毕时释放。 动态存贮区存放: (1)函数形式参数 (2)自动变量 (3)函数调用时现场保护和返回地址等

局部变量是在函数调用时分配,要函数结束时释放这些空间 C中每一个变量和函数有两个属性:数据类型和存贮类别(在内存中的存贮方法) 存贮方法分为两类:静态和动态 具体可分为四种: (1)自动的auto (2) 静态的static (3)寄存器的register(4)外部的extern

8.9.2 auto变量 函数中的局部变量,不专门声明为static,则是动态分配存贮空间。函数中的形参和在函数中定义的变量。 函数被调用时才分配存贮空间,函数调用结束时释放空间。 int f(int a) { auto int b,c=3; :} 注:auto可省auto int b,c=3;相当于int b,c=3;

8.9.3 static声明局部变量 有时希望函数中的局部变量的值在函数调用结束后不消失保留,所占单元不释放。 f(int a) { auto int b=0; static int c=3; b=b+1;c=c+1; return(a+b+c);} main() {int a=2,i; for(i=0;i<3;i++)printf(“%d”,f(a)); }

如果一个变量使用频繁,则将它放在寄存器中。 int fac(int n) { register int i,f=1; …..} 存 数 取 数 如果一个变量使用频繁,则将它放在寄存器中。 int fac(int n) { register int i,f=1; …..} 只有局部自动变量和形式参数可作为register变量 内 存 运 算 器

8.9.5 用extern声明外部变量 外部变量(即全局变量)是在函数之外定义的,它的作用域是从定义处起至本程序文件的末尾。编译时它放在静态存储区。 1、在一个文件内声明外部变量 2、在多个文件和程序中声明外部变量

8.9.6 用static声明外部变量 有时在程序设计中希望某些外部变量只限于被本文件引用,定义外部变量时加一个static声明 在不同文件中使用相同的外部变量名而不相互干扰,利于程序的模块化。

8.9.7 关于变量的声明和定义 定义:是需要申请存贮空间的 声明:对变量存贮方式进一步说明 如用static来声明一个变量作用 1、对局部变量用static来声明是指在整个程序执行期间始终存在 2、 全局变量用static来声明,该变量只在本文件模块中有效

8.9.8 存贮类别小结 数据定义需要指定两种属性:数据类型和存贮类别 1、从作用域分:局部变量和全局变量 2、从生存期分:动态和静态,静态是程序整个运行时间存在;动态是调用函数时临时分配单元 3、从存放的位置: 内存(静态存贮区,动态存贮区) 寄存器

§8.10 内部函数和外部函数 函数本质上是全局的,可以被其它函数调用,但可以指定函数不被其它文件调用。据函数能否被其它源文件调用,将函数分为内部函数和外部函数 8.10.1 内部函数(静态函数) 在函数定义时,其首部加:static 如: static int fun(int a,int b)

8.10.2 外部函数 1、在函数定义时,其首部加:extern 如: extern int fun(int a,int b) 在定义函数时,省略extern,则隐含是外部函数 2、在需要调用此函数的文件中,用extern声明所用的函数是外部函数

§8.11 如何运行一个多文件程序 一个程序由多个文件构成: 1、用Turbo C集成环境 2、用#include命令

重点内容 一个程序由多个函数构成,一个程序可由多个源文件组成 函数定义,调用(嵌套,递归) 变量的作用域 变量的生存期 作业: 8.1 8.11 8.13

第九章 预处理命令 C源程序中加入一些“预处理命令”,它不是C语言的组成部分,但它能提高编程效率。 有三种: 1、宏定义 2、文件包含 第九章 预处理命令 C源程序中加入一些“预处理命令”,它不是C语言的组成部分,但它能提高编程效率。 有三种: 1、宏定义 2、文件包含 3、条件编译