《深入浅出程序设计竞赛·基础篇》评测

最近笔者通过某些渠道搞到了《深入浅出程序设计竞赛·基础篇》(以下简称”深入浅出“)的试读版本。趁着期末考试结束过来写篇评测。

总体评价

总的来说,这本书基本上实现了其在书名中所写的深入浅出的目标。

每章页首的思维导图清晰地告诉了读者本章的主要内容,并且覆盖了绝大多数入门选手需要掌握的知识。生动有趣的语言也便于读者理解相关内容。

例题的选取也比较合适,对浮点误差,未定义行为等常见错误都有所提及。

当然也有一些美中不足的地方:比如笔误较多(如果提前叫两个人审稿的话这样的错误可能会少不少),有些内容的编排顺序并不太恰当等问题。这些内容都将在下文详细说明。

个人认为还需改进的地方

试读版中出现的多数笔误在 勘误表 中已有提及。这里主要说一些内容编排方面还需改进的地方。

考虑到本书面向初学者,对一些内容简略化,模糊化处理是可以理解的,也是比较推荐的一种做法。但这些内容如果在文中多次出现的话,还是应该注意一下表述的连贯性与一致性。

举个栗子,memset 函数的用法在 P79,P180,P194,P310 中均有所提及。 在 P310 页中详细叙述了原理,却得出了 memset 中间的参数只能是 0 或者 -1 这样不太恰当的结论。而在 P194 中,提到了将 memset 中间的参数替换为 127,128 这些其他数字的用法,并详细说明了这样初始化的结果,这两种表述的意思截然不同,可能会引发初学者的疑惑。

另外,在 P62 页中提到了变量重名的问题,但却没有详细叙述变量重名的后果,只是以”两个变量互不干涉“的措辞一笔带过,这个表述与 P116 中的变量作用域也有矛盾。

出现这样表述不一致性的问题还是应该尽量避免,对于当前无法解释清楚的内容,可以通过脚注的方式将原理叙述链接到其他页面,以确保表述的连贯性。

当然,对一些内容简略化处理并不意味着所有概念都一笔带过,有些比较重要或者可能引发误解的内容还是应该尽量叙述清楚。

P121 中提到了移位运算符的优先级低,代码中出现了 1<<n-1 这样的语句,却没有具体地解释优先级的关系是怎样的(读者可能会把这个语句理解为 1<<(n-1) 或是 (1<<n)-1,当然后面那种理解是错误的)。

(优先级的内容其实在 P39 中提到了,但考虑到这两个页面相隔较为遥远,且当时读者可能还不知道移位运算符,可以在 P121 中用脚注指向运算优先级的内容,加深读者理解)

部分章节的顺序也可能需要进行调整,一些比较常用的内容,应该放到比较靠前的位置,从而尽量避免前面的内容要用到后面的知识的尴尬局面。

第十九章”进制与位运算“虽然归属于数学部分,但考虑到 C++ 语言特性等原因,放在语言基础部分可能更加合适。这样也避免了第十章”暴力枚举“中的”子集枚举“内容要参见后面内容的情况。

另外,关于满二叉树的概念,又 踩 雷 了(

(如果还没搞清楚那几种二叉树的区别,请参考 OI-wiki 的叙述)

与同类书籍的对比

与深入浅出对标的书,笔者手头有两本,一本是《信息学奥赛一本通》(以下简称”一本通“,注意不是提高篇,笔者手头拿的是较为古董的第三版),另一本是《算法竞赛入门经典(第 2 版)》(以下简称”紫书“,当然紫书的内容相比基础篇更丰富一些)。

首先一本通仅凭它不等宽的代码字体,糟糕的排版,就已经输在起跑线上了。而且部分内容有抄袭紫书等现有资料之嫌。与之相比,深入浅出无论在排版质量,内容的广度与深度上,都完胜一本通。

而紫书和深入浅出相比,则各有可圈可点之处。紫书的提示和脚注较多,方便读者学习与理解,并在每章末附上了例题和习题表格,方便读者复习已经学习的知识。深入浅出则通过每章开头的思维导图,将该章的所有知识点串连了起来。当然深入浅出现在的小错误比较多,这点稍微影响了对深入浅出的印象分。

总结

目前看来《深入浅出·基础篇》还是一本值得推荐的入门教材。

同时继续催更洛谷赶快把剩下几本书写完(雾)

另外,本文部分内容参考了 @Planet6174 整理的 《深入浅出》编排问题合集,在此表示感谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据