第八章:模块化程序设计 重点与要求: 重点掌握函数的定义 声明及传值与调用。熟悉函数 的嵌套与递归调用 掌握变量的作用域与存储类别
1 第八章:模块化程序设计 重点与要求: 重点掌握函数的定义、 声明及传值与调用。熟悉函数 的嵌套与递归调用。 掌握变量的作用域与存储类别
函数 、函数 C语言中,程序是由函数来实现的。函数可分为(1): 标准库函数(2)用户自定义函数。 在C语言中,至少要有一个main()函数,程序的执行是 从main()函数开始的。函数的调用过程如图 lf11 main() ri1(; 21 n2() n2(); (); 31( n22(); 2
2 函数 一、函数 C语言中,程序是由函数来实现的。函数可分为(1): 标准库函数(2)用户自定义函数。 在C语言中,至少要有一个main ( )函数,程序的执行是 从main( )函数开始的。函数的调用过程如图: f11( ) {…} f21( ) {…} f31( ) {…} f1( ) {… f11( ); …} f2( ) {… f11( ); f22( ); …} main( ) {… f1( ); … f2( ); …}
哟数 其中,每个方框相当于一个模块,而每个函数相当于 个输入输出系统。 In out 例如:要设计一个如下图所示的管理程序 高等院校事务管理 科 财图后人 办公室管理 教务 研 务书勤事 管管管管管管 理理 理理理理
3 函数 其中,每个方框相当于一个模块,而每个函数相当于一 个输入输出系统。 in out 例如:要设计一个如下图所示的管理程序: 高等院校事务管理 办 公 室 管 理 教 务 管 理 科 研 管 理 财 务 管 理 图 书 管 理 后 勤 管 理 人 事 管 理
函数 由此可以得出:模块化程序设计有如下特点: (1)模块相对独立,功能单一,可混合编写也可独立编写 调试。 (2)可集体开发,缩短开发周期 (3)开发出的模块,可在不同的应用程序中多次使用,减 少重复劳动,提高开发效率 (4)测试、更新以模块为单位进行而不会影响其他模块. 函数的定义与声明 、定义:[存储类型][数据类型]函数名(带类型的形参名 表) 内部变量说明; 语句
4 函数 由此可以得出:模块化程序设计有如下特点: (1)模块相对独立,功能单一,可混合编写也可独立编写 调试。 (2)可集体开发,缩短开发周期。 (3)开发出的模块,可在不同的应用程序中多次使用,减 少重复劳动,提高开发效率。 (4)测试、更新以模块为单位进行而不会影响其他模块. 一、函数的定义与声明 1、定义:[存储类型] [数据类型] 函数名(带类型的形参名 表) { 内部变量说明; 语句; }
哟数 例:计算表达式的值 y={ x2-x+1(x<0) x3+x+3 float y(float X {if(x<0) return(X米x-x+ 1) else return(X*+x+3) 注意:当有多个 return语句时,每个 return语句后面 的表达式的类型应相同
5 函数 例:计算表达式的值 x ²-x+1 (x0) float y (float x ) { if (x<0) return (x*x-x+1); else return (x*x*x+x+3); } 注意:当有多个return语句时,每个return语句后面 的表达式的类型应相同。 y={
哟数 如:func(intn) {if(n>10) return(2*x+3) else return }编译时,由于第二个 return语句而给出警告。 说明:1)存储类型(后面讲) 2)数据类型:指函数返回值的类型。若缺省函数 类型,一律按整形处理。 3)函数是平等的兄弟般的关系,它不能嵌套定义 即不能在一个函数体内再定义另一个函数。 4)只有自定义函数而没有main(函数的程序是没 有意义的。(例L4-2)
6 函数 如:func (int n) { if (n>10) return (2*x+3); else return; } 编译时,由于第二个return语句而给出警告。 说明:1)存储类型(后面讲) 2)数据类型:指函数返回值的类型。若缺省函数 类型,一律按整形处理。 3)函数是平等的兄弟般的关系,它不能嵌套定义 即不能在一个函数体内再定义另一个函数。 4)只有自定义函数而没有main()函数的程序是没 有意义的。(例L4—2)
哟数 2、函数的声明 数据类型]函数名(类型标记符[形参],…); 注意后面的“;”不要丢了。它与定义不同,一个函数一般要经过声明 才能使用(就好象变量一样必须先声明才能使用),除非它在调用它 的前面定义。只有当返回的数据类型为int,数据类型才可省略 如:main() double new style(int, double);/*函数声明* Double new style (int a, double x)/函数定义*
7 函数 2、函数的声明 [数据类型] 函数名 (类型标记符 [形参] ,… ); 注意后面的“ ; ”不要丢了。它与定义不同,一个函数一般要经过声明 才能使用(就好象变量一样必须先声明才能使用),除非它在调用它 的前面定义。只有当返回的数据类型为int,数据类型才可省略。 如:main( ) { … double new_style ( int, double ); /*函数声明*/ … } Double new_style (int a, double x) /*函数定义*/ { … }
函数 return语句 return返回值表达式; return后面表达式的类型必须和函数定义时函数名 前的类型保持一致。 三、函数的调用 函数名([实参表]);(如果是有返回值的函数, 则可将调用结果赋值给别的变量,若是无值函数, 则不能赋值,只能单独调用;(例4—1打印若干三 角形) 五、形参、实参、参数的传递 形参:定义函数的参数 实参:调用函数时有具体值的参数
8 函数 二、return 语句 return 返回值表达式; return后面表达式的类型必须和函数定义时函数名 前的类型保持一致。 三、函数的调用 函数名 ([实参表]);(如果是有返回值的函数, 则可将调用结果赋值给别的变量,若是无值函数, 则不能赋值,只能单独调用;(例4—1打印若干三 角形) 五、形参、实参、参数的传递 形参:定义函数的参数。 实参:调用函数时有具体值的参数
函数 关于形参和实参的说明: 1、形参只有当调用时才临时分配存储单元。 2、实参一定要有确定的值,可以是表达式 3、实参和形参的类型应相同或赋值相容。 参数的传递是通过调用来完成的, 分为按值传递和按址传递
9 函数 • 关于形参和实参的说明: 1、形参只有当调用时才临时分配存储单元。 2、实参一定要有确定的值,可以是表达式。 3、实参和形参的类型应相同或赋值相容。 参数的传递是通过调用来完成的, 分为按值传递和按址传递
函数 例L43c maint MaO函数、角 Swap函数 i int a=3, b=5 void swap( int, int ) swap(a, b) printf(“a=%d,b=%dn”,a,b); a 传递值 void swap(int x, int y) 5 int tem temp=X; Xy; y=temp; printf("x%d, y=%d n,x, y) 是按值传递的 temp 按址传递放在指针里面讲
10 函数 例L4_3.c main( ) { int a=3, b=5; void swap( int , int ); swap (a, b); printf(“a=%d, b=%d\n ”, a, b); } void swap (int x, int y) { int temp; temp=x; x=y; y=temp; printf(“x=%d , y=%d \n ”, x, y); } 是按值传递的 按址传递放在指针里面讲。 Main()函数: 调用 Swap函数 传递值 3 5 a b 3 5 x y 3 temp