收藏 分享(赏)

C复习讲稿(函数部分).ppt

上传人:fmgc7290 文档编号:8291350 上传时间:2019-06-18 格式:PPT 页数:51 大小:593.50KB
下载 相关 举报
C复习讲稿(函数部分).ppt_第1页
第1页 / 共51页
C复习讲稿(函数部分).ppt_第2页
第2页 / 共51页
C复习讲稿(函数部分).ppt_第3页
第3页 / 共51页
C复习讲稿(函数部分).ppt_第4页
第4页 / 共51页
C复习讲稿(函数部分).ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

1、函 数 复 习 资 料,长春工业大学,1、概述 、函数的定义与调用 、数组作函数参数 、函数的嵌套调用和递归调用 、变量的存储属性,1 概述, 程序结构清晰,可读性好。 减少重复编码的工作量。 可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。,使用函数的 好处,【例】求一个整数的立方。,int cube (int x) /* 函数定义 */ return (x * x * x); void main( ) int f, a;printf(“nEnter an integer number:“);scanf(“%d“, ,程序运行情况如下: Enter an integer

2、 number:2 2 * 2 * 2 = 8,函数调用,程序的执行总是 从main函数开始, 一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。 一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。 在一个C程序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。,说明,函数的种类,从函数定义形式分: 有参函数:在主调函数和被调函数之间通过参数进行数据传递,如:int cube(int x) 无参函数:

3、如:getchar( )在调用无参函数时,主调函数不需要将数据传递给无参函数。,从用户的角度: 标准函数(库函数)由系统提供。如:getchar( )、sin(x)等。在程序中可以直接调用它们。附录A列出了C的部分库函数。 用户自定义函数。如:例7.1中的cube函数。,2.1 函数的定义,例如:求两个数的最大值。 int max(int x,int y) int z;z = x y ? x : y;return( z ); ,类型省略时默认为int类型, 函数的定义与调用,花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。,函数名(实参表列),在C语言

4、中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例: welcome( ); if (abs (a)max) max=abs(a); m=max(c,max(a,b);,2.2函数的调用,函数调用的一般形式:,int sum100( ) int i,t=0;for (i=1; i=100; i+)t+=i;return (t); main( ) int s;s=sum100( );printf(“%dn“, s); ,程序输出结果: 5050,int sum ( int x ) int i,t=0;for (i=1; i=x; i+)t+=i;return (t

5、); main( ) int s;s=sum (100);printf(“%dn“, s); ,【例】 求1100的累加和。,思考:两个程序有何不同,程序输出结果: 5050,?,形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,【例】比较两个数并输出大者。,main() int max(int x, int y); /*函数声明*/int a,b,c;scanf(“%d,%d“, ,2.3 函数的参数及其传递形式,若形参与实参类型不一致,自动按形参类型转换(隐式转换)。,形参必须指定类型,在发生函数调用时分配存储空间,调用结束时,形参所占

6、的内存单元被释放。,实参向形参的数据传递是“值传递” ,即实参与形参是不同的单元。函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。值传递为单向传递。,对函数参数的说明:实参可以是常量、变量或表达式,但必须有确定的值。 形参与实参类型一致,个数相同。,【例】 交换两个数。,#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 t

7、emp;temp=a; a=b; b=temp; ,main() int i=2,p;p=f(i,+i); printf(“%d“,p); int f(int a, int b) int c;if(ab) c=1;else if(a=b) c=0;else c=-1;return(c); ,【例】 参数求值顺序,main() int i=2,p;p=f(i, i+); printf(“%d“,p); int f(int a, int b) int c;if(ab) c=1;else if(a=b) c=0;else c=-1;return(c); ,运行结果:0,运行结果:1,若函数类型与re

8、turn语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换,void型函数,函数无返回值,函数体中不允许出现return语句,2.4 函数的返回值,返回语句形式: return(表达式);或 return 表达式;或 return;功能:使程序控制从被调用函数返回到主调函数中,同时把返值带给调用函数。,说明: 函数中可有多个return语句,若无return语句,遇时,自动返回调用函数,s(int r) return 3.14*r*r;main( ) int r,area;scanf(“%d“, ,自动转换为int型,程序运行情况如下: 2 12,【例】 计算并输出圆的面积,pri

9、ntstar() printf(“*“); main() int a;a=printstar();printf(“%d“,a); ,【例】函数带回不确定值,输出:10,void printstar() printf(“*“); main() int a;a=printstar();printf(“%d“,a); ,编译错误!,2.5 对被调函数的声明和函数原型,变量要先定义后使用,函数也如此,即被调函数的定义要出现在主调函数的定义之前,如在主调函数之后,则需对被调函数进行声明。,函数声明的形式: 函数类型 函数名(形参类型 形参名, );或 函数类型 函数名(); /*不提倡*/,作用:告诉编

10、译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数声明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数声明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前,【例】 函数声明举例,main() float add(float,float); /*function declaration*/float a,b,c;scanf(“%f,%f“, ,【例7.7】 两个数组大小比较。,a和b为有10个元素的整型数组比较两数组对应元素使用变量n,m,k,分别记录aibi,ai=bi,aik,认为数组ab若nk,认为数组ab若n=k,认

11、为数组a=b,3.1 数组元素作函数实参值传递,3、 数组作为函数参数,3.2 数组名作函数参数-地址传递,在主调函数与被调函数分别定义数组,且类型应一致 形参数组大小(多维数组第一维)可不指定 形参数组名是地址变量,【例】求10个学生的平均成绩.,#include float average(int stu10, int n);void main() int score10, i;float av;printf(“Input 10 scores:n“);for( i=0; i10; i+ )scanf(“%d“, ,float average(int stu10, int n) int i;

12、float av,total=0;for( i=0; in; i+ )total += stui;av = total/n;return av;,实参用数组名,形参用数组定义, int stu ,【例】 数组元素与数组名作函数参数比较,#include void swap2(int x,int y) int z;z=x; x=y; y=z; main() int a2=1,2;swap2(a0,a1);printf(“a0=%dna1=%dn“,a0,a1); ,值传递,【例】 数组元素与数组名作函数参数比较,#include void swap2(int x) int z;z=x0; x0=

13、x1; x1=z; main() int a2=1,2;swap2(a);printf(“a0=%dna1=%dn“,a0,a1); ,地址传递,【例】 求二维数组中最大元素值,int max_value(int array34) int i,j,k,max;max=array00;for(i=0;imax)max=arrayij;return(max); main() int a34=1,3,5,7,2,4,6,8,15,17,34,12;printf(“max value is %dn“,max_value(a); ,【例】 求二维数组中各行元素之和,get_sum_row(int x3,

14、 int result ,int row, int col) int i,j;for(i=0;irow;i+) resulti=0;for(j=0;jcol;j+)resulti+=xij; main() int a23=3,6,9,1,4,7;int sum_row2,row=2,col=3,i;get_sum_row(a,sum_row,row,col);for(i=0;irow;i+)printf(“The sum of row%d=%dn“,i+1,sum_rowi); ,18,12,4.1 函数的嵌套调用,C规定:函数定义不可嵌套,但可以嵌套调用函数,4、函数的嵌套调用与递归调用,【

15、例】 求三个数中最大数和最小数的差值,#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=xy?x:y;return(rz?r:z); int min(int x,int y,int z) int r;r=x

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

17、; main() int n;long y;printf(“Input a integer number:“);scanf(“%d“, ,递归函数的执行过程(以4!为例),变量的属性数据类型:决定了分配的内存单元长度, 数据存放形式, 数的范围。一个变量数据类型定义放的位置决定该变量的作用域(在某区域中有效): 全局或局部。,5.1 概述,5、变量的属性,存储属性: 变量分配在哪个存储区,决定变量的生存期.生存期:变量在程序运行过程中在内存中的存在时间。有静态变量与动态变量两种。,存储器类型:寄存器、静态存储区、动态存储区,1. 局部变量-内部变量定义:在函数内定义,只在本函数内有效说明:ma

18、in中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:auto register static (默认为auto),5.2 局部变量与全局变量,定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,应尽量少使用全局变量,因为: 全局变量在程序全部执行过程中占用存储单元 降低了函数的通用性、可靠性,可移植性 降低程序清晰性,容易出错,外部变量说明: extern 数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量

19、被屏蔽,外部变量可用存储类型:缺省 或 static,2. 全局变量-外部变量,定义 说明 次数: 只能1次 可说明多次 位置: 所有函数之外 函数内或函数外 分配内存: 分配内存,可初始化 不分配内存,不可初始化,float max,min; float average(float array, int n) int i; float sum=array0;max=min=array0;for(i=1;imax) max=arrayi;else if(arrayimin) min=arrayi;sum+=arrayi;return(sum/n); main() int i; float av

20、e,score10;/*Input */ ave=average(score,10);printf(“max=%6.2fnmin=%6.2fnaverage=%6.2fn“,max,min,ave); ,int p=1,q=5;float f1(int a) int b,c;. int f3() char c1,c2; char f2(int x,int y) int i,j; main() int m,n;. ,c1,c2的作用范围,p,q的作用范围,例 外部变量定义与说明,int max(int x, int y) int z;z=xy?x:y;return(z); main() exte

21、rn int a,b;printf(“max=%d“,max(a,b); int a=13,b=-8;,运行结果:max=13,extern int a,b; int max() int z;z=ab?a:b;return(z); main() printf(“max=%d“,max(); int a=13,b=-8;,运行结果:max=8,int i; main() void prt();for(i=0;i5;i+)prt(); void prt() for(i=0;i5;i+)printf(“%c”,*);printf(“n”); ,例 外部变量副作用,运行结果:*,存储方式 静态存储:程

22、序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间,生存期 静态变量:从程序编译到程序结束 动态变量:从包含该变量定义的函数开始执行至函数执行结束,5.3 动态变量与静态变量,变量的存储类型auto -自动型register -寄存器型static -静态型外部型 (即全局变量,可用extern 来扩展作用域),如: int sum;auto int a,b,c;register int i;static float x,y;,变量定义格式: 存储类型 数据类型 变量表;,局部变量可以定义为自动变量。,1自动变量(auto), 内存分配: 执行该函数时在动态存储区为其分

23、配存储单元,函数执行结束,所占内存空间即刻释放。 变量的初值: 定义变量时若没赋初值,变量的初值不确定;如赋初值则每次函数被调用时执行一次赋值操作。 生存期 在函数执行期间。 作用域 自动变量所在的函数内。,除形参外,局部变量与全局变量都可定义为静态变量。,2静态变量(static), 内存分配编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。 静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值 。 生存期整个程序的执行期间。 作用域局部静态变量的作用域是它所在的函数。全局静态变量的作用域是从定义处开始到

24、本源文件结束。,静态变量,3外部变量,int c; static int a; main( ) float x,y; char s; f( ) static int b=1; ,在函数外定义的变量若没有用 static说明,则是外部变量。, 内存分配编译时,将其分配在静态存储区,程序运行结束释放该单元。 变量的初值若定义变量时未赋初值,在编译时,系统自动赋初值为0。 生存期整个程序的执行期间。 作用域从定义处开始到本源文件结束。 此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。,外部变量,只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存

25、器中。受寄存器长度的限制,寄存器变量只能是char、int和指针类型的变量。,【例】寄存器变量的使用。 main( ) long int sum=0;register int i;for (i=1; i=1000; i+)sum+=i;printf(“sum=%ldn “,sum); ,程序输出结果: sum=500500,4. 寄存器变量(register),变量存储类型总结,局部变量默认为auto型 register型变量个数受限,且不能为long, double, float型 局部static变量具有全局寿命和局部可见性 局部static变量具有可继承性 extern不是变量定义,可扩

26、展外部变量作用域,【例】 auto 变量的作用域,main() int x=1;void prt(void); int x=3;prt();printf(“2nd x=%dn”,x);printf(“1st x=%dn”,x); void prt(void) int x=5;printf(“3th x=%dn”,x); ,运行结果: 3th x=5 2nd x=3 1st x=1,main() void increment(void);increment();increment();increment(); void increment(void) int x=0;x+;printf(“%dn”,x); ,【例】 写出程序运行的结果,运行结果:111,main() void increment(void);increment();increment();increment(); void increment(void) static int x=0;x+;printf(“%dn”,x); ,运行结果:123,祝 大 家 好 运!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报