描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787300196947
内容简介
本书融合了程序设计基础知识、程序中的数据组织、程序的控制结构和程序设计中的常用方法,以循序渐进、深入浅出、突出实践的方式,为学生展开程序设计基础知识、程序的基本控制结构、程序的数据组织形式、算法设计中的基本方法以及结构化程序设计技术和方法等内容。
存储结构分别采用具有丰富数据类型与良好结构的类PASCAL语言和较流行的C语言进行描述;算法采用结构化流程图(N-S图)进行描述;主要算法以C语言实现;给出算法执行示例。书中配有大量的实例和图示,每章都有丰富练习题和课程设计,旨在提高学生程序设计能力和培养学生计算思维能力。
存储结构分别采用具有丰富数据类型与良好结构的类PASCAL语言和较流行的C语言进行描述;算法采用结构化流程图(N-S图)进行描述;主要算法以C语言实现;给出算法执行示例。书中配有大量的实例和图示,每章都有丰富练习题和课程设计,旨在提高学生程序设计能力和培养学生计算思维能力。
目 录
第1章 绪 论
1.1 计算学科
1.1.1 计算学科的根本问题
1.1.2 计算学科的基本特征
1.2 计算思维
1.2.1 计算思维的概念
1.2.2 计算思维的6个特征
1.2.3 计算思维的本质
1.3 程序=数据结构+算法
1.3.1 程序
1.3.2 什么是数据结构
1.3.3 什么是算法
1.4 程序设计=数据结构+算法+程序设计方法
1.4.1 程序设计
1.4.2 程序设计方法学
1.5 语言工具和环境
1.5.1 程序设计语言
1.5.2 程序设计范型
1.5.3 程序设计语言的语法元素及其元素功能
1.5.4 编程环境和程序运行
1.6 程序设计步骤与程序设计风格
1.6.1 程序设计步骤
1.6.2 程序设计风格
1.7 算法设计与分析
1.7.1 算法描述
1.7.2 算法设计举例
1.7.3 算法设计要求
1.7.4 算法分析
1.8 课程设计相关知识
1.8.1 课程设计目的与内涵
1.8.2 课程设计步骤
1.8.3 课程设计报告规范
1.9 课程设计题目——求公因子
习 题
第2章 C语言与C++语言
2.1 C语言的发展与特点
2.1.1 C语言的发展
2.1.2 C语言的优缺点
2.1.3 C语言的特点
2.1.4 高效使用C语言
2.2 C语言应用程序结构
2.3 Visual C++ 6.0集成开发环境
2.3.1 Visual C++ 6.0的安装
2.3.2 Visual C++ 6.0的帮助系统
2.3.3 Visual C++ 6.0的启动和退出
2.3.4 Visual C++ 6.0的集成开发环境
2.3.5 Visual C++ 6.0集成开发环境设置
2.3.6 Visual C++常用术语
2.4 运行C语言应用程序方法与上机操作步骤
2.4.1 输入和编辑源程序
2.4.2 源程序的编译、连接和运行
2.4.3 建立和运行包含多个源程序文件的应用程序方法
2.5 从面向过程到面向对象
2.5.1 模块
2.5.2 信息隐蔽和抽象数据类型
2.5.3 面向对象程序设计
2.6 C++语言
2.6.1 C语言与C++语言的差异
2.6.2 类和类的定义
2.6.3 类的对象及应用
2.6.4 构造函数和析构函数
2.6.5重载
2.6.6 派生与继承
2.6.7 多态性与虚函数
2.6.8 函数模板和类模板
2.7 课程设计题目——类与对象
习题二
第3章 简单数据类型与表达式
3.1 数据类型
3.1.1 基本概念和术语
3.1.2 数据类型与数据结构
3.1.3 简单数据类型
3.1.4 构造数据类型
3.2 常量与变量
3.2.1 常量
3.2.2 变量
3.3 运算符与表达式
3.3.1 算术运算符与算术表达式
3.3.2 字符运算符与字符表达式
3.3.3 关系运算符与关系表达式
3.3.4 逻辑运算符与逻辑表达式
3.4 课程设计题目——求小公倍数
习 题
第4章 程序的基本控制结构
4.1 程序的基本控制结构
4.1.1 3种基本控制结构
4.1.2 关于对GOTO语句的认识
4.2 顺序结构程序设计
4.3 选择结构程序设计
4.3.1 单向分支选择结构程序设计
4.3.2 双向分支选择结构程序设计
4.3.3 多向分支选择结构程序设计
4.4 循环结构程序设计
4.4.1 当型循环结构程序设计
4.4.2 直到型循环结构程序设计
4.4.3 步长型循环结构程序设计
4.5 课程设计题目——求解方程的根
习 题
第5章 构造数据类型
5.1 数组类型
5.1.1 一维数组
5.1.2 二维数组
5.1.3 查找
5.1.4 排序
5.2 结构体类型
5.2.1 结构体类型的概念
5.2.2 结构体类型的定义
5.2.3 结构体变量的说明
5.2.4 结构体变量的引用
5.2.5 结构体应用举例
5.3 其它构造数据类型
5.3.1 共用体类型
5.3.2 文件类型
5.4 课程设计题目——排序算法
习 题
第6章 结构化程序设计
6.1 结构化方法概述
6.2 模块化设计技术与方法
6.2.1 模块化的一般目标
6.2.2 模块凝聚(聚合)与模块耦合(关联)
6.2.3 模块的设计准则
6.3 自顶向下设计技术与方法
6.3.1 自顶向下设计
6.3.2 自顶向下编码
6.4 逐步求精设计技术与方法
6.4.1 选择排序算法的逐步求精设计过程
6.4.2 积木游戏算法的逐步求精设计过程
6.5 结构程序优化技术与方法
6.5.1 问题模型优化
6.5.2 计算方法优化
6.5.3 算法优化
6.5.4 数据结构优化
6.6 子程序与过程文件
6.6.1 子程序
6.6.2 过程文件
6.6.3 过程应用举例
6.7 函数
6.7.1 函数的定义和调用
6.7.2 函数的嵌套调用和递归调用
6.7.3 内部函数和外部函数
6.7.4 函数应用举例
6.8 课程设计题目——学生成绩管理系统
习 题
第7章 基本数据结构
7.1 顺序表
7.1.1 向量的顺序存储表示
7.1.2 向量的运算
7.1.3 应用举例
7.2 链表
7.2.1 指针与指针对象
7.2.2 单链表
7.2.3 应用举例
7.3 栈
7.3.1 栈的概念
7.3.2 顺序栈
7.3.3 链接栈
7.4 递归与非递归过程
7.4.1 递归概念
7.4.2 递归过程(函数)设计
7.4.3 递归过程与非递归过程
7.5 队列
6.5.1 队列的概念
7.5.2 顺序队列
7.5.3 链接队列
7.6 二叉树
7.6.1 树的基本概念
7.6.2 二叉树
7.6.3 二叉树存储表示
7.6.4 二叉树遍历
7.7 课程设计题目—— 一元多项式计算器
习 题
第8章 算法设计中的常用方法
8.1 问题的解空间
8.2 枚举法
8.2.1 枚举法的基本思想
8.2.2 枚举法应用举例
8.2.3 枚举算法优化
8.3 递归与递推
8.3.1 梵天塔问题
8.3.2 再谈递归算法设计
8.3.3 快速排序
8.3.4 递推算法
8.3.5 Wythoff数对序列
8.4 分治法
8.4.1 分治法概述
8.4.2 数字旋转方阵
8.4.3 子段和问题
8.5 动态规划法
8.5.1 动态规划法概述
8.5.2 多段图的短路径问题
8.5.3 0-1背包问题
8.6 贪心法
8.6.1 贪心法概述
8.6.2 背包问题
8.6.3 0-1背包问题及贪心k阶优化方法
8.7 回溯法
8.7.1 回溯法概述
8.7.2 0-1背包问题与回溯递归算法
8.7.3 0-1背包问题与回溯迭代算法
8.8 分支限界法
8.8.1 分支限界法概述
8.8.2 分支限界法求解0-1背包问题
8.9 课程设计题目——0-1背包问题
习 题
第9章 以解决问题为中心
9.1 一元多项式问题
9.1.1 问题描述
9.1.2 问题分析
9.1.3 算法设计
9.1.4 C语言程序实现与程序运行
9.2 八皇后问题
9.2.1 问题描述
9.2.2 问题分析
9.2.3 算法设计
9.2.4 C语言程序实现与程序运行
9.2.5 VFP语言程序实现与程序运行
9.3 骑士游历问题
9.3.1 问题描述
9.3.2 问题分析与算法设计
9.3.3 C语言程序实现与程序运行
9.4 哈夫曼树与哈夫曼编码
9.4.1 问题描述
9.4.2 问题分析与算法设计
9.4.3 C语言程序实现与程序运行
9.5 课程设计题目——哈夫曼编/译码系统
习 题
参考文献
1.1 计算学科
1.1.1 计算学科的根本问题
1.1.2 计算学科的基本特征
1.2 计算思维
1.2.1 计算思维的概念
1.2.2 计算思维的6个特征
1.2.3 计算思维的本质
1.3 程序=数据结构+算法
1.3.1 程序
1.3.2 什么是数据结构
1.3.3 什么是算法
1.4 程序设计=数据结构+算法+程序设计方法
1.4.1 程序设计
1.4.2 程序设计方法学
1.5 语言工具和环境
1.5.1 程序设计语言
1.5.2 程序设计范型
1.5.3 程序设计语言的语法元素及其元素功能
1.5.4 编程环境和程序运行
1.6 程序设计步骤与程序设计风格
1.6.1 程序设计步骤
1.6.2 程序设计风格
1.7 算法设计与分析
1.7.1 算法描述
1.7.2 算法设计举例
1.7.3 算法设计要求
1.7.4 算法分析
1.8 课程设计相关知识
1.8.1 课程设计目的与内涵
1.8.2 课程设计步骤
1.8.3 课程设计报告规范
1.9 课程设计题目——求公因子
习 题
第2章 C语言与C++语言
2.1 C语言的发展与特点
2.1.1 C语言的发展
2.1.2 C语言的优缺点
2.1.3 C语言的特点
2.1.4 高效使用C语言
2.2 C语言应用程序结构
2.3 Visual C++ 6.0集成开发环境
2.3.1 Visual C++ 6.0的安装
2.3.2 Visual C++ 6.0的帮助系统
2.3.3 Visual C++ 6.0的启动和退出
2.3.4 Visual C++ 6.0的集成开发环境
2.3.5 Visual C++ 6.0集成开发环境设置
2.3.6 Visual C++常用术语
2.4 运行C语言应用程序方法与上机操作步骤
2.4.1 输入和编辑源程序
2.4.2 源程序的编译、连接和运行
2.4.3 建立和运行包含多个源程序文件的应用程序方法
2.5 从面向过程到面向对象
2.5.1 模块
2.5.2 信息隐蔽和抽象数据类型
2.5.3 面向对象程序设计
2.6 C++语言
2.6.1 C语言与C++语言的差异
2.6.2 类和类的定义
2.6.3 类的对象及应用
2.6.4 构造函数和析构函数
2.6.5重载
2.6.6 派生与继承
2.6.7 多态性与虚函数
2.6.8 函数模板和类模板
2.7 课程设计题目——类与对象
习题二
第3章 简单数据类型与表达式
3.1 数据类型
3.1.1 基本概念和术语
3.1.2 数据类型与数据结构
3.1.3 简单数据类型
3.1.4 构造数据类型
3.2 常量与变量
3.2.1 常量
3.2.2 变量
3.3 运算符与表达式
3.3.1 算术运算符与算术表达式
3.3.2 字符运算符与字符表达式
3.3.3 关系运算符与关系表达式
3.3.4 逻辑运算符与逻辑表达式
3.4 课程设计题目——求小公倍数
习 题
第4章 程序的基本控制结构
4.1 程序的基本控制结构
4.1.1 3种基本控制结构
4.1.2 关于对GOTO语句的认识
4.2 顺序结构程序设计
4.3 选择结构程序设计
4.3.1 单向分支选择结构程序设计
4.3.2 双向分支选择结构程序设计
4.3.3 多向分支选择结构程序设计
4.4 循环结构程序设计
4.4.1 当型循环结构程序设计
4.4.2 直到型循环结构程序设计
4.4.3 步长型循环结构程序设计
4.5 课程设计题目——求解方程的根
习 题
第5章 构造数据类型
5.1 数组类型
5.1.1 一维数组
5.1.2 二维数组
5.1.3 查找
5.1.4 排序
5.2 结构体类型
5.2.1 结构体类型的概念
5.2.2 结构体类型的定义
5.2.3 结构体变量的说明
5.2.4 结构体变量的引用
5.2.5 结构体应用举例
5.3 其它构造数据类型
5.3.1 共用体类型
5.3.2 文件类型
5.4 课程设计题目——排序算法
习 题
第6章 结构化程序设计
6.1 结构化方法概述
6.2 模块化设计技术与方法
6.2.1 模块化的一般目标
6.2.2 模块凝聚(聚合)与模块耦合(关联)
6.2.3 模块的设计准则
6.3 自顶向下设计技术与方法
6.3.1 自顶向下设计
6.3.2 自顶向下编码
6.4 逐步求精设计技术与方法
6.4.1 选择排序算法的逐步求精设计过程
6.4.2 积木游戏算法的逐步求精设计过程
6.5 结构程序优化技术与方法
6.5.1 问题模型优化
6.5.2 计算方法优化
6.5.3 算法优化
6.5.4 数据结构优化
6.6 子程序与过程文件
6.6.1 子程序
6.6.2 过程文件
6.6.3 过程应用举例
6.7 函数
6.7.1 函数的定义和调用
6.7.2 函数的嵌套调用和递归调用
6.7.3 内部函数和外部函数
6.7.4 函数应用举例
6.8 课程设计题目——学生成绩管理系统
习 题
第7章 基本数据结构
7.1 顺序表
7.1.1 向量的顺序存储表示
7.1.2 向量的运算
7.1.3 应用举例
7.2 链表
7.2.1 指针与指针对象
7.2.2 单链表
7.2.3 应用举例
7.3 栈
7.3.1 栈的概念
7.3.2 顺序栈
7.3.3 链接栈
7.4 递归与非递归过程
7.4.1 递归概念
7.4.2 递归过程(函数)设计
7.4.3 递归过程与非递归过程
7.5 队列
6.5.1 队列的概念
7.5.2 顺序队列
7.5.3 链接队列
7.6 二叉树
7.6.1 树的基本概念
7.6.2 二叉树
7.6.3 二叉树存储表示
7.6.4 二叉树遍历
7.7 课程设计题目—— 一元多项式计算器
习 题
第8章 算法设计中的常用方法
8.1 问题的解空间
8.2 枚举法
8.2.1 枚举法的基本思想
8.2.2 枚举法应用举例
8.2.3 枚举算法优化
8.3 递归与递推
8.3.1 梵天塔问题
8.3.2 再谈递归算法设计
8.3.3 快速排序
8.3.4 递推算法
8.3.5 Wythoff数对序列
8.4 分治法
8.4.1 分治法概述
8.4.2 数字旋转方阵
8.4.3 子段和问题
8.5 动态规划法
8.5.1 动态规划法概述
8.5.2 多段图的短路径问题
8.5.3 0-1背包问题
8.6 贪心法
8.6.1 贪心法概述
8.6.2 背包问题
8.6.3 0-1背包问题及贪心k阶优化方法
8.7 回溯法
8.7.1 回溯法概述
8.7.2 0-1背包问题与回溯递归算法
8.7.3 0-1背包问题与回溯迭代算法
8.8 分支限界法
8.8.1 分支限界法概述
8.8.2 分支限界法求解0-1背包问题
8.9 课程设计题目——0-1背包问题
习 题
第9章 以解决问题为中心
9.1 一元多项式问题
9.1.1 问题描述
9.1.2 问题分析
9.1.3 算法设计
9.1.4 C语言程序实现与程序运行
9.2 八皇后问题
9.2.1 问题描述
9.2.2 问题分析
9.2.3 算法设计
9.2.4 C语言程序实现与程序运行
9.2.5 VFP语言程序实现与程序运行
9.3 骑士游历问题
9.3.1 问题描述
9.3.2 问题分析与算法设计
9.3.3 C语言程序实现与程序运行
9.4 哈夫曼树与哈夫曼编码
9.4.1 问题描述
9.4.2 问题分析与算法设计
9.4.3 C语言程序实现与程序运行
9.5 课程设计题目——哈夫曼编/译码系统
习 题
参考文献
在线试读
第2章 C语言与C++语言
C语言是20世纪70年代初期在贝尔实验室开发出来的一种用途广泛、功能强大、使用灵活、面向过程的高级程序设计语言。它既可用于编写应用软件,又能用于编写系统软件。虽然采纳了ANSI/ISO标准以后的C语言自身不再发生变化,但是随着基于C语言的新式语言的产生,C语言的演变还在继续。新式语言包括著名的C++语言,它在许多方面对C语言进行了扩展,尤其是增加了面向对象的编程特性。本章介绍C语言与C++语言的基础知识。
2.1 C语言的发展与特点
自20世纪90年代初,C语言在我国推广以来,学习和使用C语言的人越来越多。高等院校理工科专业大多都开设了C语言或C++程序设计课程。在企业级应用软件开发和专业系统软件中,C语言或C++语言的应用非常广泛。
2.1.1 C语言的发展
C语言是在贝尔实验室由Ken Thompson、Dennis Ritchie 及其他同事在开发UNIX操作系统过程中产生的副产品。Thompson独自动手用汇编语言编写了UNIX操作系统的初版本。由于用汇编语言编写的程序往往难以调试和维护,因此,Thompson意识到需要用一种更加高级的编程语言来完成UNIX操作系统未来的开发,于是他设计了一种小型的很简单且很接近硬件的B语言。Thompson的B语言是在BCPL语言的基础上开发的,BCPL(Basic Combined Programming Language)语言是1967年英国剑桥大学Martin Richards推出的无类型程序设计语言,而BCPL语言的起源又可追溯到一种更早并且影响更深远的Algol 60语言。
1970年,贝尔实验室为UNIX项目争取到一台PDP-11计算机,Thompson就用B语言重写了部分UNIX代码。1971年,B语言暴露出了非常不适合PDP-11计算机的问题,于是Ritchie开始开发B语言的升级版。初将新开发的语言命名为NB语言,但是,后来新语言越来越脱离B语言,因此,将其改名为C语言。
1973年,C语言已经相当稳定,它既保持了BCPL和B语言精练、接近硬件的优点,又克服了它们过于简单、无数据类型的缺点。开发C语言的目的在于尽可能降低用它所写软件对硬件平台的依赖程度,使之具有可移植性。这一年Ken Thompson和Dennis Ritchie合作将UNIX操作系统90%以上的内容用C语言重写,即UNIX第5版。随着UNIX操作系统的日益广泛使用,C语言也迅速得到推广,成为世界上应用广泛的高级程序设计语言。
整个20世纪70年代,特别是1977年到1979年之间,C语言一直在持续发展。以UNIX第7版中的C语言编译系统为基础,1978年,Brian Kernighan和Dennis Ritchie合著了第1本影响深远的有关C语言的名著《The C Programming Language》。此书一经出版就迅速成为C程序员的宝典。由于当时没有C语言的正式标准,所以这本书就成为事实上的标准,编程爱好者把它称为“K&R”或者“白皮书”。
20世纪80年代,C语言已经超越了UNIX领域的界限。运行在不同操作系统下的多种类型计算机都开始使用C语言。编写新的C语言编译系统的程序员都以“K&R”作为标准,但是,“K&R”对于一些语言特性的描述非常模糊,以至于编译系统常常会对这些特性进行不同的处理。而且,“K&R”也没有对属于C语言的特性和属于UNIX操作系统的内容进行明确的区分。不久,这种对C语言进行全面、准确描述的需求逐渐显现出来。
1983年,美国国家标准协会(American National Standards Institute,ANSI)开始编制C语言标准。经过多次修订,C语言标准于1988年完成,1989年12月正式通过,公布了一个完整的C语言标准——ANSI X3.159-1989。1990年,国际标准化组织(International Organization for Standardization,ISO)通过此项标准,作为国际标准ISO/IEC 9899-1990。我们将这些标准中描述的C语言称为ANSI C、C 89、ANSI/ISO C或者就叫做“标准C”。
1995年,ISO对C 90做了一些修订,即“1995基准增补1(ISO/IEC 9899/AMD1-1995)”。1999年,ISO对C语言标准又进行了修订,在基本保留原来C语言特征的基础上,针对应用需要,增加了一些功能,尤其是C++中的一些功能,命名为ISO/IEC 9899-1999(或称为C 99)。2001年和2004先后又进行两次技术修订,即2001年的TC1和2004年的TC2。
值得注意的是,目前由不同软件公司所提供的C语言编译系统并未完全实现C 99建议的功能,它们多以C 89为基础开发。读者应了解自己所使用的C语言编译系统的特点。在进行实际软件开发工作时,应注意使用能在更大程度上实现C99功能的编译系统。本书中所举示例程序都可以在目前所有大多数编译系统(如Visual C++ 6.0)上编译、链接和运行。
C++语言是贝尔实验室的Bjarne Stroustrup设计的,它在许多方面对C语言进行了扩展,尤其是增加了面向对象的编程特性。随着C++语言的迅速普及,在不久的将来你很可能会用C++编写程序。果真如此,为何还要如此费心地学习C语言呢?首先,C++语言比C语言更加难学,在学习复杂的C++语言之前,好是先精通C语言;其次,在我们身边存在着大量的C语言程序代码,这就需要能阅读和维护这些代码;后,对于编写相对小规模程序,不会从C++语言中获得多少好处。学习C++语言之前是否应先学习C语言,是一个见仁见智问题。C++语言包含了C语言的全部特性。
2.1.2 C语言的优缺点
C语言具有自身的优缺点,两者都源于语言自身的预期用途和基础理论体系。
C语言是一种低级语言。作为一种适合系统软件的编程语言,C语言提供了对机器级概念的访问,这些是其它编程语言试图隐藏的内容。C语言提供了与计算机内在指令紧密协调的操作,使得程序可以快速执行。既然应用程序要依赖操作系统进行输入/输出、存储管理以及其它众多服务,操作系统一定不能运行得太慢。
C语言是一种小型语言。与许多其它高级程序设计语言相比,C语言提供了一套更有限的特性集合。为了保持少量的特性,C语言在很大程度上依赖一个标准函数库。
C语言是一种包容性语言。C语言假定用户知道自己在做什么,它提供了比其它高级程序设计语言更广阔的自由度。另外,不同于其它程序设计语言,C语言不提供详细的查错功能。
1. C语言的优点
C语言具有以下主要优点。
(1)高效性。高效性是C语言与生俱来的优点之一。因为C语言原本就是用来编写由汇编语言编写的操作系统UNIX,所以快速运行并占用有限内存就显得至关重要。
(2)可移植性。虽然程序的可移植性不是C语言的主要目标,但是它还是成为了C语言的优点之一。当程序必须在个人计算机到超级计算机多种机型上运行时,常常会用C语言编写程序。C程序具有可移植性的一个原因要感谢C语言与UNIX系统的早期结合,以及后来ANSI/ISO的标准化工作。C语言正是由于标准化才没有分裂成不兼容的多种版本。另一个原因是C语言编译系统规模小且容易编写,这使得此种编译系统得以广泛应用。
(3)功能强大。C语言拥有一个数据类型和运算符的庞大集合,这个集合使得C语言具有强大的表达能力。
(4)灵活性。虽然C语言初的设计是为了系统软件编程,但是没有将它限制在此范围内。C语言可以用于编写从嵌入式系统到数据处理的各种应用程序。许多在其它语言中认定为非法的操作往往在C语言中是允许的。虽然灵活性可能会让某些错误漏掉,但是它却使编程变得更加轻松。
(5)标准函数库。C语言的一个突出优点就是它的标准函数库,它包含了数百个函数,这些函数可以用于输入/输出、字符串处理、存储分配以及其它一些实用操作。
2. C语言的缺点
C语言的缺点与它的某些优点本是同根生,均来自C语言与机器的紧密性。如果将类似于Pascal这样的语言看成是“高级语言”,那么,对C语言比较精确的描述应该是“低级语言”。C语言的主要缺点如下。
(1)C程序可能会漏洞百出。C语言的灵活性使得它成为一种会漏洞百出的语言。许多程序设计语言可以发现的编程错误,C语言编译系统无法检查出来。从这方面来说,C语言与汇编语言极为相似。更为糟糕的是,C语言还包含着大量不易觉察的隐患,比如,一个额外的分号可能会导致无限循环,或者一个遗漏的&可能会引发程序崩溃。
(2)C程序可能会难以理解。虽然根据大多数衡量标准,C语言是一种小型语言,但是它也有许多其它程序设计语言没有的特性。这些特性可以用多种方式结合使用,一些结合尽管编程者心知肚明,但是其他人恐怕就难以理解。C语言的灵活性可能是另一个负面因素,有些程序员实在是太高明了,甚至可以编写出除了他们自己几乎没有人能读得懂的程序。
2.1.3 C语言的特点
C语言是当前较为流行的一种应用程序和系统软件开发工具,受到广大编程爱好者以及专业程序员的青睐,它具有以下主要特点。
1. 语言简洁、紧凑,使用方便、灵活。C语言只有37个关键字、9种控制语句。程序书写形式自由,压缩了一切不必要的成分。事实上,C语言是一个内核很小的语言,只包含极少的与硬件有关的成分,C语言不直接提供输入和输出语句、有关文件操作语句和动态内存管理语句等(这些操作由编译系统提供的库函数实现)。
2. 运算符和数据类型丰富。C语言共有34种运算符,它把括号、赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型非常丰富,表达式类型多样化。灵活使用各种运算符可以实现其它程序设计语言难以实现的运算。C语言提供的数据类型包括:整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C 99又扩充了复数类型、超长整型和布尔类型等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构的运算。
3. 具有结构化的控制语句。用函数作为程序的模块单位,便于实现程序模块化。C语言是完全的模块化和结构化程序设计语言。
4. 语法限制不太严格,程序设计自由度大。大多数高级程序设计语言的语法检查都比较严格,能检查出几乎所有的语法错误,而C语言允许程序员有较大的自由度,因此放宽了语法检查。程序员应当仔细检查程序,保证其正确性,不能依赖C语言编译系统查错。限制严格就失去灵活性;强调灵活性就必须放宽限制。C语言的灵活性对于初学者来说并不是一件幸事。
5. C语言具有汇编语言的大部分功能。C语言允许直接访问物理地址,能进行位运算,可以直接对硬件进行操作。因此C语言既具有高级语言的特性,又具有低级语言的功能。
6. C程序可移植性好。由于C语言的编译系统相当简洁,因此很容易移植到新的系统。几乎在所有的计算机系统中都可以使用C语言。
7. 生成的目标代码质量高,程序执行效率高。
C语言是20世纪70年代初期在贝尔实验室开发出来的一种用途广泛、功能强大、使用灵活、面向过程的高级程序设计语言。它既可用于编写应用软件,又能用于编写系统软件。虽然采纳了ANSI/ISO标准以后的C语言自身不再发生变化,但是随着基于C语言的新式语言的产生,C语言的演变还在继续。新式语言包括著名的C++语言,它在许多方面对C语言进行了扩展,尤其是增加了面向对象的编程特性。本章介绍C语言与C++语言的基础知识。
2.1 C语言的发展与特点
自20世纪90年代初,C语言在我国推广以来,学习和使用C语言的人越来越多。高等院校理工科专业大多都开设了C语言或C++程序设计课程。在企业级应用软件开发和专业系统软件中,C语言或C++语言的应用非常广泛。
2.1.1 C语言的发展
C语言是在贝尔实验室由Ken Thompson、Dennis Ritchie 及其他同事在开发UNIX操作系统过程中产生的副产品。Thompson独自动手用汇编语言编写了UNIX操作系统的初版本。由于用汇编语言编写的程序往往难以调试和维护,因此,Thompson意识到需要用一种更加高级的编程语言来完成UNIX操作系统未来的开发,于是他设计了一种小型的很简单且很接近硬件的B语言。Thompson的B语言是在BCPL语言的基础上开发的,BCPL(Basic Combined Programming Language)语言是1967年英国剑桥大学Martin Richards推出的无类型程序设计语言,而BCPL语言的起源又可追溯到一种更早并且影响更深远的Algol 60语言。
1970年,贝尔实验室为UNIX项目争取到一台PDP-11计算机,Thompson就用B语言重写了部分UNIX代码。1971年,B语言暴露出了非常不适合PDP-11计算机的问题,于是Ritchie开始开发B语言的升级版。初将新开发的语言命名为NB语言,但是,后来新语言越来越脱离B语言,因此,将其改名为C语言。
1973年,C语言已经相当稳定,它既保持了BCPL和B语言精练、接近硬件的优点,又克服了它们过于简单、无数据类型的缺点。开发C语言的目的在于尽可能降低用它所写软件对硬件平台的依赖程度,使之具有可移植性。这一年Ken Thompson和Dennis Ritchie合作将UNIX操作系统90%以上的内容用C语言重写,即UNIX第5版。随着UNIX操作系统的日益广泛使用,C语言也迅速得到推广,成为世界上应用广泛的高级程序设计语言。
整个20世纪70年代,特别是1977年到1979年之间,C语言一直在持续发展。以UNIX第7版中的C语言编译系统为基础,1978年,Brian Kernighan和Dennis Ritchie合著了第1本影响深远的有关C语言的名著《The C Programming Language》。此书一经出版就迅速成为C程序员的宝典。由于当时没有C语言的正式标准,所以这本书就成为事实上的标准,编程爱好者把它称为“K&R”或者“白皮书”。
20世纪80年代,C语言已经超越了UNIX领域的界限。运行在不同操作系统下的多种类型计算机都开始使用C语言。编写新的C语言编译系统的程序员都以“K&R”作为标准,但是,“K&R”对于一些语言特性的描述非常模糊,以至于编译系统常常会对这些特性进行不同的处理。而且,“K&R”也没有对属于C语言的特性和属于UNIX操作系统的内容进行明确的区分。不久,这种对C语言进行全面、准确描述的需求逐渐显现出来。
1983年,美国国家标准协会(American National Standards Institute,ANSI)开始编制C语言标准。经过多次修订,C语言标准于1988年完成,1989年12月正式通过,公布了一个完整的C语言标准——ANSI X3.159-1989。1990年,国际标准化组织(International Organization for Standardization,ISO)通过此项标准,作为国际标准ISO/IEC 9899-1990。我们将这些标准中描述的C语言称为ANSI C、C 89、ANSI/ISO C或者就叫做“标准C”。
1995年,ISO对C 90做了一些修订,即“1995基准增补1(ISO/IEC 9899/AMD1-1995)”。1999年,ISO对C语言标准又进行了修订,在基本保留原来C语言特征的基础上,针对应用需要,增加了一些功能,尤其是C++中的一些功能,命名为ISO/IEC 9899-1999(或称为C 99)。2001年和2004先后又进行两次技术修订,即2001年的TC1和2004年的TC2。
值得注意的是,目前由不同软件公司所提供的C语言编译系统并未完全实现C 99建议的功能,它们多以C 89为基础开发。读者应了解自己所使用的C语言编译系统的特点。在进行实际软件开发工作时,应注意使用能在更大程度上实现C99功能的编译系统。本书中所举示例程序都可以在目前所有大多数编译系统(如Visual C++ 6.0)上编译、链接和运行。
C++语言是贝尔实验室的Bjarne Stroustrup设计的,它在许多方面对C语言进行了扩展,尤其是增加了面向对象的编程特性。随着C++语言的迅速普及,在不久的将来你很可能会用C++编写程序。果真如此,为何还要如此费心地学习C语言呢?首先,C++语言比C语言更加难学,在学习复杂的C++语言之前,好是先精通C语言;其次,在我们身边存在着大量的C语言程序代码,这就需要能阅读和维护这些代码;后,对于编写相对小规模程序,不会从C++语言中获得多少好处。学习C++语言之前是否应先学习C语言,是一个见仁见智问题。C++语言包含了C语言的全部特性。
2.1.2 C语言的优缺点
C语言具有自身的优缺点,两者都源于语言自身的预期用途和基础理论体系。
C语言是一种低级语言。作为一种适合系统软件的编程语言,C语言提供了对机器级概念的访问,这些是其它编程语言试图隐藏的内容。C语言提供了与计算机内在指令紧密协调的操作,使得程序可以快速执行。既然应用程序要依赖操作系统进行输入/输出、存储管理以及其它众多服务,操作系统一定不能运行得太慢。
C语言是一种小型语言。与许多其它高级程序设计语言相比,C语言提供了一套更有限的特性集合。为了保持少量的特性,C语言在很大程度上依赖一个标准函数库。
C语言是一种包容性语言。C语言假定用户知道自己在做什么,它提供了比其它高级程序设计语言更广阔的自由度。另外,不同于其它程序设计语言,C语言不提供详细的查错功能。
1. C语言的优点
C语言具有以下主要优点。
(1)高效性。高效性是C语言与生俱来的优点之一。因为C语言原本就是用来编写由汇编语言编写的操作系统UNIX,所以快速运行并占用有限内存就显得至关重要。
(2)可移植性。虽然程序的可移植性不是C语言的主要目标,但是它还是成为了C语言的优点之一。当程序必须在个人计算机到超级计算机多种机型上运行时,常常会用C语言编写程序。C程序具有可移植性的一个原因要感谢C语言与UNIX系统的早期结合,以及后来ANSI/ISO的标准化工作。C语言正是由于标准化才没有分裂成不兼容的多种版本。另一个原因是C语言编译系统规模小且容易编写,这使得此种编译系统得以广泛应用。
(3)功能强大。C语言拥有一个数据类型和运算符的庞大集合,这个集合使得C语言具有强大的表达能力。
(4)灵活性。虽然C语言初的设计是为了系统软件编程,但是没有将它限制在此范围内。C语言可以用于编写从嵌入式系统到数据处理的各种应用程序。许多在其它语言中认定为非法的操作往往在C语言中是允许的。虽然灵活性可能会让某些错误漏掉,但是它却使编程变得更加轻松。
(5)标准函数库。C语言的一个突出优点就是它的标准函数库,它包含了数百个函数,这些函数可以用于输入/输出、字符串处理、存储分配以及其它一些实用操作。
2. C语言的缺点
C语言的缺点与它的某些优点本是同根生,均来自C语言与机器的紧密性。如果将类似于Pascal这样的语言看成是“高级语言”,那么,对C语言比较精确的描述应该是“低级语言”。C语言的主要缺点如下。
(1)C程序可能会漏洞百出。C语言的灵活性使得它成为一种会漏洞百出的语言。许多程序设计语言可以发现的编程错误,C语言编译系统无法检查出来。从这方面来说,C语言与汇编语言极为相似。更为糟糕的是,C语言还包含着大量不易觉察的隐患,比如,一个额外的分号可能会导致无限循环,或者一个遗漏的&可能会引发程序崩溃。
(2)C程序可能会难以理解。虽然根据大多数衡量标准,C语言是一种小型语言,但是它也有许多其它程序设计语言没有的特性。这些特性可以用多种方式结合使用,一些结合尽管编程者心知肚明,但是其他人恐怕就难以理解。C语言的灵活性可能是另一个负面因素,有些程序员实在是太高明了,甚至可以编写出除了他们自己几乎没有人能读得懂的程序。
2.1.3 C语言的特点
C语言是当前较为流行的一种应用程序和系统软件开发工具,受到广大编程爱好者以及专业程序员的青睐,它具有以下主要特点。
1. 语言简洁、紧凑,使用方便、灵活。C语言只有37个关键字、9种控制语句。程序书写形式自由,压缩了一切不必要的成分。事实上,C语言是一个内核很小的语言,只包含极少的与硬件有关的成分,C语言不直接提供输入和输出语句、有关文件操作语句和动态内存管理语句等(这些操作由编译系统提供的库函数实现)。
2. 运算符和数据类型丰富。C语言共有34种运算符,它把括号、赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型非常丰富,表达式类型多样化。灵活使用各种运算符可以实现其它程序设计语言难以实现的运算。C语言提供的数据类型包括:整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C 99又扩充了复数类型、超长整型和布尔类型等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构的运算。
3. 具有结构化的控制语句。用函数作为程序的模块单位,便于实现程序模块化。C语言是完全的模块化和结构化程序设计语言。
4. 语法限制不太严格,程序设计自由度大。大多数高级程序设计语言的语法检查都比较严格,能检查出几乎所有的语法错误,而C语言允许程序员有较大的自由度,因此放宽了语法检查。程序员应当仔细检查程序,保证其正确性,不能依赖C语言编译系统查错。限制严格就失去灵活性;强调灵活性就必须放宽限制。C语言的灵活性对于初学者来说并不是一件幸事。
5. C语言具有汇编语言的大部分功能。C语言允许直接访问物理地址,能进行位运算,可以直接对硬件进行操作。因此C语言既具有高级语言的特性,又具有低级语言的功能。
6. C程序可移植性好。由于C语言的编译系统相当简洁,因此很容易移植到新的系统。几乎在所有的计算机系统中都可以使用C语言。
7. 生成的目标代码质量高,程序执行效率高。
评论
还没有评论。