图书
从问题到程序--程序设计与C语言引论

从问题到程序--程序设计与C语言引论"

作者:裘宗燕
ISBN:7-111-16756-2/TP.4328
定价:¥36.0
字数:0千字
页数:
出版时间:2005-09-08
开本:16
版次:
装帧:
出版社:机械工业出版社
简介

本书以C作为讨论程序设计的语言,讨论了基本程序设计的各方面问题。书中给出程序实例时没有采用常见的“提出问题,给出解答,再加些解释”的简单三步形式,而是增加了许多对问题的分析和讨论,以帮助读者认识程序设计过程的实质,理解从问题到程序的思考过程。书中还尽可能详尽地解释了许多与C语言和程序设计有关的问题。 本书适合作为高等院校计算机及相关专业的教材,也可供其他学习C程序设计语言的读者阅读。

前言

作为计算机科学教育的第一门专业课程,程序设计课程的重要性是毋庸置疑的。本书的目标是作为第一门程序设计课程的教材或入门自学读物,介绍如何理解程序语言,如何学习程序设计,如何为计算机领域中的进一步学习和工作做好准备。 本书以C作为讨论程序设计的语言,讨论了基本程序设计的各方面问题。书中给出程序实例时没有采用常见的“提出问题,给出解答,再加些解释”的简单三步形式,而是增加了许多对问题的分析和讨论,以帮助读者认识程序设计过程的实质,理解从问题到程序的思考过程。书中还尽可能详尽地解释了许多与C语言和程序设计有关的问题。 程序构造过程应该有充分的科学性,并要有对程序实现过程的科学认识。有关研究的发展形成了程序的理论。入门书不可能讨论有关的理论成果,但必须反映其精神实质,使初学者从一开始就看到程序的一些本质性问题。本书特别强调问题的分析和分解,很早就介绍了函数抽象的概念,而后不断有进一步的讨论,实例中也特别注意这方面的问题。书中一些地方还通过实例介绍了一些更深入的理论问题,如通过对程序运行时间的统计,介绍计算过程的基本性质(复杂性);通过分析循环过程是否完成了所需工作,介绍“循环不变关系”的概念和意义等。当然,这些只是希望帮助读者了解一些情况,作为思考程序问题的线索。 程序设计也是一种工程性的工作,需要分析问题,寻找可能的解决方案,在各种方案中做评价和选择,还要对所做选择有清醒的认识(优点和缺点,是否在某些方面有所偏向或不足)。工程中通常没有完美的选择,更多的是权衡和折中,在程序设计里也是如此。本书的许多实例包含了比较详细的分析过程,常对一个问题给出多个解答,比较它们的优劣,有时还指出其他可能性:还可以如何看问题,还可能如何做,等等。书中还常给读者提出一些问题,希望读者发挥自己的思维能力和主观能动性。各章练习也试图反映这些想法。 本书希望强调一种观点:程序问题并没有需要记住的标准答案。由于分析问题时的不同考虑,设计过程中的不同选择,人们对同—一问题会得到许多合理而正确的不同程序。这些程序常常各有长短,可能各有侧重,也可能反映了人们对问题的不同认识。在学习中应该特别注意如何分析问题,如何把复杂问题分解为相对简单的部分,如何在可用的功能中做出选择等。这里的每一步都可能产生分支,我们应该认清各种选择的后果,包括收获和损失。 各种书籍(包括本书)给出的程序并不是“金科玉律”,它们不过是作者对问题的理解和分析的结果,实际上还有很多可能性。要学好程序设计,我们应该养成这样的习惯:在看程序时,应该特别注意分析其中隐含着作者的哪些考虑和选择,其中哪些是合理而有价值的(或不合理而无价值的),还可能有什么选择,沿其他选择做下去可能得到什么(或失去什么),等等。这样思考将使我们受益无穷。当然,这并不是说书中的示例不重要。恰恰相反,因为程序设计中有许多选择可能,所以书中应当给出好的分析和选择,供读者参考。入门书籍还应该说明选择的理由,指出采取这些选择带来的问题(缺点、限制等)。 正如本书的书名所言,程序设计是“从问题到程序”的思考和工作过程。要很好地完成程序设计,我们既要充分发挥聪明才智,又要有细致认真、一丝不苟的工作态度。即使将来不从事程序设计工作,从这一课程中得到的锻炼也可能很重要。 从作为入门语言的角度看,没有一种语言具有无可比拟的优势,使用时都需要考虑其有利方面,也要克服其不利因素。选择C作为入门语言的主要理由有:C是使用最广的语言之一,包含了基本程序设计需要理解的主要机制,能满足讨论程序设计问题的需要。学生可以用它完成练习,得到有关的知识积累和能力锻炼,还能掌握一种实用工具,也能作为后续课程学习的基础。C语言适合(也正在)作为计算机领域许多课程的教学语言。 C是一种很灵活的语言,用它写程序常需要了解一些细节,这是人们对用C作为基础课语言的主要疑虑。从另一方面看,通过用C做程序设计,也可能得到对程序设计的更多认识。C程序设计可以在比较低的层次上做,也可以在较高层次上做,学生可能从中了解更多有关程序设计过程的问题。此外,许多语言从C借鉴了一些想法和表达形式,有些就是C的扩充和发展,C语言知识对于进一步了解其他语言,包括未来的新语言都很有价值。 本书以程序设计为基本线索,同时深入介绍了C语言各方面的情况。这里强调的是如何认识程序、写程序和用C写程序。本书通过实例讨论了问题的分析和分解,找出主要步骤,确定函数抽象,找出循环,选择语言结构,最后写出程序的过程。不少实例给出了在不同考虑下可能形成的多种解法,以帮助读者理解程序设计的“真谛”。 书中特别强调好的程序设计风格,强调“好的”C程序设计:反复讨论了通过函数抽象建立清晰结构的重要性,特别关注程序的结构良好、可读、易修改,也尽可能指出了一些不良程序设计习惯及其危害。历史原因使C成为一个不太严格的语言,如果不注意,用C写的程序就有可能隐藏一些不易发现的错误。ANSIC标准倡导了一套写“好的”C程序的写法。本书坚持这一正确方向,讨论了如何写出更可靠、不易包藏隐含错误的清晰、简洁、高效的C程序,通过实例说明了应该如何写和不应该如何写。书中还介绍了一些实用的C程序设计技术,详细解释了C语言的各种结构和机制,尽可能地提供了一些背景说明。 本书包括如下各章和若干附录: 第1章,程序设计和C语言。介绍程序与程序语言的概念,C语言的发展及其特点,并用一个小例子介绍C程序的形式,其加工和执行。最后介绍程序设计与开发过程。 第2章,数据对象与计算。讨论程序语言的许多最基本概念,包括:字符集、标识符和关键字,数据与类型,数据表示,运算符、表达式与计算过程,数学函数库的使用等。 第3章,变量、函数和控制结构。讨论程序设计的一些基本问题,包括语句与复合结构,变量及其使用,简单函数定义,逻辑条件的描述与使用等。最后介绍了几种基本控制结构。 第4章,基本程序设计技术。首先讨论循环程序设计的基本问题,通过一系列程序实例分析了循环的构造过程。此后介绍了C语言的其他控制结构及其使用。 第5章,C程序结构。讨论C语言的许多具有一般性的重要问题,主要是C程序的结构,函数概念及有关的问题,预处理命令和预处理过程,递归的概念等。 第6章,数组。介绍数组的概念、定义和使用,数组与函数的关系,两维和多维数组等。 第7章,指针。首先介绍指针的概念和指针变量的使用,C语言中指针与数组的关系,多维数组作为参数的通用函数,而后讨论动态存储管理、类型定义、指向函数的指针等问题。 第8章,文件和输入输出。讨论文件的概念,与输入输出有关的各种问题,标准库的输入输出功能,以及输入输出的程序设计问题。 第9章,结构和其他数据机制。介绍结构(struct)、联合(union)、枚举(enum)等数据定义机制的意义及在程序中的使用。随后简单介绍了链接结构的概念。 第10章,程序开发技术。讨论程序设计及开发中的一般性问题和技术,包括分块开发问题等。 第11章,标准库。介绍标准库提供的各方面功能及其相关知识。 最后有几个附录介绍了C语言的一些相关参考资料。 本书以ANSI标准C语言为背景,书中所有实例均按ANSI C标准书写,习题也不涉及任何具体的系统环境。读者可以用任何符合ANSI C标准的C系统作为编程环境,如国内使用较多的TurboC系统,微机上可用的公开的免费的Icc、Dev-C++以及其他各种系统。 在此特别感谢北京大学理科试验班和数学学院参加C程序设计课程的同学们和参加辅导工作的研究生们,是他们的思考和问题给了我许多启示,使我更深入地理解了许多问题。我也要感谢我的家人与同事在这些年的工作中给予我的支持。 本书曾于1999年在北京大学出版社出版。这一新版对全书做了大幅度修改,反映—了近年来我对许多问题的新认识,也使这个新版已经成为了另一本新书。由于机械工业出版社华章分社朋友们的大力支持,使得本书得以面世,我在这里向他们表示特别的谢意。虽然本书凝结着我多年的工作心得和深入的思考,但书中仍难免有或大或小的错误。希望读者能把发现的问题告诉我,也希望同行们对本书提出宝贵意见。

