计算机程序设计 课件

上传人:我*** 文档编号:144111138 上传时间:2020-09-06 格式:PPT 页数:73 大小:242.50KB
返回 下载 相关 举报
计算机程序设计 课件_第1页
第1页 / 共73页
计算机程序设计 课件_第2页
第2页 / 共73页
计算机程序设计 课件_第3页
第3页 / 共73页
计算机程序设计 课件_第4页
第4页 / 共73页
计算机程序设计 课件_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《计算机程序设计 课件》由会员分享,可在线阅读,更多相关《计算机程序设计 课件(73页珍藏版)》请在金锄头文库上搜索。

1、计算机程序设计基础,第五章 程序组织与软件开发方法,提 纲,5.1 库与接口 5.2 随机数库 5.3 作用域与生存期 5.4 宏 5.5 条件编译 5.6 典型软件开发流程 本章小结,5.1 库与接口,库与程序文件 程序文件:源文件(*.c)、头文件(*.h)、工程文件 库:源文件与头文件 接 口 通过接口使用库:包括指定库的头文件与源文件 优势:不需了解库的实现细节,只需了解库的使用方法,标准 I/O 库,输入输出函数 常用函数列表 STRING gets( STRING buffer ); int printf( CSTRING fmt, ); int puts( CSTRING str

2、 ); int scanf( CSTRING fmt, );,数学库,数学函数 常用函数列表 三角函数与反三角函数系列 double acos( double x ); double sin( double x ); 幂函数与对数函数系列 duoble log( double x ); double pow( double x, double y ); 其他数学函数 double sqrt( double x ); ,标准辅助函数库,工具与辅助函数 常用函数列表 void exit( int status ); void free( void * p ); void * malloc( siz

3、e_t size ); int rand(); void srand( unsigned int seed );,头文件的包含策略,包含头文件的格式 尖括号:在 C 编译器的标准目录下查找该头文件 双引号:首先在当前工程项目所在的目录下查找,若不存在,则查找标准目录 使用双引号包含自己或其他编写的非 C 标准库 头文件的多次包含 多个文件包含同一个头文件 例:“zyrandom.h”包含“zylib.h”,“main.c”包含“zyrandom.h”与“zylib.h”,则“main.c”不仅主动包含了“zylib.h”,还通过“zyrandom.h”被动包含了“zylib.h” 多次包含同一

4、个头文件可能会导致程序问题,头文件的包含策略,解决方法 使用条件编译指令 #ifndef(条件判断,若未定义)、#define (定义)与 #endif(结束条件判断) 被包含的头文件 #ifndef _ZYLIB_ #define _ZYLIB_ 头文件的具体内容在此 #endif 源文件或包含文件 #ifndef _ZYLIB_ #include zylib.h #endif 源文件或包含文件的具体内容在此,5.2 随机数库,随机数的生成 库的设计原则 随机数库接口 随机数库实现 随机数库测试,随机数的生成第一版,编写程序,调用 rand 函数生成五个随机数,#include #inclu

5、de int main() int i; printf( On this computer, the RAND_MAX is %d.n, RAND_MAX ); printf( Five numbers the rand function generates as follows:n ); for( i = 0; i 5; i+ ) printf( %d; , rand() ); printf( n ); return 0; ,随机数的生成第二版,编写程序,调用 rand 函数生成五个随机数,#include #include #include int main() int i; printf

6、( On this computer, the RAND_MAX is %d.n, RAND_MAX ); printf( Five numbers the rand function generates as follows:n ); srand( (int)time(0) ); for( i = 0; i 5; i+ )printf( %d; , rand() ); printf( n ); return 0; ,接口设计原则,用途一致 接口中所有函数都属于同一类问题 操作简单 函数调用方便,最大限度隐藏操作细节 功能充足 满足不同潜在用户的需要 性能稳定 经过严格测试,不存在程序缺陷,随

7、机数库接口,设计随机数接口,#ifndef _ZYRANDOM_ #define _ZYRANDOM_ #ifndef _ZYLIB_ #include zylib.h #endif void Randomize(); int GenerateRandomNumber( int low, int high ); double GenerateRandomReal( double low, double high ); #endif,随机数库实现,实现随机数库,#include #include #ifndef _ZYRANDOM_ #include zyrandom.h #endif #ifn

8、def _ZYLIB_ #include zylib.h #endif void Randomize() srand( (int)time(NULL) ); ,随机数库实现,int GenerateRandomNumber(int low, int high) double _d; if( low high ) PrintErrorMessage( FALSE, GenerateRandomNumber: Make sure low high ) PrintErrorMessage( FALSE, GenerateRandomReal: Make sure low = high.n ); _d

