【产品特色】

【编辑】
本书为“十二五”普通高等教育本科*规划教材、北京市高等教育精品教材立项项目,获全国高校出版社优秀畅销书特等奖、原电子工业部优秀教材一等奖、全国高等院校计算机基础教育研究会优秀教材一等奖等多项奖项。《C程序设计》累计发行逾1400万册,不仅创同类书的全国纪录,在世界上也是罕见的,堪称出版界的奇迹。《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第四版)》的基础上进行了修订,使内容更加完善,更易于理解,更加切合教学需要。本书按照C语言的新标准C 99进行介绍,所有程序都符合C 99的规定,使编写程序更加规范;采用Visual C 6.0编译系统;对C语言和程序设计的基本概念和要点讲解透彻、全面而深入;按照作者提出的“提出问题—解决问题—归纳分析”三部曲进行教学和组织教材;本书的每个例题都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。本书是初学者学习C程序设计的理想教材,可作为高等学校各专业的正式教材,也是一本自学的好教材。本书配有辅助教材《C程序设计(第五版)学习辅导》(ISBN: 9787302480877)。本书的PPT电子教案和主辅教材的源代码,可到清华大学出版社官网下载,与本书配合使用的数字资源也将陆续推出,供各高校教学使用。
【内容简介】
由谭浩强教授著、清华大学出版社出版的《C程序设计》经过近三十年一千多万读者的实践检验,被公认为学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第四版)》的基础上进行了修订,使内容更加完善,更易于理解,更加切合教学需要。本书按照C语言的新标准C 99进行介绍,所有程序都符合C 99的规定,使编写程序更加规范;对C语言和程序设计的基本概念和要点讲解透彻、全面而深入;按照作者提出的“提出问题—解决问题—归纳分析”三部曲进行教学和组织教材;本书的每个例题都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。 本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例题丰富,深入浅出,文字流畅,通俗易懂,是初学者学习C语言程序设计的理想教材,既可作为高等学校各专业的正式教材,也适合读者自学。本书还配有辅助教材《C程序设计(第五版)学习辅导》。
【目录】

目录

第1章程序设计和C语言11.1什么是计算机程序1

1.2什么是计算机语言1

1.3C语言的发展及其特点3

1.4*简单的C语言程序5

1.4.1*简单的C语言程序举例5

1.4.2C语言程序的结构9

1.5运行C程序的步骤与方法11

1.6程序设计的任务13

习题14

第2章算法——程序的灵魂15

2.1程序=算法 数据结构15

2.2什么是算法16

2.3简单的算法举例17

2.4算法的特性20

2.5怎样表示一个算法21

2.5.1用自然语言表示算法21

2.5.2用流程图表示算法21

2.5.3三种基本结构和改进的流程图25

2.5.4用NS流程图表示算法28

2.5.5用伪代码表示算法31

2.5.6用计算机语言表示算法32

2.6结构化程序设计方法33

习题35

第3章*简单的C程序设计——顺序程序设计37

3.1顺序程序设计举例37

3.2数据的表现形式及其运算39

3.2.1常量和变量39

3.2.2数据类型42

3.2.3整型数据44

3.2.4字符型数据47

3.2.5浮点型数据49

3.2.6怎样确定常量的类型50

3.3运算符和表达式51

3.3.1C运算符52

3.3.2基本的算术运算符52

3.3.3自增( )、自减(--)运算符53

3.3.4算术表达式和运算符的优先级与结合性53

3.3.5不同类型数据间的混合运算54

3.3.6强制类型转换运算符55

3.4C语句56

3.4.1C语句的作用和分类56

3.4.2*基本的语句——赋值语句58

3.5数据的输入输出64

3.5.1输入输出举例64

3.5.2有关数据输入输出的概念65

3.5.3用printf函数输出数据67

3.5.4用scanf函数输入数据74

3.5.5字符输入输出函数76

习题80

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

4.1选择结构和条件判断83

4.2用if语句实现选择结构85

4.2.1用if语句处理选择结构举例85

4.2.2if语句的一般形式 87

4.3关系运算符和关系表达式89

4.3.1关系运算符及其优先次序90

4.3.2关系表达式90

4.4逻辑运算符和逻辑表达式90

4.4.1逻辑运算符及其优先次序91

4.4.2逻辑表达式92

4.5条件运算符和条件表达式94

4.6选择结构的嵌套96

4.7用switch语句实现多分支选择结构99

4.8选择结构程序综合举例102

习题107

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

5.1为什么需要循环控制110

5.2用while语句实现循环111

5.3用do…while语句实现循环113

5.4用for 语句实现循环116

5.5循环的嵌套120

5.6几种循环的比较121

5.7改变循环执行的状态121

5.7.1用break语句提前终止循环122

5.7.2用continue语句提前结束本次循环123

5.7.3break语句和continue语句的区别124

5.8循环程序举例127

习题137

第6章利用数组处理批量数据139

6.1怎样定义和引用一维数组139

6.1.1怎样定义一维数组140

6.1.2怎样引用一维数组元素140

6.1.3一维数组的初始化142

6.1.4一维数组程序举例142

6.2怎样定义和引用二维数组145

6.2.1怎样定义二维数组146

6.2.2怎样引用二维数组的元素147

6.2.3二维数组的初始化148

6.2.4二维数组程序举例149

6.3字符数组151

6.3.1怎样定义字符数组151

6.3.2字符数组的初始化152

6.3.3怎样引用字符数组中的元素152

6.3.4字符串和字符串结束标志153

6.3.5字符数组的输入输出156

6.3.6使用字符串处理函数157

6.3.7字符数组应用举例162

习题165

第7章用函数实现模块化程序设计167

7.1为什么要用函数167

7.2怎样定义函数169

7.2.1为什么要定义函数169

7.2.2定义函数的方法170

7.3调用函数171

7.3.1函数调用的形式171

7.3.2函数调用时的数据传递172

7.3.3函数调用的过程174

7.3.4函数的返回值174

7.4对被调用函数的声明和函数原型176

7.5函数的嵌套调用179

7.6函数的递归调用181

7.7数组作为函数参数189

7.7.1数组元素作函数实参189

7.7.2一维数组名作函数参数191

7.7.3多维数组名作函数参数194

7.8局部变量和全局变量196

