北大裘宗燕《从问题到程序》第五章 C程序结构课件

上传人:我*** 文档编号:142936325 上传时间:2020-08-24 格式:PPT 页数:97 大小:192KB
返回 下载 相关 举报
北大裘宗燕《从问题到程序》第五章 C程序结构课件_第1页
第1页 / 共97页
北大裘宗燕《从问题到程序》第五章 C程序结构课件_第2页
第2页 / 共97页
北大裘宗燕《从问题到程序》第五章 C程序结构课件_第3页
第3页 / 共97页
北大裘宗燕《从问题到程序》第五章 C程序结构课件_第4页
第4页 / 共97页
北大裘宗燕《从问题到程序》第五章 C程序结构课件_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《北大裘宗燕《从问题到程序》第五章 C程序结构课件》由会员分享,可在线阅读,更多相关《北大裘宗燕《从问题到程序》第五章 C程序结构课件(97页珍藏版)》请在金锄头文库上搜索。

1、从问题到程序,裘宗燕 北京大学数学学院 2005年,第五章C程序结构,本章讨论与C程序整体结构有关的问题。 对正确理解C语言/正确书写C程序都很重要。是学习用C程序设计时应了解的“深层问题”。 有些叙述性内容,有些例子要推迟到后面章节。 建议在学习后面章节之后重读这章。,1)基本数值类型的全面介绍 2)函数与C程序结构,函数原型 3)变量类,作用域与存在期 4)预处理命令 5)字位运算符(特殊问题,只需初步了解),5.1 数值类型,实数类型:float,double,long double,实数类型外的算术类型都是整数类型。字符类型也看作整数类型,可以作为整数参加运算。 每一基本整数类型都有带

2、符号与无符号两种类型,用限定词signed或unsigned说明。 无符号类型的值大于等于0。 同一基本类型的带符号/无符号类型用同样长度编码。 signed可省略,如signed long简写为long。,字符类型:char,signed char,unsigned char 用一个字节表示,其中存字符编码。字符作为整数参加运算时直接用编码,依赖于编码方式。 ASCII字符集里数字(字母)字符的编码连续排列。,char等同于signed char或unsigned char(不同系统可能不同)。简单程序只用char,不需要关心有无符号。只有用char参加整数运算时才需要考虑。 有符号/无符号

3、字符不好理解。就是:参加整数运算时看作有符号整数还是无符号整数?,若字符编码在0-127内也不会有问题。 基本ASCII字符集的编码范围是0-127。,整数类型 基本:int,short int,long int 总共六个: intunsigned int shortunsigned short longunsigned long short int简写为short,long int简写long, unsigned int简写为unsigned short表示范围不大于int,long不小于int。无符号/有符号类型位数相同。具体表示由C语言系统确定。,基本类型是int,一般用计算机的字长表示

4、。 16位机器的C系统中,int通常用16位表示; 32位机器的C系统中,int通常用32位表示。,微机C系统情况复杂: 老系统16位int,8086字长,32位long,16位short 许多新系统用32位int和long,short用16位。,整数字面量可用十、八或十六进制写(加后缀)。 short无字面量写法。无符号数加后缀u或U:例: 123U,2987654LU,327LU,32014U,无符号整数的算术运算按取模方式做(不会溢出),超出表示范围时取模作为计算结果。 例:若16位unsignd范围为065535。计算超范围时取模65536。234U+65500U的计算结果是198U。

5、,混合类型运算前把小类型转换到大类型的值。 整数提升: 小整数(short、char等)先转为int值再运算。若转换结果超出int范围(unsigned short提升可能出问题),就提升为unsigned。,基本类型相同时,认为无符号类型是比同样的有符号类型更大的类型。例如做下面计算: 2365U + 18764 将先由18764(整型值)转换生成unsigned对应值,再用此新值参与运算。 若转换结果在相应类型里无法表示,结果没有定义。,基本数据类型的选择,C 语言提供多个浮点类型和整数类型,是供编程者选择使用。对于初学,这方面的选择不太重要。,如无特殊需要,浮点数总用double,因其精

