图书前言

前言

21世纪,人类步入信息社会,大数据、人工智能、互联网+等技术已经融入人们的日常生活中,正在影响和改变着人们的工作、学习和生活方式,而这些都离不开计算机。“计算”本身是一门学科,它在自身发展的同时也促进了其他学科的发展,各学科的研究问题都有可能通过与计算科学进行学科融合而得到解决。

计算机不仅为不同专业提供了解决本专业问题的有效方法和手段,而且还提供了一种独特的处理问题的思维方式——计算思维。逻辑思维、实证思维和计算思维三大科学思维构成了现代科技创新的三大支柱。计算思维不仅仅属于计算机科学家所特有,它已经成为每个人应该具备的基本能力。因此,不仅要掌握阅读、写作和算术(Reading,wRiting,and aRithmetic——3R)能力,还要接触计算的方法和模型,培养计算思维。

众所周知,计算机可以进行数值计算问题的求解,例如解方程(组)、函数求值、概率统计等,可以用来解决如气象预报、石油探测等问题。更多的时候,人们利用计算机进行非数值计算问题的求解,例如字符、图形、图像、声音、动画等,来解决文字处理、飞机售票、学生信息管理、道路交通管理等问题。对于计算机的问题求解,特别是非数值计算的问题求解,需要研究计算机的操作对象(数据元素)以及它们之间的关系和运算。

人类使用计算机求解实际问题的基本步骤是: 首先将实际问题抽象成数学模型,即分析问题,从中抽象出操作的对象和相应的操作,找出这些操作对象之间的关系,并用数学语言加以描述;其次设计实现这些操作的算法并编写程序实现相应的算法;最后运行程序对实际问题进行求解。如何表示信息和处理信息,这正是计算机科学研究的主要问题。人类进行抽象和形式化,就需要学习和掌握常用的计算思维方式。

程序设计方法、数据结构和算法是计算机科学与工程的基础性领域知识,是开发高效计算机程序、解决各领域应用问题的核心。在寻求和实现数学模型的过程中,计算机算法与数据的结构密切相关。学习程序设计方法、数据结构和算法相关知识,不仅可以掌握计算机基础课程的基本方法,更是训练计算思维的有效途径。

当前,AI大模型的快速发展极大提升了知识获取的效率。只要提问,就能得到看似详尽的回答。但这种便利也带来风险,AI幻觉问题仍然存在,模型可能会生成看似合理却存在错误的内容。若缺乏扎实的底层知识,仅依赖AI,则很容易被误导。只有通过系统化的学习,掌握程序设计、数据结构、算法和计算思维,才能真正理解技术本质,具备判断AI回答是否正确的批判性能力。

本书面向高等学校理工类特别是新工科专业学生掌握如何使用计算机求解问题、具有主动使用计算机解决生活和学科问题的意识和能力的需求,针对计算机学科最基础性的问题编写的教材。全书共分三部分: ①结构化程序设计方法; ②面向对象程序设计方法;③基本的数据结构和算法。书中除了讲解计算的基本概念、方法,还给出了完整的实现代码。每章都给出了讲解视频和拓展学习的内容,读者可以通过扫描二维码进行进一步的学习。同时在配套教材《程序设计基础——上机实习及习题集》(第2版)中,还为每章配套了“课程实习”、“课后习题”和“课后习题参考答案”等内容。

前言〖2〗程序设计基础(第2版)全书共15章,主要内容如下。

第1~6章为结构化程序设计方法。其中: 

第1章如何让计算机进行计算。本章首先介绍计算思维和程序设计的基本方法;然后介绍程序流程图的基本画法和使用计算机求解问题的过程;接下来通过两个简单的C++程序示例,介绍C++源程序的基本结构和组成元素;最后结合“智能五子棋人机对战”任务,按照5E方法设计出这个任务的解决方案。

第2章计算机如何表示与处理数据。本章介绍二进制数及几种基本数据类型的二进制数据表示方法,包括不同进制数值之间进行转换的方法,整数、实数、字符型和逻辑型数据的二进制表示方法等。本章还介绍如何通过C++语言实现这些基本数据类型在计算机中的存储,以及对这些基本数据类型的数据进行处理的方法。同时,本章以“智能五子棋人机对战项目”为载体,通过五子棋棋盘状态的表示、棋子信息的编码、图形界面的绘制等实际案例,引导学生理解数据表示与处理在实际问题中的应用,初步建立“数据驱动界面”的工程化思维。

第3章选择与迭代算法。本章介绍处理问题时的选择思想和迭代思想,以及如何使用C++语言实现选择和迭代算法。同时,本章围绕“智能五子棋人机对战程序”中棋盘交互功能的实现,引导读者将选择与迭代结构应用于鼠标事件响应、坐标映射、落子有效性判断及回合状态管理等实际问题,体会程序控制结构在图形交互程序中的具体作用。

