计算机语言与程序设计

计算机语言与程序设计"

作者:谌卫军
ISBN:9787302154341
定价:¥29.50
字数:千字
页数:
出版时间:2007.09.01
开本:
版次:1-3
装帧:
出版社:清华大学出版社
简介

本书是清华大学信息学院本科生的教材,主要介绍C程序设计语言的基本知识,包括数据类型、选择语句、循环语句、数组、函数、指针、结构体和文件等;同时还介绍程序设计的基本方法、技术和理论。

本书中结合了作者多年讲授相关课程的教学经验以及长期的工程实践经验,也融入了最新的教学改革理念,即从知识型教学向技能型、实用型教学转变。在介绍C语言语法知识的同时,更注重培养学生分析问题、解决问题和程序设计的能力。本书内容详细、语言风趣,采用实例教学。书中附有大量的习题,便于自学。

本书适合作为高等院校计算机、自动化和电子等专业本科生的程序设计教材,也可作为正在学习程序设计的广大科技人员、软件工程师的参考教材。

前言

《计算机语言与程序设计》是清华大学信息学院各院系为大一新生开设的一门公共基础课。课程以程序设计的基本原则为线索,以C语言为工具,介绍程序设计的基本方法与C语言的基本语句,目标是使学生具备用C语言进行程序设计的能力。为了配合课程的讲授,便于学生的学习,我们编写了本教材。

C语言是一种非常重要的编程语言。一方面,由于它的高效、实用和可移植性好等特点,使它在工业界得到了广泛的应用,许多实用的软件(如操作系统、数据库管理系统等)都是用C语言编写的;另一方面,由于它的语法简洁、紧凑,容易入门,使它取代了Basic和Pascal等语言,成为了高等院校甚至某些中小学计算机教育的入门语言。不过,需要指出的是,虽然C语言的语法并不复杂,但要想真正学好它,却并非易事。在多年的教学实践中,我们深刻地体会到了这一点。由于C语言程序设计是学生第一次接触到编程,因此缺乏相关的基础和经验,更重要的是,缺乏正确的学习方法,以为吃透大纲、熟读教材、多做习题就能把编程学好。具体表现为:在学习时偏重于语法和概念的钻研,死抠一些烦琐的语法细节,喜欢对一些古怪、偏僻的问题刨根问底,如计算“(i++) + (i++)”、“a += a -= a *= a”等,以为这些才是高水平的表现,其实不然。就像孔乙己去研究“茴”字的不同写法,人们只会说他迂腐。另外,在课后练习时,采用的也是应试教育的方法,喜欢去做一些选择、填空等书面的传统题型。这样的结果,就是容易使自己陷入眼高手低、纸上谈兵的误区。事实上,我们在教学中最常碰到的一个问题就是:学生对C语言的语法都非常熟悉,但是一旦要让他们用编程来解决一个实际的问题就不行了。另外,学生在毕业找工作时,不少单位抱怨,大学培养出来的学生都说自己学过C语言,但无论是在解决问题的能力上,还是在编程的规范性上,离公司的要求都相距甚远,还得重新培训。

那么如何来解决这个问题呢?我们认为,关键在于教师的正确引导。

对于C语言程序设计这样一门实践性强、内容广、学生起点低的课程来说,不能采用传统的教学模式、学习模式和训练模式,而必须另辟蹊径。具体来说:

1.在教学理念上,应该根据社会经济发展对人才的需求来研究课程的建设和学生的培养。要从学历教育向素质教育转变,从知识型教学向技能型、实用型教学转变。本课程的目标不仅仅是让学生掌握程序设计的基本原理和方法,更重要的是提高他们的能力,包括自学能力、动手实践能力和创新能力。首先,程序设计类课程的一个特点就是语法和技术细节很多,这些内容比较枯燥、单调,不适合在课堂讲授。但如果学生在上机实践时碰到这些问题,能够很快找到解决方案,并且印象深刻,因此自学能力是非常重要的。其次,动手实践能力可以说是本课程的灵魂。在教学中我们经常发现,在拿到一个问题后,有的学生觉得自己会做,而且思路也很清楚,说起来也有道理,但是一旦要让其上机编写出相应的程序,并且正确地运行,就卡壳了。一道简单的题目,被卡上几个小时是常有的事,被卡上几天的情形也不少见。而出现这些现象的根本原因就是缺乏有效的、足量的实践训练。最后,程序设计类课程为学生提供了一个自由发挥的平台。在这个平台上,没有权威,没有定理,对任何一个程序设计问题都存在不同的解法,“条条道路通罗马”。学生可以充分发挥自己的想象力,充分运用所掌握的基础知识,设计出各种与众不同的解决方案,从而提高自己的创新能力。

