
第7章用函数实现模块化程序设计
7 用函数实现模块化程序设计 第 章

为什么要用函数功能1函数()int main()·使用函数可使程序清晰、精炼、简单、灵活。T:功能1内容函数就是功能。每一个函数用来实现一个特定功能1内容11的功能。函数名应反映其代表的功能。功能2函数()f1在设计较大程序时,往往把它分为若干个程序功能2内容1功能2内容1模块,每一个模块包括一个或多个函数,每个VS.int main()函数实现一个特定的功能。功能1内容11调用功能1一个C程序可由一个主函数和若于个其他函数调用功能2f调用功能1构成。由主函数调用其他函数,其他函数也可功能2内容调用功能21以互相调用
为什么要用函数 int main() { { ⋮ 功能1内容 } { ⋮ 功能2内容 } { ⋮ 功能1内容 } { ⋮ 功能2内容 } } 功能1函数() { ⋮ 功能1内容 } 功能2函数() { ⋮ 功能2内容 } int main() { 调用功能1 调用功能2 调用功能1 调用功能2 } VS. • 使用函数可使程序清晰、精炼、简单、灵活。 • 函数就是功能。每一个函数用来实现一个特定 的功能。函数名应反映其代表的功能。 • 在设计较大程序时,往往把它分为若干个程序 模块,每一个模块包括一个或多个函数,每个 函数实现一个特定的功能。 • 一个C程序可由一个主函数和若干个其他函数 构成。由主函数调用其他函数,其他函数也可 以互相调用

为什么要用函数CWINDOWS)system32/cmd.exe口【例7.1】想输出以下的结果,用函数调用实现XDwdoyoudo!#include*kk*****请按任意键继续int mainO//声明printstar函数void print_starO:printstar和pnint_message都是用户定义的函数名,分别用voidprint_message()://声明print_message函数来输出一排号和一行文字信息。在定义这两个函数时//调用print_star函数print_starO):print_message0://print_message函数指定函数的类型为void,意为函数无类型,即无函数值,也1//调用printstar函数就是说,执行这两个函数后不会把任何值带回main函数print_starO:returnO:在程序中,定义printstar函数和print message函数的位置是在main函数的后面,在这种情况下,应当在main函数之前或main函数中的开头部分,对以上两个函数进行声//定义print_star函数voidprintstaro)明。函数声明的作用是把有关函数的信息(函数名、函数***)n")//输出一行*号1printf("*1类型、函数参数的个数与类型)通知编译系统,以便在编译系统对程序进行编译时,在进行到main函数调用print_staro和printmessage(时知道它们是函数而不是变量或其他对voidprint_message()//定义print_message函数printf("Howdoyoudo!\n")://输出一行文字信息象。此外,还对调用函数的正确性进行检查(如类型、函数名、参数个数、参数类型等是否正确)
为什么要用函数 【例7.1】想输出以下的结果,用函数调用实现。 #include int main() { void print_star(); //声明print_star函数 void print_message(); //声明print_message函数 print_star(); //调用print_star函数 print_message(); //print_message函数 print_star(); //调用print_star函数 return 0; } void print_star() //定义print_star函数 { printf("******************\n");//输出一行*号 } void print_message() //定义print_message函数 { printf("How do you do!\n"); //输出一行文字信息 } print_star和print_message都是用户定义的函数名,分别用 来输出一排“*”号和一行文字信息。在定义这两个函数时 指定函数的类型为void,意为函数无类型,即无函数值,也 就是说,执行这两个函数后不会把任何值带回main函数。 在程序中,定义print_star函数和print_message函数的位置 是在main函数的后面,在这种情况下,应当在main函数之 前或main函数中的开头部分,对以上两个函数进行“声 明”。函数声明的作用是把有关函数的信息(函数名、函数 类型、函数参数的个数与类型)通知编译系统,以便在编译 系统对程序进行编译时,在进行到main函数调用print_star() 和 print_message()时知道它们是函数而不是变量或其他对 象。此外,还对调用函数的正确性进行检查(如类型、函数 名、参数个数、参数类型等是否正确)

