版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、重点(zhngdin)与难点q 重点:函数的定义、声明、参数传递和调用;函数的嵌套调用;变量(binling)的作用域与生存期。q 难点:参数传递和函数的嵌套调用。第1页/共87页第一页,共88页。6.1 模块化软件(run jin)与C程序的模块结构6.1.1 模块(m kui)化软件6.1.2 C语言的模块(m kui)结构第2页/共87页第二页,共88页。6.1.1 模块化软件(run jin) 模块化:就是将一个较为复杂的、大型的项目按其功能与结构,划分为若干个功能相对独立的模块(Module),每个模块实现一个功能。 C语言(yyn):是一种结构化程序设计语言(yyn),结构化程序设
2、计的基本思想之一就是程序的“模块化”。每个模块在C语言(yyn)中可以用函数来实现。第3页/共87页第三页,共88页。6.1.2 C语言的模块(m kui)结构mainabcdefeghhi第4页/共87页第四页,共88页。C程序(chngx)的组成 C程序:可以由一个或多个C源程序文件组成。在C语言中,一个C语言的源程序文件就是一个编译单位。 函数:它是C源程序的基本( jbn)模块。第5页/共87页第五页,共88页。函数(hnsh)分类 从用户使用(shyng)的角度 标准库函数与用户自定义函数 从有无函数返回值的角度 有返回值函数与无返回值函数 从有无参数的角度 有参函数与无参函数第6页
3、/共87页第六页,共88页。6.2 函数(hnsh)定义、参数和返回值6.2.1 函数定义的一般(ybn)形式6.2.2 函数参数与参数传递6.2.3 函数返回值第7页/共87页第七页,共88页。6.2.1 函数(hnsh)定义的一般形式1、无参函数(hnsh)2、有参函数(hnsh)3、空函数(hnsh)第8页/共87页第八页,共88页。1、无参函数(hnsh) 类型标识符 函数名() 类型说明(shumng) 语句 void printmessage() printf(nHello!);第9页/共87页第九页,共88页。2、有参函数(hnsh) 类型标识符 函数名(形式参数列表) 类型说明
4、(shumng) 语句 第10页/共87页第十页,共88页。3、空函数(hnsh) 类型(lixng)说明符 函数名() 调用这种函数没有任何实际作用,但在系统规划(guhu)的初期用于标示各个部分,使得程序结构清楚,可读性好,以后扩充新的功能方便。第11页/共87页第十一页,共88页。6.2.2 函数参数与参数传递1、分类:形式参数和实际参数。2、形参:在函数定义的时候声明(shngmng)的参数称为形式参数,简称形参。形参是变量名。3、实参:在函数调用的时候使用到的参数称为实际参数,简称实参。实参是表达式。第12页/共87页第十二页,共88页。参数传递1、参数传递是实参传递给形参。2、传递
5、要求:在参数传递的过程中,实参的个数必须与形参的个数一样多,并且类型应相同或保持兼容,否则系统会给出错误。3、分类(fn li) 值传递与地址传递第13页/共87页第十三页,共88页。值传递(chund)方式第14页/共87页第十四页,共88页。值传递(chund)图示函数调用开始(kish)函数调用结束(jish)复制第15页/共87页第十五页,共88页。地址(dzh)传递方式第16页/共87页第十六页,共88页。6.2.3 函数(hnsh)返回值 函数的返回(fnhu)值是通过return语句返回(fnhu)主调函数。该语句的形式如下: return 表达式;第17页/共87页第十七页,共
6、88页。返回值类型(lixng) return语句的表达式的计算结果的类型常常与函数定义的返回类型不一致。这时应该以哪一个为准呢? (1)C语言规定,函数的返回值的类型以函数定义的类型为准。 (2)如果return语句中的表达式是数值型的,系统自动进行类型转换(zhunhun)。如果系统不能自动转换(zhunhun)的,则需要编程人员进行强制转换(zhunhun)。第18页/共87页第十八页,共88页。函数默认(mrn)类型 如果在函数定义时没有指定(zhdng)返回值的类型,系统默认为int型的。 第19页/共87页第十九页,共88页。无无returnreturn语句语句(yj)(yj) 如
7、果被调用函数中没有return语句,是不是没有返回值呢? 其实不是,函数仍然返回一个值,只不过这个值是不确定的、也不是用户所希望得到的。 如果一个函数没有返回值,最好是用void明确地表示出来。这样,可以(ky)保证函数正确调用,减少出错。 第20页/共87页第二十页,共88页。6.3 函数调用6.3.1 函数(hnsh)的一般调用6.3.2 函数(hnsh)的嵌套调用6.3.3 函数(hnsh)的递归调用第21页/共87页第二十一页,共88页。6.3.1 函数(hnsh)的一般调用函数(hnsh)名(实参表列)第22页/共87页第二十二页,共88页。函数调用形式(xngsh)(1)函数(hn
8、sh)语句 printf(Welcome to C language.);(2)函数(hnsh)表达式 c=max(a,b);(3)函数(hnsh)作参数 d=max(a,max(b,c) ; 第23页/共87页第二十三页,共88页。6.3.2 函数(hnsh)的嵌套调用第24页/共87页第二十四页,共88页。举例(j l):用弦截法求方程的根。08016523xxx1xx2x)(2xf)(1xf)()()()(121221xfxfxfxxfxx第25页/共87页第二十五页,共88页。自定义函数(hnsh)1、f(x) = 2、xpoint( , )=3、root(x1,x2)8016523x
9、xx)()()()(121221xfxfxfxxfx1x2x第26页/共87页第二十六页,共88页。函数调用关系(gun x)第27页/共87页第二十七页,共88页。rootroot函数函数(hnsh)(hnsh)float root(float x1,float x2) float x,y,y1=f(x1); do x=point(x1,x2); y=f(x); if(y*y10) y1=y;x1=x; else x2=x; while(fabs(y)=0.0001); return(x);第28页/共87页第二十八页,共88页。6.3.3 函数(hnsh)的递归调用1)直接(zhji)调用
10、自身2)间接(jin ji)调用自身第29页/共87页第二十九页,共88页。递归的两个(lin )阶段 回推和递推 回推到可以确定值(即递归结束条件)时结束;递推从起初(qch)值开始进行迭代。 1 (n=0,1) /*递归结束条件*/f(n)= n*f(n-1) (n1)第30页/共87页第三十页,共88页。4!的回推与递推举例(j l) 回推 f(4)=4*f(3)=4*3*f(2)=4*3*2*f(1) 递推 f(1)=1 f(2)=2*f(1)=2 f(3)=3*f(2)=3*2=6 f(4)=4*f(3)=4*6=24第31页/共87页第三十一页,共88页。递归调用(dioyng)实
11、质 在不能计算( j sun)出结果时,先压栈;在能够计算( j sun)时,逐个出栈。第32页/共87页第三十二页,共88页。例例6.8 6.8 利用递归算法利用递归算法(sun f)(sun f)求求FibonacciFibonacci数列数列 0 (n=0)f(n)= 1 (n=1) f(n-1)+f(n-2) (n1)long f(int n) long c; if(n=0) c=0; else if(n=1) c=1; else c=f(n-1)+f(n-2); return(c);第33页/共87页第三十三页,共88页。课堂(ktng)训练自定义两个函数实现:(1)判断一个整数是否
12、为完数;(2)在屏幕上显示完数的因子。 要求:在main函数中输入(shr)整数,并调用上述两个函数进行测试。第34页/共87页第三十四页,共88页。6.4 函数(hnsh)中使用的变量6.4.1 局部变量与全局变量6.4.2 变量的存储方式(fngsh)6.4.3 变量的存储类别第35页/共87页第三十五页,共88页。6.4.1 局部变量与全局变量1、局部变量2、全局变量第36页/共87页第三十六页,共88页。1、局部变量 在一个函数内部定义的变量是内部变量,也称局部变量。 局部变量只在定义它的函数范围内有效(即可以(ky)使用),在其他函数不能使用。第37页/共87页第三十七页,共88页。
13、局部变量举例(j l)float f1(int a) int b,c; . char f2(int x,int y)int i,j;.main() int a,b; . int c; c=a+b;第38页/共87页第三十八页,共88页。2、全局变量 程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量;而在函数外定义的变量是外部变量,也称全局变量。 全局变量的有效范围(fnwi):从定义变量的位置开始到本源文件结束。第39页/共87页第三十九页,共88页。全局变量举例(j l)int p=1,q=5;float f1(a)int b,c;.char a,
14、b;char f2(int x,int y)int i,j;.main() int a,b; . char c; c=a+b; .第40页/共87页第四十页,共88页。例6.9 全局变量aint a=10;fun(int i) a+=2*i; return a;main() int a=10; printf(n%d,%d,fun(a),a); printf(n%d,%d,fun(a),a); 运行(ynxng)结果:20,1040,10第41页/共87页第四十一页,共88页。例例6.10 6.10 有一个有一个(y )(y )数组存放数组存放1010个学个学生的成绩,编一个生的成绩,编一个(y
15、 )(y )函数求出函数求出1010个学生的平均成绩、最高分和最低分。个学生的平均成绩、最高分和最低分。float max=0,min=0;float averagescore(float a,int n) int i; float sum=a0; max=min=a0; for(i=1;imax) max=ai; else if(aimin) min=ai; sum=sum+ai; return(sum/n);地址传递第42页/共87页第四十二页,共88页。全局变量应慎用 全局变量在程序执行过程(guchng)中一直占用内存。 降低了函数的通用性。 使用全局变量过多,会降低程序的可读性。 建
16、议不在必要时不要使用全局变量。第43页/共87页第四十三页,共88页。6.4.2 变量的存储(cn ch)方式静态存储区动态存储区第44页/共87页第四十四页,共88页。静态存储(cn ch)方式 静态存储方式是指在程序运行期间分配固定(gdng)的存储空间的方式。 全局变量和静态(static)变量全部存放在静态存储区。 静态存储方式在程序执行过程中一直占据固定(gdng)的存储单元,直到程序执行完毕才释放。第45页/共87页第四十五页,共88页。动态(dngti)存储方式 动态存储方式:是在程序运行期间根据需要进行动态分配存储空间的方式。 在动态存储区存放如下数据:形参、非静态变量、堆栈(
17、函数调用时的现场保护(boh)和返回地址)。 动态存储方式根据函数调用的需要,动态地分配和释放存储空间。第46页/共87页第四十六页,共88页。6.4.3 变量(binling)的存储类别 在C语言中,每一个变量和函数(hnsh)有两个属性:数据类型和存储类别。 存储类别分四类存储类别 含义auto自动,动态存储方式,可以省略static静态,静态存储方式register寄存器,CPU的寄存器extern外部,声明外部变量第47页/共87页第四十七页,共88页。auto变量(binling)auto int b,c=3;int b,c=3;第48页/共87页第四十八页,共88页。staticf
18、(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;i3;i+) printf(%d ,f(a); 第49页/共87页第四十九页,共88页。举例 打印(d yn)15的阶乘值int fac(int n) static int f=1; f=f*n; return(f);main() int i; for(i=1;iy?x:y);*eg0614b.cextern a;main() int x=2,y=3,z; z=x*a+a*y*max(x,y); printf(nz
19、=%d,z);第56页/共87页第五十六页,共88页。6.5 内部(nib)函数与外部函数1、内部函数(hnsh)2、外部函数(hnsh)第57页/共87页第五十七页,共88页。1、内部(nib)函数 如果一个函数只能被本文件中的其他函数调用,而不能被其他文件中的函数调用, 这种函数称为内部(nib)函数(或称静态函数)。定义内部(nib)函数的一般形式是(函数头):static 类型(lixng)说明符 函数名(形参表)第58页/共87页第五十八页,共88页。2、外部(wib)函数 若一个函数除了可以被本文件中的其他函数调用外,还可以被程序中的其他源文件的函数调用,这样的函数称为(chn w
20、i)外部函数。它的定义一般形式:extern 类型(lixng)说明符 函数名(形参表)注意:extern可以省略第59页/共87页第五十九页,共88页。例6.15 内部(nib)函数与外部函数*eg0615a.cextern int a;extern int max(int m,int n);static int z=12;static int min(int x,int y) return(x=n)return(m); else return(n); 第60页/共87页第六十页,共88页。6.6 多文件(wnjin)的程序运行1、工程(gngchng)方法2、文件包含方法第61页/共87页
21、第六十一页,共88页。1、工程(gngchng)方法 第62页/共87页第六十二页,共88页。2、文件(wnjin)包含方法 在eg0615.c的开始添加一行: #include 在文件包含方式中,由于最终生成一个目标文件。所以关于变量(binling)、函数的声明都不必要了。第63页/共87页第六十三页,共88页。6.7 预处理命令(mng lng) 在前面章节已经使用(shyng)了如下形式: #define PI 3.14 #include第64页/共87页第六十四页,共88页。预处理命令(mng lng) ANSI C 标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境
22、,提高编程效率。 预处理命令不是C语言本身的组成部分(z chn b fn),必须在正式编译前进行处理。 C提供的预处理功能主要有一下3种:第65页/共87页第六十五页,共88页。6.7.1 宏定义(dngy)1、不带参数(cnsh)的宏定义2、带参数(cnsh)的宏定义第66页/共87页第六十六页,共88页。1、不带参数(cnsh)的宏定义 一般形式 #define 标识符 字符串 不带参数的宏常用来表示符号(fho)常量 举例 #define PI 3.1415926第67页/共87页第六十七页,共88页。宏定义(dngy)的作用 宏定义是用宏名代替一个字符串,即只作简单的置换(zhhun
23、),不作正确性检查。也不分配存储空间。 举例 #define PI 3.14; area=PI*r*r; 展开后如下: area=3.14;*r*r; /*error*/第68页/共87页第六十八页,共88页。宏定义(dngy)的作用域 宏名的有效范围为定义命令之后到本源文件结束。 可以(ky)用#undef命令终止宏定义的作用域。第69页/共87页第六十九页,共88页。宏的作用域举例(j l)#define G 9.8main() .#undef Gf1() .G的作用(zuyng)范围第70页/共87页第七十页,共88页。宏的层层(cn cn)置换#define R 3.0#define
24、PI 3.14#define L 2*PI*R#define S PI*R*Rmain() printf(nL=%fnS=%f,L,S);注意:双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。第71页/共87页第七十一页,共88页。9.1.2 带参数(cnsh)的宏定义 一般(ybn)形式 #define 宏名(参数表) 字符串第72页/共87页第七十二页,共88页。带参数(cnsh)宏举例(例6.17)#define PI 3.14#define S(r) PI*r*rmain() float a,area; a=3.6; area=S(a); printf(nr=%f area
25、=%f,a,area);第73页/共87页第七十三页,共88页。带参数(cnsh)宏与函数 形式相同,容易混淆(hnxio) 不同之处主要有: (1)函数调用需要参数检查;宏只作简单置换。 (2)函数调用在程序运行时处理,分配内存单元;宏展开在正式编译前进行,不分配存储单元,无返回值概念。 (3)函数调用占运行时间,源程序保持不变;宏展开只占编译时间,展开后源程序变长。第74页/共87页第七十四页,共88页。举例(j l):可以得到多个结果的宏#define PI 3.14#define CIRCLE(R,L,S) L=2*PI*R; S=PI*R*R;main() float r,l,s;
26、printf(nr=); scanf(%f,&r); CIRCLE(r,l,s); printf(r=%f,l=%f,s=%f,r,l,s); 同时得到了l,s的结果第75页/共87页第七十五页,共88页。6.7.2 “文件(wnjin)包含”处理 “文件包含”处理是指一个源文件可以将另外一个源文件的全部(qunb)包含进来。 一般形式 #include文件名或 #include第76页/共87页第七十六页,共88页。两种包含形式(xngsh)比较 #include:系统到存放C库函数文件所在(suzi)的目录中寻找要包含的文件,这种称为标准方式。 #includefile2.c:系统
27、先在用户当前目录中寻找要包含的文件,如果找不到,再按标准方式查找。第77页/共87页第七十七页,共88页。“文件包含(bohn)”的含义第78页/共87页第七十八页,共88页。“文件包含(bohn)”的实质 被包含的文件与其所在的文件,在预编译后已经(y jing)成为同一个文件(而不是两个文件)。 被包含的文件的外部变量作用域扩展到了包含文件,所以不必用extern声明。第79页/共87页第七十九页,共88页。6.7.3 条件(tiojin)编译 一般情况下,源程序中所有的行都参加编译(biny)。但如果对其中一部分内容只在满足一定条件才进行编译(biny),这就是“条件编译(biny)”。第80页/共87页第八十页,共88页。条件(tiojin)编译形式1) #ifdef 标识符 程序段1 #else 程序段2 #endif2)#ifdef 标识符 程序段1 #endif 3)#ifndef 标识符 程序段1 #else 程序段2 #endif4)#if 表达式 程序段1 #else 程序段2 #endif第81页/共87页第八十一页,共88
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年工业机器人维护与保养试题及答案
- 2026年新入职医务人员三基岗前培训计划
- 2026年事业单位绩效考核知识考试试题及答案
- 2026年乡镇特色产业培育考试题附答案
- 2026年事业单位工勤岗位污水处理工高级工考试试题及答案
- 超声科甲状腺细针穿刺活检知情同意书
- 四年级下册数学 1.9 歌手大赛
- 青海省农牧民高标准住房建设图集河湟地区(施工图篇)
- 事业编水利岗 面试专项练习试卷
- 卫生系统健康宣教-标准模板
- 彩钢瓦屋面施工应急方案
- 数独8宫格游戏(初级难度)题目100道
- 舞台灯光音箱施工方案
- 鹅圆环病毒感染
- GJB2489A2023航空机载设备履历本及产品合格证编制要求
- 2025年内蒙古自治区中考物理试卷真题(含答案)
- 2025年上海松江国有资产投资经营管理有限公司招聘笔试参考题库含答案解析
- 2025年上海市各区高三二模语文试题汇编《现代文二》含答案
- 礼品礼金管理制度
- 2024省技能大赛植物嫁接赛项备考试题库(含答案)
- 公安民警矛盾纠纷调解培训
评论
0/150
提交评论