C语言第7章用函数实现模块化程序设计.ppt
合集下载
C语言程序设计教程PPT完整全套教学课件

联合体定义和使用场景分析
联合体定义
使用`union`关键字定义联合体类型,指定联合体名 称和成员列表。
内存共享
联合体的所有成员共享同一块内存空间。
使用场景
适用于多种数据类型但只需存储其中一种的场景, 如混合类型的数据存储和处理。
枚举类型定义及应用举例
枚举类型定义
使用`enum`关键字定义枚举类型,指定枚举名称和枚举常量列表。
01
跳转语句的概念和 特点
改变程序执行流程,实现程序的 跳转。
02
跳转语句的语法和 示例
break语句、continue语句、 goto语句等。
03
跳转语句的应用场 景
适用于需要中断循环、跳过某些 操作等特殊情况。
04
函数与模块化设计
函数定义和调用
函数定义的基本语法
返回类型 函数名(参数列表) { 函数体 }
将数组元素作为实参传递给形参,形参和实参类型必须一致;
数组名作为函数参数
将数组名作为实参传递给形参,形参和实参类型可以不一致,但形 参数组的大小必须大于等于实参数组的大小;
多维数组作为函数参数
多维数组可以作为函数参数传递,但需要注意多维数组的传递方式 和一维数组的传递方式不同。
06
指针与动态内存管理
02
数据类型、运算符与表达式
基本数据类型
01
整型(int)
02
浮点型(float、 double)
字符型(char)
03
04
布尔型(bool)
常量与变量
常量
在程序运行过程中,其值不能被改变 的量。
变量
在程序运行过程中,其值可以被改变 的量。
运算符和表达式
C语言程序设计第四版_谭浩强7章

➢函数的功能
return z; }
函数体
函数首部,不是语 句,行尾无分号
精选课件ppt
函数的返回值,类 型与首部定义一致14
函数的定义
关于函数类型的说明
无返回值的函数类型为void; 有返回值的函数,其类型根据返回值 类型决定;省略类型时默认为int(建议 不要省略)
精选课件ppt
15
函数的调用
int main( )
{ int max(int a[ ],int n);
int x[6],i;
for(i=0;i<=5;i++)
scanf("%d",&x[i]);
printf("max=%d",max(x,6));
return 0;
}
实参为数组名
精选课件ppt
int max(int a[ ],int n) { int m,i; m=a[0]; for (i=1;i<n;i++)
float fac; fac=1; for(i=1;i<=n;i++)
fac=fac*i; return fac;
printf("c="); scanf("%d",&c);
}
sum=factorial(a)+factorial(b)+factorial(c);
printf("%d!+%d!+%d!=%.0f",a,b,c,sum);
函数1 函数2 函数3
函数1 函数2
精选课件ppt
34
变量作用域——局部变量和全局变量
C语言第七讲 函数(2)

变量类型决定了变量在内存中所占的字节数 及数据的表示形式,并且决定了变量起作用的代 码范围,也决定了系统在什么时间、什么空间为 变量分配或释放内存单元。这是变量的生存期和 作用域。
21
一、变量的存储空间分配概念
变量定义位置 变量的作用域 空间 (变量的使用范围)
变量的存储类别变量的生存期 时间
26
局部变量
二、变量的作用域——
局部变量(local variable)与全局变量(global variable)
例
void swap( ) { int t,x,y; t=x;x=y;y=t; } main() { int x=3,y=5; printf("x=%d,y=%d\n",x,y); swap( ); printf("x=%d,y=%d\n",x,y); }
斐波那契数列的递归方法实现。计算并输出斐波 那契数列的前7个数据。
1 当n =0, 1时
fib(n) =
fib(n-1)+ fib(n-2) 当n > 1时
int fib(int n) { if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2); }
10
void main() { int n; for(n=11;n<=99;n++) if( absoluteprime(n) ) printf("%d\t",n); } /*判断一个数是否为绝对素数*/ int absoluteprime (int n) /*函数定义*/ { if(prime(n)==0) return 0; else if(prime(invert(n))==1) return 1; else return 0; }
21
一、变量的存储空间分配概念
变量定义位置 变量的作用域 空间 (变量的使用范围)
变量的存储类别变量的生存期 时间
26
局部变量
二、变量的作用域——
局部变量(local variable)与全局变量(global variable)
例
void swap( ) { int t,x,y; t=x;x=y;y=t; } main() { int x=3,y=5; printf("x=%d,y=%d\n",x,y); swap( ); printf("x=%d,y=%d\n",x,y); }
斐波那契数列的递归方法实现。计算并输出斐波 那契数列的前7个数据。
1 当n =0, 1时
fib(n) =
fib(n-1)+ fib(n-2) 当n > 1时
int fib(int n) { if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2); }
10
void main() { int n; for(n=11;n<=99;n++) if( absoluteprime(n) ) printf("%d\t",n); } /*判断一个数是否为绝对素数*/ int absoluteprime (int n) /*函数定义*/ { if(prime(n)==0) return 0; else if(prime(invert(n))==1) return 1; else return 0; }
第7章 用函数实现模块化程序设计.ppt