第4章结构化数据。本章重点介绍多记录数据和多属性数据的存储结构,以及如何使用C++语言实现这些数据的存储和处理。本章还介绍枚举数据类型。本章给出一个数组应用实例,该实例涉及基本的排序算法的思想,给读者以启发,激发读者利用计算思维解决更多、更复杂的问题的兴趣。同时围绕“智能五子棋人机对战项目”的深入开发,阐述如何利用枚举类型清晰定义棋子状态,借助二维数组完整记录棋盘局面,并在此基础上实现胜负判断等核心游戏逻辑,从而理解数据结构在支撑复杂程序功能中的重要作用。

第5章模块化。本章重点介绍模块化的思想,以及如何使用C++语言编写模块化程序。本章还介绍C++语言中带默认形参值的函数、函数重载、变量与函数的生存期和作用域、多文件结构及编译预处理等方面的内容。同时,本章结合“智能五子棋人机对战程序”的进一步开发,展示模块化思想与函数机制在优化程序结构、实现初步智能决策中的实际应用,帮助读者理解如何通过函数封装与多文件组织提升代码的清晰度、可维护性与可扩展性。

第6章数据存储。本章重点介绍计算机中数据存储的基本原理,以及如何使用C++语言编写程序操作内存中的数据。本章还介绍C++语言中的指针与函数、引用、引用与函数、指针相减运算和关系运算等方面的内容。同时,结合“智能五子棋人机对战程序”中AI决策机制的优化,将通过指针高效传递棋盘状态、利用引用返回多值结果等具体案例,帮助读者理解指针与引用在优化数据结构传递、实现复杂程序功能中的作用。

第7~10章为面向对象程序设计方法。其中: 

第7章面向对象方法。本章主要介绍面向对象方法的基本概念,以及用C++语言实现面向对象程序设计的基本方法。本章还介绍如何根据需要对C++语言提供的运算符进行重载,使运算符可以直接对自定义类的对象进行操作等知识。

第8章继承与多态。本章主要介绍面向对象程序设计的两个重要特性——继承和多态,以及用C++语言实现继承和多态的基本方法。

第9章输入输出流。本章重点介绍标准输入输出流和文件输入输出流两方面的内容。

第10章模板。本章介绍模板的基本概念,以及函数模板和类模板的定义和使用方法等。

第11~15章为基本的数据结构和算法。其中: 

第11章数据结构的基本概念。本章主要介绍数据结构的基本术语、数据的逻辑结构、数据的存储结构和数据的操作。

第12章线性表。本章主要介绍用来描述具体数据结构的抽象数据类型、线性表的特点、线性表的顺序存储结构和链式存储结构,并且给出这些存储结构完整的C++实现程序代码,以及如何复用这些代码解决实际应用问题的实例和方法。

第13章栈与队列。本章主要介绍栈和队列的特点和抽象数据类型,并给出实现顺序栈、链接栈、顺序队列和链接队列完整的C++实现程序代码,以及如何复用这些代码解决实际应用问题的实例和方法。

第14章树和二叉树。本章介绍树的基本概念、二叉树的基本特性,重点讲解二叉树的顺序表示和链式表示,二叉树的遍历和其他常用操作,并给出完整的C++实现程序代码,以及如何复用这些代码解决实际应用问题的实例和方法。本章还介绍哈夫曼树和哈夫曼码。

第15章图。本章介绍图的基本概念,并通过实例说明如何用图来描述实际问题;重点讲解图在计算机中常用的三种表示方法和图的遍历方法,并给出完整的C++实现程序代码,以及如何复用这些代码解决实际应用问题的实例和方法;最后结合具体应用问题介绍最小生成树和最短路径的问题。

为便于练习,本书不仅给出算法的描述,还给出完整的程序代码。读者直接或稍加改动就可以复用这些代码来解决自己的实际问题。

本书是由南开大学计算机学院公共计算机基础教学部的教师结合多年的教学经验,针对目前高等学校理工类特别是新工科专业大学生对计算机基础知识的需要编写的,综合考虑了MOOC和SPOC课程知识碎片化的特点,方便教师、学生和自学者使用。王恺负责第4~6章(不包括应用案例)、第8章、第9章、第14章和第15章的编写并统编全书,闫晓玉负责第1~6章应用案例的编写并负责全书校对工作,赵宏负责第1~3章(不包括应用案例)、第7章和第10~13章的编写。

在本书的编写过程中,得到了清华大学出版社张瑞庆编审的大力支持,在此表示真诚的感谢!由于作者能力和时间的限制,书中难免有不妥之处,恳请同行和读者指正,在此表示真诚谢意!

作者

2026年3月于南开园