函数讲义市公开课获奖课件_第1页
函数讲义市公开课获奖课件_第2页
函数讲义市公开课获奖课件_第3页
函数讲义市公开课获奖课件_第4页
函数讲义市公开课获奖课件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 函 数第1页第1页本章主要内容函数概述应用函数编程(函数之间数据传递)值传递地址传递变量作用域与变量存储类型auto变量、static 变量局部变量、全局变量第2页第2页C程序是由函数构成(能够多个) 有且只有一个main()其它函数 库函数自定义函数函数是结构化程序设计基本模块。含有某种功效代码段通用性强,能够被重复使用。易于维护,能够独立设计,单独调试。划分函数时,考虑功效单一完整。4.1 函数概述第3页第3页结构化程序设计思想复杂问题main()abca1a2b1b2c1c2结构化程序设计:也称为,自顶向下、逐步细化。将复杂系统划分为功效相对独立子系统组合,对各子系统再进行如此划

2、分每个模块,在C语言中表现为函数。第4页第4页C中函数分类: 用户角度分:系统函数和用户函数;参数角度分:有参函数和无参函数;返回值角度分:有返回值函数和无返回值函数。原则库函数调用 Turbo C中提供了300多条原则库函数,都放在函数库(.lib)中,函数阐明按功效分类放在标题文献(.h,也称头文献)中。 添加一行:#include “头文献名称” 或者 #include 第5页第5页函数例子:#include void PrintStar()printf(*n);void main() PrintStar ();printf(Hello Everybody!n);PrintStar ()

3、; 使用函数组装程序好处: 代码重用 程序模块化 维护以便第6页第6页4.2 函数定义与调用 4.2.1 函数定义#include void main(void ) int a,b,c; scanf ( “%d,%d” , &a, &b) ; c=max( a , b); printf (“%d” c) ;int max(int x ,int y) int z ; z=x=y? x : y ; return ( z) ;主函数函数体函数类型,返回值类型。 函数名形式参数阐明表。定义!调用!函数头第7页第7页函数定义格式: 返回值类型 函数名(形式参数列表) 申明部分 功效语句 返回语句 /*函

4、数头*/ /*函数体*/(1)函数头 返回值类型 函数名 形参列表:0个或多个,逗号分隔,给出参数名称及类型。(2)函数体 代码段,实现功效。一对 括起来。 返回语句return :有返回值:return (表示式);或return 表示式;返回无返回值:可无return语句,末尾右“”作为函数返回。第8页第8页4.2.2函数调用1、函数调用形式: 函数名(实参列表) ;单独语句形式: max (a ,b );printf(“fdsa”);表示式形式: c= max (a ,b );作为函数参数: printf (“%d” , max (a ,b ) ;1、函数调用形式: 函数名(实参列表)

5、;2、函数返回值:被调函数执行后返给主调函数值。return(表示式);或 return 表示式;可有多条return语句,碰到一条return时,程序即返回。函数没有返回值,能够没有return语句,利用 “” 返回。3、函数申明:调用之前,对被调函数要进行申明。如:int max (int x ,int y );第9页第9页#include long Multiply(int , int );void main() int num1,num2; long result; scanf(“%d%d”, &num1,&num2); printf(%ldn, Multiply(num1, num2

6、); result= 2*Multiply(2*num1,2* num2); printf(%ldn, result);long Multiply(int x, int y) long z; z=x*y; return z;【例4-2】 第10页第10页4.3 函数间数据传递函数在调用时,主调函数和被调函数之间普通存在着数据传递。传递有两种方式:值传递和地址传递将值或地址传递给被调函数;将被调函数结果返回给调用函数。主调函数被调函数向被调函数传递数据(值或地址)。将结果返回给主调用函数。第11页第11页传值调用方式:形参是普通变量-值参(1)形参是普通变量:必须传同类型数值 形参及被调函数内变