② 有参函数。在调用函数时,主调函数在调用 被调用函数时,通过参数向被调用函数传递数 据,一般情况下,执行被调用函数时会得到一 个函数值,供主调函数使用。
7.2 怎样定义函数
7.2.1 为什么要定义函数 7.2.2 定义函数的方法
7.2.1 为什么要定义函数
➢C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
如果函数值的类型和return语句中表达式的 值不一致,则以函数类型为准
7.3.4. 函数的返回值
例7.3将例7.2稍作改动,将在max函数中定 义的变量z改为float型。函数返回值的类型 与指定的函数类型不同,分析其处理方法。 ➢解题思路:如果函数返回值的类型与指定 的函数类型不同,按照赋值规则处理。
(3) 如果使用自己定义的函数,而该函数的位 置在调用它的函数后面,应该声明
7.4对被调用函数的声明和函数原型
例7.4 输入两个实数,用一个函数求出它 们之和。
➢解题思路:用add函数实现。首先要定义 add函数,它为float型,它应有两个参 数,也应为float型。特别要注意的是: 要对add函数进行声明。
int max(float x,float y)
{ float z;
z=x>y?x:y;
return( z ) ;
}
2.6
2
7.4对被调用函数的声明和函数原型
➢在一个函数中调用另一个函数需要具备如 下条件:
(1) 被调用函数必须是已经定义的函数(是库 函数或用户自己定义的函数)
(2) 如果使用库函数,应该在本文件开头加相 应的#include指令
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2 怎样定义函数
7.2.1 为什么要定义函数 7.2.2 定义函数的方法
7.2.1 为什么要定义函数
➢C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
如果函数值的类型和return语句中表达式的 值不一致,则以函数类型为准
7.3.4. 函数的返回值
例7.3将例7.2稍作改动,将在max函数中定 义的变量z改为float型。函数返回值的类型 与指定的函数类型不同,分析其处理方法。 ➢解题思路:如果函数返回值的类型与指定 的函数类型不同,按照赋值规则处理。
(3) 如果使用自己定义的函数,而该函数的位 置在调用它的函数后面,应该声明
7.4对被调用函数的声明和函数原型
例7.4 输入两个实数,用一个函数求出它 们之和。
➢解题思路:用add函数实现。首先要定义 add函数,它为float型,它应有两个参 数,也应为float型。特别要注意的是: 要对add函数进行声明。
int max(float x,float y)
{ float z;
z=x>y?x:y;
return( z ) ;
}
2.6
2
7.4对被调用函数的声明和函数原型
➢在一个函数中调用另一个函数需要具备如 下条件:
(1) 被调用函数必须是已经定义的函数(是库 函数或用户自己定义的函数)
(2) 如果使用库函数,应该在本文件开头加相 应的#include指令
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
C语言程序设计教程ppt课件(2024)

