图书前言

前言

C语言是高等学校计算机及相关专业必修的专业基础课之一,是培养学生算法思维能力、动手能力的主要课程和工具,也是面向对象程序设计、数据结构等后续课程的先导课。学生对C语言的掌握情况在很大程度上决定着大学四年的学习情况。

鉴于C语言的重要地位,近些年来出现了无数的C语言教材,有的教材在内容和顺序上存在问题,导致长期以来国内众多教师和学生对一些知识的理解出现偏差。虽然有些教材在形式上做了不少改进,如案例教学法、启发式教学法等,但核心内容并无变化,教材中的问题依然存在。

针对目前国内教材在诸多方面的错误和缺陷,本书作者在2015年编写了《深入浅出新编C语言教程》,受到广大读者的广泛好评。在此基础上,作者对原版进行了修订,在内容上进行了调整、改进和补充。并通过“探究式”的讲解,使读者对每个知识点的理解都更加准确、透彻。

编写本书的指导思想

(1) 零基础讲起。针对刚入大学的新生及初级程序员,将C语言编程的一些必要的计算机知识纳入本书第1章。

(2) 按符合读者认知规律的自然顺序安排章节,而不是为了所谓的“系统”、“全面”不顾及知识点的自然顺序把前后相关的所有内容都堆放在一起。那样做很容易把初学者的思维搞乱,因为对于初学者,理顺众多知识点之间的关系很难。

(3) 化繁为简、化整为零。重要的知识点单独写成一章,每章内容相对独立,与其他知识点关联少,条理清楚,易于初学者掌握。

(4) 对“指针”一章的内容和“文件”一章的内容重点着墨,纠正诸多错误说法和错误代码,澄清若干似是而非的问题。

(5) 将作者多年积累的教学经验、对若干问题的独到见解、编程注意事项、典型例题和习题写到书中,奉献给广大读者。 

本书在以下几方面做了较大改进。

1. 对教材内容的改进

1) 增加了以下几部分内容

要学好C语言,下面的知识是必要的。

(1) 计算机基础知识。绝大多数学校都把C语言放在大一的第一学期开设,对于没[1]〖2〗C语言可以这样学[1]前言〖2〗有任何计算机基础的新生来说,C语言的知识仿佛“天书”。因此,本书从计算机基础知识讲起。这些基础知识包括内存和内存地址的概念,二进制,不同数制之间的转换,原码、反码和补码的求法,计算机语言及语言处理过程等。

(2) 有关路径和输入输出重定向的概念。C语言中,很多地方需要用到路径和输入输出重定向的概念,故也把这两部分内容编入本书。其中路径部分放在第1章,作为选讲或自学的内容;输入输出重定向部分放在附录中,供需要的读者自学。

(3) 缓冲区及键盘缓冲区的概念。学习C语言的输入输出,缓冲区是个绕不开的话题。如果不知道数据从键盘到缓冲区的处理过程,就很难掌握输入输出,就很难解释为什么程序会出现那些意想不到的运行结果。

(4) 函数的作用和函数设计的原则。函数是被调用的,因此函数的适用性和灵活性是衡量一个函数优劣的重要指标。多数教材只注重讲解函数定义和函数调用的格式、函数参数传递的特点,对于函数的作用和设计原则(追求通用性、可利用率等)极少谈及。本书从函数返回值的设定和参数设定两方面详细讲述函数设计的原则。

(5) 文件操作原理及相关细节问题。文件一章的内容非常重要,但又特别难懂。难懂的原因有三:一是几乎所有教材都未给出文件操作的原理,学生知其然,不知其所以然;二是有几个概念特别容易混淆,如写数据有文本和二进制两种方式,文件分为文本和二进制两类文件,文件的打开方式也分为文本方式和二进制方式。有的教材未明确指出它们之间有无关联,区别是什么,导致学生概念混乱;三是有的教材在介绍文件操作时都不详细,对一些重要内容不予讲解,导致学生一编程就出错,望文件而生畏。本书对上面所说问题均做了详细讲述并予以例证。

2) 纠正了读者认知的若干错误

(1) 纠正了关于指针的一些错误说法。例如,“指针就是地址”、“若有定义int a\[10\],*p=a; 则p指向数组a”、“若有定义int a\[3\]\[5\],*p=a; 则p是指向二维数组的指针”、“指向字符串的指针变量”、“数组名就是数组的首地址”、“&a是a的地址”等错误说法。