2.在教学内容上,除了C语言程序设计的基础内容,如C语言的语法、语句和数据类型等,还应该引入一些实用、创新型的内容。例如,在函数这一章,通常的教材只是介绍函数的使用方法,而本书则引入了函数调用的实现过程,以及栈和堆的基本概念,从而使学生不仅知其然,而且知其所以然。此外,还有编程规范、代码的调试与测试等,对于一名专业的程序员来说,这些都是最起码的要求,几乎每天都要用到。而在大学的课堂上却容易被忽略。

3.在教学方法上,我们始终坚持“案例教学”和“模式教学”的思想。对于程序设计类课程,案例教学是一种极其重要的教学手段,在每一个案例中都蕴藏着程序设计的理论和方法。因此,通过案例教学,可以实现具体与抽象、理论与实践的有机结合,从而培养学生分析问题、解决问题的能力。在本书的每一章节,我们在介绍理论知识的同时,精选了大量具有代表性和实用性的新颖案例,从而将知识的讲解融入到案例的学习之中。对于每一个编程实例,我们不是简单地把源代码列在那里,然后解释一番,而是着重于问题的分析和解题的思路,讲清算法的来龙去脉,并将一些常用的算法思路抽象为若干个“编程模式”,好比是武术里面的“套路”。让学生知道,对于什么样的问题,可以使用哪一种模式,或是使用哪几种模式的组合来解决它,从而切实提高学生的动手能力。另外,读了这么多年的书,我们完全能够理解,读书是一件比较辛苦的事情,时间长了难免疲劳。因此在本书中,我们穿插了不少生动有趣的例子。例如,在讲授循环语句时,读者将看到西绪福斯的故事,还将学到价格竞猜的秘诀;在学习递归算法时,读者将听到熟悉的“从前有座山”的故事。

4.在实验环节上,我们强调一个原则,即上机实践是学好本门课程的唯一途径。推而广之,要想学好程序设计类课程,都要坚持“机考”、“机练”的原则。为此,在每一章的后面,我们提供了大量的精心挑选的编程习题。这些习题是本课程4年以来的积累与总结,具有较好的代表性。希望读者能善于利用,最好每一道题都做,并上机调试通过。

本课程已经实施了4年多的时间,在教学实践过程中,我们根据各方面的反馈情    况,不断地进行更新和完善,同时,这门课程也得到了专家和学生的认可,取得了较好的成绩,目前已进入了较为成熟和稳定的阶段。2003年秋季,本课程获清华大学软件学院2003年度教学优秀奖。2004年秋季,本课程在教学评估中,在软件学院的本科生课程中排名第一。2005年秋季,本课程在教学评估中,再次蝉联第一,并在清华30~100人课堂规模的分组中,获得全校第8名。2007年1月,本课程参加清华大学第二届青年教师教学基本功比赛,我们的教学理念获得了各位评审专家的认可,获一等奖。本书就是对这4年来我们工作的一个总结,希望与各位读者分享。

在本书的写作过程中,得到了许多人的关心和帮助,在此一并表示感谢。其中,清华大学计算机系的吴文虎教授是本人教学工作的启蒙老师,通过观摩他的课堂教学,使我受益匪浅。谭浩强教授的《C程序设计》是本人学习C语言的启蒙之作。Stanford大学的Khomenko教授和Washington大学的Dickey教授的讲义也给了我很大的启发。此外,感谢清华大学出版社的丁岭女士,没有她的辛勤工作,也就没有本书的问世。

最后,我要特别感谢我的父母和家人。你们的关心、理解和支持,永远是激励我不断前进的动力。尤其是我的女儿谌颖,你是上天赐给爸爸的礼物,爸爸希望用这本书来作为你的生日礼物。

谌卫军

2007年3月23日于清华园

目录

第1章  程序设计概述 1

1.1  计算机与程序 1

1.1.1  功能强大的计算机 1

1.1.2  计算机程序 4

1.2  C语言简介 7

1.2.1  C语言的历史 7

1.2.2  C语言的特点 9

1.2.3  C语言的应用领域 10

1.3  一个简单的C程序 11

1.3.1  问题描述与分析 11

1.3.2  C语言程序 11

1.3.3  从C语句到机器语言 13

习题1 14

第2章  数据对象与运算 15

2.1  信息的存储方式 15

2.2  数据类型 17

2.2.1  整数类型 18

2.2.2  实数类型 23

2.2.3  字符类型 23

2.3  常量 23

2.3.1  整型常量 24

2.3.2  实型常量 24

2.3.3  字符常量 25