打印九九乘法表
使用嵌套的for循环打印九九乘法表。
23
04
数组与字符串处理
2024/1/30
24
一维数组定义和操作
2024/1/30
01
一维数组定义
类型说明符 数组名
[常量表达式];
02
一维数组初始化
在定义数组时对数 组元素赋以初值;
04
一维数组操作
包括赋值、输入输
03
出、排序、查找等
。
一维数组引用
do-while循环
与while循环类似,但至少会执行一次 循环体。
示例
int i = 0; do { printf("%d ", i); i; } while (i < 10);
语法
do { // code to be executed } while (condition);
2024/1/30
19
赋值运算符
包括赋值运算符(=)和复合赋 值运算符(+=、-=、*=、/=、 %=),用于为变量赋值或进行 运算后赋值。
12
类型转换与运算顺序
2024/1/30
类型转换
当不同类型的数据进行运算时,需要进行类型转换,包括自 动类型转换和强制类型转换。自动类型转换由编译器自动完 成,而强制类型转换需要使用类型转换运算符。
0。
free函数
用于释放已分配的内存空间 ,避免内存泄漏。
2024/1/30
36
指针在数组、字符串等数据结构中应用
指针与数组
数组名本质上是一个指向数组首元素的指针;通过指针可 以访问和修改数组元素。
指针与字符串
字符串在C语言中以字符数组的形式存储,指针可以方便 地操作字符串。
使用嵌套的for循环打印九九乘法表。
23
04
数组与字符串处理
2024/1/30
24
一维数组定义和操作
2024/1/30
01
一维数组定义
类型说明符 数组名
[常量表达式];
02
一维数组初始化
在定义数组时对数 组元素赋以初值;
04
一维数组操作
包括赋值、输入输
03
出、排序、查找等
。
一维数组引用
do-while循环
与while循环类似,但至少会执行一次 循环体。
示例
int i = 0; do { printf("%d ", i); i; } while (i < 10);
语法
do { // code to be executed } while (condition);
2024/1/30
19
赋值运算符
包括赋值运算符(=)和复合赋 值运算符(+=、-=、*=、/=、 %=),用于为变量赋值或进行 运算后赋值。
12
类型转换与运算顺序
2024/1/30
类型转换
当不同类型的数据进行运算时,需要进行类型转换,包括自 动类型转换和强制类型转换。自动类型转换由编译器自动完 成,而强制类型转换需要使用类型转换运算符。
0。
free函数
用于释放已分配的内存空间 ,避免内存泄漏。
2024/1/30
36
指针在数组、字符串等数据结构中应用
指针与数组
数组名本质上是一个指向数组首元素的指针;通过指针可 以访问和修改数组元素。
指针与字符串
字符串在C语言中以字符数组的形式存储,指针可以方便 地操作字符串。
C语言程序设计教程ppt课件完整版pptx

C语言的应用领域
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
高中信息技术选修《C语言程序设计:用函数实现模块化程序设计》PPT课件

1. 初始化的全局变量和静态变量 2. 未初始化的全局变量和未初始化的静态变量 3. 常量字符串
这些数据在程序结束后由系统释放。
2019/2/6
25
栈区和堆区
栈区(stack)
由编译器自动分配释放 ,存放函数的参数值,局 部变量的值等。 由程序员分配释放 。 malloc、free
堆区(heap)
}
p、q的有效范围
c1、c2的有效范围
#include <stdio.h> int numCalls = 0; void foo()
{
++numCalls; } int main() { foo(); foo(); foo(); printf("%d\n", numCalls); 输出:3
}
10
例7.14 有一个一维数组,内放10个学生成绩,写一 个函数,当主函数调用此函数后,能求出平均分、 最高分和最低分。
全局变量(外部变量)
局部变量
静态存储方式 动态存储方式
从变量值存在的时间(即生存期),变量分为
如果一个变量值在某一时刻是存在的,则认为这一 时刻属于该变量的生存期
2019/2/6 21
操作 系统 内核
函数
用 户 区
22
2019/2/6
23
2019/2/6
24
全局数据区
全局数据区划分为三个区域。
2019/2/6
6
全局变量(Global Variable)
在所有函数之外定义的变量是全局变量,在定义它的 位置以后都有效
全局变量自动初始化为0 全局变量使函数之间的数据交换更容易,效率也高 一些 但是不推荐使用,甚至禁止使用
这些数据在程序结束后由系统释放。
2019/2/6
25
栈区和堆区
栈区(stack)
由编译器自动分配释放 ,存放函数的参数值,局 部变量的值等。 由程序员分配释放 。 malloc、free
堆区(heap)
}
p、q的有效范围
c1、c2的有效范围
#include <stdio.h> int numCalls = 0; void foo()
{
++numCalls; } int main() { foo(); foo(); foo(); printf("%d\n", numCalls); 输出:3
}
10
例7.14 有一个一维数组,内放10个学生成绩,写一 个函数,当主函数调用此函数后,能求出平均分、 最高分和最低分。
全局变量(外部变量)
局部变量
静态存储方式 动态存储方式
从变量值存在的时间(即生存期),变量分为
如果一个变量值在某一时刻是存在的,则认为这一 时刻属于该变量的生存期
2019/2/6 21
操作 系统 内核
函数
用 户 区
22
2019/2/6
23
2019/2/6
24
全局数据区
全局数据区划分为三个区域。
2019/2/6
6
全局变量(Global Variable)
在所有函数之外定义的变量是全局变量,在定义它的 位置以后都有效
全局变量自动初始化为0 全局变量使函数之间的数据交换更容易,效率也高 一些 但是不推荐使用,甚至禁止使用
C语言程序设计课程之模块化程序设计PPT学习教案

