




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 函数,第7章 函数,7.1 函数的定义 7.2 函数调用 7.3 函数说明 7.4 return语句 7.5 函数的形参与实参 7.6 递归 7.7 函数变量 7.8 内部函数与外部函数 7.9 作用域规则,一、引入,某学生成绩管理系统: 输入若干个学生的姓名、某课程的期中和期末成绩,并计算每个学生的总评成绩; 计算总评成绩的分数段情况; 输出所有学生的姓名、期中、期末和总评成绩; 查询某个学生的总评成绩。,7.1 函数定义,模块化设计思想:将一个程序按照功能分解成一个一个的模块。 在C语言中,一个函数就是一个模块。,C程序有一个主函数和若干个其他函数 主函数调用其他函数,其他函数可相
2、互调用 函数需要定义后才能使用 函数分为库函数和自定义函数,注:,例: #include stdio.h void print(); /*函数说明*/ void main() int i; for (i=0;i10;i+) print(); /*函数调用*/ void print() /*函数定义*/ putchar(*); return; ,二、函数的定义,1、函数的分类 从用户角度 标准函数(库函数):由系统提供 用户自定义函数:可解决专门问题 从函数调用形式 无参函数 有参函数,2、函数的定义形式 无参函数的定义 函数返回值的数据类型说明 函数名(void) 说明语句部分 执行语句部分
3、有参函数的定义 函数返回值的数据类型说明 函数名(带有 类型说明的参数表) 说明语句部分 执行语句部分 空函数的定义 函数返回值的数据类型说明 函数名(void) ,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,例 有参函数 int sum(int x,int y) return(x+y); ,形式参数,函数的返回值 在C语言中将函数分为带返回值的函数和不带返回值函数两种。 如果一个函数带返回值,此类函数必须使用显式的返回语句向调用者返回一个结果,称为函数返回值。 如果一个函数无返回值,此函数用于完成某项
4、特定的处理任务,函数的任务完成后不向调用者返回结果,一般可以不写return语句。用户在定义此类函数时应指定它的返回值为“空类型”,空类型的类型说明符为“void”。,例 有返回值函数 int max(int x,int y) int z; z=xy?x:y; return(z); ,例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,注意:,函数定义中不能包含另一个函数的定义。也就是说,函数定义不能嵌套。在C语言中,函数定义是并列的关系,不能一个包含另一个。 例:下面的定义是错误的,该程序试图在print函数定义中
5、定义另一个函数prnline。 void print() putchar(*); void prnline() /* 错误 */ putchar(n); ,7.2 函数的调用,1、函数的调用形式 调用有参函数: 被调用的函数名(参数列表) 调用无参函数: 被调用的函数名() 注: 其中参数表达式的个数与函数定义的个数、数据类型都应该匹配,若不匹配可能会出现预料不到的结果。此时的参数叫实际参数,简称实参。,2、函数的调用方式,函数调用形式出现在表达式中。 这种方式要求函数是带返回值的。 例如,x=sum(n1,n2); 函数调用形式作为独立的语句出现。 这种情况下,函数一般不带返回值。 例如:p
6、rint(); 函数调用形式作为另一个函数的实参出现。 这时,函数必须是有返回值的。 printf(sum=%d, sum(n1,n2);,不使用自定义函数求最大值 main() int a,b,c,d,m; scanf(%d%d%d%d, ,使用自定义函数求最大值 int max(int x,int y) int z; z=xy?x:y; return(z); main() int a,b,c,d,m; scanf(%d%d%d%d, ,3、函数的嵌套调用,在C语言中,函数是并列的、独立的一个一个模块,通过调用与被调用相关联。在一个函数定义中不可以定义另一个函数,但是允许在一个函数中调用另一
7、个函数,这就是所谓的函数定义不可以嵌套,函数调用则允许嵌套。,#include stdio.h void print(); /*函数说明*/ void prnline(); /*函数说明*/ void main() int i; for (i=0;i10;i+) print(); /*函数调用*/ putchar( ); void print() /*函数定义*/ putchar(*); prnline(); /*函数调用*/ return; void prnline() /*函数定义*/ putchar(-); ,例:,调用关系图,void main() int i; for (i=0;i1
8、0;i+) print(); putchar( ); ,void print() putchar(*); prnline(); return; ,void prnline() putchar(-); ,7.3 函数说明,函数说明的其一般形式为: 函数返回值的数据类型说明符 被调用函数名(形参表); 括号内的形参表可以给出形参的数据类型名和形参名,也可以只给出形参的类型名。,在语言中,并不需要在任何情况下都必须对函数进行函数说明,可以省略对被调用函数的函数说明用三种情况。 (1) 被调用函数的函数定义出现在调用它的函数之前。 (2) 对C编译提供的库函数的调用不需要再作函数说明,但必须把该函数的
9、头文件用#include 命令包含在源程序的最前面。,#include stdio.h void print() /*函数定义*/ putchar(*); void main() int i; for (i=0;i10;i+) print(); /*函数调用*/ putchar(n); ,例:,随堂练习,1、定义函数返回两个数中较大的数,在主函数中通过调用该函数求三个数之中较大的数并输出。编写主函数调用该函数。,2、编写power函数实现求xn使程序完整。 #include double power(double x,int n) main() int i; double p; scanf(“
10、%d”, ,随堂练习,7.4 return 语句,函数被调用时,可使用return语句返回,当执行Return语句时,程序控制马上返回到调用环境。语法: return; 或return 表达式;,注意:(1) return(表达式); 和return 表达式;都是正确的。(2) 带返回值的函数只能返回一个值。(3) 若定义函数不带返回值,可用void定义函数类型(4) return语句中的表达式与函数的返回值类型不匹配时,以函数定义时的返回类型为准。,7.5 函数的形参与实参,函数调用时需要传递数据。调用函数要将实参的值传送给被调用函数的形参。 若函数定义首部是 double power(do
11、uble x,int n) /* 函数定义 */ 调用形式是可以是power(y,m), 也可以是power(3.0,5)。 其中,x和n是形式参数,y和m是实际参数,3.0和5也是实际参数。,函数参数的调用方式: 传值 一般变量 传(地)址 指针或数组,实际参数与形式参数的参数个数、数据类型和顺序都应该一致,如果数据类型不一致,系统将按照自动转换规则进行转换。 调用函数的实参可以是0、1或多个。实参可以是常量、变量或表达式,形参只能是变量。 数据的传递是单向的,只能是从实参向形参传递。函数运行时,形参的改变不影响实参,实参和形参占用不同的内存单元。 当一个函数调用另一个函数时,被调用的函数必
12、须存在。 形参变量只有在被调用时,才分配内存单元,形参只在该函数内有效。,传值调用特点,形参是标识了一个存储空间的变量名,这个存储空间是在函数被调用时由系统分配的,被调用函数执行完毕,则形参的空间将被系统释放掉。如果是多次调用,每次调用系统都会重新为形参分配空间。因此,形参所占的空间是没有“记忆”的。被调用函数内的形参的值不论如何变化,都不会影响实参的变化 。,void swap(int x,int y) int temp; printf(before change x=%d,y=%dn,x,y); temp=x; x=y; y=temp; printf(changed x=%d,y=%dn,
13、x,y); Void main() int a,b; printf(input two number:n); scanf(%d,%d, ,例:,例:求3到100之间的所有素数。用函数判断一个数是否是素数,函数的返回值是1表示该数是素数,函数的返回值是0,则表示该数不是素数。 #include stdio.h #include math.h int prime(int); /*函数说明 */ void main() int i; for (i=3;i=100;i+) if (prime(i)=1) /*函数调用 */ printf(%4d,i); printf(n,i); ,int prime(
14、int i) /* 函数定义 */ int j,k,flag=1; k=i; i=sqrt(i); for (j=2;j=i;j+) if (k%j=0) flag=0; break; return flag; ,作 业,1、定义一个函数MYABS,求x+y的绝对值,用主函数调用该函数。 2、定义一个函数IS_DIGIT(ch),当ch是0-9的数字,返回1,否则返回0。用主函数调用该函数。,#include stdio.h #include stdlib.h long factorial(int); /*函数说明 */ void main() int i,j; long sum; sum=0
15、; for (i=0;i=2;i+) j=rand(); /*产生1个随机数 */ j=j%10; /*取随机数的个位 */ printf(%2d!+,j); sum=sum+factorial(j); /*函数调用 */ printf(b=%ld,sum); ,例:,long factorial(int i) /*函数定义,求i的阶乘 */ long product=1; for (;i=1;i-) product= product*i; return product; ,7.6 递 归 调 用,一个函数定义中使用调用形式间接或直接的调用自己就称为递归调用。 含有直接或间接调用自己的函数称为
16、递归函数。语言允许函数的递归调用。执行递归函数将反复调用其自身,每调用一次就进入新的一层。 递归调用需要设置条件来终止自调用过程。,void f() printf(*); f(); ,直接调用自己,int f1(int x) int y; f2(y); ,直接调用自己,int f2(int x) int y; f1(y) ,void f() printf(*); f(); 如果在主函数中直接调用该函数,程序将不断地打印“*”号,无休止地调用其自身。,int sum(int n) if(n=1) return n; else return (n+sum(n+1); ,long power(int
17、 n) long f; if(n1) f=power(n-1)*n; else f=1; return f; ,main() int n; long x; printf(“input an integer number:n”); scanf(“%d”, ,编写递归程序的关键是: (1) 构造递归表达式。将n阶的问题转化为比n阶小的问题(当然也可以将n阶的问题转化为比n阶大的问题),转化以后的问题与原来的问题的解法是相同的。 (2) 寻找一个明确的递归结束条件,称为递归出口。,7.7 内部变量与外部变量,在C语言中,每个变量都有自己的作用域,变量的作用域是指变量的作用范围。按作用域可分:内部变量
18、和外部变量。,内部变量局部变量 定义:在函数内定义,只在本函数内有效 注意: * main中定义的变量只在main中有效。 * 不同函数中同名变量,占不同内存单元。 * 形参属于局部变量。,例题: 不同函数中同名变量,main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b); sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b); ,外部变量全局变量 定义:在函数外定义,为本文件所有函数共用 有效范围:从定义变量的位置开始到
19、本源文件结束,及有extern说明的其它源文件 说明: extern 数据类型 变量表; 注意: 在一个源程序的所有文件中只能定义一次 若外部变量与局部变量同名,则外部变量被屏蔽,例: 外部变量说明与定义,int max(int x, int y) int z; z=xy?x:y; return(z); main() extern int a,b; printf(max=%d, max(a,b); int a=13,b=-8;,extern int a,b; int max() int z; z=ab?a:b; return(z); main() printf(max=%d,max(); in
20、t a=13,b=-8;,运行结果:max=13,说明,定义,外部变量定义与外部变量说明不同,定义 说明 次数: 只能1次 可说明多次 位置: 所有函数之外 函数内或函数外 分配内存: 分配内存,可初始化 不分配内存,不可初始化,int a=3,b=5; max(int a, int b) int c; c=ab?a:b; return(c); main() int a=8; printf(max=%d,max(a,b); ,例: 外部变量与局部变量,运行结果:max=8,int f1(int xb) extern int xa; return(xa*xb); main() extern int xb; int xa=5; printf(“xa=%d,xb=%d,result=%d”, xa,xb,f1(xa); int xa=3,xb=4;,例: 外部变量的定义和使用,运行结果:xa=5,xb=4,result=15,变量属性: 数据类型 存储类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年二级注册建筑师之法律法规经济与施工模考模拟试题(全优)
- 【凯里(黔东南)】2025年贵州凯里市事业单位第二轮公开招聘工作人员181人笔试历年典型考题及考点剖析附带答案详解
- 【通化】2025年上半年吉林通化市事业单位公开招聘应征入伍高校毕业生24人笔试历年典型考题及考点剖析附带答案详解
- 第五章食品感官分析第一节食品感官分析的定义与特性第二节食品
- 2025年安徽省应急管理厅直属事业单位公开招聘工作人员笔试历年典型考题及考点剖析附带答案详解
- 第六章分子的结构与性质无机化学多媒体电子教案74课件
- 冰冻可乐教学课件下载
- 优异英语教学课件
- 口腔癌围手术期管理
- 小学生科学开发大脑课件
- 上市专项工作组管理办法
- 四川省成都市武侯区2024-2025学年八年级下学期期末物理试卷(含答案)
- 《思想道德与法治》学习通课后章节答案期末考试题库2025年
- 清廉讲堂活动方案
- 家居落地活动方案
- 服装艺术搭配培训课件
- 2025年 汕头市公安局警务辅助人员招聘考试笔试试卷附答案
- 航空公司统计管理制度
- 车辆伤害事故桌面功能演练方案、脚本
- 老旧厂房改造-洞察及研究
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
评论
0/150
提交评论