
c程序 谭浩强第七章.pptx
55页第7章函 数,,,模块化程序设计方法: 人们在求解某个复杂问题时,通常采用逐步分解、分而治之的方法,也就是将一个大问题分解成若干个比较容易求解的小问题,然后分别求解程序员在设计一个复杂的应用程序时,往往也是把整个程序划分成若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块象达积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法子模块1,子模块2,子模块n,功能模块1,功能模块2,功能模块n,……,……,……,……,软件项目,C语言程序,C语言函数,达积木,7.1 函数概述,1、函数的概念,函数其实就是一段可以重复调用的、功能相对独立完整的程序段C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用,2、函数的分类,从用户角度,标准函数(库函数):由系统提供 用户自定义函数,从函数形式,无参数无返回值 无参数有返回值 有参数无返回值 有参数有返回值,使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件,7.2 函数的定义和调用,1、无参数无返回值的函数,定义格式,void 函数名 (void){ 变量声明部分 执行部分},空类型,表明函数无返回值,不可省!,表明无参数,可缺省!,必须为合法的标识符,函数用途,此类函数用于完成某项固定的处理任务,执行完成后不向调用者返回函数值。
它类似于其它语言的过程函数的原型声明,void 函数名( void ); 或 void 函数名( );,C语言规定,对函数调用之前必须对其原型加以声明,否则会出现编译错!,1、无参数无返回值的函数,函数的调用,函数名( );,注意:不能将这种函数调用赋值给任何变量,因为它没有返回值调用时,( )中间不能有void实例,#include #include void showerror ( ); //声明showerror函数的原型void main ( ){ int a; scanf ("%d", //函数体,没有声明变量},注意:对函数调用之前,必须要先声明或先定义,否则编译错!,编写C程序的一般格式,文件包括(如include 等,用于标准库库函数原型声明)常量定义(根据需要而定,如#define PI 3.1415等)变量定义(根据需要而定)用户自定义函数原型声明main函数用户自定义函数,函数的返回,形式,① rerurn (表达式); //有返回值 ② rerutn 表达式; //有返回值 ③ return; //无返回值,使程序控制从被调用函数返回到调用函数中,如果有返回值,同时把返值带给调用函数。
功能,说明,函数中可以有多个return语句在无返回值的函数中,return语句的形式只能是第③种形式例如:void showyes ( ){ char key; key = getchar ( ); if (toupper(key) != 'Y') return; printf ("YES! ");},函数showyes的功能是: 如果输入的字符不是'Y'或'y',则什么都不输出,直接返回,否则,输出"YES! ",标准库函数,其功能是将小写字符转换成大写字符,2、无参数有返回值的函数,定义格式,返回值类型符 函数名 (void){ 变量声明部分 执行部分},可以为除数组类型外的任何类型,缺省时,默认为int型,表明无参数,可缺省!,必须为合法的标识符,函数用途,此类函数用于完成某项固定的处理任务,执行完成后向调用者返回函数值函数的原型声明,返回值类型符 函数名( void ); 或 返回值类型符 函数名( );,2、无参数有返回值的函数,函数的调用,函数名( void ); 或 变量 = 函数名( );,实例,#include #include #include int sum ( ); void main ( ){ int tot; tot = sum ( ); if (tot == -1) printf ("\nnot select!\n"); else printf ("\nthe result is : %d\n", tot);},int sum ( ) { int i, tot = 0; char key; key = getchar ( ); if (key != '0' },,声明sum函数的原型,,调用sum函数,函数的定义,无参数有返回值,,,变量声明部分,函数sum的功能是: 输入‘0’:计算1~100之间所 有偶数之和 输入‘1’:计算1~100之间所 有奇数之和,2、无参数有返回值的函数,函数的返回,表达式的值即是函数的返回值; 函数体中一般都包含return(表达式)语句, 如果没有, 函数也会返回一个值。
这个值是不可预知的, 将会使程序可能犯有逻辑错; 一般情况下,表达式值的类型应与函数返回值类型一致; 当return(表达式)语句中的表达式的类型与函数的返回值类型不一致时,编译器将对表达式进行强制类型转换, 将表达式的值强制转换成函数返回值类型, 然后返回给调用者格式,rerurn (表达式); 或 rerutn 表达式;,说明,int func ( ){ float f = 5; f = f / 2; return ( f );},函数将返回2,而不是2.5,注意:如果不将函数调用赋值给任何变量,它的返回值将被丢弃!,3、有参数无返回值的函数,定义格式,void 函数名 (类型符1 形参名1, 类型符2 形参名2, … , 类型符n 形参名n ){ 变量声明部分 执行部分},函数用途,此类型的函数主要是根据形参的值来进行某种事务的处理灵活性上要比无形参的函数强,它更能体现调用函数与被调函数之间的数据联系函数的原型声明,void 函数名(类型符1 形参名1, 类型符2 形参名2, … , 类型符n 形参名n ); 或 void 函数名(类型符1 , 类型符2 , … , 类型符n );,至少要有一项,形参之间要用逗号“,”分开,指明形参类型,不允许对形参赋初值,3、有参数无返回值的函数,函数调用,函数名( 实参1,实参2,……,实参n );,实参可以是常量、变量、表达式、函数等,注意事项: (1) 实参列表中的实参必须与函数定义时的形参数量相同、类型相符。
(2) 赋值对应关系: 实参1 -> 形参1 实参2 -> 形参2 …… 实参n -> 形参n (3)实参表求值顺序(即实参赋值给形参的顺序) 因系统而定TC、BC、VC均是自右向左,也就是说最右边的实参最先赋值给最右边的形参, 最左边的实参最后赋值给最左边的形参但VC与TC、BC在具体赋值时稍有不同,注意它们之间的区别3、有参数无返回值的函数,#include void compare (int a, int b); void main ( ){ int i = 2; compare ( i, i++ ); printf ("i = %d\n", i);}void compare ( int a, int b ) { printf ("a = %d b = %d\n", a, b); if ( a > b) printf ("a > b\n"); else if (a == b) printf ("a = b\n"); else printf ("a < b\n");},i为实参,,,a、b为形参,,原型声明,2,3,3,2,2,3,4、有参数有返回值的函数,定义格式,返回值类型符 函数名 (类型符1 形参名1, … … , 类型符n 形参名n ){ 变量声明部分 执行部分},函数用途,此类型的函数主要是根据形参的值来进行某种事务的处理,同时可将处理后的结果值返回给调用函数 。
它最能体现调用函数与被调函数之间的数据联系函数的原型声明,返回值类型符 函数名(类型符1 形参名1, …… , 类型符n 形参名n ); 或 返回值类型符 函数名(类型符1 , 类型符2 , …… , 类型符n );,4、有参数有返回值的函数,函数调用,函数名( 实参1,实参2,……,实参n ); 或变量名 = 函数名( 实参1,实参2,……,实参n );,#include int max (in t a, int b); //函数的原型声明void main ( ){ int a, b, c; scanf ("%d%d", },运行结果:5 9↙the biggest number is 9,5、函数调用和函数说明小结,函数调用,函数语句: 例:printstar ( ); printf (“Hello,World!\n”); 函数表达式: 例: m = max (a, b) * 2; 函数参数: 例: printf (“%d”, max(a,b)); m = max (a, max(b,c));,例: 函数说明举例,void main( ){ float add(float,float); //函数原型声明 float a, b ,c; scanf ("%f,%f", },7.3 函数参数的传递方式,1、值传递方式,根据实参传递给形参值的不同,通常有值传递方式和地址传递方式两种。
方式: 函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: ① 形参与实参占用不同的内存单元 ② 单向传递,例: 交换两个数(值传递方式),#include void swap (int a, int b); void main ( ){ int x = 7, y = 11; printf ("before swapped: "); printf ("x=%d, y=%d\n", x, y); swap (x, y); printf ("after swapped: "); printf ("x=%d, y=%d\n", x, y);}void swap (int a, int b){ int temp; temp = a; a = b; b = temp;},运行结果:before swapped: x = 7, y = 11after swapped: x = 7, y = 11,。












