《C语言程序设计》课件第6章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
– 一个文件作用域标识符的作用域可通过引用性声明被扩大
1 0
86
6.5.1 标识符#includ的e 作用域
标识符的作用域
8 7
外部变量定义性声明与引用性声明的差别
– 定义性声明一个外部变量时可以带有初始化值也可以不带初始化值, 引用性声明一个外部变量时不能指定
初始化值;
– 定义性声明一个外部变量时可以使用存储类型e x t e r n 、
0
在C 程序的开发过程中,编译源程序时编译程
序将对源程序文件作两个阶段的编译预处理。
第1 阶段: 预处理程序预处理阶段
预处理程序扫描源程序, 对其中的" 预处理命令
" 做相应处理。
预处理命令:
文件包含命令
宏定义命令
条件编译命令
6.8.1 预处理概念
6.8.1 预处理概念
printf ( "That"s wonderful!" ) ;
6.4.2 函数调用
函数例1问题
46
函数例2问题
47
函数例3问题
48
}
0 1
0 2
0 3
0 4
函数调用
6.4.3 函数调用时的参数传递
50
6.4.3 函数调用时的参数传递
51
6.4.3 函数调用时的参数传递
52
54
验证歌德巴赫猜想: 任何一个大于4的偶数都
55
函数调用时的参数传递
数据类型
数据类型 参数名
6.4.1 函数的引用性声明
6.4.1 函数的引用性声明
6.4.2 函数调用
0 5
p r i n t _ w o r d ( ) ;i n t m a i n ( v o i d )· · · · ·{}
0 6
v o i d p r i n t _ w o r d ( v o i d )
erful!" ) ;
将以下2行代码:
查找源代码中由续行符(反斜线后紧跟换行符)组成的物
合并为1行代码:
printf ( "That"s wond\
理行,把它们合并成一个逻辑行。
11
2
6.8.1 预处理概念
6.8.1 预处理概念
113
114
6.8.2 文件包含命令
1 1
5
0 1
文件包含命令
0 2
96
6.5.2 外部对象的连接属性
9 8
在一个多文件程序中将一个已定义的具有外部连接属性的
标识符作用域从定义所在的源文件扩展到其他源文件的方法是: 在其他源文件中引用性声明该标识符。
函数引用性声明一般形式
e x t e r n 返回值类型说明符 函数名( 形式参数类型表) ;
全局变量引用性声明一般形式
s t a t i c 或缺省, 引用性声明一个外部变量时使用存储类型e x t e r n 或缺省。
6.5.1 标识符的作用域
6.5.1 标识符的作用域
01
02
91
int main ( void)
{
int a= 3 ;
{
int b= 4 ;
loop: a++;
}
if( a< 6 ) goto loop;
int f(int a)
函数调用结束后不消失
而保留原值,实现方法
可以是:让其占用的存
储单元不释放,在下一
次调用该函数时,该变
量已有值,恰是上一次
函数调用结束时的值。
}
105
106
6.6.1 变量的生命期属性
108
6.4.5 递归函数特点
1 0
0 1
9
0 2
6.8 编译预处理及预处理命令
1 1
64
6.4.5 递归函数
6.4.5 递归函数
例4:Hanoi塔问题
67
例4:Hanoi塔问题
68
例4:Hanoi塔问题
例4:Hanoi塔问题
70
初学者编写递归函数时常犯错误 71
⑴缺少对数据最小规模的正确判断、处理及返回操作。函
数一旦被调用将进入无穷递归。
例如:
long f(long n)
56
6.4.5 递归函数
57
0 1
0 2
0 3
0 4
0 5
0 6
0 7
6.4.5 递归函数
6.4.5 递归函数
6.4.5 递归函数特点
60
递归函数执行过程
61
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 0
1 1
递归函数执行过程
6.4.5 递归函数
求fibonacci(5)过程
02
例如:
03
# i n c l u d e < s t d i o . h >
i n t f ( )
04
{ i n t y ; }
05
i n t m a i n ( v o i d ){ i n t y ; r e t u r n 0 ; }
06
标识符的作用域规则
标识符的作用域规则
95
* 6.5.2 外部对象的连接属性
printf("% d", b);
return 0 ;
}
函数作用域 vs 块作用域
6.5.1 标识符的作用域
92
int might (int small, double
标识符的作用域规则
93
9 4
01
允 许 在 不 同 的 作 用 域 内 定 义 或 声 明 代
表 不 同 对 象 的 两 个 或 多 个 同 名 的 标 识 符 。
语言程序设计
添加副标题
第6章 模块化程序设计与函数
2
找前5个默尼森数。P是素数且M也是素数,并且满足等式M=2P-1,则称M为默尼森数。例如,P=5,
0 1
0 2
0 3
0 4
使用函数的目的
5
主要内容
6
6.1 函数概述
7
6.1.1 模块化程序设计
8
6.1.2 函数
9
10
11
1 2
3
0 2
变量的生命期属性
0 3
全局变量是静态变量
0 4
形式参数都是动态变量
0 5
局部变量有静态变量、动态变量之分
0 6
s t a t i c a u t o / r e g i s t e r
0 7
静态局部变量的存在周期与全局变量相同, 作用域与局部
0 8
变量相同
0 9
静态变量只能用常量初始化, 未指定初值为0
{
0 3自 定 义 函 数 p r i n t _ w o r d 的定 义 为
}
0 4
4 2
0 1
例2 :
0 2
6.4.2 函数调用
43
无参函数直接调用一般形式
函数名( )
有参函数直接调用的一般形式函数名( 实在参数表达式表, …, …)
函数名( 实在参数表达式表,…, …)
6.4.2 函数调用
2
程序可读性好
4
– 容易修改
– 不会因遗漏而导致程序问题
使用符号常量的优点
类对象宏定义
6.8.3 宏定义命令
126
127
6.8.3 宏定义命令
0 2命令功能: 有选择地编译源代码
0 11 38
7.4 条件编译命令
0 1
0 2
0 3
0 4
9
条件编译命令
命令功能: 有选择地编译源代码。
1 3
0 5
法的, 在这个代码段外使用该标识符是非法的。
01
03
05
02
04
06
6.5 标识符的作用域
6.5 标识符的作用域
84
标识符的作用域
8 5
2
各类标识符的四类作用域
3
文件作用域
4
– 从标识符定义或声明位置起到源文件结尾的源文件范围
– 文件作用域标识符: 外部对象名
全局变量名
全局数组名
函数名
8
在函数外自定义的数据类型名
– 形式参数允许:

结构
类型
联合
类型
枚举
类型
数组
类型
基本
类型

函数
类型
类型
首部
6.2.4 形式参数
6.2.5 函数体
0 1
0 2
0 3
0 4
0 5
2 4
函数返回通过r e t u r n 语句实现
r e t u r n 语句的三个用途
– 结束函数的执行并返回到主
调函数
0 6
0 7
0 8
0 9
– 向主调函数传递回一个函数
几种选择性编译源代码情况
6.8.4 条件编译命令
140
1 4
1
# d e f i n e S Y S T E M 2
# i n c l u d e " I B M . h "
# e l i f S Y S T E M = = 2
# i n c l u d e " H o n e y w e l l . h "# e l i f S Y S T E M = = 3# i n c l u d e " M i c r o s o f t . h " # e l s e
条件编译命令
# i f S Y S T E M = = 1
# i n c l u d e " o t h e r . h "
# e n d i f
6.8.4 条件编译命令
THANKS
添加副标题
{
return n*fact (n-1);
}
初学者编写递归函数时常犯错误
例5 : 把一个整数作为字符串打印出来。算法:
把字符串看作一个字符与长度大于1 的字符串
的并置, 用递归函数p r i n t d来处理。
7 3
# i n c l u d e < s t d i o . h >
v o i d p r i n t d ( i n t n )
{ i f ( n < 0 )
{ p u t c h a r ( " - " ) ; n = - n ; }
i f ( n / 1 0 )
p r i n t d ( n / 1 0 ) ;
p u t c h a r ( n % 1 0 + " 0 " ) ;
}
若n 为 - 1 2 3 , 分析打印过程
120
类对象宏定义
121
6.8.3 宏定义命令
122
02
03
04
1 2
3
宏名的有效范围是从它的定义点开始到它所在源程序文件
02
的末尾。
03
可用# u n d e f 预处理命令取消前面定义过的某个宏名的定
04

# u n d e f 宏名
类对象宏定义
12
4
3
– 使用符号常量含义清楚
方便程序的修改
e x t e r n 数据类型说明符 全局变量名;
1
2
3
4
5
6.5.2 外部对象的连接属性
10
1
6.6 变量的存储属性
1 0
2
变量的生命期属性
生命期属性反映程序运行时变量的存在状态
按照生命期属性分类变量
静态变量
动态变量
存在周期与程序运
行时间相同
存在周期与定义它的
代码块执行时间相同
0 1
1 0
e l s e
r e t u r n f ( a , b - a ) ;
}
阅读程序2
阅读程序3
81
6.5 标识符的作用域
82
8 3
代表程序中的各类对象
标识符的作用域
个代码段。
标识符( i d e n t i f i e r )
– 与已定义或声明的标识符相关的一
– 在这个代码段内使用该标识符是合
6.4.5 递归函数
x2 x3
x2 x3
比较递推法和递归法
77
阅读程序1
8 0
i n t f ( i n t a , i n t b )
{
i f ( a = = b )
r e t u r n a ;
e l s e i f ( a > b )
r e t u r n f ( a - b , b ) ;
函数原型
函数
0 3
符号常量:g = 9 . 8 1 , e = 2 . 7 1 8
0 4
# i n c l u d e < f i l e 2 . c >
0 5
B
A
0 6
B
0 7
A
0 8
116
6.8.2 文件
6.8.2 文件包含命令
118
6.8.2 文件包含命令
6.8.3 宏定义命令
119
类对象宏定义
15
{
4
printf("x = % d",x);
}
5
16
1
2定义无返回值函数时返回值类型说明符为void
例如:
3
首部
6
6.2.3 返回值类型
6.2.3 返回值类型
17
6.2.4 形式参数
18
6.2.4 形式参数
19
6.2.4 形式参数
20
2 1
数据类型说明符:
– 指定形式参数的数据类型。
类型的返回值;
– 归还函数中定义的局部对象
的存储空间
6.3 函数返回
6.3 函数返回
6.3 函数返回
6.3 函数返回
6.3 函数返回
6.3 函数返回
29
30
不能通过 return语句返回多个值给主调函数
例如:int f( int x, int y){
2
3
4
f函数被调用时总是返回y的 值
}
6 . 2 . 1 函数定义形式02
03
6 . 2 . 2 函数名
04

6 . 2 . 3
函数返回值类型

6 . 2 . 4
函数的形式参数

6 . 2 . 5
函数体

6 . 2 . 6
函数的存储类型
6.2 函数定义
13
6.2.1 函数定函数义名 形形式参式数声明
}
6.2.1 函数定义形式
6.2.2 函数名
return ( x, y);
6.3 函数返回
6.3 函数返回
32
6.4 函数调用
33
6.4 函数调用
34
6.4.1 函数的引用性声明
6.4.1 函数的引用性声明
36Biblioteka 37}02
03
04
函数的引用性声明
函数引用性声明一般形式
38
相关文档
最新文档