7.8.1局部变量196

7.8.2全局变量197

7.9变量的存储方式和生存期201

7.9.1动态存储方式与静态存储方式201

7.9.2局部变量的存储类别202

7.9.3全局变量的存储类别205

7.9.4存储类别小结209

7.10关于变量的声明和定义211

7.11内部函数和外部函数212

7.11.1内部函数212

7.11.2外部函数213

习题215

第8章善于利用指针217

8.1指针是什么217

8.2指针变量219

8.2.1使用指针变量的例子219

8.2.2怎样定义指针变量220

8.2.3怎样引用指针变量222

8.2.4指针变量作为函数参数224

8.3通过指针引用数组229

8.3.1数组元素的指针229

8.3.2在引用数组元素时指针的运算229

8.3.3通过指针引用数组元素231

8.3.4用数组名作函数参数236

8.3.5通过指针引用多维数组243

8.4通过指针引用字符串254

8.4.1字符串的引用方式 254

8.4.2字符指针作函数参数258

8.4.3使用字符指针变量和字符数组的比较262

8.5指向函数的指针265

8.5.1什么是函数的指针265

8.5.2用函数指针变量调用函数265

8.5.3怎样定义和使用指向函数的指针变量267

8.5.4用指向函数的指针作函数参数269

8.6返回指针值的函数273

8.7指针数组和多重指针276

8.7.1什么是指针数组 276

8.7.2指向指针数据的指针变量279

8.7.3指针数组作main函数的形参281

8.8动态内存分配与指向它的指针变量284

8.8.1什么是内存的动态分配284

8.8.2怎样建立内存的动态分配284

8.8.3void指针类型 286

8.9有关指针的小结288

习题291

第9章用户自己建立数据类型293

9.1定义和使用结构体变量293

9.1.1自己建立结构体类型293

9.1.2定义结构体类型变量 295

9.1.3结构体变量的初始化和引用296

9.2使用结构体数组300

9.2.1定义结构体数组300

9.2.2结构体数组的应用举例301

9.3结构体指针303

9.3.1指向结构体变量的指针303

9.3.2指向结构体数组的指针304

9.3.3用结构体变量和结构体变量的指针作函数参数306

9.4用指针处理链表309

9.4.1什么是链表 309

9.4.2建立简单的静态链表310

9.4.3建立动态链表311

9.4.4输出链表315

9.5共用体类型317

9.5.1什么是共用体类型317

9.5.2引用共用体变量的方式318

9.5.3共用体类型数据的特点319

9.6使用枚举类型322

9.7用typedef声明新类型名326

习题330

第10章对文件的输入输出331

10.1C文件的有关基本知识331

10.1.1什么是文件331

10.1.2文件名332

10.1.3文件的分类332

10.1.4文件缓冲区333

10.1.5文件类型指针333

10.2打开与关闭文件334

10.2.1用fopen函数打开数据文件335

10.2.2用fclose函数关闭数据文件337

10.3顺序读写数据文件338

10.3.1怎样向文件读写字符338

10.3.2怎样向文件读写一个字符串341

10.3.3用格式化的方式读写文本文件345

10.3.4用二进制方式向文件读写一组数据345

10.4*读写数据文件350

10.4.1文件位置标记及其定位350

10.4.2*读写 353

10.5文件读写的出错检测355

习题355

附录357

附录A常用字符与ASCII代码对照表357

附录BC语言中的关键字358

附录C运算符和结合性359

附录DC语言常用语法提要361

附录EC库函数365

参考文献371


