
前言
随着信息社会的发展,计算机领域的知识和能力越来越受到人们的重视,作为计算机入门知识的程序设计自然备受重视。本书作为程序设计的入门课程教材和自学读物,致力于帮助读者理解程序和计算,理解并掌握程序设计的思想、方法和基本技术,学习一种实用的编程语言,以便为在信息社会中继续学习和工作打下坚实的基础。本书详细介绍了程序设计语言与基本程序设计的各方面情况和问题,包括与计算机程序和程序设计有关的基本概念,用计算机解决问题的思维方法,以及程序设计的基本技术。本书的内容选择、撰写方式和章节安排都认真考虑了入门课程和自学者的需求。
本书在内容编排上特别重视由易到难、稳步推进,以递进的方式讲解概念,解释细节,展示简单用例,再给出完整的问题实例分析和程序源代码,辅以对完整程序的分析和评价等,通过多种方式相互呼应,帮助读者领悟并掌握与程序设计有关的概念、方法和技术。本书特别考虑了内容的安排顺序、难点的分解和多种角度的解释等,使学习曲线尽可能平滑,让读者更容易接受。
本书用标准C语言作为基本教学语言,辅以C++的少量易用功能以降低初学者的学习难度。这样安排的主要理由是:
(1)C语言包含了最重要的基本程序设计机制,能较好地满足编程学习的需要,完善的开发工具也很容易获得。
(2)C语言是许多计算机专业课程的支撑语言,这种安排有利于与后续的学习和课程接轨。
(3)C语言一直是业界广泛使用的语言之一。
由于C语言中少数机制的技术细节较多,初学者不易掌握,因此,本书采用C++语言中相应的特性作为替代(主要是输入输出和存储分配机制),从而降低学习和编程的难度,使读者能专注于程序设计的学习。
本书以程序设计为主线,贯彻“在做中学”的理念,致力于帮助读者通过正确的实践去深入理解“计算思维”,以及用计算机解决问题的方法和技术。书中介绍了C/C++语言的各种重要结构,其中特别关注它们在程序中的作用和相互联系。在讨论编程实例时,本书摒弃了一些教材中常见的“叙述问题,列出代码,简单说明”三步法,改为详细阐释从问题到程序的思考和工作过程。书中通过大量编程实例,反复展示对问题的分析和分解、找出主要步骤、确定函数抽象、找出循环、选择语言结构直至开发出能正确完成工作的良好程序的全过程,帮助读者理解程序设计的真谛。
学习程序设计需要理解这种工作的系统性、科学性和工程性。进行程序设计就是为了用计算机解决问题,第一步工作应该是深入分析问题,设法找出解决问题的线索和方法,为后续编程做好准备。分析中有可能发现多种可用的解决方案,这时就需要比较不同方案并做出选择,还要对所做的选择有清醒的评价(优点、缺点、倾向性等)。这又是典型的工程问题:实际中常常无法找到完美的解,需要权衡、折中和选择。第二步工作是程序的功能分解,把复杂功能分解为较简单的部分。正确、有效的分解是科学性问题,而在多种可能分解中选择又具有明显的工程性。之后的编码也同样需要科学和工程思维的结合。总之,正确的好程序不是随便做出来的,必须基于科学的方法,辅以正确的工程处理。
书中的大量实例给出了完整的开发过程,有些包含比较详细的分析和讨论,有些给出了基于不同考虑的多种解法。书中仔细比较了它们的特性,有时还指出了其他可能性。一些实例完成后有回顾与分析,提出了关于还可能如何想、如何做的思考。书中经常给读者提出一些问题,启发读者积极思考,发挥读者的主观能动性,帮助读者更好地理解程序设计的真谛。书中的练习题也力图反映这些想法。
本书中的讨论还特别强调对程序设计过程的正确认识,强调良好的程序设计风格,强调通过函数抽象建立清晰结构的重要性,强调程序的良好结构、可读性、易修改性等。书中的源代码示例都力图反映这些良好性质,也尽量避免出现晦涩难懂的语句或结构。书中根据内容进展及时介绍一些重要的标准函数库,帮助读者建立对标准函数库的清晰认识。此外,书中还简单介绍了一些与计算和程序有关的一般问题,如通过统计程序运行时间介绍计算的基本性质(复杂性),通过分析循环过程能否完成所需工作介绍“循环不变关系”的概念等。这些既能丰富读者的知识,也能作为思考程序的线索。
程序设计是一种实践性活动,仅靠读书、抄写现成代码做试验是不可能学好的。作为初学者,不但需要深入阅读和理解教科书上的内容,还必须“在做中学”,一次次地亲身经历“从问题到程序”的思考和把初步的代码设计构想逐渐细化直至变成能正确实现预期目标的具体程序代码的工作过程。在这些过程中,既需要发挥自己的聪明才智,也需要细致认真、踏踏实实地工作。
请读者注意,对同一个问题可以有不同的考虑和分析、不同的设计选择和不同的具体实现方法,因此可能得到许多不同的程序。它们可能各有长短或侧重,也可能反映了对问题的不同想法,但都是对原问题的合理解答。不应将各种书籍(包括本书)里的程序看作标准答案,这些程序只是作者对问题的一种解答。为了学好程序设计,希望读者能养成一种习惯:在阅读书中程序时注意思考作者的考虑和选择,分析其中哪些是合理且有价值的(或不合理、无价值的),还可能怎样选择,采纳其他选择可能得到什么(或失去什么),等等。这样思考将使你受益无穷。当然,虽然程序设计中有很多选择,但本书中的实例还是努力给出好的选择,说明选择的理由,指出有关选择带来的问题(缺点和限制等),供读者参考。
今天,计算机系统的安全问题变得越来越重要,程序的强健和安全是计算机系统安全的基础。本书在讨论程序设计的基本问题时,也简单讨论了一些C程序结构的脆弱点和可能的安全缺陷,以及提高程序健壮性的基本技术。这些初步讨论意在帮助读者提高认识,理解计算机安全的重要性。
本书的讨论不依赖于具体开发系统,读者可以用任何符合C和C++标准的系统作为学习工具。但在讨论编程中的一些具体情况时,参考一种具体程序开发环境也可能有所助益。本书选用相对简单的Dev-C++集成开发环境作为展示工具,借助它介绍一些开发中的实际问题,特别是程序的调试。
本书包含如下8章和若干附录:
第1章 程序设计和C/C++语言:介绍程序与程序语言的概念、C语言和C++语言的发展及其特点,用一个简单例子介绍C/C++程序及其加工和执行,最后介绍集成开发环境Dev-C++的基本使用。
第2章 数据与简单计算程序:讨论程序语言中最基本的概念,包括字符集、标识符和关键字,数据与类型,数据表示,运算符、表达式与计算过程,数学函数库的使用,等等。
第3章 变量和控制结构:介绍C/C++基本编程机制及其使用,包括语句和复合结构,变量,关系运算和逻辑运算,以及支持选择和循环执行的控制结构,并介绍程序的动态除错方法。
第4章 基本程序设计技术:首先讨论循环程序设计的基本方法,通过实例分析循环的构造过程;然后介绍常用标准库函数,交互式程序设计的输入输出,特别是C++字符流和文件流输入输出技术。
第5章 函数与程序结构:首先介绍函数的定义与调用、程序的函数分解和递归函数,以及外部变量等概念;在此基础上讨论与更复杂的C/C++程序和多文件开发有关的技术,包括函数和变量的声明与定义、预处理程序;最后介绍集成开发环境中的程序调试工具。
第6章 数组:介绍数组的概念、定义和相关程序设计技术。
第7章 指针:介绍指针的概念和指针变量的使用,指针与数组的关系,多维数组作为参数的通用函数,以及动态存储管理、指向函数的指针等概念及其在程序中的应用。
第8章 结构体和其他数据机制:首先介绍类型定义,然后介绍结构体的定义及其在程序中的使用,并简单介绍链接结构的概念和类(class)的概念。
最后安排了5个附录,分别介绍C和C++语言运算符、ANSI C关键字、C和C++语言常用功能、命名规范以及编程形式规范,并给出进一步学习的建议。
为了方便读者阅读,本书中的重要名词概念用黑体字标记,重要词句用粗楷体字标记,重要源代码用波浪线标记,附加注释性的词句用楷体字标记。本书中一些高级主题用星号标记,供学有余力的读者阅读。
作者特别感谢参加相关课程学习的学生,他们提出的问题给了作者许多启示,促使作者更深入地思考了许多问题。作者感谢家人与同事多年的支持。虽然本书凝结了作者的多年思考,但仍难免有错误或不足,希望得到读者的指正和同行的意见、建议。相关教学资料(教学课件、编程练习题参考答案和额外的习题等)可以从如下网址获取:https://devcpp.gitee.io/ptop。如果需要联系作者,请发邮件至qzy@math.pku.edu.cn或anbangli@mail.ccnu.edu.cn。
裘宗燕(北京大学数学学院信息科学系)
李安邦(华中师范大学物理科学与技术学院)
2022年5月