9、 = (double)rand() / (double)RAND_MAX + 1.0); return (low + _d * (high - low); ,随机数库测试,单独测试库的所有函数 合法参数时返回结果是否正确 非法参数时返回结果是否正确,即容错功能是否正常 联合测试 多次运行程序,查看生成的数据是否随机 测试整数与浮点数随机数是否均能正确工作,5.3 作用域与生存期,量的作用域与可见性 量的存储类与生存期 函数的作用域与生存期 声明与定义,量的作用域与可见性,作用域与可见性 作用域:标识符的有效范围 可见性:程序中某个位置是否可以使用某个标识符 标识符仅在其作用域内可见 位于作用域

10、内的标识符不一定可见 局部数据对象 定义于函数或复合语句块内部的数据对象(包括变量、常量与函数形式参数等) 局部数据对象具有块作用域,仅在定义它的块内有效 有效性从定义处开始直到该块结束 多个函数定义同名的数据对象是允许的,原因?,局部数据对象的作用域,int func( int x, int y ) int t; t = x + y; /* 单独出现的花括号对用于引入嵌套块 */ /* 允许在块中定义数据对象,作用域仅限本块 */ int n = 2; printf( n = %d.n, n ); return t; ,量的作用域与可见性,全局数据对象 定义于函数或复合语句块之外的数据对象

11、全局数据对象具有文件(全局)作用域,有效性从定义处开始直到本文件结束,其后函数都可直接使用 若包含全局数据对象定义的文件被其他文件包含,则其作用域扩展到宿主文件中,这可能会导致问题,为什么? 不要在头文件中定义全局数据对象! 函数原型作用域 定义在函数原型中的参数具有函数原型作用域,其有效性仅延续到此函数原型结束 函数原型中参数名称可以与函数实现中的不同,也可以省略,作用域与可见性示例,1int i;/* 全局变量 i 作用域开始,可见 */ 2int main() 3 4 int n;/* 局部变量 n 作用域开始,可见 */ 5 i = 10;/* 全局变量 i 有效且可见 */ 6 pr

12、intf( i = %2d; n = %2dn, i, n ); 7 n = func( i ); 8 printf( i = %2d; n = %2dn, i, n ); 9/* 局部变量 n 作用域结束,不再可见 */ 10int n;/* 全局变量 n 作用域开始,可见 */ 11int func( int x )/* 形式参数 x 作用域开始,可见 */ 12 13 i = 0;/* 全局变量 i 有效且可见 */ 14 printf( i = %2d; n = %2dn, i, n ); 15 n = 20;/* 全局变量 n 有效且可见 */ 16 /* 嵌套块开始 */ 17 i

13、nt i = n + x; /* 局部变量 i、x 有效可见;全局变量 n 有效可见;全局变量 i 有效不可见 */ 18 printf( i = %2d; n = %2dn, i, n ); 19 /* 局部变量 i 作用域结束,全局变量 i 有效且可见 */ 20 return +i; 21/* 局部变量 x 作用域结束,不再可见 */ 22/* 文件结束,全局变量 i、n 作用域结束 */,量的存储类与生存期,生存期:量在程序中存在的时间范围 C 使用存储类表示生存期 作用域表达量的空间特性,存储类表达量的时间特性 静态(全局)生存期 全局数据对象具有静态(全局)生存期 生死仅与程序是否

14、执行有关 自动(局部)生存期 局部数据对象具有自动(局部)生存期 生死仅与程序流程是否位于该块中有关 程序每次进入该块时就为该对象分配内存,退出该块时释放内存;两次进入该块时使用的不是同一个数据对象,static 关键字,修饰局部变量:静态局部变量 使局部变量具有静态生存期 程序退出该块时局部变量仍存在,并且下次进入该块时使用上一次的数据值 静态局部变量必须进行初始化 不改变量的作用域,仍具有块作用域,即只能在该块中访问,其他代码段不可见 修饰全局变量 使其作用域仅限定于本文件内部,其他文件不可见,静态局部变量示例,检查下述程序的输出结果,#include int func( int x );

15、 int main() int i; for( i = 1; i 4; i+ ) printf( Invoke func %d time(s): Return %d.n, i, func(i) ); return 0; int func( int x ) static int count = 0; /* 定义静态局部变量count,函数结束后仍存在 */ printf( x = %d.n, x ); return +count; ,函数的作用域与生存期,所有函数具有文件作用域与静态生存期 在程序每次执行时都存在,并且可以在函数原型或函数定义之后的任意位置调用 内部函数与外部函数 外部函数:可以

16、被其他文件中的函数所调用 内部函数:不可以被其他文件中的函数所调用 函数缺省时均为外部函数 内部函数定义:使用 static 关键字 内部函数示例:static int Transform( int x ); 内部函数示例:static int Transform( int x ) ,声明与定义,声明不是定义 定义在程序产生一个新实体 声明仅仅在程序中引入一个实体 函数的声明与定义 声明是给出函数原型,定义是给出函数实现代码 类型的声明与定义 产生新类型就是定义 类型定义示例:typedef enum _BOOL FALSE, TRUE BOOL; 不产生新类型就不是定义,而仅仅是声明 类型声明示例: enum _BOOL;,全局变量的作用域扩展,全局变量的定义不能出现在头文件中,只有其声明才可以出现在头文件中 声明格式:使用 extern 关键字 /* 库的头文件 */ /* 此处仅引入变量 a,其定义位于对应源文件中 */ extern int a; /* 变量 a 可导出,其他文

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号