【免费在线读】
第5章循环结构程序设计〖1〗5.1为什么需要循环控制前面介绍了程序中常用到的顺序结构和选择结构,但是只有这两种结构是不够的,还需要用到循环结构(或称重复结构)。因为在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。例如:  要向计算机输入全班50个学生的成绩;(重复50次相同的输入操作) 分别统计全班50个学生的平均成绩;(重复50次相同的计算操作) 求30个整数之和;(重复30次相同的加法操作) 检查30个学生的成绩是否及格。 (重复30次相同的判别操作)要处理以上问题,*原始的方法是分别编写若干个相同或相似的语句或程序段进行处理。例如为了统计全班50个学生的平均成绩,可以先编写求一个学生平均成绩的程序段: scanf(″%f,%f,%f,%f,%f″,&score1,&score2,&score3,&score4,&score5);//输入一个学生5门课的成绩aver=(score1 score2 score3 score4 score5)/5;//求该学生平均成绩printf(″aver=%7.2f″,aver);//输出该学生平均成绩然后再重复写49个同样的程序段。这种方法虽然可以实现要求,但是显然是不可取的,因为工作量大,程序冗长、重复,难以阅读和维护。相信每一位读者都会认为这是*笨的办法。实际上,几乎每一种计算机高级语言都提供了循环控制,用来处理需要进行的重复操作。在C语言中,可以用循环语句来处理上面的问题: i=1;//设整型变量i初值为1 while(i<=50) //当i的值小于或等于50时执行花括号内的语句{scanf(″%f,%f,%f,%f,%f″,&score1,&score2,&score3,&score4,&score5);//输入一个学生5门课的成绩aver=(score1 score2 score3 score4 score5)/5; //求该学生平均成绩printf(″aver=%7.2f″,aver);//输出该学生平均成绩i ;//每执行完一次循环使i的值加1 } 可以看到: 用一个循环语句(while语句),就把需要重复执行50次程序段的问题解决了。一个while语句实现了一个循环结构。请读者先阅读这个程序段,理解循环结构的执行过程,在下一节将对其执行过程作必要的说明。大多数的应用程序都会包含循环结构。循环结构和顺序结构、选择结构是结构化程序设计的3种基本结构,它们是各种复杂程序的基本构成单元。因此熟练掌握选择结构和循环结构的概念及使用是进行程序设计*基本的要求。5.2用while语句实现循环在5.1节中已看到了在C程序中可以用while语句来实现循环结构。上面的while循环结构就是一个while语句,它的执行过程是: 开始时变量i的值为1,while语句首先检查变量i的值是否小于或等于50,如果是,则执行while后面的语句(称为循环体,在本例中是花括号内的复合语句)。在循环体中先输入第1个学生5门课的成绩,然后求出该学生的平均成绩aver,并输出此平均成绩。请思考*后一行“i ;”的作用。图5.1它使i的值加1,i的原值为1,现在变成2了。然后流程返回到while语句的开头,再检查i的值是否小于或等于50,由于i的值2小于50,因此又执行循环体,输入第2个学生5门课的成绩,然后求出第2个学生的平均成绩并输出此平均成绩。i 又使变量i的值变为3,处理第3个学生的数据……直到处理完第50个学生的数据后,i的值变为51。由于它大于50,因此不再执行循环体。流程图见图5.1,其中,虚线框内为while循环结构。while语句的一般形式如下: while (表达式) 语句其中的“语句”就是循环体。循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句(用花括号括起来的若干语句)。执行循环体的次数是由循环条件控制的,这个循环条件就是上面一般形式中的“表达式”,它也称为循环条件表达式。当此表达式的值为“真” (以非0值表示)时,就执行循环体语句;为“假” (以0表示)时,就不执行循环体语句。例如“i<=50”是一个循环条件表达式,它是一个关系表达式。它的值只能是“真”或“假”。在执行while语句时,先检查循环条件表达式的值,当为非0值(真)时,就执行while语句中的循环体语句;当表达式为0(假)时,不执行循环体语句。其流程图见图5.2。while语句可简单地记为: 只要当循环条件表达式为真(即给定的条件成立),就执行循环体语句。注意: while循环的特点是先判断条件表达式,后执行循环体语句。通过下面的例子,可以学习到怎样利用while语句进行循环程序设计。【例5.1】求1 2 3 … 100,即∑100n=1n。解题思路: 在处理这个问题时,先分析此题的特点: (1) 这是一个累加的问题,需要先后将100个数相加。要重复进行100次加法运算,显然可以用循环结构来实现。重复执行循环体100次,每次加一个数。(2) 分析每次所加的数有无规律。发现每次累加的数是有规律的,后一个数是前一个数加1。因此不需要每次用scanf语句从键盘临时输入数据,只须在加完上一个数i后,使i加1就可得到下一个数。为了使思路清晰,画出传统流程图和NS结构流程图表示算法,见图5.3。
【作者简介】
谭浩强教授,我国著名计算机教育专家。1958年毕业于清华大学自动控制系。青年时期曾担任清华大学学生会主席、北京市学联副主席、北京市人民代表、全国文教战线先进分子。他是我国计算机普及和高校计算机基础教育的开拓者之一。现任全国高等院校计算机基础教育研究会荣誉会长、全国计算机应用技术证书考试委员会主任委员,享受国务院政府特殊津贴。曾获国家科技进步奖、*教学成果奖,被原国家科学技术委员会和中国科学技术协会表彰为“全国先进科普工作者”,被北京市人民政府评为“北京市有突出贡献的专家”。谭浩强教授创造了三个世界纪录:(1)30年来他(以及和他人合作)共编著出版了160多本计算机著作,主编了400多本计算机书籍,是出版科技著作数量*多的人。(2)他编著和主编的书发行量超过6000万册,是读者*多的科技作家。我国平均每21人、知识分子每1.2人就拥有一本谭浩强的书。(3)他和他人合著的《BASIC语言》发行1250多万册,他所著的《C程序设计》发行1400多万册,双双创造科技书籍发行量的*纪录。他曾在中央电视台主讲了BASIC,FORTRAN,COBOL,Pascal,QBASIC,C,Visual Basic七种计算机语言,观众超过500万人。 谭浩强教授善于用读者容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业作出重要的贡献。21世纪初,被《计算机世界》报组织的“世纪评选”评为“我国20世纪*有影响的十个IT人物”,被《电脑报》评为“我国十大IT人物”,他的功绩是把千百万群众带入计算机的大门。
【前言】

▲ 原全国政协副主席、国务委员、国家科委主任、中国工程院院长宋健同志为谭浩强教授题词▲ 原全国人民代表大会副委员长、中国科学院院长卢嘉锡给谭浩强教授的题词▲ 副部长吴启迪给谭浩强教授的贺信▲ 中国科学院资深院士、中国计算机学会名誉理事长张效祥给谭浩强教授的题词

