1、21 世 纪 高 等 院 校 计 算 机 系 列 教 材C 语言与程序设计主 编:韩 海 桂 超 副主编:邓 鸣 李 祥华 中 科 技 大 学 出 版 社内 容 简 介随 着 计 算 机 的 发 展 和 普 及 , 掌 握 计 算 机 知 识 、 应 用 计 算 机 解 决 实 际 问 题 无 疑 是 培 养 新 型 人 才 的 一 个 重 要 环 节 。 C 语 言 是 目 前 国 内 外 普 遍 使 用 的 一 种 计 算 机 语 言 , 具 有 广 泛 的 代 表性,因此 C 语言往往作为学习程序设计的第一门课程,是进一步学习其他软件编程知识 的基础。本书针对初学者的特点,精心策划,从计
2、算机基础知识出发,由浅入深地介绍 C 语言 的语法知识。 前两章简要介绍计算机的基本知识, 以及 C 语言编程的系统环境和操作过程, 作为学习的铺垫; 第 3 章至第 7 章讲述 C 语言的基本概念 、 程序的基本结构和数组的操作; 第 8 章介绍程序调试的概念和基本方法,让学习者具备查错、纠错的能力;第 9 章至第 11章是提高部分,讲述指针、函数、结构体及链表等较深入的内容;第 12 章和第 13 章讲述 文件、预处理和位运算的有关知识。本 书 内 容 全 面 、 结 构 合 理 、 逻 辑 性 强 , 可 以 作 为 高 等 学 校 计 算 机 专 业 的 教 材 ; 本 书 语 言流畅
3、,内容深入浅出,以日常生活中的实例讲解 C 语言相应的处理方法,也是自学者的 理想参考书。前 言自从现代电子计算机在 1946 年 诞 生 以 来 , 计 算 机 在 人 类 的 日 常 生 活 中 扮 演 着 越 来 越 重 要 的 角 色 , 把 计 算 机 应 用 于 解 决 实 际 生 活 问 题 也 逐 渐 成 为 现 代 人 生 活 中 的 一 项 重 要 技 能 。 掌 握 计 算 机 的 基 本 知 识 和 使 用 技 能 , 学 习 用 计 算 机 语 言 编 写 小 型 应 用 软 件 , 进 而 较 深 入 地 学习和运用计算机知识是驾驭计算机的几个重要阶段。计 算 机
4、语 言 经 历 了 从 低 级 到 高 级 的 多 个 发 展 阶 段 。 在 众 多 的 计 算 机 语 言 中 , C 语言以 其 灵 活 性 和 实 用 性 受 到 广 大 计 算 机 应 用 人 员 的 喜 爱 。 当 今 流 行 的 Windows、 Unix、 Linux 等 各种操作系统都支持以 C 语言进行软件开发。本书的编者都是长期从事于计算机教学的专业教师。 从多年 的教学经验中我们体会到 C 语言作为学习计算机程序设计的第一门基础课,不仅要学习 C 语言的基本语法,更重要的 是 领 会 过 程 式 程 序 设 计 的 思 想 , 为 进 一 步 学 习 面 向 对 象 的
5、 程 序 设 计 打 好 基 础 。 因 此 我 们 在 编写本书时,力求把 C 语言语法知识和程序设计的思想有机结合在一起,以前者为手段, 以后者为目的。在讲述 C 语言的重要语法时,多数都结合日常生活中的实例进行讲解,使 读 者 易 于 理 解 和 掌 握 。 本 书 内 容 深 入 浅 出 , 结 构 合 理 , 逻 辑 性 强 , 即 使 是 初 学 者 , 读 懂 本 书亦非难事。在参考目前已出版的各种 C 语言教材的基础上 , 我们对各个知识点进行了适当的处理。 一方面,弱化了 printf 和 scanf 等输入输出方法中过于繁杂的格式规定,仅保留基本的输入 输 出 手 段 ;
6、对 于 指 向 函 数 的 指 针 等 不 太 常 用 的 章 节 仅 作 简 单 介 绍 。 另 一 方 面 , 详 细 描 述 了 函 数 调 用 过 程 (包 括 递 归 的 实 现 过 程 ); 明 确 提 出 了 二 级 指 针 的 概 念 ; 加 强 了 关 于 链 表 基 本 操 作 方 法 的 内 容 ; 把 一 些 经 典 的 问 题 作 为 例 题 讲 解 , 所 选 例 题 具 有 较 好 的 代 表 性 和 趣 味 性 , 如 “水 仙 花 数 ”、 “验 证 哥 德 巴 赫 猜 想 ”、 “杨 辉 三 角 形 ”、 “奇 幻 方 ”等 。 为 了 配 合 相 关 章
7、节 的 学 习 , 本 书 每 一 章 都 配 有 丰 富 的 习 题 , 而 且 习 题 与 知 识 点 联 系 紧 密 , 以 巩 固 读 者 的 学 习 效果。本书由韩海和桂超主编,第 1 章和第 6 章由邓鸣编写,第 2 章和第 3 章由李祥编写,第 4 章、第 5 章、第 12 章和第 13 章由桂超编写,第 7 章至第 11 章由韩海编写。 本 书 在 编 写 过 程 中 还 得 到 了 江 汉 大 学 数 学 和 计 算 机 科 学 学 院 以 及 湖 北 经 济 学 院 教 师 们的大力支持,谨在此表示衷心感谢。 由于编者水平有限,书中难免有错漏之处,敬请广大读者批评指正。编
8、者2005 年 1 月于武汉目 录第 1 章 计 算 机 基 础 知 识 . (1)1.1 数 制 及 相 互 转 换 (1)1.1.1 数制 (1)1.1.2 十 进 制 数 转 换 成 其 他 进 制 数 (2)1.1.3 非 十 进 制 数 转 换 成 十 进 制 数 (3)1.1.4 二进制数与十六进制数相互转换. (3)1.1.5 数 的 书 写 方 法 (4)1.2 计 算 机 系 统 (5)1.2.1 计 算 机 系 统 的 组 成 (5)1.2.2 内 部 存 储 器 (6)1.3 数据在计算机中的存储. (7)1.3.1 在 内 存 中 存 储 字 符 (7)1.3.2 在
9、内 存 中 存 储 整 数 (8)1.3.3 在 内 存 中 存 储 实 数 (9)本章要点 . (9)习题 1 (10)第 2 章 C 语言概述. (11)2.1 计 算 机 语 言 (11)2.2 C 语言的发展与特点. (13)2.3 C 语言的工作环境. (14)2.4 最简单的 C 程序 (17)2.5 流程图 (19)本章要点 . (20)习题 2 (21)第 3 章 常 量 、 变 量 、 表 达 式 (22)3.1 数据类型 (22)3.2 常量 (23)3.2.1 字 符 常 量 (23)3.2.2 整 型 常 量 (24)3.2.3 实 型 常 量 (24)3.2.4 字
10、符 串 常 量 (25)3.3 变量 (25)3.3.1 变 量 的 定 义 (25)3.3.2 变 量 的 初 始 化 (26)3.4 运 算 符 与 表 达 式 (27)2 C 语言与程序设计3.4.1 算 术 运 算 符 (27)3.4.2 自 增 和 自 减 运 算 符 (28)3.4.3 数 据 类 型 的 自 动 转 换 (29)3.4.4 赋 值 运 算 符 (29)3.4.5 复 合 赋 值 运 算 符 (30)3.4.6 强 制 类 型 转 换 运 算 符 (30)3.4.7 圆括号 (31)3.4.8 字 节 数 运 算 符 sizeof (32)3.5 常 用 的 数 学
11、 函 数 (32)3.6 广 义 表 达 式 (33)3.6.1 逗 号 表 达 式 (33)3.6.2 条 件 表 达 式 (问 号 表 达 式 ) (34)3.7 表 达 式 应 用 举 例 (34)本章要点 . (35)习题 3 (35)第 4 章 顺序结构程序设计. (37)4.1 顺 序 执 行 语 句 (37)4.1.1 表 达 式 语 句 (38)4.1.2 函 数 调 用 语 句 (38)4.1.3 C 语言程序的一般结构及书写规则 . (38)4.1.4 复 合 语 句 (39)4.2 标 准 输 入 /输 出 函 数 . (40)4.2.1 字 符 的 输 入 /输 出 函
12、 数 getchar( )/putchar( ) (40)4.2.2* 字 符 串 的 输 入 /输 出 函 数 gets( )/puts( ) (41)4.2.3 格 式 化 输 入 /输 出 函 数 scanf( )/printf( ) (42) 本章要点 . (48)习题 4 (48)第 5 章 分支结构程序设计. (50)5.1 关系运算符和关系表达式. (50)5.1.1 关 系 运 算 符 (50)5.1.2 关 系 表 达 式 (51)5.2 逻辑运算符和逻辑表达式. (51)5.2.1 逻 辑 运 算 符 (51)5.2.2 逻 辑 表 达 式 (52)5.3 if 语句 .
13、(53)5.3.1 简单 if 语句 (53)5.3.2 标准 if 语句 (54)5.3.3 复合的 if 语句 (56)5.4 switch 和 break 语句 (58)目 录 III本章要点 . (60)习题 5 (60)第 6 章 循 环 结 构 . (62)6.1 循 环 是 相 似 重 复 (62)6.1.1 重 复 是 完 成 工 作 的 重 要 方 法 (62)6.1.2 对 重 复 操 作 进 行 控 制 (63)6.2 for 语句控制的循环. (64)6.2.1 for 语句的基本格式. (64)6.2.2 用 for 语句控制计数 (67)6.2.3 for 语句的几
14、种特殊用法. (69)6.3 while 语句控制的循环 . (72)6.3.1 用 while 控制循环 . (72)6.3.2 while 循 环 与 for 循环的比较 (74)6.4 do while 语句控制的循环 . (76)6.5 break 和 continue 语句. (78)6.5.1 break 语句 (78)6.5.2 continue 语句 . (80)6.6 循 环 的 典 型 应 用 (81)6.6.1 有 关 数 列 的 计 算 类 问 题 (81)6.6.2 其 他 计 算 问 题 (84)6.6.3 完 全 性 问 题 (85)6.6.4 存 在 性 问 题
15、 (86)6.7 循环嵌套 (87)6.7.1 基 本 概 念 (87)6.7.2 应 用 举 例 (89)本章要点 . (92)习题 6 (92)第 7 章 数 组 (95)7.1 数 组 变 量 与 存 储 分 配 . (95)7.1.1 定 义 数 组 变 量 (95)7.1.2 数 组 变 量 的 存 储 分 配 (97)7.1.3 数 组 变 量 的 初 值 (98)7.2 使 用 数 组 元 素 (99)7.2.1 赋 值 和 取 值 (99)7.2.2 数 组 的 典 型 应 用 (101)7.3 二维数组 (105)7.3.1 二 维 数 组 的 基 本 概 念 (105)7.
16、3.2 二 维 数 组 的 应 用 (107)7.3.3 多 维 数 组 .(111)4 C 语言与程序设计7.4 字 符 数 组 与 字 符 串 (112)7.4.1 基 本 概 念 (112)7.4.2 字 符 串 的 相 关 操 作 (113)7.4.3 处 理 字 符 串 的 系 统 工 具 (116)7.4.4 应 用 示 例 (119)本章要点 . (120)习题 7 (121)第 8 章 调 试 程 序 . (125)8.1 程 序 出 错 与 处 理 方 法 . (125)8.1.1 语 法 错 误 (125)8.1.2 逻 辑 错 误 (127)8.2 在 TC 3.0 环境
17、下调试程序 (127)8.2.1 TC 3.0 集成环境中的调试工具 (127)8.2.2 调 试 示 例 (129)本章要点 . (133)习题 8 (134)第 9 章 指 针 (137)9.1 指 针 的 基 本 概 念 (137)9.1.1 变 量 名 和 变 量 的 地 址 (137)9.1.2 存 放 内 存 地 址 的 变 量 (138)9.1.3 指 针 与 指 针 变 量 (139)9.1.4 定 义 指 针 类 型 标 识 符 (140)9.2 指 针 的 基 本 用 法 (141)9.2.1 建 立 指 向 关 系 (142)9.2.2 间 接 访 问 变 量 (142)
18、9.2.3 用 指 针 作 为 系 统 工 具 的 参 数 (144)9.3 指 向 数 组 元 素 的 指 针 . (145)9.3.1 指 针 表 达 式 (146)9.3.2 与 指 针 有 关 的 运 算 (149)9.3.3 用 指 针 变 量 扫 描 数 组 (150)9.4 指针数组 (153)9.4.1 定 义 指 针 数 组 (153)9.4.2 指 针 数 组 的 应 用 (153)9.5 二级指针 (155)9.5.1 指 向 指 针 变 量 的 指 针 (155)9.5.2 指 向 数 组 的 指 针 (157)9.5.3 指 向 数 组 的 二 级 指 针 变 量 (
19、159)本章要点 . (160)习题 9 (161)目 录 5第 10 章 函数 (164)10.1 函 数 的 基 本 概 念 (164)10.1.1 函 数 定 义 (164)10.1.2 函 数 调 用 (165)10.1.3 库 函 数 与 头 文 件 (166)10.1.4 函 数 分 类 (167)10.2 自定义函 数及其调用 . (168)10.2.1 定 义 函 数 的 方 法 (168)10.2.2 调 用 自 定 义 函 数 (171)10.3 函 数 调 用 过 程 (173)10.3.1 main 函 数 . (174)10.3.2 函 数 调 用 规 则 (174)
20、10.3.3 函 数 调 用 与 返 回 (175)10.3.4 函 数 的 嵌 套 调 用 (178)10.4 变 量 的 类 别 (179)10.4.1 变 量 的 存 储 类 别 (180)10.4.2 全 局 变 量 和 局 部 变 量 (182)10.5 函 数 的 递 归 调 用 (187)10.5.1 问 题 分 解 与 解 的 合 成 (188)10.5.2 递 归 函 数 及 调 用 过 程 (189)10.5.3 汉 诺 塔 问 题 (192)10.6 与 函 数 有 关 的 指 针 (195)10.6.1 指 针 作 为 函 数 的 参 数 (195)10.6.2 返 回
21、 指 针 的 函 数 (200)10.6.3 指 向 函 数 的 指 针 (201)10.7 模 块 化 编 程 (203)10.7.1 运 行 多 文 件 的 程 序 (204)10.7.2 用 extern 声明外部函数和外部变量. (204)本章要点 . (206)习题 10 (206)第 11 章 结 构 体 . (209)11.1 在内存中存放二维表数据. (209)11.1.1 把一列数据集中存放数组. (209)11.1.2 把 一 行 数 据 集 中 存 放 . (210)11.2 结构体变量 (211)11.2.1 定 义 结 构 体 类 型 (211)11.2.2 定 义
22、结 构 体 变 量 (212)11.2.3 结 构 体 变 量 的 初 值 (215)11.2.4 访 问 结 构 体 变 量 (215)6 C 语言与程序设计VI C 语言与程序设计11.2.5 结 构 体 的 嵌 套 (217)11.3 结构体数组 (218)11.4 指向结构体的指针. (219)11.4.1 指 向 结 构 体 的 指 针 和 指 向 结 构 体 的 域 的 指 针 . (219)11.4.2 用 结 构 体 或 者 指 向 结 构 体 的 指 针 在 函 数 间 传 递 数 据 . (222)11.5 链表 (225)11.5.1 动 态 内 存 分 配 (225)1
23、1.5.2 结构体中含有指向结构体的指针域. (226)11.5.3 建 立 链 表 (227)11.5.4 插 入 节 点 (230)11.5.5 遍 历 链 表 (232)11.5.6 删 除 节 点 (233)11.5.7 关于链表操作的自定义函数. (235)11.6 复杂的链式结构. (239)11.7 共用体 (240)本章要点 . (242)习题 11 (243)第 12 章 文件 (245)12.1 文 件 和 文 件 指 针 (245)12.1.1 文 件 的 概 念 (245)12.1.2 文 件 操 作 的 基 本 过 程 (246)12.1.3 文 件 的 结 构 体
24、指 针 (247)12.2 文 件 的 打 开 和 关 闭 (247)12.2.1 文 件 打 开 函 数 fopen( ) . (247)12.2.2 文 件 关 闭 函 数 fclose( ). (249)12.3 C 语言处理的文件类型 . (249)12.4 文件操作 (250)12.4.1 文件记录指针的顺序定位操作. (250)12.4.2 文件记录指针的随机定位操作. (253)本章要点 . (256)习题 12 (256)第 13 章 C 语言的预处理命令和位运算 . (258)13.1 C 语言的预处理命令. (258)13.1.1 #define (258)13.1.2 #
25、include (260)13.1.3 #error (261)13.1.4 条 件 编 译 预 处 理 命 令 #if、 #else、 #endif (261)13.1.5 #ifdef (262)13.1.6 #ifndef (263)目 录 713.1.7 #undef 命令 . (263)13.2 位运算 (264)13.2.1 正负整型数在计算机内的表示方法. (264)13.2.2 位 运 算 符 及 表 达 式 (264)本章要点 . (266)习题 13 (266)附录. (267) 附录 1 字符与 ASCII 对照表 (267)附录 2 运算符优先级与结合性. (268)附
26、录 3 C 语言的语法规则提要 . (268)附录 4 常用库函数 (273)参考文献 (276)8 C 语言与程序设计第 1 章 计 算 机 基 础 知 识从 古 老 的 结 绳 计 数 到 中 国 人 引 以 自 豪 的 算 盘 , 计 算 工 具 伴 随 着 人 类 文 明 的 发 展 在 不 断 更新。 1946 年第一台电子计算机 ENIAC 的诞生, 标志着计算工具的质的飞跃。 电子计算机 不仅可以高速完成大量计算任务,而且可以进行存储、统计、分类等数据管理工作。现 代 电 子 计 算 机 除 了 能 够 存 放 数 据 之 外 , 一 个 重 要 特 征 是 存 储 程 序 ,
27、人 们 可 以 把 一 连 串 的 操 作 命 令 和 数 据 一 起 存 放 到 计 算 机 中 , 然 后 命 令 计 算 机 连 续 完 成 这 些 操 作 步 骤 , 对 相 应 的 数 据 进 行 处 理 。 人 们 用 计 算 机 能 够 识 别 的 形 式 编 排 各 个 操 作 步 骤 , 即 称 之 为 计 算 机 程 序,无论是程序还是数据,在计算机中都是以二进制形式存储的。1.1 数 制 及 相 互 转 换人 们 在 日 常 生 活 中 每 天 都 要 与 数 打 交 道 , 通 常 书 写 的 数 是 十 进 制 数 , 而 计 算 机 内 部 使 用的是由 0 和 1
28、 两种符号构成的二进制数。二进制数在书写时过于冗长、容易出错,所以 在 计 算 机 领 域 还 经 常 使 用 八 进 制 数 和 十 六 进 制 数 。 同 一 个 数 值 可 以 用 不 同 的 数 制 书 写 , 不 同数制之间可以相互转换。在此将仅说明正整数在不同数制间的转换方法。1.1.1 数制描 述 一 个 数 制 需 要 说 明 三 个 方 面 的 问 题 : 有 哪 些 计 数 符 号 、 每 个 数 位 代 表 的 含 义 和 基 本的计数规则。1 计 数 符 号 书 写 数 据 必 然 使 用 各 种 符 号 , 某 一 数 制 所 有 计 数 符 号 构 成 的 集 合
29、称 作 该 数 制 的 数 符 集 。k 进制的数符集包含 k 个符号。比如:二进制数符集当中只有两个符号 0 和 1; 八进制数符集当中有 8 个符号 0, 1, 2, 3, 4, 5, 6 和 7;十进制数符集当中有 10 个符号 0, 1, 2, 3, 4, 5, 6, 7, 8 和 9; 十六进制数符集当中有 16 个符号 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E和 F。各 个 计 数 符 号 是 有 顺 序 的 , 二 进 制 、 八 进 制 和 十 进 制 的 每 个 计 数 符 号 就 是 它 的 序 号 值 , 十六进制的后 6 个
30、计数符号的序号值依次是 10, 11, 12, 13, 14 和 15。C 语言与程序设计21 3 76 82 3 42 1 72 82 42 211 5 7 8 56 9 8 616 6 132 基 数 和 权如果用 k 进制书写一个整数 anan-1 a1a0, 从右 往左把每一位依次记作第 0 位、 第 1 位第 n 位,则第 i 位上的数符 ai 所代表的含义是 aiki。 k 称 为 这 个 数 制 的 基 数 , ki 称 为 k 进 制数第 i 位 的 权 。 个 位 、 十 位 、 百 位 是 十 进 制 各 个 数 位 上 的 权 特 有 的 名 称 , 相 应 的 权 是
31、100、 101、 1023 计 数 规 则简单地说,k 进制数的计数规则就是“逢 k 进 1, 借 1 当 k”。1.1.2 十进制数转换成其他进制数短除法是把十进制正整数转换成二进制数的常用方法。 把十进制数连续除以 2, 直到商 是 0 为止, 记录每次的余数 , 没有余数则记余数为 0。 以记录余数的相反次序依次写出各个 余数,结果就是相应的二进制数。【例 1.1】 把十进制数 137 转换成二进制数。2 12 0 0 书 1 写 0 方 0 向 02 10把 每 次 得 到 的 余 数 按 由 下 往 上 的 次 序 写 出 , 可 知 与 十 进 制 数 137 等 值 的 二 进
32、 制 数 是10001001。短 除 法 不 仅 用 于 十 进 制 到 二 进 制 的 转 换 , 也 用 于 十 进 制 数 转 换 成 其 他 进 制 数 。 十 进 制 数转换成八进制或者十六进制的方法与转换成二进制的方法相同,只是除数分别是 8 和 16而已。在转换成十六进制时还需要把大于 9 的余数写成相应的十六进制数符。【例 1.2】 把十进制数 15785 转换成十六进制数。16 9 书1 10 写13 方16 3 向010 对应的十六进制数符是 A, 13 对应 D。 所 以 , 与 十 进 制 数 15785 等值的十六进制数 是 3DA9。第 1 章 计算机基础知识 31
33、.1.3 非十进制数转换成十进制数用 k 进制书写的一个数 anan-1 a1a0, 其 含 义 是 : ankn+an-1kn-1+ +a1k1+a0k0把 二 进 制 数 (或 者 八 进 制 数 )转 换 成 十 进 制 只 需 要 以 2(或 者 8)代 替 式 中 的 k, 然 后 用 十 进 制 计算规则计算出结果即可。对于十六进制数,如果数中含有 A 到 F 的数符,则先依照计数 符号的次序把它们转换成相应的十进制数,然后再进行计算。【例 1.3】 把二进制数 1111001101 转换成十进制数。129+128+127+126+025+024+123+122+021+120=
34、512+256+128+64+8+4+1= 973【例 1.4】 把十六进制数 A1B2 转换成十进制数。10163+1162+11161+2160= 40960+256+176+2= 413941.1.4 二进制数与十六进制数相互转换如果要把一个 k 进制数转换成 r 进制(k 10 , r 10), 一般是以十进制数作为中间过渡。 先把 k 进制数转换成十进制, 再把等值的十进制数转换成 r 进制。 但是, 在二进制和十六进 制之间存在非常简便的转换方法,不需要做两次转换。二进制数转换成十六进制的具体方法是:(1) 把二进制数自右向左每 4 位分成一组,最左边一组若不足 4 位则左补 0;
35、(2) 把每组 4 位的二进制数转换成 1 位十六进制数;(3) 按从左到右的次序写出转换结果。【例 1.5】 把二进制数 101100110101111 转换成十六进制。 分组,左补一个 0: 0101, 1001, 1010, 1111转换: 5 9 A F所以,等值的十六进制数是 59AF。 十六进制数转换成二进制更简单,只需从左到右把每位十六进制数符写成相应的 4 位二进制数,不足 4 位则左补 0 凑齐 4 位,并把结果写在一起即可。【例 1.6】 把十六进制数 36D 转换成二进制。等值的二进制数是 001101101101, 去 掉 最 左 边 的 0, 得 1101101101
36、。 二 进 制 数 与 八 进 制 数 之 间 也 存 在 类 似 的 转 换 方 法 。 二 进 制 数 转 换 成 八 进 制 数 只 要 把 上述 二 进 制 数 转 换 成 十 六 进 制 的 方 法 中 的 “4 位 一 组 ”改 成 “3 位 一 组 ”即 可 。 八 进 制 转 换 成 二进制也只需要把每一位八进制数符写成相应的 3 位二进制数,不足 3 位则左补 0 凑齐 3C 语言与程序设计4位,并把结果写在一起。 由 于 二 进 制 与 十 六 进 制 、 二 进 制 与 八 进 制 之 间 存 在 非 常 简 便 的 转 换 关 系 , 因 此 八 进 制数与十六进制数之
37、间进行转换时通常用二进制作为过渡。表 1.1 列出了 0 到 15 之间的十进 制数在二进制、八进制和十六进制下的对应值。表 1.1 0到 15在 各 数 制 下 的 表 示十进制 二进制 八进制 十六进制 十进制 二进制 八进制 十六进制0 0000 00 0 8 1000 10 81 0001 01 1 9 1001 11 92 0010 02 2 10 1010 12 A3 0011 03 3 11 1011 13 B4 0100 04 4 12 1100 14 C5 0101 05 5 13 1101 15 D6 0110 06 6 14 1110 16 E7 0111 07 7 15
38、 1111 17 F1.1.5 数的书写方法多 种 数 制 并 存 时 , 有 些 情 况 下 写 出 一 个 数 无 法 分 辨 到 底 是 使 用 的 哪 一 种 数 制 , 也 就 不 能准确把握数值究竟是多少,比如 1011。 为 此 , 需 要 在 书 写 形 式 上 加 以 区 分 。 书 写 方 法 有 三种:下标法、前导法和后缀法。C 语言采用前导法。1 下 标 法 下 标 法 是 日 常 使 用 的 一 种 书 写 方 法 , 是 在 写 完 表 示 数 值 的 符 号 序 列 之 后 , 在 右 下 角 以角标的形式写上所使用的数制的基数。比如:10012 表示二进制数 1
39、001;3778 表示八进制数 377;37716 表示十六进制数 377。2 前 导 法前导法是在数的前面加上特定的符号以区分不同的数制。C 语言使用前导法,十六进 制数的前导符号是 0x, 八 进 制 数 的 前 导 符 号 是 0。 十 六 进 制 数 123 在 C 语言中写作 0x123, 八进制数 123 在 C 语言中写作 0123。 注 意 , 123 和 0123 在 C 语言中是不相等的。3 后 缀 法 与 前 导 法 相 反 的 做 法 , 是 在 数 的 后 面 加 一 个 特 殊 的 符 号 表 示 数 制 。 汇 编 语 言 采 用 后 缀法,比如十六进制数 123
40、 在汇编语言中写作 123H。编写程序时绝大多数情况下都用十进制,十进制数在 C 语言中直接写出,不需要加任第 1 章 计算机基础知识 5何前导符号。虽然在用 C 语言编写程序时很少使用二进制、八进制、十六进制,但掌握了 二进制数可以更好地理解数据在计算机中的存储方法。1.2 计 算 机 系 统1.2.1 计算机系统的组成计算机系统由硬件系统和软件系统两大部分组成, 每一部分 又可以再进行更细的划分。 图 1.1 描 述 了 计 算 机 系 统 的 各 个 组 成 部 分 , 其 中 的 内 部 存 储 器 (简 称 内 存 )将 在 1.2.2 节详细 介绍。计 硬件系统 算机主 机外部设备
41、CPU内部存储器 输入设备 输出设备运算器 控制器 寄存器组系统软件系统系统软件 应用软件外部存储设备图 1.1 计算机系统的组成1 CPUCPU 是英文 Central Processing Unit 的缩写,其中文翻译是“中央处理器”或“中央处 理 单 元 ”。 CPU 是 计 算 机 的 核 心 部 件 , 被 形 象 地 称 为 计 算 机 的 “大 脑 ”。 CPU 中的运算器 又 称 算 术 逻 辑 单 元 (Arithmetic and Logic Unit, 简 记 作 ALU), 负 责 完 成 各 种 计 算 任 务 , 包 括加、减、乘、除等算术运算和与、或、非等逻辑运算
42、。控 制 器 (Control Unit)是 计 算 机 的 控 制 核 心 , 它 负 责 产 生 各 种 控 制 信 号 指 挥 各 部 件 协 同 工 作 。 CPU 中 还 有 一 组 寄 存 器 (Register), 这 是 计 算 机 中 速 度 最 快 的 数 据 存 储 部 件 , 但 容 量 很小。集 成 在 一 片 集 成 电 路 (Integrated Circuit, 简 记 做 IC)上 的 CPU 又称为 MPU(微 处 理 器 , Micro Processing Unit), 从 8086、 80286 到 80386、 80486、 “奔 腾 ”, 是 In
43、tel 公司在各个不同时期生产的具有代表性的 MPU, 以 MPU 为核心制造出的计算机称为微型计算机,由 于其体积小,一般仅限于一个人使用,又被形象地称为“个人电脑”。衡量一个 CPU 好坏的重要指标是运算速度和字长。 运算速度一般用每秒执行多少次基 本 运 算 (比 如 加 法 运 算 )表 示 , 当 今 的 个 人 电 脑 运 算 速 度 已 达 3 G 以上,超过每秒 30 亿次。C 语言与程序设计6字长是运算器的二进制位数,当今流行的个人电脑是 32 位机,一次能够进行最多 32 位二进制数的运算,当然它也能完成 8 位二进制数或者 16 位二进制数的运算。2 外 部 设 备计算机
44、主机由 CPU 与内部存储器构成。把数据送入计算机内部的设备称为输入设备, 典 型 的 输 入 设 备 有 键 盘 、 鼠 标 等 。 计 算 机 对 数 据 进 行 处 理 的 结 果 往 往 通 过 输 出 设 备 送 到 计 算 机 外 部 供 人 们 使 用 , 典 型 的 输 出 设 备 有 显 示 器 、 打 印 机 等 。 用 于 长 期 、 大 量 存 储 数 据 的 是 计 算 机 的 外 部 存 储 器 (简 称 外 存 ), 常 用 的 外 存 有 磁 盘 、 光 盘 等 。3 软 件 系 统 计 算 机 的 程 序 和 数 据 统 称 为 软 件 , 计 算 机 的 硬
45、 件 设 备 必 须 在 程 序 的 命 令 、 控 制 之 下 才能 工 作 , 没 有 软 件 的 计 算 机 硬 件 系 统 称 为 裸 机 。 软 件 系 统 中 用 于 解 决 日 常 生 活 中 实 际 问 题的是应用软件,应用软件品种繁多,包括办公软件、辅助设计(CAD)、辅助制造(CAM)、 辅 助 教 学 (CAI)等 。用于计算机自身管理的是系统软件, 最典型的系统软件是操作系统(O perating System), 它 是 控 制 、 调 度 、 管 理 计 算 机 的 大 型 软 件 , 比 如 Windows 操 作 系 统 、 Unix 操 作 系 统 。 系 统
46、 软 件 中 还 包 括 一 类 特 殊 的 翻 译 工 具 , 它 用 来 把 人 们 编 写 的 计 算 机 程 序 翻 译 成 计 算 机 可 识 别 的二进制代码。1.2.2 内部存储器内 存 是 计 算 机 内 部 的 存 储 设 备 , 存 放 在 磁 盘 上 的 程 序 要 在 调 入 内 存 后 才 能 被 执 行 , 数 据也通常先存放到内存中才能被 CPU 读取并处理。 内存的速度与 CPU 相匹配, 比外存快得 多。无论是程序还是数据, 在计算机的存储设备上都是以二进制数的形式存放。 存储元(b it) 是存储器的最小单位, 它能存放一个二进制的 0 或者 1。 单个存储
47、元能够存放的信息量实在 太 小 , 当 今 的 计 算 机 在 组 织 存 储 器 时 都 是 把 8 个 存 储 元 联 合 在 一 起 使 用 , 称 为 一 个 字 节 (byte)。字 节 是 存 储 器 的 基 本 单 位 , 存 储 器 的 容 量 都 是 以 字 节 表 示 的 。 通 常 所 说 的 “内 存M”、 “硬 盘 G”都 是 省 略 说 法 , 完 整 的 形 式 是 “内 存 容 量 是 MB”、 “硬 盘 容 量 是GB”, 其中的 B 就是字节, 而 M、 G 表示数值大小, 还有一个表示数值大小的字母是 K, 它们的关系为:1 G=1 024 M , 1 M
48、=1 024 K , 1 K=1 024 B内 存 是 存 放 正 在 执 行 的 程 序 及 其 所 用 数 据 的 地 方 。 程 序 执 行 过 程 中 CPU 需要不停地与 内 存 交 换 信 息 , 从 内 存 中 读 取 下 一 条 指 令 和 数 据 , 完 成 指 定 的 操 作 后 再 把 结 果 存 放 到 内 存 中。CPU 无论是从内存中读取数据还是把数据写往内存,都必须明确指出是内存的哪一个 字节,区分“这个字节”与“那个字节”的方法是对所有内存字节进行编号。编号的方式是用非负整数从 0 编 起 逐 个 编 排 。 每 一 个 内 存 字 节 在 计 算 机 中 都 有 惟 一 的第 1 章 计算机基础知识 725480684376118编 号 , 这 个 编 号 就 是 内 存 地 址 。 图 1.2 是一台内存为 256 MB 的 计 算 机 的 内 存 示 意 图 , 每 一 个 方 框 代 表 内 存 的 一 个 字 节 , 方 框 内 的