C语言程序设计 用函数实现模块化程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四. 函数的声明
在程序中调用函数要 满足以下条件:
1.被调函数必须存在, 且遵循先定义,后使 用的原则; 2.如果函数在主调函 数之后定义,则应在 主调函数中或主调函 数之前对被调函数进 行声明。
#include <stdio.h> #include <stdio.h> void main( ) x ) int sum ( int {int sum ( int x ); { int i,t=0; intfor (i=1; i<=x; i++) s; s=sum (100); t+=i; printf("%d\n", s); return (t); } } int main( ) voidsum ( int x ) { int i,t=0; { int s; s=sum (100); i++) for (i=1; i<=x; printf("%d\n", s); t+=i; } return (t);}
18/73
7.4 函数的调用
一. 函数调用的一般形式
函数名(实参表列)
说明:
1.如果调用无参函数,实 参表列部分没有,但括号 不能省略; 2.实参的个数和形参个数 一般相等; 3.实参和形参的类型一一 对应,必要时使用类型转 换; 4.实参变量定义在调用函 数之前完成。
例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); }
说明:这种方式不能 用于void类型。
20/73
7.4 函数的调用
三. 函数调用的执行过程 1.按从右到左的顺序 ,计算实参各表达式 的值; 2.按照位置,将实参 的值一一传给形参; 3.执行被调用函数; 4.当遇到return(表达 式)语句时,计算表达 式的值,并返回主调 函数。
21/73
7.4 函数的调用
14/73
7.3 函数参数和函数的值
一、形式参数和实际参数
例7-3 读程序,写程序结果 #include <stdio.h> int sum(int a,int b) { int c; a=a+b; b=a+b; c=a+b; printf(“sum:%d+%d = %d\n”, a,b,c); return a; } void main() { int a=1,b=3,c ; c=sum(a,b); printf(“main:%d+%d = %d\n”, a,b,c); }
13/73
7.3 函数参数和函数的值
一、形式参数和实际参数
说明: 1.定义函数时,必须说明形参类 型,形参只能是变量和数组; 2.函数被调用前,形参不占内存 ,函数调用结束后,内存也被释 放; 3.实参可以是常量、变量和表达 式; 4.实参和形参的类型必须一致, 字符型和整型可以相互匹配; 5.C语言中实参对形参的数据传 递是“值传递”,即单向传递 ,仅由参数的对应位置决定,与 名字无关。 例7例8- 2 #include <stdio.h> int max(int x,int y) b,int a) { int z; c; c x b a b: y; z = x > y ? x : a; return( z ); c x } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56
都有子程序概念,用子程序实现模块的功能。
主模块
模块1
模块11
模块2
模块21 模块22
4/73
在 C 语ຫໍສະໝຸດ Baidu中是利用函数来实现子程序的作用。
学生成绩 管理系统
成绩 录入
成绩 查询
成绩 统计
成绩单 打印
5/73
采用模块化程序设计的优越性:
控制程序设计的复杂性
提高软件的可靠性
提高软件开发的效率
各函数的信息往来主要是由参数传递和返回语句实现的
12/73
一个C程序由若干个函数组成, 各函数调用时经常要传递一些 数据,调用函数把数据传递给 被调用函数,经被调用函数使 用后,一般会返回一个确定结 果,在返回调用函数时,把这 些结果带回调用函数。
7.3 函数参数和函数的值
一、形式参数和实际参数
函数参数用于函数间数据的传递 形式参数:定义函数时使用的参数 实际参数:调用函数时使用的参数 函数max有两个形式参数x和y 形参x和y只在max函数中使用 a和b是主函数中定义的变量 main函数调用max函数 a和b是max函数的实参 例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56
19/73
7.4 函数的调用
二. 函数调用的方式
1.函数语句 形式为:函数名(实参表列); 例如: printmessage(); printf(“%d”,a); 2.函数表达式
说明:这种方式不要求 函数带返回值,函数仅 完成一定的操作。
函数的值参与运算 例如: m=max(a,b); m=3*max(a,b); printf(“The max is %d”, max(a,b));
16/73
7.3 函数参数和函数的值
2. 函数值的类型
(1)函数的类型也就是函数值 的类型,函数max是int型 的,函数max的值也是int 型的; (2)省略了类型说明的函数是 int型; (3)return语句中的表达式一 般应与函数类型一致。如 果不一致,需要进行类型 转换,只有数值型数据可 以进行自动类型转换,以 函数类型为准。 例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); }
10/73
7.2 函数的定义
二、函数体组成
一般情况下,函数体由
两部分组成: { [局部变量说明] 语句 } 局部变量: 函数体内定义的变量, 其有效范围仅在函数内部, 离开函数体无意义。
11/73
7.3 函数参数和函数的值
例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } 主调函数 被调用函数 void main() ┇ int max(int x,int y) { int a,b,c ; a, b scanf(“%d,%d”,&a,&b); c=max (a,b); { c=max(a,b); ┇ z ┇ printf(“The max is %d”, ); return( z ); } }
1
C 语言程序设计
第七章 用函数实现模块化程序设计
北京航空航天大学 交通科学与工程学院 徐国艳
本章要点
函数的定义、说明与调用 函数之间参数传递规则 函数递归调用和嵌套调用 变量的存储类型与特性
2/73
第七章 用函数实现模块化程序设计
3/73
7.1 概述
一、模块化程序结构
一个较大的应用程序应分为若干个程序模块,每一 个模块用来实现一个特定的功能。所有的高级语言
提高软件的可维护性 提高程序的重用性
6/73
二、C程序的结构
函数
main ( )
F1 ( ) F11 ( ) F21 ( )
F2 ( )
F22 ( )
黑盒子
C程序是函数的集合体, 每个函数是一个独立 的程序模块; 有一个主函数,若干 个子函数; 所有子函数地位平等, 可相互调用、自我调 用; 函数可集中或分散存 放在一个或多个源程 序文件中。
7/73
三、C函数的分类
数学函数 (math.h) 字符和字符串函数 ( ctype.h,string.h) I/O函数 ( stdio.h) 动态存储分配函数(stdlib.h或malloc.h) 详见P384附录F
库函数
用户定义函数
形式
无参函数 有参函数 空函数
8/73
四、C程序的执行顺序
一个源程序文件,由一 个或多个函数以及其他 有关内容组成,是一个 编译单位,函数不是一 个编译单位。 C程序的执行总是从 main函数开始,调用其 它函数后回到main函数, 在main函数中结束整个 程序的运行; 所有的子函数都是平行 的,任何子函数都不属 于其他函数;
例7- 1 #include <stdio.h> void printstar() { printf(“*************\n”); } void printmessage() {printf(“ Hello,world.\n”); printstar(); } void main() { 这两个函数能单独执行吗? printstar(); printmessage(); }
17/73
7.3 函数参数和函数的值
3.不需要返回值的函数
(1)如果函数中没有使用 return语句,函数返回的 是一个不确定的值; (2)如果一个函数不需要返回 值,可以用void做类型说 明; (3)如果一个函数被声明为 void型的,就不允许再引 用他的返回值,只能用函 数语句形式调用;
例7- 1 #include <stdio.h> void printstar() { printf(“***************”); } void printmessage() { printf(“ Hello,world.\n”); printstar(); } void main() { printstar(); printmessage(); }
15/73
7.3 函数参数和函数的值
二、函数的返回值
例7例8- 2 1.返回函数值的方法 #include <stdio.h> (1)函数的返回值也就是函数的 int max(int x,int y) y) int max(int x,int 值,如果一个函数有返回值, { int z; { if(x>y) return y; ; z = x > y ? x :>(x) ? x : y ); 就必须用return语句; return(x y return return((zz); ); } (2)一个函数中可以有多个 } void main() return语句,无论执行到哪 void main() { int a,b,c ; 个return语句,都将结束函 { int a,b,c ; scanf(“%d,%d”,&a,&b); 数调用,返回主调函数。 scanf(“%d,%d”,&a,&b); c=max(a,b); c=max(a,b); (3) return语句中的括号可以 printf(“The max is %d”, c); printf(“The max is %d”, c); } 省略,return后面可以是一 } 个表达式,返回的是表达式 的值。
不能
9/73
7.2 函数的定义
一、函数定义的一般形式
类型说明 函数名([形式参数说明]) { 函数体} 例7- 2 形式参数说明方法: #include <stdio.h> 类型说明 变量名1[,类型说明 变量名2 ] … int max(int x,int y) { int z; 1.无参函数的定义形式 z=x>y?x: void printstar() y; return( z ); { printf(“***************”); 类型说明 函数名() } { 函数体} } void main() { int a,b,c ; 2.空函数的定义形式 void function(int a, float y) scanf(“%d,%d”,&a,&b); 类型说明 函数名([形式参数说明]) { c=max(a,b); } printf(“The max is %d”, c); { } }
在程序中调用函数要 满足以下条件:
1.被调函数必须存在, 且遵循先定义,后使 用的原则; 2.如果函数在主调函 数之后定义,则应在 主调函数中或主调函 数之前对被调函数进 行声明。
#include <stdio.h> #include <stdio.h> void main( ) x ) int sum ( int {int sum ( int x ); { int i,t=0; intfor (i=1; i<=x; i++) s; s=sum (100); t+=i; printf("%d\n", s); return (t); } } int main( ) voidsum ( int x ) { int i,t=0; { int s; s=sum (100); i++) for (i=1; i<=x; printf("%d\n", s); t+=i; } return (t);}
18/73
7.4 函数的调用
一. 函数调用的一般形式
函数名(实参表列)
说明:
1.如果调用无参函数,实 参表列部分没有,但括号 不能省略; 2.实参的个数和形参个数 一般相等; 3.实参和形参的类型一一 对应,必要时使用类型转 换; 4.实参变量定义在调用函 数之前完成。
例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); }
说明:这种方式不能 用于void类型。
20/73
7.4 函数的调用
三. 函数调用的执行过程 1.按从右到左的顺序 ,计算实参各表达式 的值; 2.按照位置,将实参 的值一一传给形参; 3.执行被调用函数; 4.当遇到return(表达 式)语句时,计算表达 式的值,并返回主调 函数。
21/73
7.4 函数的调用
14/73
7.3 函数参数和函数的值
一、形式参数和实际参数
例7-3 读程序,写程序结果 #include <stdio.h> int sum(int a,int b) { int c; a=a+b; b=a+b; c=a+b; printf(“sum:%d+%d = %d\n”, a,b,c); return a; } void main() { int a=1,b=3,c ; c=sum(a,b); printf(“main:%d+%d = %d\n”, a,b,c); }
13/73
7.3 函数参数和函数的值
一、形式参数和实际参数
说明: 1.定义函数时,必须说明形参类 型,形参只能是变量和数组; 2.函数被调用前,形参不占内存 ,函数调用结束后,内存也被释 放; 3.实参可以是常量、变量和表达 式; 4.实参和形参的类型必须一致, 字符型和整型可以相互匹配; 5.C语言中实参对形参的数据传 递是“值传递”,即单向传递 ,仅由参数的对应位置决定,与 名字无关。 例7例8- 2 #include <stdio.h> int max(int x,int y) b,int a) { int z; c; c x b a b: y; z = x > y ? x : a; return( z ); c x } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56
都有子程序概念,用子程序实现模块的功能。
主模块
模块1
模块11
模块2
模块21 模块22
4/73
在 C 语ຫໍສະໝຸດ Baidu中是利用函数来实现子程序的作用。
学生成绩 管理系统
成绩 录入
成绩 查询
成绩 统计
成绩单 打印
5/73
采用模块化程序设计的优越性:
控制程序设计的复杂性
提高软件的可靠性
提高软件开发的效率
各函数的信息往来主要是由参数传递和返回语句实现的
12/73
一个C程序由若干个函数组成, 各函数调用时经常要传递一些 数据,调用函数把数据传递给 被调用函数,经被调用函数使 用后,一般会返回一个确定结 果,在返回调用函数时,把这 些结果带回调用函数。
7.3 函数参数和函数的值
一、形式参数和实际参数
函数参数用于函数间数据的传递 形式参数:定义函数时使用的参数 实际参数:调用函数时使用的参数 函数max有两个形式参数x和y 形参x和y只在max函数中使用 a和b是主函数中定义的变量 main函数调用max函数 a和b是max函数的实参 例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56
19/73
7.4 函数的调用
二. 函数调用的方式
1.函数语句 形式为:函数名(实参表列); 例如: printmessage(); printf(“%d”,a); 2.函数表达式
说明:这种方式不要求 函数带返回值,函数仅 完成一定的操作。
函数的值参与运算 例如: m=max(a,b); m=3*max(a,b); printf(“The max is %d”, max(a,b));
16/73
7.3 函数参数和函数的值
2. 函数值的类型
(1)函数的类型也就是函数值 的类型,函数max是int型 的,函数max的值也是int 型的; (2)省略了类型说明的函数是 int型; (3)return语句中的表达式一 般应与函数类型一致。如 果不一致,需要进行类型 转换,只有数值型数据可 以进行自动类型转换,以 函数类型为准。 例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); }
10/73
7.2 函数的定义
二、函数体组成
一般情况下,函数体由
两部分组成: { [局部变量说明] 语句 } 局部变量: 函数体内定义的变量, 其有效范围仅在函数内部, 离开函数体无意义。
11/73
7.3 函数参数和函数的值
例7- 2 #include <stdio.h> int max(int x,int y) { int z; z = x > y ? x : y; return( z ); } 主调函数 被调用函数 void main() ┇ int max(int x,int y) { int a,b,c ; a, b scanf(“%d,%d”,&a,&b); c=max (a,b); { c=max(a,b); ┇ z ┇ printf(“The max is %d”, ); return( z ); } }
1
C 语言程序设计
第七章 用函数实现模块化程序设计
北京航空航天大学 交通科学与工程学院 徐国艳
本章要点
函数的定义、说明与调用 函数之间参数传递规则 函数递归调用和嵌套调用 变量的存储类型与特性
2/73
第七章 用函数实现模块化程序设计
3/73
7.1 概述
一、模块化程序结构
一个较大的应用程序应分为若干个程序模块,每一 个模块用来实现一个特定的功能。所有的高级语言
提高软件的可维护性 提高程序的重用性
6/73
二、C程序的结构
函数
main ( )
F1 ( ) F11 ( ) F21 ( )
F2 ( )
F22 ( )
黑盒子
C程序是函数的集合体, 每个函数是一个独立 的程序模块; 有一个主函数,若干 个子函数; 所有子函数地位平等, 可相互调用、自我调 用; 函数可集中或分散存 放在一个或多个源程 序文件中。
7/73
三、C函数的分类
数学函数 (math.h) 字符和字符串函数 ( ctype.h,string.h) I/O函数 ( stdio.h) 动态存储分配函数(stdlib.h或malloc.h) 详见P384附录F
库函数
用户定义函数
形式
无参函数 有参函数 空函数
8/73
四、C程序的执行顺序
一个源程序文件,由一 个或多个函数以及其他 有关内容组成,是一个 编译单位,函数不是一 个编译单位。 C程序的执行总是从 main函数开始,调用其 它函数后回到main函数, 在main函数中结束整个 程序的运行; 所有的子函数都是平行 的,任何子函数都不属 于其他函数;
例7- 1 #include <stdio.h> void printstar() { printf(“*************\n”); } void printmessage() {printf(“ Hello,world.\n”); printstar(); } void main() { 这两个函数能单独执行吗? printstar(); printmessage(); }
17/73
7.3 函数参数和函数的值
3.不需要返回值的函数
(1)如果函数中没有使用 return语句,函数返回的 是一个不确定的值; (2)如果一个函数不需要返回 值,可以用void做类型说 明; (3)如果一个函数被声明为 void型的,就不允许再引 用他的返回值,只能用函 数语句形式调用;
例7- 1 #include <stdio.h> void printstar() { printf(“***************”); } void printmessage() { printf(“ Hello,world.\n”); printstar(); } void main() { printstar(); printmessage(); }
15/73
7.3 函数参数和函数的值
二、函数的返回值
例7例8- 2 1.返回函数值的方法 #include <stdio.h> (1)函数的返回值也就是函数的 int max(int x,int y) y) int max(int x,int 值,如果一个函数有返回值, { int z; { if(x>y) return y; ; z = x > y ? x :>(x) ? x : y ); 就必须用return语句; return(x y return return((zz); ); } (2)一个函数中可以有多个 } void main() return语句,无论执行到哪 void main() { int a,b,c ; 个return语句,都将结束函 { int a,b,c ; scanf(“%d,%d”,&a,&b); 数调用,返回主调函数。 scanf(“%d,%d”,&a,&b); c=max(a,b); c=max(a,b); (3) return语句中的括号可以 printf(“The max is %d”, c); printf(“The max is %d”, c); } 省略,return后面可以是一 } 个表达式,返回的是表达式 的值。
不能
9/73
7.2 函数的定义
一、函数定义的一般形式
类型说明 函数名([形式参数说明]) { 函数体} 例7- 2 形式参数说明方法: #include <stdio.h> 类型说明 变量名1[,类型说明 变量名2 ] … int max(int x,int y) { int z; 1.无参函数的定义形式 z=x>y?x: void printstar() y; return( z ); { printf(“***************”); 类型说明 函数名() } { 函数体} } void main() { int a,b,c ; 2.空函数的定义形式 void function(int a, float y) scanf(“%d,%d”,&a,&b); 类型说明 函数名([形式参数说明]) { c=max(a,b); } printf(“The max is %d”, c); { } }