7、量只有在被调用时才分派内存单元, 此时将实参值初始化给相应形参。 形参与实参完全脱离了关系,形参值不影响实参。 调用结束时,形参所占据内存单元被释放。(2)实参必须有拟定值,以便把这些值传递给形参。(3)实参与形参在数量、位序和类型上必须一致。【例4-5】观测程序运营结果。#include void swap (int , int ) ;void main (void ) int a,b ; a=10;b=20 ; printf ( “调用前:na= %d,b=%d n ”,a,b ) ; swap (a,b); printf ( “调用后:na= %d,b=%d n ”,a,b ) ;voi

8、d swap (int x ,int y ) int z ; z=x; x=y; y=z ;第12页第12页指针变量作形参,必须传同类型地址(指针)数据。 此时在主调函数和被调函数之间能够实现信息“双向传递”。4.3.2 传地址调用方式例4-6 /*函数参数为指针变量*/void swap (int *x, int *y) ;void main ( ) int a,b ; a=10;b=20 ; printf ( “调用前:na= %d,b=%d n ”,a,b ) ; swap (&a,&b); printf ( “调用后:na= %d,b=%d n ”,a,b ) ;void swap (

9、int *x ,int *y ) int z ; z=*x; *x=*y; *y=z ; 第13页第13页2. 形参为数组类型,实参为数组名#include void fun(int b );main ( )int a10,i; for(i=0;i10;i+) scanf(“%d”,&ai); fun(a); for(i=0;i10;i+) printf(“%d”,ai); void fun( int b ) int max,k,i ; max=b0; k=0; for(i=1;imax) max=bi;k=i; max=b0;b0=bk;bk=max;例: 编写函数,将数组中最大值与第一个数

10、互换。要求在main()中进行数据输入输出,第14页第14页【例4-7】输入5个数到数组中,求这5个数平均值。求平均值编写函数实现,并将该值作为返回值。 #include #define N 5float aver( int data, int) ;void main (void) int i, arrayN, av; for(i=0;iN;i+) scanf(%d, &arrayi); av= aver(array,N) ; printf( av=%f n ,av) ; float aver( int data , int n ) int i ; float avg=0 ; for (i=0

11、 ; in ; i+) avg+= datai; avg/=n ; return (avg ) ; 第15页第15页【例4-8】输入10个数到数组中,再输入一实数,判断该数在数组中是否存在?假如存在,输出该数在数组中下标;假如不存在,输出-1。查找编写函数实现。#include int search(float a,float x);void main( )int i,position;float a10,x;printf(输入10个实数:n); for(i=0;i10;i+) scanf(%f,&ai);printf(输入要找实数:n);scanf(%f,&x);position=searc

12、h(a, x); if(position=-1)printf(“没找到。n);elseprintf(“找到了。下标是 %d,position);int search(float a,float x)intxpos=-1,i;for(i=0;i10;i+) if(ai=x) xpos=i;return xpos; 第16页第16页4.4 函数嵌套调用和递归调用 C中不允许作嵌套函数定义,各函数之间都是平等和独立。C允许在一个函数定义中出现对另一个函数调用。【例4-9】函数嵌套调用例子。#include float fun2(float x);float fun1(float x);void ma