从20世纪70年代末、80年代初开始,我国的高等院校开始面向各个专业的全体大学生开展计算机教育。面向非计算机专业学生的计算机基础教育牵涉的专业面广、人数众多,影响深远,它将直接影响我国各行各业、各个领域中计算机应用的发展水平。这是一项意义重大而且大有可为的工作,应该引起各方面的充分重视。三十多年来,全国高等院校计算机基础教育研究会和全国高校从事计算机基础教育的老师始终不渝地在这片未被开垦的土地上辛勤工作,深入探索,努力开拓,积累了丰富的经验,初步形成了一套行之有效的课程体系和教学理念。高等院校计算机基础教育的发展经历了3个阶段:20世纪80年代是初创阶段,带有扫盲的性质,多数学校只开设一门入门课程;20世纪90年代是规范阶段,在全国范围内形成了按3个层次进行教学的课程体系,教学的广度和深度都有所发展;进入21世纪,开始了深化提高的第3阶段,需要在原有基础上再上一个新台阶。在计算机基础教育的新阶段,要充分认识到计算机基础教育面临的挑战。(1) 在世界范围内信息技术以空前的速度迅猛发展,新的技术和新的方法层出不穷,要求高等院校计算机基础教育必须跟上信息技术发展的潮流,大力更新教学内容,用信息技术的新成就武装当今的大学生。(2) 我国国民经济现在处于持续快速稳定发展阶段,需要大力发展信息产业,加快经济与社会信息化的进程,这就迫切需要大批既熟悉本领域业务,又能熟练使用计算机,并能将信息技术应用于本领域的新型专门人才。因此需要大力提高高校计算机基础教育的水平,培养出数以百万计的计算机应用人才。(3) 21世纪,信息技术教育在我国中小学中全面开展,计算机教育的起点从大学下移到中小学。水涨船高,这样也为提高大学的计算机教育水平创造了十分有利的条件。迎接21世纪的挑战,大力提高我国高等学校计算机基础教育的水平,培养出符合信息时代要求的人才,已成为广大计算机教育工作者的神圣使命和光荣职责。全国高等院校计算机基础教育研究会和清华大学出版社于2002年联合成立了“中国高等院校计算机基础教育改革课题研究组”,集中了一批长期在高校计算机基础教育领域从事教学和研究的专家、教授,经过深入调查研究,广泛征求意见,反复讨论修改,提出了高校计算机基础教育改革思路和课程方案,并于2004年7月发布了《中国高等院校计算机基础教育课程体系2004》(简称CFC 2004)。国内知名专家和从事计算机基础教育工作的广大教师一致认为CFC 2004提出了一个既体现先进性又切合实际的思路和解决方案,该研究成果具有开创性、针对性、前瞻性和可操作性,对发展我国高等院校的计算机基础教育具有重要的指导作用。根据近年来计算机基础教育的发展,课题研究组先后于2006、2008和2014年发布了《中国高等院校计算机基础教育课程体系》的新版本,由清华大学出版社出版。为了实现CFC提出的要求,必须有一批与之配套的教材。教材是实现教育思想和教学要求的重要保证,是教学改革中的一项重要的基本建设。如果没有好的教材,提高教学质量只是一句空话。要写好一本教材是不容易的,不仅需要掌握有关的科学技术知识,而且要熟悉自己工作的对象,研究读者的认识规律,善于组织教材内容,具有较好的文字功底,还需要学习一点教育学和心理学的知识等。一本好的计算机基础教材应当具备以下5个要素:(1) 定位准确。要明确读者对象,要有的放矢,不要不问对象,提笔就写。(2) 内容先进。要能反映计算机科学技术的新成果、新趋势。(3) 取舍合理。要做到“该有的有,不该有的没有”,不要包罗万象、贪多求全,不应把教材写成手册。(4) 体系得当。要针对非计算机专业学生的特点,精心设计教材体系,不仅使教材体现科学性和先进性,还要注意循序渐进,降低台阶,分散难点,使学生易于理解。(5) 风格鲜明。要用通俗易懂的方法和语言叙述复杂的概念。善于运用形象思维,深入浅出,引人入胜。为了推动各高校的教学,我们愿意与全国各地区、各学校的专家和老师共同奋斗,编写和出版一批具有中国特色的、符合非计算机专业学生特点的、受广大读者欢迎的优秀教材。为此,我们成立了“中国高等院校计算机基础教育课程体系规划教材”编审委员会,全面指导本套教材的编写工作。本套教材具有以下几个特点:(1) 全面体现CFC的思路和课程要求。可以说,本套教材是CFC的具体化。(2) 教材内容体现了信息技术发展的趋势。由于信息技术发展迅速,教材需要不断更新内容,推陈出新。本套教材力求反映信息技术领域中新的发展、新的应用。(3) 按照非计算机专业学生的特点构建课程内容和教材体系,强调面向应用,注重培养应用能力,针对多数学生的认知规律,尽量采用通俗易懂的方法说明复杂的概念,使学生易于学习。(4) 考虑到教学对象不同,本套教材包括了各方面所需要的教材(重点课程和一般课程,必修课和选修课,理论课和实践课) ,供不同学校、不同专业的学生选用。(5) 本套教材的作者都有较高的学术造诣,有丰富的计算机基础教育的经验,在教材中体现了研究会所倡导的思路和风格,因而符合教学实践,便于采用。本套教材统一规划,分批组织,陆续出版。希望能得到各位专家、老师和读者的指正,我们将根据计算机技术的发展和广大师生的宝贵意见及时修订,使之不断完善。

