1第九讲函数2本节学习目标•函数简介•函数使用•按值传递与按地址传递•全局变量与局部变量•存储类型3一个简单模型经理部财务部供应部……人事部一家公司•经理部•是公司内的一个部门•可以指挥其它各部门•各部门•关系平等,可以互相请求对方帮助•可以向经理部反馈信息,但不能指挥经理部4一件事情经理部需要一台电脑经理部财务部供应部1.经理部发出命令2.供应部向财务部申请支票3.财务部向财务部提供支票4.供应部购买电脑5.供应部将电脑提供给经理部获得电脑获得支票5提出问题•编写一段代码显示以下图形•********************•*大家好*•********************•*大家好*•********************6范例•方法一:–#includestdio.h–voidmain()–{–printf(*************\n);–printf(大家好*\n);–printf(*************\n);–printf(大家好*\n);–printf(*************\n);•}•方法二–#includestdio.h–voidstar()–{–printf(*************\n);–}–voidword()–{–printf(*大家好\n);–}•voidmain()•{•star();word();star();•}7什么是函数•独立的程序段•执行一个具体的、明确定义的任务•易于编写、理解、调试和维护•将需要多次执行的一组指令定义为函数8函数功能•有效的维护代码•容易的理解代码•消除代码的冗余•使代码可以重用9函数之间的关系mainabcde10函数使用说明•C语言源程序是由一个或多个函数组成。•一个C程序只有一个main函数,程序运行从main函数开始,到main函数结束。•Main函数以外的函数,都是相互独立,可以互相调用,但子函数不可调用main函数。11函数的分类(用户角度)•标准函数•—也叫库函数,由系统提供的,不需用户去定义使用的函数。•如printf、strcmp等•自定义函数•—用以解决用户专门的问题。12举例•#includestdio.h•#includemath.h•voidmain()•{•inta;•intb=5;•a=pow(b,2);•printf(%d\n,a);••}•#includestdio.h•pow(intb)•{•inta;•a=b*b;•return(a);•}•voidmain()•{•intx;•x=pow(5);•printf(%d\n,x);•}13函数分类(函数的形式)•无参函数–—主函数并未向被调用函数传送数据。•有参函数–—主调用函数与调用子函数之间有数据的传递。14函数参数•形式参数–在定义函数时,函数名后面括号中的变量名,即是形参。•实际参数–在主函数调用一个函数时,函数名后括号中的参数。主要区别:系统是否为其分配内存单元15函数参数说明:•1.在自定义函数中指定的形参变量,在未出现函数调用时,它们并不占用内存中的存储单元。只有在发生函数调用时形参才被分配内存单元。在调用结束后,所占用的存储单元被释放。•2.实参可以是常量,变量或表达式:如:add(3,a+b);•3.形参必须指定参数类型。•4.实参与形参类型要一致.•5.实参与形参的数据传递是“值传递”。16形参与实参范例•#includestdio.h•intsum(inta,intb)•{•intc;•c=a+b;•return(c);•}•voidmain()•{•inta,b,c;•printf(输入两个数;);scanf(%d,%d,&a,&b);•c=sum(a,b);•printf(%d\n,c);•}17函数使用的一般过程•主函数开始•函数声明与定义•主函数调用•子函数执行•将执行结果返回主函数•主函数结束18函数声明•有参函数声明格式函数类型函数名(参数列表);注:当被调用函数的函数定义出现在调用函数之前时可以省去对被调用函数的说明19函数声明•无参函数声明格式函数类型函数名();注:当被调用函数的函数定义出现在调用函数之前时可以省去对被调用函数的说明20函数的定义•无参函数的定义格式数据类型函数名(){声明部分;执行部分;}21有参函数的格式数据类型函数名(参数列表){声明部分;执行部分;}22函数调用的方式•1、函数语句•例:sum(2,5);•2、函数表达式•例:c=2*sum(2,5);•函数参数•例:c=sum(5,sum(2,5))23函数调用•有参函数调用的一般格式–函数名(参数列表)24函数的返回值•什么是返回值?–—即希望通过函数调用使主调函数能从被调函数得到一个值。25函数值注意事项•主要功能:将控制权从被调用函数再交给主调函数。•函数返回值是通过函数中的return语句获得的。•return的格式–return(参数)–参数:–可以是变量,常量,表达式。–参数类型必须与函数的返回类型一致。26Return范例•#includestdio.h•intsum(inta,intb)•{•intc;•c=a+b;•return(c);•}•voidmain()•{•inta,b,c;•printf(输入两个数;);scanf(%d,%d,&a,&b);•c=sum(a,b);•printf(%d\n,c);•}27返回值类型•floatmax(inta,intb)–/*返回的函数值为整型*/•doublemin(inta,intb)–/*返回的函数值为双精度型*/•charleter(chara,charb);–/*返回的函数值为字符型*/28返回值类型范例•#includestdio.h•floatadd(inta,intb);•voidmain()•{•inta,b;•printf(输入两个整数:);•scanf(%d%d,&a,&b);•printf(%f,add(a,b));•}•floatadd(inta,intb)•{•floatc;•c=a+b;•return(c);•}29返回值注意事项•注意:–调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空)类型”。30函数调用范例•#includestdio.h•intsum(inta,intb)•{•intc;•c=a+b;•return(c);•}•voidmain()•{•inta,b,c;•printf(输入两个数;);scanf(%d,%d,&a,&b);•c=sum(a,b);•printf(%d\n,c);•}函数定义部分函数调用部分31课堂练习•1.编写一个函数min,它返回2个参数的最小值。•2.编写一个c程序,它接收一个三角形的三个边,并且检查三角型是等边三角形。•3.接收一个值,并使用函数显示该值的平方。•4.编写一个c函数,它从用户接收信息并且按用户请求多次显示信息。32函数调用(续)•按值传递(如以上例题,皆是按值传递)•按地址传递–当主函数中的值需要变化时,可以使用按地址传递。33按地址传递•#includestdio.h•intsum(int*p,int*q)•{•intsum;•sum=*p+*q;•return(sum);•}•voidmain()•{•inta,b;•printf(输入两个数:);•scanf(%d,%d,&a,&b);•printf(sum=%d\n,sum(&a,&b));•}34嵌套函数调用•#includestdio.h•intsum(inta,intb);//声明计算和的函数•intpow(intx);//声明计算平方的函数•voidmain()•{•inta,b,c;•printf(输入a和b的值:);•scanf(%d%d,&a,&b);•c=sum(a,b);•printf(c=%d\n,c);•}•//计算和的函数•intsum(inta,intb)•{•intc;•c=pow(a)+pow(b);•returnc;•}•//计算平方的函数•intpow(intx)•{•inty;•y=x*x;•returny;•}35变量:全局变量,局部变量•局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。全局、局部变量决定变量的作用域36全局变量•全局变量:在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量。全局变量可以为本文件中其它函数所共用。它的有效范围为:从定义变量的位置开始到本原文件结束。37存储类型•功能–变量的存储类型决定了变量的存放位置。–存储类型决定了变量的生命周期与可见性。38存储类型•自动变量(auto)•全局变量(extern)•静态变量(static)•寄存器变量(register)39课后作业•用函数,判断一个整数的奇偶性。•输入三个数,用函数从大到小排序。