6、度和范围能满足一般要求(float精度过低,long double可能低效,一般不用它们)。 如无特殊需要,整数总用int。int是C语言里最基本的类型,能得到硬件基本支持,其效率不会低于任何其他整数类型。有时用long类型。 如无特殊需要,字符总采用char。 尽量少用unsigned类型,除非服务于特殊目的。,5.2 函数和标准函数库,问题复杂使程序变长。大程序难开发/难阅读理解/难修改;修改时容易破坏完整性,难保证不引进新错误。 程序中常出现许多相同/类似片段。使程序更长,增加不同部分间的联系,损害可修改性。,处理复杂问题的基本方法: 将复杂事物分解为 较简单的部分,分别处理。 由各部分

7、的解构造出整个问题的解。 复杂概念在简单的基本概念的基础上定义。 证明复杂数学定理,常先证明一些引理。,为支持复杂程序开发,各种程序抽象机制被引进程序语言。使人能把程序片段抽象出来作为整体对待处理。 借助这些机制可控制复杂的程序结构,完成复杂的程序或软件系统。抽象机制也是程序结构的组织手段。,C只提供了计算过程的抽象机制,函数。其他语言把这类抽象机制分为 “函数”和“过程”两类。C统称为函数。 后有许多发展,如模块、类型定义、面向对象等。,编写大程序时应特别注意函数分解。 没有合理函数分解不可能完成复杂工作/多花时间/程序更难理解/错误更难发现和纠正。 开始就应强调好的编程习惯(包括函数分解)

8、。,函数的作用:把一段计算抽象出来,封装(包装)成独立实体。这种封装程序段称为函数定义。 定义后通过函数名就可以用简便方式要求执行该函数所封装的计算。这种描述片段称为函数调用。,函数抽象机制的意义: 重复片段可用唯一的函数定义和一些形式简单的函数调用取代,使程序更简短清晰 同样计算片段只描述一次,易于修改 函数定义和使用形成对复杂程序的分解。可独立考虑函数定义与使用,大大提高工作效率 具有独立逻辑意义的函数可看作高层基本操作,使人可站在合适的抽象层次上观察把握程序的意义,C语言的库函数 基本C语言很小,ANSI C定义了标准库,其中提供最常用的与平台无关的功能。 每个符合标准的C系统都提供了标

9、准库,通常还提供一些扩充库,以便使用特定硬件/特定系统的功能: DOS 上的C系统提供与DOS有关的功能函数 Windows上的系统提供与 Windows有关的函数 UNIX系统上的系统提供与UNIX接口的函数 扩充库不标准,使用扩充库的程序依赖于具体系统。,库函数实现常用计算,可按规定方式调用,不必自己实现/不必关心怎样实现。开发一次使所有用户受益。,标准库功能包括输入输出、文件操作、存储管理,其他如数学函数、数据转换函数等。有关介绍散布在各章,后面有详细介绍。 对具体C系统的扩充库可查阅系统联机帮助,或查阅有关手册、参考书籍。需要学习如何阅读。,下面介绍两组常用标准函数。,字符分类(),i

10、salpha(c)c是字母字符 isdigit(c)c是数字字符 isalnum(c)c是字母或数字字符 isspace(c)c是空格、制表符、换行符 isupper(c)c是大写字母 islower(c)c是小写字母 iscntrl(c)c是控制字符 isprint(c)c是可打印字符,包括空格 isgraph(c)c是可打印字符,不包括空格 isxdigit(c)c是十六进制数字字符 ispunct(c)c是标点符号 int tolower(int c)转为对应小写字母 int toupper(int c)转为对应大写字母,#include #include int main() int