(2) 对文件操作中的一些问题进行了纠正或澄清。例如,函数feof()何时返回非零值问题(多数教材所讲都是错的)、用二进制方式能否打开文本文件、用文本方式打开文件后能否以二进制方式向其中写数据等问题。

(3) 澄清了共用体变量能否初始化、共用体变量能否作为参数等问题。

2. 对各章节的内容分配及前后顺序都做了较大调整和优化

1) 对指针内容的分解

指针是C语言的精华,但指针又非常难学。因为C语言中指针的类型很多。如此多的类型本就容易混淆,一般教材又把它们全部放在一章中讲解,显得很全面、很系统。但学生要在一章中(一两周的时间)弄懂如此多且抽象难懂的内容,实在是勉为其难。实际效果表明,这样安排很不合理。也正是因为这样安排才使得指针如此难学。

本书将指针最重要的两个应用——用指针变量访问变量、用指针变量访问下标变量两部分抽出来作为单独的两章来讲解。其中,“用指针变量访问变量”一章放在函数之后、数组之前讲解,“用指针变量访问下标变量”一章放在数组之后讲解,其余内容放在“指针综述”一章中介绍。如此分解可化繁为简,具有重点突出、针对性强、易于接受等优点,也彰显了指针的这两个重要用途。另外,如此设计也可把对指针的学习从短短一两周的时间扩展到前后约一个月的时间。较长时间的消化,有利于学生更好地理解指针、掌握指针。

2) 各章节顺序的调整

(1) 数组和指针的顺序问题。一般教材都是先讲数组,再讲指针。带来的问题就是,无法对数组名进行解释,于是产生了“数组名是个地址”的错误说法。实际上数组名在多数情况下都是一个指针。在不介绍指针的情况下,很难把数组一章的内容讲清、讲透。

先讲数组再讲指针,也无法讲明在数组名作为参数的情况下被调函数形参int x\[\]中的x是个指针变量,只好把它说成是“与实参数组具有相同地址的数组”,不仅难以令人信服,而且对很多现象(比如为什么x可以进行自增运算)也无法解释。

(2) 数组和函数的顺序问题。一般教材都是把函数放在数组之后讲解,原因是便于把数组名作为参数放在函数一章中。看起来似乎归类得当,岂不知这样一来就掩盖了函数一章的重点。函数一章,最应该教给学生的是如何把函数设计得当,便于其他函数调用,只应突出这一重点。如果把数组问题也放在函数一章中,就会喧宾夺主,因为数组名作为参数本身也是非常重要的一个知识点。

综上所述,最合适的顺序安排应是函数、指针(1)、数组、指针(2)、指针综述。

本书的使用建议

建议理论授课学时数: 56~64,建议实验学时数:32。

第1章计算机基础知识,若授课对象不是大一第一学期新生,已有基础,可以不讲,或只讲需要的部分。其中带星号的内容(路径及其表示)为选讲内容。

本书适用对象:高等院校本、专科所有开设“程序设计基础”或“C语言程序设计”课的学生,或自学C语言的读者,以及初级向高级进阶的程序员。

其他说明

1. 本书所用编译器

本书讲解时兼顾Visual C++ 6.0(简称VC)和Turbo C 2.0,但程序主要是针对VC编写的,所有源程序都在VC中调试、运行过,例题中的运行结果都是在VC中得到的。

2. 例题和源代码

本书配套资料(可以www.tup.com.cn下载)中含有全部103个例题的源代码,例题编号与源程序的编号一一对应。例如,例2.1的源代码对应资料中的源文件s2_1.c,若该例题有3种解法,则对应的源文件分别是s2_1_1.c、s2_1_2.c和s2_1_3.c。

本书的编写获山东省高等学校教学改革项目资助。原达教授、谢青松教授对本书的编写给予了热情帮助和大力支持,在此向两位深表谢意。此外,本书的编写参考了大量的书籍和文献资料,谨向这些书籍和文献资料的作者表示感谢。本书在编写出版过程中也得到了清华大学出版社的大力支持和帮助,在此一并表示感谢。

由于时间仓促和作者水平所限,书中难免存在疏漏和欠妥之处,请各位专家、读者不吝指正。

作者

2016年6月25日