❖ 解决办法:将判断素 数的功能用一个独立 的模块来实现,即自 定义函数;在main函 数中反复调用此功能 模块就可以了。
第1页/共71页
void sushu(int x)
{int i;
for(i=2;i<=x/2;i++)
if(x%i==0) break;
if(i>=x/2)
printf("yes\n");
return t; }
值
main()
函
{ int a,b; printf("input two
数
numbers:");
调
scanf("%d%d",&a,&b); printf("%.0lf\n", fun(a,b));
用
}
输出
第21页/共71页
double jiecheng(int n) { int i; double t=1;
第22页/共71页
有返回值函数调用
b=jiecheng(a); b=b+jiecheng(i); printf("%.0lf\n", jiecheng(a));
总结:
•将函数调用看做一个可以利用的值。 •函数调用一般不作为独立语句存在。
jiecheng(a)×;
第23页/共71页
无返回值函数调用
函数编程练习
编写函数,求三角形面积。 函数参数:三角形的三条边 函数返回值:三角形面积。
3-3
第29页/共71页
编程练习(实验题目)
编写函数判断一个数是否是完数。 完数:一个数如果恰好等于它的 因子之和,这个数就是完数,例 如6的因子为1、2、3,而6= 1+2+3,因此6是完数。 要求函数返回整型值。
第1页/共71页
void sushu(int x)
{int i;
for(i=2;i<=x/2;i++)
if(x%i==0) break;
if(i>=x/2)
printf("yes\n");
return t; }
值
main()
函
{ int a,b; printf("input two
数
numbers:");
调
scanf("%d%d",&a,&b); printf("%.0lf\n", fun(a,b));
用
}
输出
第21页/共71页
double jiecheng(int n) { int i; double t=1;
第22页/共71页
有返回值函数调用
b=jiecheng(a); b=b+jiecheng(i); printf("%.0lf\n", jiecheng(a));
总结:
•将函数调用看做一个可以利用的值。 •函数调用一般不作为独立语句存在。
jiecheng(a)×;
第23页/共71页
无返回值函数调用
函数编程练习
编写函数,求三角形面积。 函数参数:三角形的三条边 函数返回值:三角形面积。
3-3
第29页/共71页
编程练习(实验题目)
编写函数判断一个数是否是完数。 完数:一个数如果恰好等于它的 因子之和,这个数就是完数,例 如6的因子为1、2、3,而6= 1+2+3,因此6是完数。 要求函数返回整型值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2) 一个源程序文件由一个或多个函数以及其他有 关内容(如预处理指令、数据声明与定义等)组 成。一个源程序文件是一个编译单位,在程序编 译时是以源程序文件为单位进行编译的,而不是 以函数为单位进行编译的。
说明:
(3) C程序的执行是从main函数开始的,如果在 main函数中调用其他函数,在调用后流程返回 到main函数,在main函数中结束整个程序的运 行。
7.1为什么要用函数
解决的方法:用模块化程序设计的思路
函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
7.1为什么要用函数
在设计一个较大的程序时,往往把它分为若干个程 序模块,每一个模块包括一个或多个函数,每个函 数实现一个特定的功能
C程序可由一个主函数和若干个其他函数构成 主函数调用其他函数,其他函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次
7.1为什么要用函数
解题思路:
在输出的文字上下分别有一行“*”号,显然不必 重复写这段代码,用一个函数print_star来实现输 出一行“*”号的功能。
再写一个print_message函数来输出中间一行文 字信息
用主函数分别调用这两个函数
#include <stdio.h>
int main()
说明:
(1) 一个C程序由一个或多个程序模块组成,每一 个程序模块作为一个源程序文件。对较大的程序, 一般不希望把所有内容全放在一个文件中,而是 将它们分别放在若干个源文件中,由若干个源程 序文件组成一个C程序。这样便于分别编写、分 别编译,提高调试效率。一个源程序文件可以为 多个C程序共用。
说明:
7.2 怎样定义函数
7.2.1 为什么要定义函数 7.2.2 定义函数的方法
7.2.1 为什么要定义函数
C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2.1 为什么要定义函数
指定函数的名字,以便以后按名调用 指定函数类型,即函数返回值的类型 指定函数参数的名字和类型,以便在调用
{ void print_star();
void print_message();
print_star(); print_message();
print_star();
return 0; }
输出16个*
void print_star()
{ printf(“******************\n”); } 输出一行文字
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”); }
7.1为什么要用函数
main
a
b
c
de f g h
i
e
7.1为什么要用函数
可以使用库函数
可以使用自己编写的函数
在程序设计中要善于利用函数,可以减少重 复编写程序段的工作量,同时可以方便地实 现模块化的程序设计
7.1为什么要用函数
例7.1 输出以下的结果,用函数调用实现。 ****************** How do you do! ******************
void print_message() { printf(“ How do you do!\n”); }
#include <stdio.h> int main()
声明函数
{ void print_star();
void nt_star(); print_message();
而直接使用它们。应该说明,不同的C语言编译 系统提供的库函数的数量和功能会有一些不同, 当然许多基本的函数是共同的。 用户自己定义的函数。它是用以解决用户专门需 要的函数。
说明:
(6) 从函数的形式看,函数分两类。 ① 无参函数。无参函数一般用来执行指定的一组操
作。无参函数可以带回或不带回函数值,但一般 以不带回函数值的居多。 ② 有参函数。在调用函数时,主调函数在调用被 调用函数时,通过参数向被调用函数传递数据, 一般情况下,执行被调用函数时会得到一个函数 值,供主调函数使用。
问题:
如果程序的功能比较多,规模比较大,把所有代码 都写在main函数中,就会使主函数变得庞杂、头 绪不清,阅读和维护变得困难
有时程序中要多次实现某一功能,就需要多次重复 编写实现此功能的程序代码,这使程序冗长,不精 炼
7.1为什么要用函数
解决的方法:用模块化程序设计的思路
采用“组装”的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用
print_star();
return 0; }
定义函数
void print_star() { printf(“******************\n”); }
void print_message() { printf(“ How do you do!\n”); }
#include <stdio.h> int main() { void print_star();
说明:
(4) 所有函数都是平行的,即在定义函数时是分别 进行的,是互相独立的。一个函数并不从属于另 一个函数,即函数不能嵌套定义。函数间可以互 相调用,但不能调用main函数。main函数是被 操作系统调用的。
说明:
(5) 从用户使用的角度看,函数有两种。 库函数,它是由系统提供的,用户不必自己定义
第7章 用函数实现模块化程序设计
7.1为什么要用函数
7.2怎样定义函数
7.3调用函数
7.4对被调用函数的声明和函数原型
7.5函数的嵌套调用
7.6函数的递归调用
7.7数组作为函数参数 7.8局部变量和全局变量
7.9变量的存储方式和生存期
7.10 关于变量的声明和定义
7.11 内部函数和外部函数
7.1为什么要用函数
说明:
(3) C程序的执行是从main函数开始的,如果在 main函数中调用其他函数,在调用后流程返回 到main函数,在main函数中结束整个程序的运 行。
7.1为什么要用函数
解决的方法:用模块化程序设计的思路
函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
7.1为什么要用函数
在设计一个较大的程序时,往往把它分为若干个程 序模块,每一个模块包括一个或多个函数,每个函 数实现一个特定的功能
C程序可由一个主函数和若干个其他函数构成 主函数调用其他函数,其他函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次
7.1为什么要用函数
解题思路:
在输出的文字上下分别有一行“*”号,显然不必 重复写这段代码,用一个函数print_star来实现输 出一行“*”号的功能。
再写一个print_message函数来输出中间一行文 字信息
用主函数分别调用这两个函数
#include <stdio.h>
int main()
说明:
(1) 一个C程序由一个或多个程序模块组成,每一 个程序模块作为一个源程序文件。对较大的程序, 一般不希望把所有内容全放在一个文件中,而是 将它们分别放在若干个源文件中,由若干个源程 序文件组成一个C程序。这样便于分别编写、分 别编译,提高调试效率。一个源程序文件可以为 多个C程序共用。
说明:
7.2 怎样定义函数
7.2.1 为什么要定义函数 7.2.2 定义函数的方法
7.2.1 为什么要定义函数
C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2.1 为什么要定义函数
指定函数的名字,以便以后按名调用 指定函数类型,即函数返回值的类型 指定函数参数的名字和类型,以便在调用
{ void print_star();
void print_message();
print_star(); print_message();
print_star();
return 0; }
输出16个*
void print_star()
{ printf(“******************\n”); } 输出一行文字
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”); }
7.1为什么要用函数
main
a
b
c
de f g h
i
e
7.1为什么要用函数
可以使用库函数
可以使用自己编写的函数
在程序设计中要善于利用函数,可以减少重 复编写程序段的工作量,同时可以方便地实 现模块化的程序设计
7.1为什么要用函数
例7.1 输出以下的结果,用函数调用实现。 ****************** How do you do! ******************
void print_message() { printf(“ How do you do!\n”); }
#include <stdio.h> int main()
声明函数
{ void print_star();
void nt_star(); print_message();
而直接使用它们。应该说明,不同的C语言编译 系统提供的库函数的数量和功能会有一些不同, 当然许多基本的函数是共同的。 用户自己定义的函数。它是用以解决用户专门需 要的函数。
说明:
(6) 从函数的形式看,函数分两类。 ① 无参函数。无参函数一般用来执行指定的一组操
作。无参函数可以带回或不带回函数值,但一般 以不带回函数值的居多。 ② 有参函数。在调用函数时,主调函数在调用被 调用函数时,通过参数向被调用函数传递数据, 一般情况下,执行被调用函数时会得到一个函数 值,供主调函数使用。
问题:
如果程序的功能比较多,规模比较大,把所有代码 都写在main函数中,就会使主函数变得庞杂、头 绪不清,阅读和维护变得困难
有时程序中要多次实现某一功能,就需要多次重复 编写实现此功能的程序代码,这使程序冗长,不精 炼
7.1为什么要用函数
解决的方法:用模块化程序设计的思路
采用“组装”的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用
print_star();
return 0; }
定义函数
void print_star() { printf(“******************\n”); }
void print_message() { printf(“ How do you do!\n”); }
#include <stdio.h> int main() { void print_star();
说明:
(4) 所有函数都是平行的,即在定义函数时是分别 进行的,是互相独立的。一个函数并不从属于另 一个函数,即函数不能嵌套定义。函数间可以互 相调用,但不能调用main函数。main函数是被 操作系统调用的。
说明:
(5) 从用户使用的角度看,函数有两种。 库函数,它是由系统提供的,用户不必自己定义
第7章 用函数实现模块化程序设计
7.1为什么要用函数
7.2怎样定义函数
7.3调用函数
7.4对被调用函数的声明和函数原型
7.5函数的嵌套调用
7.6函数的递归调用
7.7数组作为函数参数 7.8局部变量和全局变量
7.9变量的存储方式和生存期
7.10 关于变量的声明和定义
7.11 内部函数和外部函数
7.1为什么要用函数