13、in() float a; scanf(%f,&a); printf(%f,myfun1(a);float fun1(float x) return 2*fun2(x); float fun2(float x) return x0?x:-x; 第17页第17页【例4-10】使用函数嵌套调用编程,计算S。void main( ) int N,K; scanf(%d%d,&N,&K); printf(n%.0fn,fsum(N,K); 分析(1)求累加和编一函数fsum(); (2)累加每一项,再编一函数fexp() (3)循环中,进行累加时,调用fexp()求出该项double fsum(int

14、 n,int k) double sum=0; int i; for(i=0;in;i+)sum+=fexp(i,k); return sum;double fexp(int n,int k) double power=1; int i; for(i=0;ik;i+)power*=n; return power; 第18页第18页4.4.2 函数递归调用含义:一个函数在它函数体内直接或间接地调用它本身称为递归调用。用递归法处理问题,应当符合下列2个条件:边界问题(也称基本问题)有直接解。 原问题能够转化成一个规模较小新问题,新问题求解办法与原问题相同。 第19页第19页【例4-11】计算n!

15、。使用递归函数实现。 long fac(int n) if(n=1) return(1); else return n*fun(n-1);void main() int n; scanf(“%d”,&n); printf(“%d”,fac(n);第20页第20页【例5- 】汉诺塔问题(Hanoi) 问题提出:相传是在古印度圣庙中一个游戏。 在一块铜板装置上,有三根杆A、B、C,在A杆自下而上、由大到。小放置64个金盘。游戏目的:把A杆上金盘所有移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子; 移动过程中三根杆上始终保持大盘在下,小盘在上,操作过程中盘子能够置于A、B、C任一杆

16、上。第21页第21页4.5 变量作用域与存储类型C程序中变量使用规则是:先定义后使用。定义形式中: 类型: 表明变量占用内存空间大小; 位置(函数内与外): 表明变量在程序中作用域。 普通,还要说明其存放类型,说明变量存放方式。 不同存放方式影响变量在内存中存在时间。 第22页第22页4.5.1局部变量与全局变量 局部变量:在函数内部或复合语句内部定义变量(包含函数形参)。不同函数内局部变量之间没相关系,同名也互不影响。局部变量同名时,当前局部变量有效。 第23页第23页【例4-12】函数局部变量应用举例。 void func1(int a, int b) int x; printf(“fun

17、c1 x :%x”,&x); void func2() int x; printf(“func2 x :%x”,&x);void main()int x, y;func1(3,4);func2();printf(“main x DS:%x”,&x);第24页第24页【例4-13】复合语句中局部变量举例。void main() int i,j; i=2; j=3; int i; i=5; printf(Inter i = %d,j=%dn,i,j); printf(Outer i = %d,j=%dn,i,j);第25页第25页2. 全局变量在函数体外部定义变量称为全局变量。局部变量属于所在函数

18、,而全局变量属于所有函数,能够被当前文献其它函数使用。 全局变量和局部变量同名时,当前局部变量有效,全局变量被屏蔽。普通来说,在较大程序中要避免出现全局变量和局部变量同名情况。 第26页第26页【例4-14】全局变量应用举例。int qNum=10; void main() printf(%dn, qNum); func1(); printf(%dn, qNum); func2();printf(%dn, qNum);void func1() qNum =1; void func2() qNum =2; 第27页第27页全局变量阐明:extern 数据类型 全局变量名;#include voi

19、d func1() extern int sum; /申明 sum=1;int sum=0;void main() func1(); printf(%dn,sum); 第28页第28页全局变量优缺点: 使用全局变量长处 减少实参和形参数据传递带来时间消耗。 使用全局变量缺点: 全局变量保留在静态存贮区,编译时为其分派空间,整个程序结束才释放该空间。因此全局变量生存期比较长,过多全局变量占用较多内存单元。 全局变量破坏了函数封装性能。 全局变量使函数代码可读性减少。 第29页第29页4.5.2变量存储类型 动态存贮区和静态存贮区 程序运营后,内存中可供程序使用存贮空间分为三个部分。代码区存储:程

20、序二进制代码。静态存贮区和动态存贮区:存储程序相关数据。 静态存贮区里:全局变量、静态变量。动态存贮区里:函数内定义变量、形参。特点:调用时,为变量动态分派内存空间;调用结束,释放该变量内存空间。变量存贮类别有三种:auto、static、register。第30页第30页 auto存储类型(关键字能够省略)在默认情况下,所有局部变量(包括形参)都是auto变量 #include void main(void) auto int a,b; scanf(“%d,%d”,&a,&b); if(ba) int t; t=a; a=b; b=t; printf(“Max=%d”,a);ab作用域t作用

21、域。生存期:变量都拥有自己内存空间。 从申请-被释放,这段时间称为变量生存期。 register存储类型 其作用域、生存期与auto相同,差别在于,假如CPU内部存储器空闲,则使用存储器作为变量存储单元,以提升速度。主要是循环变量,整形和字符型。第31页第31页 static(静态)存储类型 作用域:函数内定义局部静态变量,在该函数之外不可见。 生存期:从编译-整个程序结束。 位于静态存贮区,在函数调用结束后,值仍然存在, 并影响到下一次调用过程。void row ( ) ;void main ( ) int i ; for (i=1 ; i=9 ; i+ ) row ( ) ;void ro

22、w ( ) static int a=1 ; int i ; for (i=1 ; i=9 ; i+) printf ( “%5d” , a*i ) ; printf ( “ n ”) ; a+ ;a作用域生存期从编译开始到程序结束。第32页第32页【例4-15】 static局部变量应用举例。#include int f( int x) int a=10; static int stc=1; stc = stc +x+a; return stc;void main() printf(%dn,f(1); printf(%dn, f(1); 第33页第33页关于static局部变量提出几点注意:

23、存放在静态区,生存期比较长,从编译开始它就存在, 整个程序结束后才被释放。从作用域来看,它是一个局部变量,属于当前函数; 即,当前函数内可见,其它函数 不可见。对初值处理不同。auto变量定义时假如没有初始化,那么它是一个随机值;static局部变量假如没有初始化,编译器自动将其初始化为 值 0 或 空字符。在程序中尽也许不用或少用static局部变量。原因主要有: static局部变量生存期长,比较浪费内存; 使用static局部变量会造成函数多次调用之间发生联络,使代码可读性降低。 第34页第34页4. static 型全局变量 C程序能够由多个源文献构成。一个文献中定义全局变量,其它文献

24、中能够使用(用extern方式申明后)。假如限制本文献中全局变量不能被其它文献使用,能够在全局变量定义前加关键字static。static型全局变量作用域:本文献内。 第35页第35页 【举例】static全局变量应用。/文献f1.c里代码下列:#include#includestatic int gs=0;void func(intx);void main() func (3); printf(%d, gs);/文献f2.c里代码下列:extern int gs;void func (int x) gs+=x; 第36页第36页4.6 外部函数和内部函数 当一个程序由多个源文献构成时,能够指

25、定一个文献中函数能被其它文献调用;也能够指定该函数只能被本文献使用;从这个意义上,函数能够分为外部函数和内部函数。 第37页第37页4.6.1 外 部 函 数 一个函数假如能够被其它源文献调用,称为外部函数。 定义外部函数时,在函数头最左面加关键字extern, 表明该函数是一个外部函数 省略extern关键字,则系统默认为外部函数 extern int max(int a,int b) return ab?a:b; 文献f1.c里代码下列:extern void printstar(); /* extern 能够省略不写*/void main() printstar ();文献f2.c里代码

26、下列:void printstar () printf(*n);这里f1.cmain函数调用了f2.c外部函数printstar。 第38页第38页4.6.2 内部函数假如一个函数只能被本文献中函数调用,该函数就称为内部函数,定义内部函数时,在函数最左面加关键字static static int max(int a,int b) return ab?a:b;第39页第39页文献f1.c 里代码:void func(); static void printstar ()printf(printstar in f1.c.n);void main()printstar ();func(); 文献f2

27、.c里代码:static void printstar ()printf(printstar in f2.c.n);void func()printstar (); 第40页第40页4.7.2 在VC+下多文献程序运营在VC+环境下,编译和运营由多个源文献构成程序操作下列: 办法一,新建一个工程,向其中添加已有源文献。办法二,新建一个工程,在其中创建多个源文献 。 第41页第41页补充 编译预处理 C 语言尚有一类编译预处理语句。 作用是在编译时对程序作一定处理,满足特定处理要求。编译预处理语句语法形式:#关键词 参数表 宏定义预处理1.1不带参数宏定义作用:定义常量名,提升程序可读性,便于修

28、改。格式: #define 宏名 字符串#define PI 3.1415926void main(void) float r; scanf(“%f ”,&r) printf(“%fn”,PI*r*r);编译时用字符串替换宏名。3.1415926第42页第42页阐明:宏名普通用大写;编译时用字符串无条件替换宏名;#define PI 3.1415926;PI*r*r3.1415926*r*r; 宏名有效范围,从定义到程序尾。也能够通过#undef修改定义范围。#define G 9.8void main(void ) #undef GG范围能够在宏定义字符串中使用已定义宏名。” ”字符串中宏名不替换。#define R 3.0#define PI 3.141

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论