从问题到程序:程序设计与C语言引论第2版
作者 : 裘宗燕
出版日期 : 2011-05-03
ISBN : 978-7-111-33715-7
定价 : 39.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 348
开本 : 16
原书名 :
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

本书以C作为工具语言,讨论了基本程序设计的各方面内容,详细解释了与C语言和程序设计有关的问题。在新版修订中,特别加强了针对近年日益受到业界和学术界广泛重视的问题的讨论,并通过详细地分析和讨论大量符合C99标准的实例,给出了分析和分解问题、找出解决问题的主要步骤、确定函数抽象、找出循环、选择语言结构直至最后做出所需程序的完整过程。
  本书适合作为高等院校计算机及相关专业第一门程序设计课程的教材,也可供其他学习C程序设计的读者自学使用。

图书特色

本书通过大量符合C99标准的实例,详细介绍了C程序设计的思想和技术。书中没有采用常见的“提出问题,给出程序,加些解释”的简单三步形式,而是强调问题的分析和讨论,意在帮助读者认识程序设计的实质,理解从问题到程序的思考过程。很多实例包含详细的分析和讨论,不少实例给出了基于不同考虑形成的多种解法和性质比较,指出了看问题、分析问题和解决问题的方式方法,以帮助读者理解程序设计的真谛。

新版特色
? 特别加强了针对近年广受业界和学术界重视的问题的讨论。
? 在基本部分只介绍C程序设计中使用最广泛的内容,着重程序设计技术和方法的讨论,而有关C语言的一些细节问题集中放在各章最后,以免过多的语言细节干扰讨论的主干内容,也使课程教学内容的安排有了更多选择。
? 大大加强了安全性方面的讨论,在讨论各种程序设计技术的同时,认真分析了相关C程序结构中的脆弱点和可能的编程缺陷,提出了提高程序强健性的技术手段。

图书前言

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

裘宗燕
北京大学数学学院信息科学系

* 任何语言都有弱点。有句话说:“最好的语言也不能防止人写出坏程序。”这不是说语言不重要,而是说任何语言都有正确使用的问题。C在这方面的问题突出一点,读者应特别注意。

上架指导

计算机\程序设计

封底文字

本书通过大量符合C99标准的实例,详细介绍了C程序设计的思想和技术。书中没有采用常见的“提出问题,给出程序,加些解释”的简单三步形式,而是强调问题的分析和讨论,意在帮助读者认识程序设计的实质,理解从问题到程序的思考过程。很多实例包含详细的分析和讨论,不少实例给出了基于不同考虑形成的多种解法和性质比较,指出了看问题、分析问题和解决问题的方式方法,以帮助读者理解程序设计的真谛。

新版特色
? 特别加强了针对近年广受业界和学术界重视的问题的讨论。
? 在基本部分只介绍C程序设计中使用最广泛的内容,着重程序设计技术和方法的讨论,而有关C语言的一些细节问题集中放在各章最后,以免过多的语言细节干扰讨论的主干内容,也使课程教学内容的安排有了更多选择。
? 大大加强了安全性方面的讨论,在讨论各种程序设计技术的同时,认真分析了相关C程序结构中的脆弱点和可能的编程缺陷,提出了提高程序强健性的技术手段。

作者简介