2.4  变量 26

2.4.1  基本概念 26

2.4.2  变量的命名 27

2.4.3  变量的定义 27

2.4.4  变量的初始化 28

2.5  运算符和表达式 28

2.5.1  算术运算符和算术表达式 29

2.5.2  赋值运算符和赋值表达式 31

2.6  类型转换 32

2.6.1  运算转换 32

2.6.2  赋值转换 33

2.6.3  强制转换 34

习题2 34

第3章  顺序结构程序设计 36

3.1  C语句概述 36

3.2  数据的输入与输出 37

3.2.1  基本概念 37

3.2.2  printf函数(格式输出函数) 38

3.2.3  scanf函数(格式输入函数) 41

3.3  程序举例 43

习题3 46

第4章  选择结构程序设计 48

4.1  关系运算符和表达式 48

4.2  逻辑运算符和表达式 49

4.3  if语句 51

4.3.1  if语句的形式之一 51

4.3.2  if语句的形式之二 52

4.3.3  if语句的形式之三 53

4.3.4  条件运算符 54

4.4  switch语句 54

4.5  程序举例 56

习题4 62

第5章  循环结构程序设计 64

5.1  for语句 65

5.2  while语句 69

5.3  do-while语句 72

5.4  break语句和continue语句 73

5.5  程序举例 75

习题5 94

第6章  数组 98

6.1  一维数组的定义和使用 98

6.1.1  基本概念 98

6.1.2  一维数组的使用 100

6.2  二维数组的定义和使用 104

6.2.1  基本概念 104

6.2.2  二维数组的使用 105

6.3  字符数组与字符串 107

6.4  程序举例 110

习题6 126

第7章  函数 130

7.1  概述 130

7.1.1  引言 130

7.1.2  什么是函数 131

7.1.3  为何使用函数 132

7.2  函数的使用 133

7.2.1  函数的定义 134

7.2.2  函数的声明 135

7.2.3  函数的调用 138

7.3  变量的作用范围 140

7.3.1  局部变量 140

7.3.2  全局变量 141

7.4  函数调用的实现过程 143

7.4.1  进程的内存分布 143

7.4.2  控制流与数据流 144

7.4.3  函数调用举例 144

7.5  数组与函数参数 150

习题7 152

第8章  指针 157

8.1  什么是指针 157

8.1.1  地址亦数据 157

8.1.2  地址与类型 159

8.1.3  什么是指针 159

8.2  指针变量 160

8.2.1  指针的定义 160

8.2.2  指针运算符 161

8.2.3  为何要使用指针 165

8.3  指针与数组 169

8.3.1  指向数组元素的指针 169

8.3.2  通过指针访问数组元素 169

8.3.3  动态数组 174

8.3.4  指针还是数组 179

8.3.5  二维数组与指针 181

8.4  指针与字符串 193

8.4.1  字符串的表示形式 193

8.4.2  字符串的访问 195

习题8 199

第9章  结构体 204

9.1  结构体的定义与使用 204

9.1.1  引言 204

9.1.2  结构体的定义 205

9.1.3  结构体变量的使用 207

9.2  结构体数组与指针 208

9.2.1  结构体数组 208

9.2.2  结构体与指针 209

9.3  结构体作为函数参数 210

9.4  链表 212

9.4.1  链表的基本概念 212

9.4.2  对链表的操作 213

习题9 225

第10章  算法引论 231

10.1  算法分析 231

10.1.1  什么是算法分析 231

10.1.2  Big O表示法 232

10.2  查找算法 234

10.2.1  顺序查找法 234

10.2.2  折半查找法 235

10.3  排序算法 237

10.4  递推算法 239

10.5  递归算法 244

10.5.1  基本概念 245

10.5.2  基于分治策略的递归算法 249

10.5.3  基于回溯策略的递归算法 258

习题10 268

第11章  文件 273

11.1  文件的基本概念 273

11.2  文件的访问 274

11.2.1  文件的访问方式 274

11.2.2  文件的打开和关闭 275

11.2.3  读文件 276

11.2.4  写文件 278

11.3  程序举例 279

习题11 283

第12章  上机指导 285

12.1  上机步骤 285

12.1.1  打开Visual C++ 285

12.1.2  创建工程 287

12.1.3  创建源文件 288

12.1.4  编译链接 289

12.2  编程规范 289

12.2.1  命名规则 290

12.2.2  编码格式 291

12.2.3  注释 293

12.3  程序调试 294

12.3.1  编译链接 294

12.3.2  程序调试 296

附录Ⅰ  ASCII字符编码 299

附录Ⅱ  标准库函数 301

参考文献 307

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个