《C程序设计谭浩强著精品课件函数》由会员分享,可在线阅读,更多相关《C程序设计谭浩强著精品课件函数(26页珍藏版)》请在金锄头文库上搜索。
1、 C 程序设计第八章 函数第八章 函数8.1 概述 8.2 函数定义的一般形式 8.3 函数参数和函数返回值1C 程序设计第八章 函数void main() :x=x*x*x;y=y*y*y;z=z*z*z;ans1=x+y+z;a=a*a*a;b=b*b*b;c=c*c*c;ans2=a+b+c;: 为什么使用函数?重复多次的同一 计算类型void main() :ans1=cube(x,y,z);ans2=cube(a,b,c);: int cube(int a,b,c) int ans;ans=(a*a*a)+(b*b*b)+(c*c*c);return ans; 函数主程序ans函数可
2、以把相对独立的某个功能抽象 出来,使之成为程序中的一个独立实 体。可以在同一个程序或其他程序中 多次重复使用。 2C 程序设计第八章 函数函数机制的优点:n使程序变得更简短而清晰 n有利于程序维护n可以提高程序开发的效率 n提高了代码的重用性 3C 程序设计第八章 函数【例】先举一个函数调用的简单例子#include void main() void printstar(); /*对printstar函数声明*/void print_message(); /*对print_message函数声明*/printstar(); /*调用printstar函数*/print_message(); /
3、*调用print_message函数*/printstar(); /*调用printstar函数*/4C 程序设计第八章 函数void printstar() /*定义printstar函数*/ printf(“* * * * * * * * * * * * * * * *n“); void print_message() /*定义print_message函数*/ printf(“How do you do!n“); 运行情况如下: * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * *5C
4、 程序设计第八章 函数8.1 概述C程序是模块结构的,每个模块也称为函数。一个C程序可由一个main函数和若干个用户自定义 函数构成,这些函数是通过调用来建立联系的。在这些函数中还可以调用系统提供的各类标准库函 数。本章主要介绍用户自定义函数的定义、调用以及函 数间信息的传递。6C 程序设计第八章 函数1. C程序各函数之间的关系1) 不管主函数的书写位置如何,C程序总是从主函数开始运行、并在主函数结束;2) 主函数可调用所有自定义函数,但不能被任何函数调用;3) 一个自定义函数除了可被主函数调用外,还可被其它自定义函数调用;4) 自定义函数可调用除主函数之外的其它自定义函数,甚至可直接或间接
5、地自己调用自己。7C 程序设计第八章 函数main自定义f1自定义f2自定义fn函数调用关系图示:库函数8C 程序设计第八章 函数2. 函数调用的执行流程嵌套调用:mainabac开始结束调用返回9C 程序设计第八章 函数3. C函数的分类从用户使用的角度分类:库函数: 由语言系统提供 ; 用户无须定义,也 不必在程序中作类型 说明; 只需在程序前包含 有该函数定义的头文 件;用户自定义函数: 用户在程序中根据 需要而编写的函数;10C 程序设计第八章 函数从函数的形式分类:无参函数调用时不需要任何参数;有参函数调用时必须给出实参,函数依据实参进行相应处理。11C 程序设计第八章 函数8.2
6、函数定义的一般形式1. 有参函数定义的一般形式类型标识符 函数名(形式参数表) 函数头 局部声明 函数体执行语句 特点:调用时必须给出实参,函数将依据实参实现特定操作。 其中 类型标识符:说明函数返回值的类型,省略为int型;函数名:遵循标识符命名规则,名称尽量反映功能;12C 程序设计第八章 函数形式参数:从形式上说明该函数调用时所需的参数 个数及类型,多个形参间逗号分隔;局部说明部分:对自定义函数局部使用的变量、数 组等进行类型定义;执行语句:实现函数功能;其中的返回语句return将 控制程序流程返回主调函数;13C 程序设计第八章 函数【例】用自定义函数找出两数中的较大数void ma
7、in( ) int a, b;scanf(“%d,%d“, printf(“MAX=%dn“, max(a, b); int max(int x, int y) /*int可省略,定义形参变量*/ int z; /*局部变量定义*/z=xy? x:y;return(z); /*将z的值作为返回值*/ 14C 程序设计第八章 函数2. 无参函数定义的一般形式类型标识符 函数名( ) 局部声明执行语句 特点:不依据任何参数来实现特定操作; 注意:尽管没有参数但圆括号不能省去。例:定义实现延时功能的无参函数 void delay( ) /*无参、无返回值*/ long i;for( i=0; iy?
8、 x:y;return(z); /*z值作为返回值*/18C 程序设计第八章 函数851. 形式参数和实际参数说明 1) 编译时并不为形参分配存储单元,在程序运行中发生函数调用时,才动态地为形参分配存储单元,并接受实参传递的值;函数调用结束,形参占 用的存储单元将被释放; 如例中第一次调用: 实参:a bd=max(a, b); 形参:x y第二次调用: 实参:d cd=max(d, c); 形参:x y 8581281219C 程序设计第八章 函数58508 02) 由于实参和形参各有各的存储单元,因此在被调 函数中给形参变量赋值,不会对实参造成任何影 响。如例中主调函数:d=max(a,
9、b); 实参:a b被调函数: 形参:x yint max(int x,int y) int z;z=xy? x: y;x=y=0; return(z); 20C 程序设计第八章 函数3) 实参、形参的形式实参形式 传递内容 形参形式常量 变量、下标变量表达式函数调用数组名 同类型数组例:d=max( i%100, 10); /*实参:表达式、常量*/ d=max(n1, n2); /*实参:下标变量*/d=max(int)sqrt(25), c); 实参的值 单向传递数组地址 单向传递同类型变量21C 程序设计第八章 函数4) 由于实参和形参各有各的存储单元,因而实参和形参可以同名,且互不干
10、扰;5) 实参与形参在个数、类型、顺序上要对应一致;否则因编译系统不做匹配性检查,将造成数据传 递错误。如: d=max(7.8, 10.2); /*实、形参类型不一致*/ d=max(a, b, c); /*实、形参个数不一致*/6 在实、形参类型不一致时将按赋值规则自动转换 为同一类型。而实、形参个数不一致时,编译检 测出错误。d=max(7, 10);22C 程序设计第八章 函数2. 函数的返回值若仅返回一个值:可用return返回语句实现;若需返回多个值:则需要使用其它手段实现;如:指针、全局变量返回语句的一般形式:return(表达式);功能:在自定义函数中使用该语句,可使程序的执行
11、流程返回到主调函数的调用位置,并将表达式的值作为返回值。表达式形式:任何合法的C表达式;23C 程序设计第八章 函数使用说明: 1) 一个自定义函数中可以有一个以上的return语句;这常用于分支结构的不同出口,但只可能有一个 被执行。如上例:if (xy) return(x);else return(y);如:函数功能判断形参m、n的大小关系;若mn返回1、m0? 1:-1); /*只执行该条*/return(!(m-n)=0); /*永远不可能执行*/24C 程序设计第八章 函数2) 若函数不需要用return语句返回值,其类型应采用void空类型标识符;此时返回语句的形式为:return; 或者干脆省去返回语句; 函数体结束标志也可控制流程返回。如:void printstar( ) printf(“*n“); return; /*或省略*/该函数仅仅完成输出一行星号字符的特定操作, 不需要参数,也不需要返回值。25C 程序设计第八章 函数3) return后表达式值的类型一般应与定义函数的类型一致;若不一致,则以定义函数时的类型为准自动转换。 如:int average( ) float sum; return(sum/4.0); /*sum/4.0值为实型,自动转为int型返回*/26