前言

小语

小学毕业的那个暑假,爸爸问我要不要学习计算机编程。编程?听起来好像很酷的样子,我想也没想就答应了。

不过等到真学起来,才发觉完全不是那么回事儿。中间的过程真是一言难尽。尤其是上了初中之后,功课愈加繁忙,我需要从吃饭、睡觉和休息中挤出一些时间来面对那全然陌生的语句和代码。就连那台我平常用来看网剧、购物、玩游戏的电脑也一下子变得生疏了。

刚刚学习程序两个月的时候,爸爸帮我报名参加一场省级竞赛。同场竞赛的一百多名选手之中,算上我只有三名女生。至于我身边的朋友,几乎没有谁和我一样。她们中好多人根本不知道Python和C++为何物。因为学习的时间太短,那次比赛我并没有晋级,我感到有些沮丧,但爸爸却安慰我,他只是想让我感受一下竞赛的氛围,增长一些见识。至于比赛成绩并没那么重要。

那时我根本没有想到,半年之后我用刚刚学会的MFC制作的“初中知识关联学习卡片”会在2019年度全国中小学生电脑制作比赛中获奖。在得知获奖的那个晚上,爸爸对我说:“你记了这么多的笔记,都可以出书了!”

从小父母便教育我,好东西要与大家分享。因此,我也愿意把我的学习经验来与大家分享。更何况,按照爸爸的说法,在与大家分享的过程中,大家有所得,而我并无所失,反而能在这个过程中,使自己得到更多的锻炼!

语爸

2018年夏天,小语刚刚取得中学的录取通知书。在等待开学的这段时间里,我和语妈就孩子的假期安排产生了分歧。语妈主张提前学一些初中课程,我则更倾向于让她学习一些课程以外的技能,例如,计算机编程。

语妈满脸质疑,“现在就学编程,太早了吧!”

我和语妈都是“七零”后,从大学时代才开始接触编程。上计算机课是我们能够接触到电脑的唯一机会。在此之前,即便想学,也没有那个条件。毕竟计算机对于那时的大多数普通中学生来说,就是一个传说。而那时的计算机,除了编程之外,我不知道还能干什么别的(当然,那时也有电脑游戏)。

但现在已经完全不同。我们的孩子几乎是看着电脑,伴着网络长大的。对于一般的初中生来说,除了编程和一些比较专业的应用,电脑(还有智能手机)上的东西大概没剩下什么是他们不会用的。既然有这么好的条件,为什么不早一点开始学习编程呢?

从什么语言开始学呢?我接触计算机的前十年所学的计算机语言中,只有C/C++仍然在广泛应用,那就从它开始吧!

于是,在那个暑假,我从收集的计算机语言教材中挑选了几本我认为相对易于理解的,又专门网购了一些针对中学生编程竞赛的书籍。在给小语讲解了一些计算机编程基本概念之后,便都扔给她自己去看了。因为当初我就是自学C语言的。而且我的工作也很忙,并没有那么多时间陪她。

这种“放羊”式的教学效果很不理想,半个假期过去了,除了一些书面的竞赛知识题答得尚可,对于编写程序,小语始终未得入门。于是我挤出一些时间尝试着对照书上的内容给她讲解,但每每看到她一脸懵懂的表情,我的内心深受打击。

难道真的如语妈质疑的那样,起步太早了吗?

静下心来,独自翻阅给小语准备的书籍,回想自己当初的学习历程,我发现一个以前一直忽视的问题。我之所以能够看懂这些书,是因为我会。如果没有相关的知识背景,这些书中讲的大多数内容,我恐怕根本看不懂,更别说零基础的小语了。我也相信有一些天才儿童、特别聪明伶俐的孩子,对于计算机程序有着天生的敏感,能够一学就会,但我家小语显然不是这种孩子。

于是我放弃了教科书,开始自行设计一些有针对性的实例,力求简单、典型、实用。一边讲解,一边让小语尝试直接上机编写和实测。等到假期结束,小语已经记了一大本笔记,完成了十多个实例程序的编写和实测,学习的效果开始逐渐显现。

当初为了说服语妈,我曾专门上网去找论据。看到有网友在提相同的问题:“初一学编程,早吗?”下面自然是回答什么的都有,而好几个明显是中学生朋友给出的答案居然是:“初中才学啊?晚了!”