全国高等院校计算机基础教育研究会荣誉会长“中国高等院校计算机基础教育课程体系规划教材”编审委员会主任
前言
20世纪90年代以来,C语言迅速在全世界普及推广。无论在中国还是在世界各国,“C语言程序设计”始终是高等学校的一门基本的计算机课程。C语言程序设计在计算机教育和计算机应用中发挥着重要的作用。作者于1991年编著了《C程序设计》一书,由清华大学出版社出版。该书针对初学者的特点和认知规律,精选内容,分散难点,降低台阶,例题丰富,深入浅出。出版后受到广大读者的热烈欢迎。许多读者说: “C语言原来是比较难学的,但自从《C程序设计》出版后,C语言变得不难学了。”根据C语言的发展和教学的实践,作者先后对该书进行了3次大的修订,累计重印200多次,发行超过1400万册,平均每年印刷50万册,成为我国广大初学者学习C语言程序设计的主流用书。国内许多介绍C语言的书籍以本书为蓝本。本书曾荣获原电子工业部优秀教材一等奖、全国高等院校计算机基础教育研究会优秀教材一等奖、全国高校出版社优秀畅销书特等奖和“十二五”普通高等教育本科*规划教材,这是对我的莫大鼓励和鞭策。在此书再版之际,作者想对学习程序设计问题提出以下几点看法。一、 关于C程序设计教学的指导思想〖*2〗1. 为什么要学习程序设计大学生不能满足于只会用办公软件,应当有更高的要求,对于理工科的学生尤其如此。计算机的本质是“程序的机器”,程序和指令的思想是计算机系统中*基本的概念。程序设计是软件开发人员的基本功。只有懂得程序设计,才能进一步懂得计算机,真正了解计算机是怎样工作的。通过学习程序设计,学会进一步了解计算机的工作原理,更好地理解和应用计算机,掌握用计算机处理问题的方法,培养计算思维,提高分析问题和解决问题的能力,具有编制程序的初步能力。即使将来不是计算机专业人员,由于学过程序设计,理解软件生产的特点和生产过程,就能与程序开发人员更好地沟通与合作,开展本领域中的计算机应用,开发与本领域有关的应用程序。因此,无论计算机专业学生还是非计算机专业学生,都应当学习程序设计知识,并且把它作为进一步学习与应用计算机的基础。2. 为什么选择C语言进行程序设计,必须用一种计算机语言作为工具,否则只是纸上谈兵。可供选择的语言很多,各有特点和应用领域。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点,既适于编写系统软件,又能方便地用来编写应用软件。有人以为C 语言出现后,C语言就过时了,会被淘汰了,这是一种误解。C 是为处理较大规模的程序开发而研制的大型语言,它比C语言复杂得多,难学得多。事实上,将来并不是每个人都需要用C 编制大型程序。C语言是更为基本的。美国一位资深软件专家写了一篇文章,题目是《对计算机系学生的建议》,是经验之谈,可供参考。他说: “大学生毕业前要学好C语言,C语言是当前程序员共同的语言。它使程序员互相沟通,比你在大学学到的‘现代语言’(比如ML语言、Java语言、Python语言或者正在教授的流行语言)都更接近机器。”他指出: “不管你懂得多少延续、闭包、异常处理,只要你不能解释为什么while(s =t )的作用是复制字符串,那你就是在盲目无知的情况下编程,就像一个医生不懂*基本的解剖学就盲目开处方。”C语言更适合解决某些小型程序的编程。C语言作为传统的面向过程的程序设计语言,在编写底层的设备驱动程序和内嵌应用程序时,往往是更好的选择。现在大多数高校把C语言作为*门计算机语言进行程序设计教学,这是合适的,有了C语言的基础,需要时再进一步学习C 语言,也是很容易过渡的。3. 怎样处理好算法和语言的关系进行程序设计,要解决两个问题: (1) 要学习和掌握解决问题的思路和方法,即算法。(2) 学习怎样实现算法,即用计算机语言编写程序,达到用计算机解题的目的。因此,课程的内容应当主要包括两个方面: 算法和语言。算法是灵魂,不掌握算法,编程就是无米之炊。语言是工具,不掌握语言,编程就成了空中楼阁。二者都是必要的,缺一不可。作者的做法是: 以程序设计为中心,把二者紧密结合起来,既不能孤立地、抽象地研究算法,更不能孤立地、枯燥地学习语法。算法是重要的,但本课程不是专门研究算法与逻辑的理论课程,不可能系统全面地介绍算法;也不是脱离语言环境研究算法,而是在学习编程的过程中介绍有关的典型算法,引导学生思考怎样构造一个算法。编写程序的过程就是设计算法的过程。语言工具也是重要的,掌握基本的语法规则是编程的基础,如果不掌握必要的语法规则,连*简单的程序也编不出来,或者编出来的程序错误百出,无法运行。但是掌握C语言绝不能靠死学死记,就像熟读英语的语法不一定会写英文文章,只靠字典学不好外语一样。如果你去看C语言标准文本,可能感觉如看“天书”一样,恐怕只有计算机专家才能看懂。绝不能把程序设计课程变成枯燥地介绍语法的课程,学习语法要服务于编程。在30年前我们编写《BASIC语言》时就已经遇到了这个问题,我们坚决摒弃了孤立地介绍语法的做法,而是以程序设计为中心,把算法与语言紧密结合起来。不是根据语言规则的分类和顺序作为教学和教材的章节和顺序,而是从应用的角度切入,以编程为目的,以编程为主线,从初学者的认知规律出发,由浅入深,由易到难,构建了教材和教学的体系。一开始就让学生看懂简单的程序,编写简单的程序,然后逐步深入。语法规则不是通过孤立的学习而是在学习编程的过程中学到的。随着编程难度的逐步提高,算法和语法的学习同步趋于深入。学生在富有创意、引人入胜的编程中,学会了算法,掌握了语法,把枯燥无味的语法规则变成生动活泼的编程应用。事实证明这种做法是成功的。多年来,我们坚持和发展了这种行之有效的方法,取得了很好的效果。近年来许多学校的经验表明,按照这种思路进行教学,教师容易教,学生容易学,效果很好。4. 注意培养科学思维方法大学计算机基础教育要综合考虑三个方面的因素: (1)信息技术的发展; (2)面向应用的需求; (3)科学思维的培养。大学不仅要使学生学到丰富的知识,更要培养学生的科学思维能力。在教学中要“讲知识,讲应用,讲方法”。方法比知识更重要。方法就是处理问题的思维方式 ,教育就是教人养成正确的思维方式,知识不能代替思维。知识不是智慧,解决问题的方法才是智慧。编程是一项引发积极思维的活动,它不是一种简单的技能,不是只要熟记有关规则、熟能生巧,就能完成任务的。编程需要智慧,编写每一个程序都要积极开动脑筋,发挥创造精神。编程是一件很灵活的工作,没有标准答案,不同的人可以写出不同的程序。在教学过程中要引导学生善于思考,在给出程序设计任务后,首先要引导学生对问题进行任务分析,思考解题的思路,设计算法,然后再考虑如何用C语言实现它。同一个问题,往往有不同的解题思路和方法,要善于引导学生前后连贯,综合比较,归纳分析。要活学活用,学用结合,学到方法,学出兴趣。研讨算法的过程就是培养科学思维方法的过程。正如学习数学培养了学生的逻辑思维能力一样。要有意识地通过程序设计培养学生的科学思维(包括计算思维)能力,使学生掌握在信息时代处理问题的科学方法。培养科学思想不是一项外加的任务,不要搞得玄而又玄,它是渗透在整个学习过程中的,是自然而然的,但是需要画龙点睛,善于归纳和提高。二、 关于本书内容的选择原则与具体安排1. 本书是一本介绍怎样用C语言进行程序设计的教材,目的是学习编写程序,C语言是工具,掌握语言工具是为了编程。因此本书章节的安排不是以语言作为主线,而是以怎样编程作为主线。在由浅入深介绍编程的过程中自然而然地介绍C语言的有关内容,二者紧密结合,同步深入。本书不是C语言的使用说明手册,不可能也没必要详细介绍C语言的全部内容,更不可能详细介绍所有细节。只能介绍*基本的内容,使读者能顺利地用C语言编写小规模的程序。在教学中,常用到的就介绍,不常用甚至用不到的就不介绍(或在教材中列出这些内容,使读者有个印象,以后用到时可以查阅)。如果读者今后有需要,可以在此基础上继续深入,并在实践中掌握有关语言工具的细节。 2. 程序设计课程存在以下实际问题: (1) 许多学校把程序设计放在一年级,学生缺乏必要的计算机基础知识;(2) 学时不是很多,一般只有四五十学时。(3)本书的读者大多数将来不一定从事专业的编程工作。学习C程序设计不能脱离实际。课程的作用是使读者了解什么是程序设计,了解计算机高级语言的特点和使用方法,能用C语言编写出规模不大的程序。有了这个基础,以后需要时可以进一步深入和提高,有能力用任何一种语言编写出实用程序。3. 教材必须做到定位准确,取舍恰当,结构合理,概念清晰,循序渐进,易于理解,善于把复杂的问题简单化,能用通俗易懂的方法和语言阐述清楚复杂的概念。作者认为: 只有明白“不明白的人为什么不明白”的人才是明白人。这是作者三十多年来从事教学和编著教材一贯坚持的理念,并且取得了很好的效果,受到广大师生的肯定和欢迎。在本书中仍然充分体现这一特点。4. 根据教学实践的反馈,在本书第四版出版时已作了较大的修改,这次修订是在第四版的基础上进行的,为了教学的延续性,第五版基本保持第四版的基本结构和内容,并作了适当的精简和补充。具体安排如下: (1) 第1章中简要介绍了程序设计的初步知识。但是由于篇幅关系以及学生基础不同,没有单独加设一章系统介绍计算机基本知识。有些需要用到的知识(如补码、地址、路径、数制转换等),可在教学中随时补充(讲到哪,就补到哪)。这样可以尽早切入C语言编程,始终以编程为主线。(2) 在第三版中第3章“数据类型、运算符与表达式”内容涉及数据在计算机中的存储形式,初学者一开始就接触这些内容容易感到枯燥难学。在第四版中对这部分内容进行了精简,不再单独设章,把其中*基本的、必须了解的内容结合在第3章“*简单的C程序设计”中介绍,降低了学习难度。在这次修订中又进一步精简,对于输入输出格式,主要介绍*基本、*常用的内容,对其他格式,有些在随后陆续结合程序介绍,有的不作具体介绍,只列表给出,使读者有全面了解,以后用到时可以查阅。(3) 在第四版中,已把“位运算”和“预处理指令”这两章内容从教材移入《C程序设计(第四版)学习辅导》一书中。在这次修订中为减少篇幅,把第四版中的第11章“常见错误分析”也移放到《C程序设计(第五版)学习辅导》一书中,供读者自学参考。(4) 在第三版的“结构体与共用体”一章中有设计链表(链表的建立、插入、删除和输出等)的内容,对于非计算机专业学生来说,难度较大。作者认为,这部分内容对非计算机专业可以不作为基本要求,在第四版中已对这部分内容作了精简,只对链表作简单的介绍,读者对之有一定了解即可。考虑到这部分对计算机专业学生是需要的,我们把有关链表的详细内容作为习题供选做,并在《C程序设计(第五版)学习辅导》一书的习题解答中给出完整的程序,供需要者参考。(5) 专门编写了“C程序案例” 一章,综合应用各章的知识。其中提供了不同难度、不同类型的程序。阅读这些程序,可以使学生了解怎样去编写应用程序,提高自己的编程能力。这部分内容安排在《C程序设计(第五版)学习辅导》一书中,供需要者参考。5. 加强算法。专设一章(第2章)介绍算法的概念、算法的特点、表示算法的工具以及怎样设计算法,并通过一些简单的例子说明怎样构造一个算法。使读者有一个初步的、基本的了解。在以后各章中,由浅入深地结合例题介绍各种典型的算法,并且用C语言表示此算法,写出程序并运行。这样就使算法与程序紧密结合,便于验证算法的正确性。学习时不会觉得抽象,而会觉得算法具体有趣,看得见,摸得着,有利于启发思维,培养科学思维方法。在各例题中,在提出问题后,都先进行分析问题,讨论解题思路,也就是构造算法,然后才是根据算法编写程序,而不是先列出程序再解释程序,从中了解算法。这样做,更符合读者的认知规律,使读者更容易理解算法,也引导读者在处理任务时先考虑算法再编程,而不是坐下来就写程序,养成良好的编程习惯。6. 指针是C语言的一大特点,也是重点和难点,是作者下功夫*多的部分。指针这一部分概念比较复杂,应用相当灵活,很多初学者觉得指针很抽象,很难掌握,这成为学习C语言的拦路虎。如果没有清晰的思路和深入的理解,是难以真正掌握指针的。作者认为,应该用清晰易懂的语言使读者明白指针的本质,绝不能让读者一知半解,囫囵吞枣。作者明确指出“指针就是地址”。很多读者反映,这是画龙点睛,把指针讲透了,抓住了问题的本质。有了这个明确的认识,很多不清楚的问题都迎刃而解了,觉得指针不再难理解、难掌握了。作者根据初学者的特点,用通俗易懂的方法讲清楚了指针是什么,并且通过大量的例子说明怎样通过用指针有效地处理问题。在这次修订中,作者对“指针就是地址”作了更深入具体的分析和叙述,使之更加容易理解,更加有说服力,解决了读者学习中的一大困惑。在这一章中,既有*基本的讲解和通俗的比喻,又有具有深度的编程技巧。从原理到应用,由浅到深,步步深入,不同程度的读者都能从中得到启迪与裨益。许多学校的老师对学生说,如果对指针不明白,看清华版的《C程序设计》就明白了。希望读者认真学好这一章。7. 更加通俗易懂,容易学习。作者充分考虑到广大初学者的情况,精心设计体系,适当降低门槛,尽量少用深奥难懂的专业术语,便于读者入门。没有学过计算机原理和高等数学的读者也完全可以掌握本书的内容。本书采用作者提出的“提出问题—解决问题—归纳分析”教学三部曲,先具体后抽象,先实际后理论,先个别后一般;而不是先抽象后具体,先理论后实际,先一般后个别。在介绍每个例题时,都采取以下的步骤: 给出问题—解题思路—编写程序—运行结果—程序分析—有关说明,使读者很容易理解。即使没有教师讲解,读者也能看懂本书的内容,就有可能做到,教师少讲,提倡自学,上机实践。8. 本教材是按照C 99标准进行介绍的(目前许多教材是按照C 99标准介绍的),以符合C语言的发展,使程序更加规范。C 99是在C 89的基础上扩充一些功能而推出的。C 99和C 89是兼容的,用C 89编写的程序在C 99环境下仍然可以运行。C 99所增加的有些功能和规定是为了在编制比较复杂的程序时方便使用和提高效率。对初学者暂时用不到的,本书不作介绍,以免增加学习难度,可以在将来深入编程时再逐步了解和使用。9. 程序的编译和运行环境,*早多用Turbo C,后来多用Visual C 6.0。用Visual C 6.0是比较方便的。但由于在Windows 7以上的系统中不支持Visual C 6.0,因此许多用户改用Visual Studio 2008或2010。我们在《C程序设计(第五版)学习辅导》一书中既介绍Visual C 6.0的使用方法,也介绍用Visual Studio 2010编译和运行C程序的方法,供读者参考使用。10. 为了帮助读者学好C程序设计,作者精心编著了《C程序设计(第五版)学习辅导》,作为本书的配套用书。内容包括以下4个部分。*部分: 《C程序设计(第五版)》全部习题的参考解答。提供了130多个程序,可以作为学习《C程序设计(第五版)》的补充例题,对于读者拓宽视野、丰富知识和提高编程能力很有好处。第二部分: 深入学好C程序设计。包括4章: (1) 预处理指令。系统介绍了C语言中的预处理指令,是对教材的补充。(2) 位运算。系统介绍了C语言的位运算,是对教材的补充。(3) 常见错误分析。作者总结了初学者学习时常出现的35种错误,对初学者避免错误会有帮助。(4) C程序应用案例。通过3个应用实例(个人所得税计算、学生试卷分数统计和电话订餐信息处理)了解怎样用C语言编写能供实用的程序。第三部分: C语言程序上机指南。包括: (1) 怎样用Visual C 6.0运行C程序。(2) 怎样用Visual Studio 2010运行C程序。详细介绍这两种使用方法,尤其是Visual Studio 2010,是很多读者希望了解和使用的,但介绍它的教材较少。第四部分: 上机实践指导。包括3章: (1) 程序的调试与测试。(2) 上机实验的目的和要求。(3) 实验安排。具体安排了12个实验,给出题目和具体要求。该书内容丰富,是对教材的重要补充。对于希望学好C程序设计的读者是很好的参考读物。三、 怎样学习C程序设计1. 要着眼于培养能力。C语言程序设计并不是一门纯理论的课程,而是一门应用的课程。应当注意培养分析问题的能力、构造算法的能力、编程的能力和调试程序的能力。2. 要把重点放在解题的思路上,通过大量的例题学习怎样设计一个算法,构造一个程序。初学时更不要在语法细节上死背死抠。一开始就要学会看懂程序,编写简单的程序,然后逐步深入。语法细节是需要通过较长期的实践才能熟练掌握的。初学时,不宜过早地使用C语言的某些容易引起错误的细节(如不适当地使用 和--)。3. 掌握基本要求,注意打好基础。在学校学习阶段,主要是学习程序设计的方法,进行程序设计的基本训练,为将来进一步学习和应用打下基础。不可能通过几十小时的学习,由一个门外汉变成编程高手,编写出大型而实用的程序,要求应当实事求是。如果学时有限,有些较深入的内容可以选学或自学,把精力放在*基本、*常用的内容上,打好基本功。4. 要十分重视实践环节。光靠听课和看书是学不会程序设计的,学习本课程既要掌握概念,又必须动手编程,还要亲自上机调试运行。读者一定要重视实践环节,包括编程和上机,要既会编写程序,又会调试程序。学得好与坏,不是看你“知不知道”,而是“会不会干”。考核方法应当是编写程序和调试程序,而不应该只采用是非题和选择题。5. 要举一反三。学习程序设计,主要是掌握程序设计的思路和方法。学会使用一种计算机语言编程,在需要时改用另一种语言应当不会太困难。不能设想今后一辈子只使用在学校里学过的某一种语言。无论用哪一种语言进行程序设计,其基本规律是一样的。在学习时一定要活学活用,举一反三,掌握规律,在以后需要时能很快地掌握其他新的语言进行编程。 6. 要提倡和培养创新精神。教师和学生都不应当局限于教材中的内容,应该启发学生的学习兴趣和创新意识。能够在教材程序的基础上思考更多的问题,编写难度更大的程序。在本书每章的习题中,包括了一些难度较大的题目,建议学生尽量选做,学会自己发展知识,提高能力。7. 如果对学生有较高的程序设计要求,应当在学习本课程后安排一次集中的课程设计环节,要求学生独立完成一个有一定规模的程序。8. 从实际出发,区别对待学习本课程的有计算机专业学生,也有非计算机专业的学生;有本科生,也有专科(高职)学生;有重点大学的学生,也有一般大学的学生。情况各异,要求不同,必须从实际出发,制订出切实可行的教学要求和教学方案,切忌脱离实际的一刀切。例如,对计算机专业学生的要求应当比非计算机专业高,尤其是对算法的要求应当高一些,不仅会用现成的算法,还应当会设计一般的算法。*好能在学完本课程后独立完成一个有一定规模的程序。对高职学生的要求应不同于本科生,更不应照搬重点大学的做法,不宜在算法上要求太高,而应切实掌握语言工具,具有较强的动手和实践能力,例如编码能力和调试能力。对基础较好、学生程度较高的学校,可以少讲多练,强调自学,有的内容课堂上可以不讲或少讲,指定学生自学。引导学生通过自学和实践发展知识,尽可能完成一些难度较高的习题。9. 为了满足不同的需要,出版不同层次的C程序设计教材全国各校的情况不同,学生的基础和学习要求也不尽相同,不可能都采用同一本教材。教材应当满足多层次多样化的要求。许多学校的老师认为《C程序设计》是一本经过长期教学实践检验的优秀教材,其内容与风格已为广大师生所熟悉,希望在《C程序设计》的基础上组织不同层次的教材,供不同对象选用。作者与清华大学出版社反复研究,决定出版C程序设计的系列教材,包括以下3种: (1) 《C程序设计(第五版)》,即本书。本书系统全面,内容深入,讲解详尽,包含了许多其他教材中没有的内容,尤其是针对编程实践中容易出现的问题作了提醒和分析,是学习C语言程序设计的理想教材,适合程度较高、基础较好的学校和读者使用。(2) 《C程序设计教程(第2版)》。以《C程序设计》一书的内容为基础,适当减少内容,突出重点,紧扣*基本的要求,适合学时相对较少的本科院校使用。该书已被正式列为“十二五”普通高等教育本科*规划教材。(3) 《C语言程序设计(第3版)》。内容更加精练,要求适当降低,写法上更加通俗易懂,适合应用型大学和程度较好的高职院校使用。该书亦已列为普通高等教育“十一五”*规划教材和2009年度普通高等教育精品教材。10. 为了帮助广大读者更好地掌握本书的内容,我们组织制作了与本书配合使用的数字资源,将在近期内陆续推出,供各高校教学使用。
在本书出版之际,作者衷心感谢全国高等院校计算机基础教育研究会和全国各高校教师多年来始终不渝的关心与鼎力支持,感谢广大读者给予我的理解与厚爱,感谢清华大学出版社三十多年来的密切合作与支持。没有这一切,我不可能取得今天的成就。我永远感谢曾经帮助和支持过我的、相识的和不相识的同志和朋友。薛淑斌、谭亦峰高级工程师参加了本书内容的研讨并编写了部分程序,南京大学的金莹副教授参加了本次修订工作并负责制作与本书配合的数字资源。由于作者水平有限,本书肯定会有不少缺点和不足,热切期望得到专家和读者的批评指正。
谭浩强谨识2017年5月于清华园对使用本教材的建议1. 本书是作为高等学校学生学习C程序设计的教材,对象是没有学过计算机程序设计的大学生。本书既注重概念清晰,使读者建立起对程序设计和C语言的清晰理解,又注意引导学生学以致用,使学生在较短的时间内初步学会用C语言编写程序,具有初步的编程知识和能力,而不是仅停留在理论知识层面上。虽然如此,本书与就业上岗前的职业培训教材是有区别的,也不是供软件开发人员使用的手册和技术规范,本书带有基础的性质,主要帮助学生学习程序设计方法,学习怎样去编写程序,为以后的进一步提高与应用打好基础。如果读者准备从事软件开发工作,可以在学习本书的基础上进一步学习有关专业知识。2. 本书系统全面,内容丰富,供基础较好的学校和学生学习。本书很适合自学,建议采取课堂讲授与自学相结合的方法。在课堂上教师主要介绍编程思路和怎样用C语言去实现算法,不要孤立地一一介绍语法的细节,但是要在介绍程序时重点指出关键之处以及容易出错的地方。要求学生通过自学教材和上机实践来理解程序设计方法,学会正确使用C语言工具,具有初步编程能力。语法不是靠讲和背学会的,而是在实践中掌握的。3. 作者专门编写的“常见错误分析”(《C程序设计(第五版)学习辅导》第13章)中列举了初学者在编程序时常出现的错误,这是作者在多年教学实践中收集和总结出来的,是很有价值的,希望教师和同学能充分利用这个资源。教师可以结合教学提醒学生避免出现类似的错误。学生在学习过程中可以随时翻阅,了解在什么情况下容易出错。在经过一段时间的编程和上机实践后,再系统地阅读一下,回顾和总结自己易出错的问题,这样可以减少错误,提高编程效率。4. 要善于利用习题。本书各章中的习题包括不同类型、不同程度的142道题目。其中有些题目的难度高于书中的例题,这样做的目的是使学生不满足于已学过的内容,而要举一反三,善于发展已有知识,提倡创新精神,培养解决问题的能力。有的专家和读者说,如果能独立地完成全部习题,他的C语言学习就过关了。希望教师能指定学生完成各章中有一定难度的习题。希望学生能尽量多做习题,以提高自己的水平。在《C程序设计(第五版)学习辅导》一书中,提供了绝大多数习题的参考解答,列出了程序。对于比较难的习题,除了给出程序外,还作了比较详细的说明。这些习题解答实际上是作者对本教材例题的补充,希望读者能充分利用它。学生即使没有时间自己做全部习题,如果能把全部习题的参考解答都看一遍,而且都能看懂,也会很有收获,能扩大眼界,丰富知识。教师也可以挑选一些习题解答在课堂上讲授,作为补充例题。5. 预处理指令往往是C程序中必要的部分,尤其是用#include指令来包含头文件和用#define指令定义符号常量。在本教材中结合编写程序,介绍了怎样使用这两种预处理指令。在《C程序设计(第五版)学习辅导》一书中,专门有一章系统、详细地介绍各种预处理指令的使用,以供使用参考。教师可在介绍#include指令和#define指令时说明还有其他预处理指令,请同学们自己学习参考。6. “位运算”是C语言区别于其他高级语言的一个重要特点。C语言能对“位” 进行操作,使得C具有比较接近机器的特点。考虑到非计算机专业学生的情况,这次修订时在主教材中不再包括位运算的内容。但是,在编写系统软件和数据采集、检测与控制中往往需要用到位运算。信息类专业的学生需要学习这方面的知识,因此,把位运算的内容放到《C程序设计(第五版)学习辅导》一书中,计算机和其他信息类专业可以把它列入教学内容,其他读者可以选学。7. 为了便于教学,本教材中的例题程序的规模一般都不大。在学完各章内容之后,需要综合应用已学过的知识,编写一些应用程序,以提高编程能力。在《C程序设计(第五版)学习辅导》一书中专门有一章“C程序案例”,这些案例很有实用价值,对于读者在学习本书后提高编程能力会有很大的帮助。要善于利用这些资源,教师可以指定学生阅读这些程序。8. 由于学时少,只靠几十小时的教学就能使学生真正掌握C程序设计是困难的,如果有条件,*好在学完本教材后安排一次课程设计,要求学生独立完成一个有一定规模的程序设计,这是一个重要的教学实践环节,能大大提高学生的独立编程能力。9. 本书可供不同层次的读者使用。可以采取以下几种方法之一: (1) 程度较高的学校和学生,可以学完本书的全部内容,再完成一个大作业。(2) 课堂上讲完本书的基本内容,目录中有*的章节可以指定学生课后自学,但应作为教学要求,完成相关的习题和实验。(3) 如果学时不够,难以讲完全部内容,有*的章节可作为选学内容,不作为教学要求,教师可作很简单的介绍,然后留作学生日后需要时查阅参考。但建议不要把本书后面几章舍弃,应当让学生基本学完第1~10章,使学生对C语言有全面的了解。例如,文件的概念是很重要的,宁可作简单的介绍,也不要放弃。前5章的进度可以快些,有些程序可以让学生自学。
【媒体评论】
评论
【书摘与插画】

返回顶部