目录

前言
本书作者简介
第1章 程序设计和C语言
1.1程序和程序语言
1.2 C语言简介
1.3一个简单的C程序
1.4程序开发过程
1.5问题与程序设计
本章讨论的重要概念
练习
第2章 数据对象与计算
2.1基本字符、名字表示、标识符和关键字
2.2数据与类型
2.3基本类型与数据表示
2.3.1整数类型和整数的表示
2.3.2实数类型和实数的表示
2.3.3字符类型和字符的表示
2.3.4数据的外部表示、内部表示与转换
2.4运算符、表达式与计算
2.4.1算术运算符
2.4.2算术表达式
2.4.3表达式的求值
2.4.4计算和类型
2.5数学函数库及其使用
2.5.1函数、函数调用
2.5.2数学函数及其使用
2.5.3函数调用中的类型转换
问题解释
几个常用程序模式
本章讨论的重要概念
练习
第3章 变量、函数和控制结构
3.1语句、复合结构
3.2变量——概念、定义和使用
3.2.1变量的定义
3.2.2变量的赋值与取值
3.2.3几个问题
3.3定义函数(初步)
3.3.1函数定义
3.3.2函数和程序
3.3.3函数与类型
3.3.4 自定义输出函数
3.4关系表达式、逻辑表达式、条例
表达式
3.4.1关系表达式和条件表达式
3.4.2逻辑表达式
3.5语句与控制结构
3.5.1条件语句(if语句)
3.5.2循环语句(1):while语句
3.5.3循环语句(2):for语句
3.6若干常用结构和问题
3.6.1增量和减量运算符(++、——)
3.6.2逗号运算符
3.6.3实现二元运算符操作的赋值运算符
3.6.4空语句
3.6.5表达式和求值
问题解释
几个常用程序模式
本章讨论的重要概念
练习
第4章基本程序设计技术
4.1循环程序设计
4.1.1基本循环方式
4.1.2求一系列完全平方数
4.1.3判断素数(谓词函数)
4.1.4艰难的旅程(浮点误差)
4.1.5求立方根(迭代和逼进)
4.1.6求sin函数值(通项计算)
4.2循环程序的问题
4.2.1从循环中退出
4.2.2循环中的几种变量
4.3循环与递归
4.3.1阶乘和乘幂(循环,递归)
4.3.2 Fibonacci序列(计算与时间)
4.3.3为计算过程计时
4.3.4 Fibonacci序列的迭代计算(程序
正确性与循环不变式)
·4.3.5最大公约数
4.3.6河内塔(梵塔)问题
4.4基本输入输出
4.4.1格式输入函数scanf
4.4.2字符输入输出函数
4.4.3输入函数的返回值及其作用
4.5控制结构和控制语句
4.5.1 do—while循环结构
4.5.2流程控制语句
4.5.3开关语句
4.6程序设计实例
4.6.1一个简单计算器
4.6.2定义枚举常量
4.6.3单词计数问题
4.7程序测试和排错
4.7.1测试
4.7.2白箱测试
4.7.3黑箱测试
4.7.4排除程序里的错误
问题解释
几个常用程序模式
本章讨论的重要概念
练习
第5章C程序结构
5.1数值类型
5.1.1实数类型和整数类型
5.1.2字符类型
5.1.3整数类型
5.1.4基本数据类型的选择
5.2函数和标准库函数
5.2.1 C语言的库函数
5.2.2字符分类函数
5.2.3随机数生成函数
5.3函数定义和程序的函数分解
5.3.1主函数
5.3.2程序的函数分解
5.3.3对函数的两种观点
5.3.4函数原型
5.4 C程序结构与变量
5.4.1 外部定义的变量
5.4.2作用域与生存期
5.4.3 外部变量和自动变量
5.4.4变量定义的嵌套
5.4.5静态局部变量
5.4.6变量的其他问题
5.4.7一个实例
5.5预处理
5.5.1文件包含命令
5.5.2宏定义与宏替换
5.5.3条件编译命令
5.6定义常量
5.7字位运算符
5.8编程实例
5.8.1一个简单的猜数游戏
5.8.2加密与解密
本章讨论的重要概念
练习
第6章 数组
6.1数组的概念、定义和使用
6.1.1定义数组变量
6.1.2数组的使用
6.1.3数组的初始化
6.1.4数组的存储实现
6.2数组程序实例
6.2.1从字符到下标
6.2.2筛法求素数
6.2.3成绩分类
6.2.4多项式求值
6.2.5定义数组的问题
6.3数组作为函数参数
6.3.1一个例子
6.3.2修改实参数组的元素
6.4字符数组与字符串
6.4.1字符数组
6.4.2字符串
6.4.3程序实例
6.4.4标准库字符串处理函数
6.4.5输出文本里的最长行
6.5两维和多维数组
6.5.1多维数组的初始化
6.5.2多维数组的表示和使用
6.5.3多维数组作为函数的参数
6.6编程实例
6.6.1成绩直方图
6.6.2 一个通用带检查的整数输入函数
6.6.3 “计算”数组变量的大小
6.6.4统计C程序里的关键字
6.6.5数组的划分
6.6.6数组的排序
问题解释
几个常用程序模式
本章讨论的重要概念
练习
第7章 指针
7.1地址与指针
7.2指针变量的定义和使用
7.2.1指针操作
7.2.2指针作为函数的参数
7.2.3与指针有关的一些问题
7.3指针与数组
7.3.1指向数组元素的指针
7.3.2基于指针运算的数组程序设计
7.3.3数组参数与指针
7.3.4指针与数组操作的程序实例
7.3.5字符指针与字符数组
7.4指针数组
7.4.1指针数组与两维数组
7.4.2命令行参数及其处理
7.5多维数组作为参数的通用函数
7.6动态存储管理
7.6.1为什么需要动态存储管理
7.6.2 C语言的动态存储管理机制
7.6.3两个程序实例
7.6.4函数、指针和动态存储
7.7定义类型
7.7.1定义数组类型和指针类型
7.7.2复杂类型描述与解读
7.8指向函数的指针
7.8.1 函数指针的定义和使用
7.8.2函数指针作为函数的参数
7.8.3数值积分函数
7.8.4若干以函数指针为参数的数组操作
实用函数
几个常用程序模式
本章讨论的重要概念
练习
第8章文件和输入输出
8.1文件的概念
8.1.1流和文件指针
8.1.2缓冲式输入输出
8.2文件的使用
8.2.1文件的打开和关闭
8.2.2输入输出函数
8.2.3程序实例
8.2.4直接输入输出函数
8.3标准流输入输出与格式控制
8.3.1行式输入和输出
8.3.2输入格式控制
8.3.3输出格式控制
8.3.4以字符串作为格式化输入
输出对象
8.3.5标准错误流
8.4程序实例
8.4.1求文件数据的平均值
8.4.2一个背单词程序
8.4.3资金账目系统
练习
第9章 结构和其他数据机制
9.1 结构(struct)
9.1.1结构声明与变量定义
9.1.2结构变量的初始化和使用
9.1.3结构、数组与指针
9.2结构与函数
9.2.1处理结构的函数
9.2.2程序实例
9.3联合(union)
9.4枚举(enum)
9.5编程实例
9.5.1数据组的排序
9.5.2复数的表示和处理
9.6链接结构(自引用结构)
9.6.1 链接结构
9.6.2 自引用结构的定义
9.6.3程序实现
9.6.4数据与查找
9.7字段
问题解释
本章讨论的重要概念
练习
第10章 程序开发技术
10.1分别编译和C程序的分块开发
10.1.1分块开发的问题和方法
10.1.2程序实例:学生成绩处理
10.1.3分块重整
10.1.4其他安排和考虑
10.1.5模块化思想和技术
10.1.6单一头文件结构和多个头文件结构
10.2功能模块和程序库
10.2.1 复数模块
10.2.2目标文件和库
10.2.3防止重复包含
10.3错误报告和处理
10.3.1建立统一的错误报告机制
10.3.2定义变参数的错误报告函数
10.3.3运行中错误的检查和处理
10.4程序的配置
10.4.1程序的行为参数和启动时的配置
10.4.2交互式配置
10.4.3通过命令行参数
10.4.4采用配置文件
10.5程序开发过程
10.5.1 自上而下的开发
10.5.2自下而上的开发
10.5.3实际开发过程
练习
笫11章标准库
11.1标准库结构
11.1.1标准定义(<stddef.h>)
11.1.2错误信息(<errno.h>)
11.2几个已经介绍过的头文件
11.2.1数学函数(<math.h>)
11.2.2字符处理函数(<cgype.h>)
11.3字符串函数(<string.h>)
11.3.1一些字符串函数
11.3.2存储区操作
11.4功能函数(<stdlib.h>)
11.4.1几个整数函数
11.4.2数值转换
11.4.3执行控制
11.4.4与执行环境交互
11.4.5常用函数bsearch和qsort
11.5 日期和时间(<time.h>)
11.6实现特征(<limits.h>和
<float.h>)
11.6.1整数类型特征
11.6.2浮点数类型特征
11.7其他与输入输出有关的函数
(<stdio.h>)
11.7.1符号常量和类型
11.7.2文件操作函数
11.7.3流缓冲区操作函数
11.7.4文件定位及定位函数
11.7.5其他有关函数
11.7.6采用va_list参数的输出函数
11.8定义变长度参数表(<stdarg.h>)
11.9非局部控制转移(<setjmD.h>)
11.10调试断言和信号处理(<assert.h>
<signal.h>)
11.11标准库的其他功能
11.11.1本地化
11.11.2多字节字符
本章讨论的重要概念
练习
附录A C语言运算符表
附录B C语言速查
附录C C99简介
进一步学习的建议
参考文献

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个