1、问题:能不能把所有的代码全部写问题:能不能把所有的代码全部写main函函数中?数中?问题:能不能把所有的代码全部写问题:能不能把所有的代码全部写main函函数中?数中?u把所有代码都写在把所有代码都写在main函数中,就会使主函数函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难变得庞杂、头绪不清,阅读和维护变得困难u有时程序中要多次实现某一功能,就需要多次重有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码复编写实现此功能的程序代码,这使程序冗长,这使程序冗长,不精炼不精炼解决的方法:用解决的方法:用模块化程序设计的思路模块化程序设计的思路u事先编好一批实现各种不同
2、功能的函数事先编好一批实现各种不同功能的函数;u把它们保存在函数库中把它们保存在函数库中,需要时需要时直接用;直接用;u采用采用“组装组装”的办法简化程序设计的的办法简化程序设计的过程过程。函数:一个完成特定功能的独立程序模块。函数:一个完成特定功能的独立程序模块。在设计一个较大的程序时,往往把它分为若干个在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能函数实现一个特定的功能。程序可由一个主函数程序可由一个主函数和若干个其他函数构成和若干个其他函数构成,主函数调用其他函数,其主函数调用其他函
3、数,其他函数也可以互相调用他函数也可以互相调用。mainabcfghdeie例例7.1 输出以下的结果,用函数调用实现。输出以下的结果,用函数调用实现。*How do you do!*解题思路:解题思路:u在输出的文字上下分别有一行在输出的文字上下分别有一行“*”号,显然不号,显然不必重复写这段代码,用一个函数必重复写这段代码,用一个函数print_star来来实现输出一行实现输出一行“*”号的功能。号的功能。u再写一个再写一个print_message函数来输出中间一函数来输出中间一行文字信息行文字信息u用主函数分别调用这两个函数用主函数分别调用这两个函数#include int main(
4、)void print_star();void print_message();print_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);输出输出16个个*输出一行文字输出一行文字#include int main()void print_star();void print_message();print_star();print_message();print_star();return 0;voi
5、d print_star()printf(“*n”);void print_message()printf(“How do you do!n”);声明函数声明函数定义函数定义函数#include int main()void print_star();void print_message();print_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);#include int main()void pr
6、int_star();void print_message();print_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);说明说明:(1)(1)一个程序由一个或多一个程序由一个或多个程序模块组成,每一个程序模个程序模块组成,每一个程序模块作为一个源程序文件。块作为一个源程序文件。#include int main()void print_star();void print_message();prin
7、t_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);说明说明:(2)(2)一个源程序文件由一个一个源程序文件由一个或多个函数以及其他有关内容或多个函数以及其他有关内容(如预处理指令、数据声明与定(如预处理指令、数据声明与定义等)组成。义等)组成。#include int main()void print_star();void print_message();print_star();print_mes
8、sage();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);说明说明:(3)(3)程序的执行是从程序的执行是从mainmain函数开始的,如果在函数开始的,如果在mainmain函数中函数中调用其他函数,在调用后流程返调用其他函数,在调用后流程返回到回到mainmain函数,在函数,在mainmain函数中结函数中结束整个程序的运行。束整个程序的运行。#include int main()void print_star();void print_
9、message();print_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);说明说明:(4)(4)所有函数都是平行的,所有函数都是平行的,即在定义函数时是分别进行的,即在定义函数时是分别进行的,是互相独立的。函数间可以互相是互相独立的。函数间可以互相调用,但不能调用调用,但不能调用mainmain函数。函数。mainmain函数是被操作系统调用的。函数是被操作系统调用的。#include int m
10、ain()void print_star();void print_message();print_star();print_message();print_star();return 0;void print_star()printf(“*n”);void print_message()printf(“How do you do!n”);说明说明:(5)(5)从用户使用的角度看,从用户使用的角度看,函数有两种:函数有两种:库函数;库函数;用户自己定义的函数。用户自己定义的函数。7.2.1 为什么要定义函数为什么要定义函数7.2.2 定义函数的方法定义函数的方法7.2.3 函数的返回值函数的返
11、回值C语言要求,在程序中用到的所有函数,语言要求,在程序中用到的所有函数,必须必须“先定义,后使用先定义,后使用”指定指定函数函数名字名字、函数、函数返回值类型返回值类型、函数、函数实现的实现的功能功能以及以及参数的个数与类型参数的个数与类型,将,将这些信息通知编译系统。这些信息通知编译系统。1.定义无参函数定义无参函数定义无参函数的一般形式为定义无参函数的一般形式为:类型名类型名 函数名函数名(void)函数体函数体 类型名类型名 函数名函数名()函数体函数体 指定函数指定函数值的类型值的类型指定函数指定函数值的类型值的类型1.定义无参函数定义无参函数定义无参函数的一般形式为定义无参函数的一
12、般形式为:类型名类型名 函数名函数名(void)函数体函数体 类型名类型名 函数名函数名()函数体函数体 包括声明部分包括声明部分和语句部分和语句部分包括声明部分和包括声明部分和语句部分语句部分2.定义有参函数定义有参函数定义有参函数的一般形式为定义有参函数的一般形式为:类型名类型名 函数名(形式参数表列)函数名(形式参数表列)函数体函数体 3.定义空函数定义空函数定义定义空空函数的一般形式为函数的一般形式为:类型名类型名 函数名(函数名()先用空函数占一个位置,以后先用空函数占一个位置,以后逐步逐步扩充扩充好处:好处:程序结构清楚,可读性好,以后程序结构清楚,可读性好,以后扩充新功能方便,对
13、程序结构影响不大扩充新功能方便,对程序结构影响不大通常,希望通过函数调用使主调函数能得通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值到一个确定的值,这就是函数值(函数的返函数的返回值回值)(1)函数的返回值是通过函数中的函数的返回值是通过函数中的return语语句获得的。句获得的。u一个函数中可以有一个以上的一个函数中可以有一个以上的return语句,语句,执行到哪一个执行到哪一个return语句,哪一个语句,哪一个就就起作用起作用ureturn语句后面的括号可以不要语句后面的括号可以不要通常,希望通过函数调用使主调函数能得通常,希望通过函数调用使主调函数能得到一个确定的值,
14、这就是函数值到一个确定的值,这就是函数值(函数的返函数的返回值回值)(2)函数值的类型。应当在定义函数时指定函数值的类型。应当在定义函数时指定函数值的类型函数值的类型通常,希望通过函数调用使主调函数能得通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值到一个确定的值,这就是函数值(函数的返函数的返回值回值)(3)在定义函数时指定的函数类型一般应该在定义函数时指定的函数类型一般应该和和return语句中的表达式类型一致语句中的表达式类型一致u如果函数值的类型和如果函数值的类型和return语句中表达式的语句中表达式的值不一致,则以函数类型为准值不一致,则以函数类型为准例例7.3将例
15、将例7.2稍作改动,将在稍作改动,将在max函数中定函数中定义的变量义的变量z改为改为float型。函数返回值的类型型。函数返回值的类型与指定的函数类型不同,分析其处理方法。与指定的函数类型不同,分析其处理方法。解题思路:如果函数返回值的类型与指定解题思路:如果函数返回值的类型与指定的函数类型不同,按照赋值规则处理。的函数类型不同,按照赋值规则处理。#include int main()int max(float x,float y);float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(max is%dn,c);return 0;int max(float x,float y)float z;z=xy?x:y;return(z);1.52.62.62变为变为27.17.1、函数的概念、函数的概念 7.27.2、函数的定义及、函数的定义及returnreturn语句语句