为什么要用函数(1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。较大的程序,可分别放在若干个源文件中。这样便于分别编写和编译,提高调试效率。一个源程序文件可以为多个C程序共用。(2)一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。(3)C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。(4)所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是被操作系统调用的。(5)从用户使用的角度看,函数有两种。①库函数,它是由系统提供的,用户不必自己定义,可直接使用它们。应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。2用户自已定义的函数。它是用以解决用户专门需要的函数。(6)从函数的形式看,函数分两类。1)无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。②有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据
为什么要用函数 (1) 一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。较大的程序,可分别放在若干个源文件中。 这样便于分别编写和编译,提高调试效率。一个源程序文件可以为多个C程序共用。 (2) 一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义等)组成。一个源程序文件是一个编译 单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。 (3) C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结 束整个程序的运行。 (4) 所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌 套定义。函数间可以互相调用,但不能调用main函数。main函数是被操作系统调用的。 (5) 从用户使用的角度看,函数有两种。 ① 库函数,它是由系统提供的,用户不必自己定义,可直接使用它们。应该说明,不同的C语言编译系统提供的库函数的数 量和功能会有一些不同,当然许多基本的函数是共同的。 ② 用户自己定义的函数。它是用以解决用户专门需要的函数。 (6) 从函数的形式看,函数分两类。 ① 无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。 ② 有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据

定义函数
定义函数

为什么定义函数C语言要求,在程序中用到的所有函数,必须先定义,后使用”。定义函数应包括以下几个内容(1)指定函数的名字,以便以后按名调用。(2)指定函数的类型,即函数返回值的类型。(3)指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。(4)指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。这是最重要的,是在函数体中解决的
为什么定义函数 定义函数应包括以下几个内容: (1) 指定函数的名字,以便以后按名调用。 (2) 指定函数的类型,即函数返回值的类型。 (3) 指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。 (4) 指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。这是最重要的,是在函数体中 解决的。 C语言要求,在程序中用到的所有函数,必须 “先定义,后使用

定义函数的方法定义有参函数定义无参函数类型名函数名(形式参数表列)类型名函数名0类型名函数名(void)L+y或函数体函数体函数体intmax(intxinty)函数名后面括号内的void表示空”即函数没有int z.1/声明部分1/执行语句部分z=x>y?xy:参数。retum(z):函数体包括声明部分和语句部分。定义空函数类型名函数名()在定义函数时要用类型标识符"(即类型名)指定0函数值的类型,即指定函数带回来的值的类型。函数体为空,什么也不做
定义函数的方法 类型名 函数名() { 函数体 } 函数名后面括号内的void表示 “空 ”,即函数没有 参数。 函数体包括声明部分和语句部分。 在定义函数时要用 “类型标识符 ”(即类型名)指定 函数值的类型,即指定函数带回来的值的类型。 定义无参函数 类型名 函数名(void) { 函数体 } 或 类型名 函数名(形式参数表列) { 函数体 } 定义有参函数 int max(int x,int y) { int z; //声明部分 z=x>y?x:y; //执行语句部分 return(z); } 类型名 函数名() { } 定义空函数 函数体为空,什么也不做

调用函数
调用函数

函数调用的形式//调用无参函数print_star():函数名(实参表列)//调用有参函数c=max(a,b):1.函数调用语句把函数调用单独作为一个语句。如printf_star(O)这时不要求函数带回值,只要求函数完成一定的操作。2.函数表达式函数调用出现在另一个表达式中,如c=max(a,b):这时要求函数带回一个确定的值以参加表达式的运算。3.函数参数函数调用作为另一个函数调用时的实参。如m=max(a,max(b.c):,又如:printf("%d",max(a,b)
函数调用的形式 函数名(实参表列) print_star(); //调用无参函数 c=max(a,b); //调用有参函数 1. 函数调用语句 把函数调用单独作为一个语句。如printf_star(); 这时不要求函数带回值,只要求函数完成一定的操作。 2. 函数表达式 函数调用出现在另一个表达式中,如c=max(a,b); 这时要求函数带回一个确定的值以参加表达式的运算。 3. 函数参数 函数调用作为另一个函数调用时的实参。如m=max(a,max(b,c));,又如:printf (″%d″, max (a,b));

形式参数和实际参数在调用有参函数时,主调函数和被调用函数之间有数据传递关系。在定义函数时函数名后面括号中的变量名称为形式参数”(简称形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为实际参数(简称实参”)。实际参数可以是常量、变量或表达式,但要求它们有确定的值。实参与形参的类型应相同或赋值兼容。赋值兼容是指实参与形参类型不同时能按不同类型数值的赋值规则进行转换
形式参数和实际参数 在调用有参函数时,主调函数和被调用函数之间有数据传递关系。 在定义函数时函数名后面括号中的变量名称为 “形式参数 ”(简称 “形 参 ”) 或“虚拟参数”。 在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数” (简称“实参”)。 实际参数可以是常量、变量或表达式,但要求它们有 确定的值。 实参与形参的类型应相同或赋值兼容。赋值兼容是指实参与形参类型不同时 能按不同类型数值的赋值规则进行转换