《程序设计基础》重点讲授在c/c++语言言环境下,编写程序的思路和方法,涉及计算机语言、数据结构和常用算法等内容。全书内容丰富,强调动手实践,深入浅出地引导读者理性思维和理性实践,教学方法引人入胜,便于自学。
《程序设计基础》可作为大专院校教材,亦可供从事计算机、自动化和相关领域的科研人员参考。
作 者 简 介 吴文虎,1955~1961年分别就读于清华大学电机工程系和自动控制系。毕业后留校任教,曾任计算机科学与技术系教授,博士生导师,科研成果曾多次获国家教委、电子部的科技进步二等奖和863高科技成果精品展金奖。主编、主审和撰写了几十部有关计算机的图书。
从1984年开始介入青少年计算机普及活动,1990~1997年担任中国计算机学会普及委员会主任,作为总教练和领队曾连续15年带领中国队参加国际信息学奥林匹克竞赛,届届名列前茅。从1996年开始指导和组织清华大学学生参加ACM世界大学生程序设计竞赛,连续13年获得决赛权,多次获金牌和银牌。
教学工作:曾多年主讲研究生学位课。从2001年开始主讲本科生主干课“程序设计基础”。该课着力于教学理念、教学思路和教学方法的改革,受到学生欢迎,当年就被评为清华大学精品课,第二年被北京市评为精品课,第三年被教育部评为首批国家级精品课,在全国起到示范和带头作用。
近年来在教育教学方面所获得的荣誉:
1997年获清华大学教学优秀成果特等奖;
1998年获全国优秀教师一等奖(宝钢奖);
1999年获国家科技部、中宣部和中国科协颁发的“全国科学普及先进个人奖”;
1999年获首都劳动奖章;
2001年获北京市高等教育教学优秀成果一等奖;
2001年获“全国师德先进个人”奖;
2002年获信息学奥林匹克国际委员会颁发的特别贡献奖;
2004年获北京市高等教育教学优秀成果一等奖;
2004年获中国计算机学会颁发的杰出贡献奖;
2005年获清华大学良师益友奖;
2006年获北京市高等教育教学名师奖;
2008年获清华大学学生会授予的“我最喜爱的教师”奖;
2009年获ACM/ICPC组委会颁发的杰出教练奖;
2010年获ACM/ICPC组委会颁发的杰出贡献奖。
曾任:
中国计算机学会普及委员会主任
全国高校计算机基础教育研究会副理事长
教育部现代远程职业教育与成人教育专家组组长
NOI(中国信息学奥林匹克)科学委员会主席
国际信息学奥林匹克中国队总教练 第3版说明 本书的第1版是2003年9月完成的,经过一年的试用,于2004年9月发行了第2版。 学生普遍反映,这本教材思路清晰,重点突出,易学易用,特别是强化实践教学思想,使学生既动手又动脑,学会了编程的基本思路和方法,受到了学生的好评。从第2版的使用到现在又经过了6年时间,这期间我们在实践中认真听取学生的反馈意见,不断改进教学方法,与时俱进地充实教学内容,特别是注重将讲课内容与作业提交系统形成一个有机的整体;使学生的学习更容易做到理性思维和理性实践,以期达到进一步提高教学质量的目标。为此,我们又在第2版的基础上调整了部分章节,增加了一些常用的重要算法及程序实现,形成了现在的第3版。从教材改版的目标而言,我们认为“没有最好,只有更好”.
吴文虎、徐明星2010年9月 第2版说明 本书第1版是2003年9月出版的,经过一年的使用后,学生普遍反映本书重点突出,易学易用。但作为教师,我感到还要不断地研究教学规律,化解教学中的难点。为此,我又重新审阅了全书,在文字上做了调整,内容上做了修正,力求讲得明白透彻。在教学中发现,初学者往往要花费很多的时间在程序调试上,效率很低。实际上程序调试已成为学生编程实践中的“拦路虎”。所以,配合本书,又专门编著了《程序设计基础(第2版)习题解答与上机指导》,还准备上小班辅导课让学生学会调试程序的基本方法。我认为这可能是进一步提高该课教学质量的一个关键。
吴文虎2004年8月 前 言Preface “计算机语言与程序设计”是一门十分重要的基础课程。该课长期沿袭着这样的教学模式:过于注重语句、语法和一些细节,基本上是以高级语言自身的体系为脉络展开的,没有把逻辑与编程解题思路放在主体地位上;对如何分析问题和解决问题讲得不够,对学生编程的能力、上机解题的能力训练不够。这样就给后续课程及研究生阶段的课题研究留下了缺憾。很多学生在学习这门课时感到枯燥难学,学过之后,不能用来解决实际问题。
我个人的经历有些不同,除了学校给我安排的教学和科研任务之外,20年来我一直指导初中学生、高中学生和大学生参加有关计算机的各种比赛,包括国际信息学奥林匹克和ACM世界大学生程序设计竞赛,通过对这些学生成长道路的反复思考和研究,使我感到很有必要改变我们的课程教学模式,用新的教学理念和方法培养一流人才。对这一问题,我和有关领导谈了自己的想法,他们非常支持。
从2001年9月起,我接受了程序设计基础课程的教学任务,并开始对该课程教学模式进行改革:以强调动手实践上机编程为切入点;以任务驱动方式,通过实例讲授程序设计的基本概念和基本方法;重点放在思路上,即在C/C++语言的环境下,针对问题进行分析,构建数学模型,理出算法并编程实现。同时,要求学生养成良好的编程习惯;在教学过程中培养学生的思维能力和动手能力,鼓励学生探索、研究和创新。在指导思想上,强调转变观念,以学生为中心,将学生视为教学的主体,安排教学首先考虑培养目标、学生的认知规律和学习特点。在教学的每一个环节,顾及学生的实际情况,多想怎样才能有利于调动学生学习的积极性,引导学生主动学习。具体的改革措施主要针对两个方面:教学模式和对学生学习的评价方式。
对教学模式的改革
提出强化实践。明确告诉学生:程序设计课是高强度的脑力劳动,不是听会的,也不是看会的,而是自己练会的。只有让学生动手,他才会有成就感,进而对课程产生兴趣,学起来才比较从容。因此,我们的基本思想是在理论指导下,让学生动手、动脑,更多地上机实践。学生只有在编写大量程序之后,才能获得真知灼见,感到运用自如。注重学生动手能力的培养是这门课和以往课程最大的不同之处。
程序设计基础(第3版)前言提出理性思维和理性实践。按照建构主义的学习理论,学生作为学习的主体在与客观环境(指所学内容)的交互过程中构建自己的知识结构。教师应引导学生在解题编程的实践中探索其中带规律性的认识,将感性认识升华到理性高度,只有这样,学生才能举一反三。
提出授课的原则是要学生“抱西瓜”而不是“捡芝麻”,重点放在思路、算法、编程构思和程序实现上。语句只是表达工具,讲一些最主要的,对细枝末节的东西根本不讲。要求学生在课堂上积极思考,尽量当堂学懂。突出上机训练,在编写程序的过程中,使学生提高利用计算机这个智力工具来分析问题和解决问题的能力。
提出要让学生养成良好的编程习惯。我们在与国内一些软件公司的技术人员座谈时了解到,中国软件之所以上不去的原因之一就有“习惯问题”。印度十个人编程,会编出一样的东西,而我们十个人编程可能会有十种风格。因为我们忽略了一个重要问题,即“顾客”的感受,程序的编写是给别人看的,而不是只给我们自己看的。再者,尽管我们学生模型构思做得很快,但编程的基本功不扎实,往往到了关键的时候,就出问题。鉴于此,在课上我们强调程序的可读性、规范性;要求变量必须加注释;程序构思要有说明;学会如何调试程序;尽量使程序优化;还要求对程序的运行结果做正确与否的判断和分析。
提出“自学、动手、应用、上网”的学习习惯。我认为在本科阶段就应该注意培养学生的自学能力。很多东西完全是可以自学的,尤其是计算机。计算机是实践性极强的学科,所学的内容和要实践的东西是一个整体,因此可以自己动手来学,书上看不懂的在机器上动手试试,往往就弄懂了。上网是指充分利用网络平台,提高获取信息、处理信息和交流信息的能力。
对学生学习评价方式的改革
考试是检验学生学习效果、评价学生学习业绩的重要环节。考试作为“指挥棒”对教学目标、教学过程有着相当大的影响。我一直在思考如何进行考试改革,如何借助考试环节调动和激发学生自主学习的积极性、创造性等问题。
开学之初,我就向学生宣布考试方式--上机解题,判分也是由计算机来完成,对就是对,错就是错,不纸上谈兵,不考笔试,不考死记硬背的东西。我们平时比较注意对学生学习方式的引导,让学生明白:理论很重要,要在理论指导下,动手动脑、有条理地进行实践。实践才能出真知,动手才能学到真本事。
我们还将一些有较好程序设计基础的学生组织起来,因材施教,引导他们进行探索式的研究性学习,让他们继续提高。同时让他们在班上担任“小教员”,帮助同学学习。
这样做行不行呢?经过两年的教学实践,这门课取得了很好的教学效果,学生给以很高的评价。学生点评为:“授课方式独特新颖,深入浅出,启发式教学,激发学生兴趣,调动学生的积极性,有助于学生独立思考能力的提高。" (引自清华大学2001年下半年教学评估结果查询)参加“小教员”工作的学生,提高了责任感,培养了敬业精神。他们的水平和能力也有相应的提高,其中三名同学代表清华大学参加了2002年ACM世界大学生程序设计竞赛的分区赛和总决赛,取得了世界总排名第四的好成绩(2300支队伍参加区域赛,60支队伍参加总决赛).
2002年5月,在北京市高校计算机基础教育研讨会上,我曾应约就此课程的教学改革作了专题报告,受到了与会专家和老师们的好评,他们认为“这是非常好的新的教学范例”.
改革是没有止境的。经过两年的实践,我感到在一些方面还要进一步努力,还有许多工作要做:要进一步加大学生训练环节的力度;要加强对基础较差学生的辅导;要建立一个因材施教的机制,创造条件,让学生能有更广阔的发展空间;要建立平时的督促机制,让每一个学生真正落实动手实践;要考虑与后续课程的衔接。
现在大家看到的这本教材就是在上述的背景下,整理了课上的教案,补充了一些内容写出来的。在教材成文的过程中,我的同事和学生(博士生)起了很大作用。他们提出了很好的建议,对一些算法进行了研究和整理,特别是对全书整体上的结构进行了缜密的推敲。
从一种体系转变为现在的体系是有相当大的难度的,也有风险,学生爱不爱这样学,能不能学到真本事,是不是能够达到预期的教学目标,都会存在问题。但我以为,要改革就要知难而进,不付诸努力就收到良好的教学效果是不可能的。
目前这本教材可能存在很多不足,但是我们有这种思想准备,在教学实践中,多听取学生的反馈意见,不断修改,使之日臻完善。我们相信,恒心与虚心能够成就一本好的教材。
参加本书研究、撰写工作的还有徐明星(参加本书总体策划与章节编排)、邬晓钧(撰写第9、10、13章及附录)和李净(进行教案整理、图文设计),此外,赵强工程师和杨非同学也做了大量的书稿整理和成文工作,吴根清、孙辉、刘建、刘林泉、邓菁、陈德锋、侯启明等同学看了本书的第一稿,提出了宝贵的修改意见。在此一并感谢他们所付出的劳动。
由于时间仓促,作者水平有限,书中难免有纰漏,欢迎读者多提宝贵意见。
吴文虎2003年9月
吴文虎,教授1955年—1961年分别就读于清华大学电机工程系及自动控制系,现为计算机系教授、博士生导师,主要研究方向包括语音识别及语言理解、语音合成、语音信号数字处理等。吴教授学术水平精湛、教学水平高超、教学经验丰富,多年来用对学生无私的爱诠释了最好的师恩师德。他于1997年获清华大学优秀教学成果特等奖,1998年获“全国优秀教师一等奖”,1999年获国家科技部(原国家科委)授予的“全国科学普及先进个人奖”,1999年荣获“首都劳动奖章”,2001年获“全国师德先进个人奖”,2001年、2004年获北京市高等教育教学优秀成果一等奖,2003年为本科生讲授的“程序设计基础”课程被列为教育部首批“国家级精品课”,2004年获中国计算机学会颁发的“杰出贡献奖”,2006年获北京市高等教育教学名师奖;吴教授深受清华学子的爱戴,2003年获清华大学教书育人奖,2005年获清华大学第八届“良师益友”荣誉称号,2008年被清华大学学生会评为第一届“我最喜爱的教师”。. 从1989年至今,吴教授作为总教练和领队,曾15次带领中国队参加国际信息学奥林匹克竞赛,中国队累计获金牌51块,届届名列前茅,2002年获信息学奥林匹克国际委员会颁发的“特别贡献奖”。1997年—2008年,吴教授连续?3年指导清华大学的学生进入ACM世界大学生程序设计大赛总决赛,多次获金牌、银牌,并于2009年被大赛组委会授予“杰出教练奖”。
1 绪论
2 编程准备
2.1 程序编写
2.2 程序代码及说明
2.3 输出流对象cout
2.4 输入流对象cin
2.5 程序注释
2.6 算术运算符
2.7 数学函数
2.8 小结
习题
3 变量、代数与计算机解题
3.1 程序的基本结构
3.2 变量与数据类型
3.3 定义变量和赋初值
3.4 变量赋值
3.5 指针变量
3.6 小结
习题
4 逻辑思维与计算机解题
4.1 关系运算和关系表达式
4.2 枚举法的思路
4.3 循环结构
4.4 分支结构
4.5 任务4.1的程序框图
4.6 任务4.1的参考程序
4.7 逻辑问题及其解法
4.8 小结
课后阅读材料
习题
5 函数思维与模块化设计
5.1 函数
5.2 指向函数的指针
5.3 编程实例1
5.4 编程实例2
5.5 小结
课后阅读材料
习题
6 数据的组织与处理(1)——数组
6.1 数组
6.2 筛法
6.3 线性查找与折半查找
6.4 冒泡排序法
6.5 递推
6.6 指针与数组
6.7 字符数组及其处理
6.8 二维数组
6.9 小结
课后阅读材料
习题
7 数据的组织与处理(2)——结构
7.1 结构与结构数组
7.2 指针和结构
7.3 链表
7.4 小结
习题
8 文件
8.1 将数据保存到文件
8.2 从文件中读取数据
8.3 利用输入输出文件解交互类型的题
8.4 小结
9 递归思想与相应算法
9.1 递归及其实现
9.2 递归算法举例
9.3 小结
课后阅读材料
习题
10 贪心法
10.1 贪心法解题的一般步骤
10.2 贪心法相关理论
10.3 小结
习题
11 动态规划
11.1 最短路径问题
11.2 动态规划的基本概念
11.3 动态规划思想
11.4 举例说明动态规划思路
11.5 小结
习题
12 蒙特卡罗法
12.1 伪随机数的产生
12.2 伪随机数的应用
12.3 小结
习题
13 多步决策问题
13.1 多步决策问题的解题思路
13.2 安全条件形式化
13.3 从状态图上研究怎样一步一步过河
13.4 多步决策问题的编程思路
14 深度优先搜索
14.1 问题描述
14.2 解题思路
14.3 深度优先搜索与剪枝
15 宽度优先搜索
15.1 问题描述
15.2 解题思路
思考问题
习题
16 流与输入输出设置
16.1 流的概念与输入输出格式
16.2 改变整数的进制
16.3 设置浮点数的精度
16.4 设置输入输出宽度
16.5 设置对齐方式和填充字符
16.6 其他设置
附录a 程序调试
a.1 计分程序的调试
a.2 跳马程序的调试
附录b 库函数
b.1 数学函数
b.2 字符判断函数
b.3 字符串相关函数
附录 cascii码表
参考文献