11、c, cd = 0, cu = 0, cl = 0; while (c = getchar() != EOF) if (isdigit(c) +cd; if (isupper(c) +cu; if (islower(c) +cl; printf (digits: %dn, cd); printf (uppers: %dn, cu); printf (lowers: %dn, cl); return 0; ,用标准库函数完成判断比自己写条件更合适。,统计单词程序: #include #include int main () int count = 0, c; while (c = getchar

12、() != EOF) if (isspace(c) continue; +count; while (c = getchar() != EOF ,随机数生成函数 应用有时需要带随机性的计算: 程序调试:用数据做运行试验,随机数据非常合适。 计算机模拟:模拟实际情况/过程,探索规律性。客观事物变化有随机性。 为此需要生成随机数。 计算机只能生成 “伪随机数”。,常用方法是定义某种递推关系,设法使序列中的数比较具有随机性。最常用的是除余定义: a0 = Aan = (B an-1 + C) mod D A,B,D,C为常数,0AD。适当选择B、C可产生 0 到 D-1 的较好随机数列。 可以根据这

13、种关系定义随机数生成函数(后面讨论)。,使用标准库的随机数功能需要包含文件。 随机数生成函数:int rand(void) 无参数,得到0和符号常量 RAND_MAX 间的随机整数。 不同系统的RAND_MAX可能不同,为至少32767。 TURBO-C里的RAND_MAX是32767。,函数srand用seed值设种子值: void srand(unsigned seed) 默认初始种子值是1。rand根据当时种子值生成下一随机数并修改种子值。,下面程序先打印出由默认种子值出发的10个随机数,而后打印设定了新的种子值11后生成的10个随机数: #include #include int ma

14、in() int i; for (i = 0; i 10; +i) printf (%d , rand(); putchar(n); srand(11); for (i = 0; i 10; +i) printf (%d , rand(); putchar(n); return 0; ,5.3 函数定义和程序的函数分解,一个C程序主要是一系列的函数定义。函数定义形式: 返回值类型 函数名 参数表 函数体 函数头部:描述函数外部与函数内部的联系。 无返回值类型表明函数返回int值(新标准不允许)。应该总写返回类型。无返回值用void说明。 允许任意多个参数。无参函数用(void) (早期C语言对

15、ANSI C的影响),定义函数时可用()。,库函数有限,编写复杂程序时需要自己定义函数。,主函数main main的返回值规定为int。这个返回值在程序结束时送给外部。程序外部(如操作系统)可用这个值 一般用返回0表示程序正常结束,其他值表示出错 main以外的函数只有被调用时才会执行 不允许调用main,int main () /*一般写法*/ . . return 0; ,程序的函数分解,什么样的程序片段应该定义为函数: 重复出现的相同/相似计算片段,可设法抽取性定义为函数。可能缩短程序,提高可读性和易修改性。 长计算过程中有逻辑独立性的片段,即使出现一次也可定义为函数,以分解复杂性。,经

16、验原则:可以定义为函数的东西,就应该定义为函数;一个函数一般不超过一页。 往往存在很多可行的分解,寻找合理有效的分解是需要学习的东西。,实例研究:字符图形,写程序打印下面这类字符图形,最“简单”的方式:用一系列 putchar 调用打印星号和空格(数清字符个数,就可以写出程序)。,方法二:程序里写一系列printf调用。例: int main () /* 打印菱形 */ printf( * ); printf( * * ); printf( * * *); . . /* 下略 */ ,不好!每个程序需要写一组输出语句,很罗嗦,没意思,若要修改图形大小或形式,程序需全部重写 如果需要画出新图形,已做工作对新工作毫无价值,应考虑画这类图形的“基本动作”,定义为函数。,一种分析(存在许多合理分析): 需要画的图形比较规范,一行有两种情况:1)一段连续字符;2)在两个特定位置的字符。可考虑定义两个函数,其头部分别为: void line(int begi

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

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

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