裘宗燕:
裘宗燕: 北京大学数学学院信息科学系教授。长期从事计算机软件与理论、程序设计语言和符号计算方面的研究和教学工作。已出版多部著作和译著,包括《程序设计语言基础》(译著,北京大学出版社,1990),《Mathematica数学软件系统的应用与程序设计》(编著,北京大学出版社,1994),《计算概论(上)》(合著,高等教育出版社,1997),《从问题到程序—程序设计与C语言引论》(编著,北京大学出版社,1999)等;自2000年以来,他先后为机械工业出版社华章分社翻译了《程序设计实践》(2000),《C++程序设计语言(特别版)》(2001),《C++语言的设计和演化》(2002),《程序设计语言——概念和结构》(2002),《从规范出发的程序设计》(2003),《计算机程序的构造和解释》(2004)等一系列经典著作,他认真的工作作风、严谨的治学态度,以及所做出的巨大贡献,赢得广大读者的好评。 在北京大学教授的主要课程:计算概论(一年级本科生,主要内容为C语言程序设计),程序设计技术与方法(本科生),程序设计语言原理(研究生),算法和数据结构(本科生),算法设计与分析(本科生和研究生),数理逻辑(本科生)等。 点击进入[URL=http://www.math.pku.edu.cn/teachers/qiuzy/]作者主页[/URL]。

图书目录

前言
 新版说明
第1章 程序设计和C语言
 1.1 程序和程序语言
 1.2 C语言简介
 1.3 一个简单的C程序
 1.4 程序开发过程
 1.5 问题与程序设计
 本章讨论的重要概念
 练习
第2章 数据与简单计算程序
 2.1 基本字符、标识符和关键字
 2.2 数据、类型和简单程序
  2.2.1 几个常用类型
  2.2.2 函数printf和简单文本输出程序
 2.3 运算符、表达式和计算
  2.3.1 算术运算符和算术表达式
  2.3.2 表达式的求值
  2.3.3 计算和类型
 2.4 数学函数和简单计算程序
  2.4.1 函数、函数调用
  2.4.2 数学函数及其使用
  2.4.3 函数调用中的类型转换
 语言细节和问题
  C语言的字符集
  基本数据类型的一些问题
  数据形式的转换和输出
  运算对象的求值顺序
 几个常用程序模式
 本章讨论的重要概念
 练习
第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 循环语句:while语句
  3.5.3 循环语句:for语句
 3.6 若干C语言结构
  3.6.1 增量和减量运算符(++、--)
  3.6.2 逗号运算符
  3.6.3 实现二元运算符操作的赋值运算符
  3.6.4 空语句
  3.6.5 定义枚举常量
 3.7 输入和输出
  3.7.1 格式输入函数scanf
  3.7.2 字符输入和输出函数
 语言细节和问题
  变量的意义和实现
  赋值操作的一些问题
  条件表达式和条件语句
  表达式和求值
  输入和缓冲
 几个常用程序模式
 本章讨论的重要概念
 练习
第4章 基本编程技术
 4.1 循环程序设计
  4.1.1 基本循环方式
  4.1.2 求一系列完全平方数
  4.1.3 判断素数(谓词函数)
  4.1.4 艰难旅程(浮点误差)
  4.1.5 求立方根(迭代和逼近)
  4.1.6 求sin函数值(通项计算)
  4.1.7 从循环中退出
 4.2 输入循环
  4.2.1 输入循环的基本技术
  4.2.2 字符输入
  4.2.3 检查输入
  4.2.4 一个简单计算器
 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 测试
  4.4.2 白箱测试
  4.4.3 黑箱测试
  4.4.4 排除程序里的错误
 语言细节和问题
  程序的逐步求精和控制结构嵌套
  循环中的几种变量
  与输入输出有关的几个问题
  输入与安全性
 几个常用程序模式
 本章讨论的重要概念
 练习
第5章 C程序结构
 5.1 数值类型
  5.1.1 字符类型
  5.1.2 整数类型
  5.1.3 基本数据类型的选择
 5.2 几种控制语句
  5.2.1 do-while循环结构
  5.2.2 流程控制语句
  5.2.3 开关语句
 5.3 一些标准库函数
  5.3.1 字符分类函数
  5.3.2 随机数生成函数
 5.4 程序的函数分解
  5.4.1 函数分解
  5.4.2 对函数的两种观点
  5.4.3 函数定义与调用之间的配合
  5.4.4 函数原型
  5.4.5 求函数的根
  5.4.6 一个简单猜数游戏
 5.5 C程序结构与变量
  5.5.1 外部定义的变量
  5.5.2 作用域、存在期和变量类
  5.5.3 变量的其他问题
 5.6 预处理
  5.6.1 文件包含命令
  5.6.2 宏定义与宏替换
  5.6.3 条件编译命令
  5.6.4 定义常量
  5.6.5 单词计数问题
 5.7 字位运算符
 本章讨论的重要概念
 练习
第6章 顺序数据组织:数组
 6.1 数组的定义和使用
  6.1.1 数组变量的定义和声明
  6.1.2 数组的使用
  6.1.3 数组的初始化
  6.1.4 数组程序实例
  6.1.5 定义数组的问题
 6.2 以数组为参数的函数
  6.2.1 一个例子
  6.2.2 修改实参数组的元素
 6.3 二维和多维数组
  6.3.1 多维数组的初始化
  6.3.2 多维数组的使用
  6.3.3 多维数组作为函数的参数
 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.5.4 数组的划分
  6.5.5 数组的排序
  6.5.6 统计C程序里的关键字
 语言细节和问题
  数组的存储实现
  越界访问的可能后果
  多维数组的实现
  函数参数与sizeof运算符
  字符串的字典序
 几个常用程序模式
 本章讨论的重要概念
 练习
第7章 指针的应用
 7.1 指针的定义和使用
  7.1.1 指针的定义
  7.1.2 指针操作
  7.1.3 指针作为函数参数
  7.1.4 有关指针的几个问题
 7.2 指针与数组
  7.2.1 指向数组元素的指针
  7.2.2 基于指针运算的数组程序设计
  7.2.3 数组参数与指针
  7.2.4 指针与数组操作的程序实例
  7.2.5 字符指针与字符数组
  7.2.6 多维数组作为参数的通用函数
 7.3 指针数组
  7.3.1 字符指针数组
  7.3.2 指针数组与二维数组
  7.3.3 命令行参数及其处理
 7.4 动态存储管理
  7.4.1 C语言的动态存储管理机制
  7.4.2 两个程序实例
  7.4.3 函数、指针和动态存储
  7.4.4 定义类型
 7.5 指向函数的指针
  7.5.1 函数指针的定义和使用
  7.5.2 函数指针作为函数的参数
 语言细节和问题
  指针运算原理
  指针转换
  使用动态存储管理的要点和细节
  动态调整策略
  过时的函数指针形式
  复杂类型描述与解读
 几个常用程序模式
 本章讨论的重要概念
 练习
第8章 文件和输入输出程序设计
 8.1 文件的概念
  8.1.1 流和文件指针
  8.1.2 缓冲式输入输出
 8.2 文件的使用
  8.2.1 文件的打开和关闭
  8.2.2 输入输出函数
  8.2.3 程序实例
  8.2.4 标准错误流
  8.2.5 直接输入输出函数
 8.3 标准流输入输出与格式控制
  8.3.1 行式输入和输出
  8.3.2 输入格式控制
  8.3.3 输出格式控制
  8.3.4 以字符串作为格式化输入输出对象
 8.4 程序实例
  8.4.1 求文件中数据的平均值
  8.4.2 一个背单词程序
  8.4.3 资金账目系统
 几个常用程序模式
 本章讨论的重要概念
 练习
第9章 结构和复杂数据组织
 9.1 结构
  9.1.1 结构声明与变量定义
  9.1.2 结构变量的初始化和使用
  9.1.3 结构、数组与指针
 9.2 枚举
 9.3 结构与函数
  9.3.1 处理结构的函数
  9.3.2 程序实例
 9.4 编程实例
  9.4.1 数据组的排序
  9.4.2 复数的表示和处理
 9.5 链接结构(自引用结构)
  9.5.1 链接结构
  9.5.2 自引用结构的定义
  9.5.3 程序实现
  9.5.4 数据与查找
 语言细节和问题
  结构的实现
  联合
  字段
 本章讨论的重要概念
 练习
第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.1.3 C99的几个头文件
 11.2 几个已经介绍过的头文件

教学资源推荐
作者: 王珊珊 臧洌 张志航 编著
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
参考读物推荐
作者: (美)Harvey M.Deitel 等
作者: (美)John Robert Gardner,Zarella L.Rendon