C语言 第08章 函数.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C语言 第08章 函数.ppt》由会员分享,可在线阅读,更多相关《C语言 第08章 函数.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 函数函数 8.1 8.1 概述概述 8.2 8.2 函数的定义函数的定义 8.3 8.3 函数参数和函数值函数参数和函数值 8.4 8.4 函数的调用函数的调用 8.5 8.5 函数的嵌套调用函数的嵌套调用 8.6 8.6 函数的递归调用函数的递归调用 8.7 8.7 数组作为函数参数数组作为函数参数 8.8 8.8 局部变量和全局变量局部变量和全局变量 8.9 8.9 变量的存储类别变量的存储类别第八章第八章 目录目录8.1 8.1 概述概述8.1 8.1 概述概述mainabcdefghhieg8.1 8.1 概述概述#include“stdio.h”void printst
2、ar()printf(“*n”);void print_message()printf(“How do you do!n”);void main()printstar();print_message();printstar();例例.简单的函数调用。简单的函数调用。运行结果运行结果*How do you do!*8.1 8.1 概述概述(1)一个一个C 程序由一个或多个源程序文件组成。程序由一个或多个源程序文件组成。说明说明说明说明(2)一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。(3)C 程序的执行从程序的执行从 main 函数开始,调用其他函函数开始,调用其他函
3、 数后返回到数后返回到main 函数,在函数,在main函数中结束整函数中结束整 个程序的运行。个程序的运行。(4)所有函数都是平行的,即在定义函数时是互相所有函数都是平行的,即在定义函数时是互相 独立的,函数不能嵌套定义。函数间可以互相独立的,函数不能嵌套定义。函数间可以互相 调用,但不能调用调用,但不能调用main函数。函数。8.1 8.1 概述概述(5)从函数使用的角度来看,从函数使用的角度来看,C C语言的函数可以分语言的函数可以分 为两类:标准库函数和用户自定义函数。为两类:标准库函数和用户自定义函数。标准库函数与头文件标准库函数与头文件执行效率高,用户需要时,可在程序中直接进执行效
4、率高,用户需要时,可在程序中直接进行调用。行调用。C C语言库函数所用到的常量、外部变量、函数类语言库函数所用到的常量、外部变量、函数类型和参数说明,都在相应的头文件型和参数说明,都在相应的头文件(.h)(.h)中声明,中声明,这些文件通常存放在系统目录这些文件通常存放在系统目录includeinclude。用户自定义函数用户自定义函数 无参函数无参函数 有参函数有参函数8.2 8.2 函数的定义函数的定义8.2 8.2 函数的定义函数的定义有参函数定义有参函数定义有参函数定义有参函数定义形式一形式一形式一形式一函数值类型函数值类型 函数名函数名(形式参数类型及参数说明形式参数类型及参数说明)
5、声明部分声明部分 语句语句 函数返回值的类型,函数返回值的类型,可以是简单类型、可以是简单类型、voidvoid类型或构造类类型或构造类型等。型等。函数名是函数的标识函数名是函数的标识符,遵循符,遵循C C语言标识语言标识符的命名规则,区分符的命名规则,区分大小写。大小写。如如:int max(int a,int b)形式参数简称形参。形式参数简称形参。注意:无论函数是否注意:无论函数是否有形式参数,圆括号有形式参数,圆括号不可省。不可省。8.2 8.2 函数的定义函数的定义有参函数定义有参函数定义有参函数定义有参函数定义形式二形式二形式二形式二函数值类型函数值类型 函数名函数名(形式参数列表
6、形式参数列表)形式参数说明形式参数说明 声明部分声明部分 语句语句 如如:int max(a,b)int a,b;8.2 8.2 函数的定义函数的定义例例.定义符号函数定义符号函数sign。int sign(int x)int y;y=x0?1:(x=0?0:-1);return y;/*函数返回值类型未说明,默认为函数返回值类型未说明,默认为int,建议给出函数类型说明建议给出函数类型说明*/*形式参数说明形式参数说明*/*函数局部变量函数局部变量*/*返回函数值返回函数值*/8.3 8.3 函数参数和函数值函数参数和函数值8.3 8.3 函数参数和函数值函数参数和函数值11.形式参数和实际
7、参数形式参数和实际参数形式参数和实际参数形式参数和实际参数实参实参调用函数使用的参数调用函数使用的参数形参形参定义函数使用的参数定义函数使用的参数单向值单向值传递传递复制复制单向值传递方式是指在函数调用时,将实参单向值传递方式是指在函数调用时,将实参之值传递给对应的形式参数,使形参具有与之值传递给对应的形式参数,使形参具有与实参相同的值。实参相同的值。8.3 8.3 函数参数和函数值函数参数和函数值例例.调用函数时的数据传递。调用函数时的数据传递。#include“stdio.h”int max(int x,int y)/*定义有参函数定义有参函数*/int z;z=xy?x:y;return
8、(z);运行情况运行情况7,8 Max is 8abxyvoid main()int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Max is%dn”,c);8.3 8.3 函数参数和函数值函数参数和函数值有关形参与实参的几点说明:有关形参与实参的几点说明:有关形参与实参的几点说明:有关形参与实参的几点说明:实参可以是常量、变量或表达式。不论是何种实参可以是常量、变量或表达式。不论是何种类型,函数调用时,必须有确定的值,以便将类型,函数调用时,必须有确定的值,以便将值传递给形参。值传递给形参。在函数定义中指定的形参,未调用时,它们在函数定义中指定
9、的形参,未调用时,它们不占用存储单元。只有调用该函数时,形参不占用存储单元。只有调用该函数时,形参才被分配空间,函数调用结束后,形参所占才被分配空间,函数调用结束后,形参所占的存储单元被释放。的存储单元被释放。8.3 8.3 函数参数和函数值函数参数和函数值实参与形参的数据传递为单向传递,只可由实实参与形参的数据传递为单向传递,只可由实参向形参传递,不能由形参传回实参。实参与参向形参传递,不能由形参传回实参。实参与形参处在不同的函数中,作用的区域不同,即形参处在不同的函数中,作用的区域不同,即使实参与形参同名,也是不同的变量。使实参与形参同名,也是不同的变量。定义函数时,必须指定形参的类型。调
10、用函定义函数时,必须指定形参的类型。调用函数时,实参类型、个数及排列次序应与形参数时,实参类型、个数及排列次序应与形参一一对应。一一对应。8.3 8.3 函数参数和函数值函数参数和函数值22.函数的返回值函数的返回值函数的返回值函数的返回值功能功能 用于结束函数的执行并返回到调用者。用于结束函数的执行并返回到调用者。用来向主调函数传递一个返回值。用来向主调函数传递一个返回值。return语句的表示形式语句的表示形式 return 表达式表达式;or return(表达式表达式);8.3 8.3 函数参数和函数值函数参数和函数值int sign(int x)int y;return y=x0?1
11、:(x=0?0:-1);if(x0)return(1);else if(xy?x:y;return(z);void main()float a,b,c;scanf(“%f,%f”,&a,&b);c=max(a,b);printf(“Max is%fn”,c);运行情况运行情况1.5,2.5 Max is 2.0000008.3 8.3 函数参数和函数值函数参数和函数值注意注意:为了明确表示为了明确表示“不带返回值不带返回值”,可以用,可以用“void”定义定义“无类型无类型”。此时函数体内不。此时函数体内不得出现得出现return语句。语句。如:如:void main()8.3 8.3 函数参
12、数和函数值函数参数和函数值例例.写出以下程序的运行结果。写出以下程序的运行结果。max()/*函数类型缺省,为函数类型缺省,为int型,型,return语句缺省语句缺省*/运行结果运行结果-256,-256 /*/*返回值不确定,返回值不确定,TC2TC2返回值为返回值为0*/0*/min()/*函数类型缺省,函数类型缺省,return语句缺省语句缺省*/main()printf(%d,%dn,max(),min()););8.4 8.4 函数的调用函数的调用8.4 8.4 函数的调用函数的调用11.函数调用形式函数调用形式函数调用形式函数调用形式 函数名(实参表列)函数名(实参表列)一个函数
13、一旦被定义,就可在程序的一个函数一旦被定义,就可在程序的 其它函数中使用它,这个过程称为函其它函数中使用它,这个过程称为函 数调用。数调用。说明:说明:说明:说明:实际参数之间以实际参数之间以“,”分隔。分隔。实参与形参应保持个数、次序及类型的一致,实参与形参应保持个数、次序及类型的一致,以确保实参与形参之间数据的正确传递。以确保实参与形参之间数据的正确传递。实参一般为表达式,可以是常量、变量(调实参一般为表达式,可以是常量、变量(调用时必须有确定的值或确定的地址)。用时必须有确定的值或确定的地址)。形参必须为变量。形参必须为变量。8.4 8.4 函数的调用函数的调用函数调用的三种形式函数调用
14、的三种形式函数调用的三种形式函数调用的三种形式函数语句函数语句调用调用函数表达式函数表达式调用调用函数参数函数参数调用调用在函数调用后加在函数调用后加“;”;”,构成一个语句。,构成一个语句。目的是执行一个动作或完成特定的目的是执行一个动作或完成特定的功能。功能。函数调用作为表达式的一部分。函数调用作为表达式的一部分。被调用函数执行的结果为主调函数提被调用函数执行的结果为主调函数提供一个值供一个值。主调函数通过表达式接收值。主调函数通过表达式接收值。被调函数作为某个函数的一个参数。被调函数作为某个函数的一个参数。8.4 8.4 函数的调用函数的调用例例.函数语句调用与函数表达式调用。函数语句调
15、用与函数表达式调用。#include“stdio.h”void main()printf(nk1=%d,printf(nk2);运行结果运行结果k2k1=38.4 8.4 函数的调用函数的调用例例.函数参数调用形式调用函数函数参数调用形式调用函数max2 。#include“stdio.h”int max2(int x,int y)/*求两个数中较大的求两个数中较大的*/int z;return(z=xy?x:y);void main()int a,b,c;scanf(“%d,%d,%d”,&a,&b,&c);printf(“Max is%dn”,max2(max2(a,b),c);/*内层函
16、数内层函数max2的值作为外层函数的值作为外层函数max2的实参,整个的实参,整个函数函数max2的值又作函数的值又作函数printf的的实参的的实参*/8.4 8.4 函数的调用函数的调用22.函数声明函数声明函数声明函数声明调用用户自定义函数时,一般在主调函调用用户自定义函数时,一般在主调函数中对被调用函数返回值的类型、函数数中对被调用函数返回值的类型、函数名称、函数形参的类型进行说明,这种名称、函数形参的类型进行说明,这种说明称为函数声明。说明称为函数声明。#include“stdio.h”void main()float add(float x,float y);/*对对被被调调用用函
17、函数数的的声声明明*/float a,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sum is%fn”,c);float add(float x,float y)/*函数首部函数首部*/return(x+y);/*函数体函数体*/8.4 8.4 函数的调用函数的调用函数声明的一般形式:函数声明的一般形式:函数声明的一般形式:函数声明的一般形式:类型类型 函数名函数名(类型类型1 1 形参形参1,1,类型类型2 2 形参形参2,);2,);注意注意:函数声明是以语句形式出现的,因此其后有语句函数声明是以语句形式出现的,因此其后有语句结束标记结束标记“;
18、”。类型类型 函数名函数名(类型类型1,1,类型类型2,);2,);8.4 8.4 函数的调用函数的调用以下两种情况,可以省略对被调用函数的声明:以下两种情况,可以省略对被调用函数的声明:以下两种情况,可以省略对被调用函数的声明:以下两种情况,可以省略对被调用函数的声明:若函数定义放在主调函数之前,若函数定义放在主调函数之前,遵循先定义后调用原则遵循先定义后调用原则,函数声函数声明可以省略。明可以省略。8.4 8.4 函数的调用函数的调用#include“stdio.h”float add(float x,float y)/*函数首部函数首部*/return(x+y);/*函数体函数体*/vo
19、id main()float a,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sum is%fn”,c);8.4 8.4 函数的调用函数的调用如果已在所有函数定义之前,在函数外如果已在所有函数定义之前,在函数外部已做了函数声明,则在各个主调函数部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。中不必对所调用的函数再作声明。8.4 8.4 函数的调用函数的调用例如:例如:char letter(char,char);float f(float,float);void main()char letter(char c1,char c2)fl
20、oat f(float x,float y)8.4 8.4 函数的调用函数的调用例例.判断两个数的大小。判断两个数的大小。#include“stdio.h”void main()int f(int,int);int i=2,p;p=f(i,i+);printf(“%dn”,p);f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);运行结果:运行结果:18.4 8.4 函数的调用函数的调用例例.编程求两个整数的阶乘之和。编程求两个整数的阶乘之和。void main()int n1,n2;long sum;long f
21、ac(int);/*fac函数声明函数声明*/scanf(%d,%d,&n1,&n2);sum=fac(n1)+fac(n2);printf(%d!+%d!=%ldn,n1,n2,sum);/*定义函数定义函数fac,其功其功能是求能是求n!*/long fac(int n)int i;long r=1;for(i=1;i=n;i+)r=r*i;return r;8.5 8.5 函数的嵌套调用函数的嵌套调用8.5 8.5 函数的嵌套调用函数的嵌套调用定义定义定义定义所谓函数的嵌套调用是指一个函数调用另一函数所谓函数的嵌套调用是指一个函数调用另一函数的过程中又出现对其它的函数调用。的过程中又出现
22、对其它的函数调用。这种嵌套调用的层次原则上不限制。这种嵌套调用的层次原则上不限制。main函数函数1调用函数调用函数12函数函数1调用函数调用函数234函数函数25678结束结束98.5 8.5 函数的嵌套调用函数的嵌套调用例例.用弦截法求方程的根用弦截法求方程的根方法:方法:xy8.5 8.5 函数的嵌套调用函数的嵌套调用N-S流程图流程图输入输入x1、x2,求求f(x1)、f(x2)直到直到f(x1)和和f(x2)异异号号真真假假x1=xy1=yx2=xy2=y直到直到|y|1e-4|y|0)x1=x;y1=y;else x2=x;while(fab(y)=1e-4);return(x);
23、8.5 8.5 函数的嵌套调用函数的嵌套调用/*续上续上*/void main()/*主函数主函数*/float x1,x2,f1,f2,x;do printf(input x1,x2:n);scanf(%f,%f,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(x=%.4fn,x);运行情况运行情况input x1,x2:2,6 x=5.00008.5 8.5 函数的嵌套调用函数的嵌套调用main函数函数调用调用root函数函数root函数函数调用调用xpoint函数函数xpoint函数函数输出根输出根x结束结束调
24、用调用f函数函数f函数函数8.6 8.6 函数的递归调用函数的递归调用8.6 8.6 函数的递归调用函数的递归调用定义定义定义定义在调用一个函数的过程中又出现直接或间接地调在调用一个函数的过程中又出现直接或间接地调用该函数本身。用该函数本身。直接调用直接调用间接调用间接调用f函数函数调用调用f函数函数f1函数函数调用调用f2函数函数f2函数函数调用调用f1函数函数8.6 8.6 函数的递归调用函数的递归调用无论是直接还是间接递归,两者都是无终止的调无论是直接还是间接递归,两者都是无终止的调用自身。要避免这种情况的发生,使用递归解决用自身。要避免这种情况的发生,使用递归解决的问题应满足两个基本条
25、件:的问题应满足两个基本条件:问题的转化。有些问题不能直接求解或难以问题的转化。有些问题不能直接求解或难以求解,但可以转化为一个新问题,这个新问求解,但可以转化为一个新问题,这个新问题相对较原问题简单或更接近解决方法。这题相对较原问题简单或更接近解决方法。这个新问题的解决与原问题一样,可以转化为个新问题的解决与原问题一样,可以转化为下一个新问题,下一个新问题,。转化的终止条件。原问题到新问题的转化是转化的终止条件。原问题到新问题的转化是有条件的、次数是有限的,不能无限次数地有条件的、次数是有限的,不能无限次数地转化下去。这个终止条件也称为边界条件。转化下去。这个终止条件也称为边界条件。8.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 第08章 函数 语言 08
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内