我当时并没有拿这种说法当真。不过在一年后的今天,我越来越认同这种说法,并且为没让孩子更早接触编程而感到后悔。因为身处一个区域的中心城市,初中生所面临的学业负担可想而知,甚至要比高中生的压力还要大。在课业任务重的时候,小语每周甚至抽不出两个小时的时间留给编程。如果早两年,无疑她会有更加充裕的时间。

就是在这种紧张的环境中,小语在学习函数、指针,以及更为复杂的面向对象编程的时候,逐渐遇到了瓶颈。于是我说:“咱们先把C++放一放,换一种语言,学学Python。”

我没有准备新的实例,直接使用前面为C/C++设计的实例,让小语用Python再做一遍。有了C++的基础,学习基本语法结构相对简单的Python,小语的学习进度这次要快得多。

就这样,在投入了从国庆到春节几乎所有的闲暇时间后,小语基本学会了使用Python和C++两种语言面向对象编制Windows简单应用程序的技巧,并参加了2019年第二十届全国中小学电脑制作比赛,获得了初中组计算机程序设计项目全国二等奖。

兴奋之余,我指着小语那厚厚的几大本笔记开玩笑说:“这些都可以拿去出书了。”

“可以吗?”她眨着眼睛问,“有了这本书,是不是像我一样笨的孩子都可以学会编程了?”

我家小语当然不笨,她和其他孩子一样喜欢听到别人夸她聪明。我们也相信任何一个如她一样受到父母钟爱的孩子都不是笨孩子。孩子小的时候,我曾教她要学会分享,现在她要把她学习编程的经验和经历拿出来与大家分享。

于是我们开始认真地考虑出书的可能性。在接下来的几个月中,小语又用她本就不多的休息时间整理了笔记,重新上机测试每一个程序以保证它们不会出错。我则帮助她润饰文字并增加必要的注释,这便是本书内容的来源。

虽然书中的例子最开始都是我设计的,最后的定稿也是由我来做,但书中绝大部分程序和记述文字都出自小语之手。所以,这首先是她的作品。

致谢

感谢亲爱的妈妈,每每在我冥思苦想的时候,给我送来好吃的,让我缓解压力,并对我们的书提出中肯的意见。还要感谢我的班主任柴老师和学校的荣主任、赵老师对我学习和参赛的支持。

最后要感谢我亲爱的爸爸,是他通过精心设计的巧妙实例,带我进入了美妙的编程世界,也是他逐一指出我笔记和程序中的错误。我的语言表达能力有限,文本表述也欠佳,学业又紧张,没有足够的时间,一切都有赖于爸爸的润饰和把关。

首先感谢语妈对我们的全力支持。她是本书的第一位读者,提出了很多十分中肯的意见。感谢沈阳市沈东初级中学的老师们对小语参加课外学习和活动的支持。

原创性声明

本书中的文字和程序均为作者自行编制完成。实例中所用的图片,包括第17~20章实例中使用的荷塘、金鱼和动物图片均为作者自行拍摄。书中所列实例亦为作者自行设计,但作为计算机语言方面的教学用书,所用实例应力求简单和典型,具有普遍性,与其他著作中的实例可能会有雷同之处,这一点在所难免。

在写作本书之前,作者曾经学习和参考过多种Python和C/C++方面的著作和一些相关网站的内容,从中获得过巨大的启发和帮助。但在本书写作过程中,没有对其观点和内容形成实质性的引用,因此也就没有列出参考文献。

特别说明

在一些资深的程序员看来,本书中的示例程序恐怕不够专业和完美。确实,在整理这些示例程序的过程中,在保证程序运行结果的条件下,我们对它们尽可能简化,以增加可读性,便于读者理解。那么,一般程序中必备的容错性和兼容性设计就相应被忽略掉了。

此外,不同于很多教材以理论为主、实例为辅的方式,本书主要以实例为主。实例中没有涉及的理论和概念一般不会提及。这也是面向尚未接触足够背景知识的初学者时所做的一种实用性选择。

配套源程序

本书的配套源程序请扫描右侧的二维码进行下载,如果在下载过程中碰到问题请联系陈老师,联系邮箱chenlch@tup.tsinghua.edu.cn。

源程序

作者

2020年3月