第三章模块化程序设计 >3.1模块化程序设计的方法与特点 >32函数的定义 >3.3无返回值函数的定义与调用 >34有返回值函数的定义与调用 >35函数嵌套调用和函数声明 >36函数的递归调用 >38全局变量和局部变量 >39指针和指针作为函数参数 >3.10返回指针值的函数 >3.12典型例题
第三章 模块化程序设计 ➢ 3.1 模块化程序设计的方法与特点 ➢ 3.2 函数的定义 ➢ 3.3 无返回值函数的定义与调用 ➢ 3.4 有返回值函数的定义与调用 ➢ 3.5 函数嵌套调用和函数声明 ➢ 3.6 函数的递归调用 ➢ 3.8 全局变量和局部变量 ➢ 3.9 指针和指针作为函数参数 ➢ 3.10 返回指针值的函数 ➢ 3.12 典型例题
3.1模块化程序设计的方法与特点 什么是模块化程序设计? 模块化程序设计就是将一个复杂的大问题,分解为一 个个独立的简单的小问题(即模块),分别解决简单的 小问题,进而解决复杂的大问题。 在C语言中,这些独立的简单的模块就是函数。 ∫功能分解法-基础 >模块分解飞 面向对象法-主流 功能分解是一个自顶向下、逐步求精的过程 模块划分的原则是:高聚合、低耦合
3.1 模块化程序设计的方法与特点 ➢什么是模块化程序设计? 模块化程序设计就是将一个复杂的大问题,分解为一 个个独立的简单的小问题(即模块),分别解决简单的 小问题,进而解决复杂的大问题。 在C语言中,这些独立的简单的模块就是函数。 ➢模块分解 ▪ 功能分解是一个自顶向下、逐步求精的过程。 ▪ 模块划分的原则是:高聚合、低耦合。 功能分解法 -- 基础 面向对象法 -- 主流
3.1模块化程序设计的方法与特点 例3-1:从键盘输入10个正整数,编程求它们的阶乘 方法1:用循环嵌套实现, 求n!的程序代码: 外层循环控制求10次阶乘, #include 内层循环控制求阶乘 void main o #include i int i, n; float fact; void main o fact=1; i int i, j, n; float fact scanf(“%d”,&n); for(j=1;j<=10;j++) for(i=; i<=n; i++) i fact=l fact=fact*i: scanf(%od”,&n); printf(“fact=%.0fn”,fact); for(i=l; i<=n; i++) fact=fact*i: printi(“fact=%.0fn”,fact);
例3-1:从键盘输入10个正整数,编程求它们的阶乘 3.1 模块化程序设计的方法与特点 求n! 的程序代码: #include void main ( ) { int i , n ; float fact; fact=1; scanf(“%d”, &n); for ( i=1; i void main ( ) { int i , j, n ; float fact; for(j=1; j<=10; j++) { fact=1; scanf(“%d”, &n); for ( i=1; i<=n; i++) fact=fact*i; printf(“fact=%.0f\n”, fact); } }
3.1模块化程序设计的方法与特点 #include 方法2:用函数实现 void func( int m) 编写一个求阶乘的函数, i int i; float fact-l; 假设函数名为func for(i=l; i<=m; i++ main函数中用一层循环, fact=fact*i: 在循环体内通过调用函数 printf(%!=%.0fn”,m,fac;func来计算阶乘 void main ( i int i,n for(i=1;i<=10;i++) i scanf(%", &n); func(n);
void main ( ) { int i , n; for(i=1; i 方法2: 用函数实现 ◼编写一个求阶乘的函数, 假设函数名为func ◼main函数中用一层循环, 在循环体内通过调用函数 func来计算阶乘 3.1 模块化程序设计的方法与特点
3.1模块化程序设计的方法与特点 例:编程实现一个图书管理系统 图书管理系统 功能菜单图书信息管理图书查询借书管理还书管理 新书图书信息 入库修改 按时过期 归还罚款 按书名按作者按类别 查询查询查询 模块1模块2模块3模块↓模块5模块6‖模块7模块8模块9
图书管理系统 功能菜单 图书查询 图书信息 修改 新书 入库 按作者 查询 按书名 查询 按类别 查询 模块1 模块2 模块3 模块4 模块5 模块6 图书信息管理 借书管理 还书管理 按时 归还 过期 罚款 模块7 模块8 模块9 3.1 模块化程序设计的方法与特点 例: 编程实现一个图书管理系统
3.1模块化程序设计的方法与特点 模块化程序设计的特点: (1)模块相对独立,功能单 编写相对简单,可以独立编写调试 (2)可集体开发,缩短开发周期。不同的模块可以由 不同的人员开发,最终能够合成完整的程序 (3)开发出的模块,可在不同的应用程序中多次使用, 减少重复劳动,提高开发效率 (4)测试、更新以模块为单位进行而不会影响其他模块
➢模块化程序设计的特点: (1)模块相对独立,功能单一 编写相对简单,可以独立编写调试 (2)可集体开发,缩短开发周期。不同的模块可以由 不同的人员开发,最终能够合成完整的程序 (3)开发出的模块,可在不同的应用程序中多次使用, 减少重复劳动,提高开发效率 (4)测试、更新以模块为单位进行而不会影响其他模块 3.1 模块化程序设计的方法与特点
32函数的定义 1、定义格式:函数类型函数名(形式参数表) {函数体;} 2、说明: (1)函数名:用户定义的合法标识符 (2)函数类型:函数返回值的类型(函数计算结果的类型 若返回值为in或char类型,函数定义时可省略不写 若函数无返回值,函数定义时应写上vod类型 (3)形式参数 ①书写格式:每一个参数都要写上数据类型和参数名, 参数之间以逗号分隔,无参数时应写上void ②作用:表示将从主函数中接收哪些类型的数据信息
3.2 函数的定义 1、定义格式 : 函数类型 函数名 ( 形式参数表) { 函数体 ; } 2、说明: (1) 函数名 : 用户定义的合法标识符 (2) 函数类型 : 函数返回值的类型( 函数计算结果的类型) 若返回值为int或char类型, 函数定义时可省略不写 若函数无返回值, 函数定义时应写上void 类型 (3) 形式参数 ① 书写格式 : 每一个参数都要写上数据类型和参数名, 参数之间以逗号分隔, 无参数时应写上void ② 作用 : 表示将从主函数中接收哪些类型的数据信息
32函数的定义 (4)函数体:由变量声明和语句组成 ①函数体内定义的变量是局部量,只在函数被执行时存在 ②函数体可以为空(即存在空函数) void f(oid)函数定义# include {} void list( void 例32:编程输出信息*{prnt(“m”);} good: void main() 分析: t list( 因为输出信息中有两行星号,考虑 printf( goodⅧn”); 将输出一行星号写成一个单独的函数,istO 然后再main函数中调用这个函数两次 输出一行星号的函数很简单,只写一个 函数调用 printf函数就行了,所以该函数没有参数和返回值
例3-2: 编程输出信息 ****** good! ****** (4) 函数体 : 由变量声明和语句组成 ① 函数体内定义的变量是局部量, 只在函数被执行时存在 ② 函数体可以为空(即存在空函数) void f (void) { } #include 3.2 函数的定义 void list( void ) { printf(“******\n”); } void main( ) { list( ) ; printf(“ good \n”); list ( ); } 分析: ◼因为输出信息中有两行星号,考虑 将输出一行星号写成一个单独的函数, 然后再main函数中调用这个函数两次 ◼输出一行星号的函数很简单,只写一个 printf函数就行了,所以该函数没有参数和返回值 函数定义 函数调用
32函数的定义 例3-1的程序代码: 说明 #include 1.C程序从main函数开始执行, void func( int m) 调用其他函数后再返回到 i int i; float fact=1 main函数 for(i-l; i<=m; i++) 2.所有函数都是平行的, fact=fact*i: 定义函数时是互相独立的 printf(9gd!=%.0fn”,m,fact);函数之间可以互相调用, 但是不能调用main函数 void main( 注意 i int i, n; 函数定义和函数调用不同 for(i=1;i=10;i++) 函数定义实际上就是编写一个 scanf(“%d”,&n); 小程序,它可以完成一定的功能 func(n); 函数调用是在需要时使用已经 定义好的函数 个函数应先定义,再调用
例3-1的程序代码 : #include void func( int m ) { int i ; float fact=1 ; for( i=1; i<=m; i++ ) fact=fact*i; printf(“%d!=%.0f\n”, m, fact); } void main ( ) { int i , n; for(i=1; i<=10; i++) { scanf(“%d”, &n); func(n); } } 说明: 1. C程序从main函数开始执行, 调用其他函数后再返回到 main 函数 2. 所有函数都是平行的, 定义函数时是互相独立的 函数之间可以互相调用, 但是不能调用main函数 3.2 函数的定义 注意: ▪函数定义和函数调用不同 ▪函数定义实际上就是编写一个 小程序,它可以完成一定的功能 ▪函数调用是在需要时使用已经 定义好的函数 ▪ 一个函数应先定义,再调用
3.3无返回值函数的定义与调用 1、无返回值的无参函数的定义形式 void函数名(void 例3-2的程序 函数体;} #include void list(void) 表示 表示 无返回值 无参数 { printi(“Ⅶn”);} void main( 无参函数的调用形式: -list(); 函数名(); printi(“ good n”); 注意: list (: 函数名后面的小括号不能省略
3.3 无返回值函数的定义与调用 例3-2的程序 #include void list(void) { printf(“******\n”); } void main( ) { list( ) ; printf(“ good \n”); list ( ); } 1、无返回值的无参函数的定义形式 void 函数名(void) { 函数体; } 表示 无返回值 表示 无参数 ➢无参函数的调用形式: 函数名( ) ; 注意: 函数名后面的小括号不能省略