C语言是高等学校计算机专业及相关专业必修的专业基础课之一,是培养学生算法思维能力、动手能力的主要课程和工具,也是面向对象程序设计、数据结构等后续课程的先导课。学生对C语言的掌握情况在很大程度上决定着大学四年的学习情况。 本书作者在2015年编写的《深入浅出新编C语言教程》受到广大读者的广泛好评。在此基础上,作者对原版进行了修订,在内容上进行了调整、改进和补充,最终形成了本书。本书通过“探究式”的讲解,使读者对每个知识点的理解更加准确、透彻。 编写本书的指导思想 (1) 零基础讲起。针对刚进入大学的新生及初级程序员,将C语言编程的一些必要的计算机知识纳入本书第1章。 (2) 按符合读者认知规律的自然顺序安排章节。 (3) 化繁为简、化整为零。重要的知识点单独写成一章,每章内容相对独立,与其他知识点关联少,条理清楚,易于初学者掌握。 (4) 对“指针”一章的内容和“文件”一章的内容重点着墨,描述清楚,使读者更容易掌握这两章内容。 (5) 将作者多年积累的教学经验、对若干问题的独到见解、编程注意事项、典型例题和习题写到书中,让读者更有针对性地学习。 本书在以下几方面做了较大改进。 1. 对教材内容的改进 1) 增加了以下几部分内容 要学好C语言,下面的知识是必要的。 (1) 计算机基础知识。绝大多数学校把C语言放在大一的第一学期开设,对于没有任何计算机基础的新生来说,C语言的知识仿佛“天书”。因此,本书从计算机基础知识讲起,这些基础知识包括内存和内存地址的概念,二进制,不同数制之间的转换,原码、反码和补码的求法,计算机语言及语言处理过程等。 (2) 有关程序、指令和输入输出重定向的概念。C语言中,很多地方需要用到程序与指令以及输入输出重定向的概念,故也把这两部分内容编入本书。其中,程序与指令部分放在第1章,输入输出重定向部分放在附录中,供需要的读者自学。 (3) 缓冲区及键盘缓冲区的概念。学习C语言的输入输出,缓冲区是个绕不开的话题。如果不知道数据从键盘到缓冲区的处理过程,就很难掌握输入输出,就很难解释为什么程序会出现那些意想不到的运行结果。 (4) 函数的作用和函数设计的原则。函数是被用来调用的,因此函数的适用性和灵活性是衡量一个函数优劣的重要指标。本书不但注重讲解函数定义和函数调用的格式、函数参数传递的特点,而且对于函数的作用和设计原则(追求通用性、可利用率等)进行重点讲述。本书从函数返回值的设定和参数设定两方面详细讲述函数设计的原则。 C语言可以这样学(第2版·MOOC版·题库版·OnlineJudge版)前言(5) 文件操作原理及相关细节问题。“文件”一章的内容非常重要,但又特别难懂。难懂的原因有三:一是讲解时如果未给出文件操作的原理,那么学生知其然,不知其所以然;二是有几个概念特别容易混淆,如写数据有文本和二进制两种方式,文件分为文本和二进制两类文件,文件的打开方式也分为文本方式和二进制方式,讲解时如果未明确指出它们之间有无关联,区别是什么,会导致学生概念混乱;三是在介绍文件操作时如果对一些重要内容不予讲解,会导致学生一编程就出错,望文件而生畏。本书对上面所说问题均做了详细讲述并予以例证。 2) 对读者容易忽视的问题进行了探讨 (1) 对指针进行了深入探讨。 (2) 对文件操作中的一些问题进行了探讨。例如,函数feof()何时返回非零值问题、用二进制方式能否打开文本文件、用文本方式打开文件后能否以二进制方式向其中写数据等问题。 (3) 讨论了共用体变量能否初始化、共用体变量能否作为参数等问题。 2. 对各章节的内容分配及前后顺序做了较大调整和优化 1) 对指针内容的分解 指针是C语言的精华,但指针又非常难学。C语言中指针的类型很多,如此多的类型本就容易混淆,如果把它们全部放在一章中讲解,显得很全面、很系统,但学生要在一章中(一两周的时间)弄懂如此多且抽象难懂的内容,实在是勉为其难。 本书将指针最重要的两个应用——用指针变量访问变量、用指针变量访问下标变量两部分抽出来作为单独的两章来讲解。其中,“用指针变量访问变量”一章放在函数之后、数组之前讲解,“用指针变量访问下标变量”一章放在数组之后讲解,其余内容放在“指针综述”一章中介绍。如此分解可化繁为简,具有重点突出、针对性强、易于接受等优点,也彰显了指针的这两个重要用途。另外,如此设计也可把对指针的学习从短短一两周扩展到前后约一个月。较长时间的消化,有利于学生更好地理解指针、掌握指针。 2) 各章节顺序的调整 (1) 数组和指针的顺序问题。如果先讲数组,再讲指针,带来的问题就是无法对数组名进行解释。实际上数组名在多数情况下都是一个指针。在不介绍指针的情况下,很难把“数组”一章的内容讲清、讲透。 (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下载)中含有全部例题的107个源代码,例题编号与源程序的编号一一对应。例如,例2.1的源代码对应资料中的源文件s2_1.c,若该例题有3种解法,则对应的源文件分别是s2_1_1.c、s2_1_2.c和s2_1_3.c。 3. 本书所获得的项目资助 \[1\] 教育部新工科研究与实践项目(EXTYR20200640), “以建设国家级一流本科专业为契机,依托山东省未来智能计算协同创新中心,打造新工科协同育人实践创新平台”,教育部。 \[2\] 山东省研究生教育质量提升计划项目(SDYKC19199), “算法分析与设计”, 山东省教育厅。 \[3\] 山东省教育教学研究课题(2021JXY042),“建设国家级一流本科专业,赋能山东省数字经济发展”, 山东省教育科学研究院。 \[4\] 烟台市校地融合发展项目,“赋能烟台战略性新兴产业发展,打造国家级一流软件工程专业”, 烟台市教育局。 本书引用了MOOC中的视频,在此向参与录制视频的于文丽、曹旗磊、王涵3位老师表示感谢。 原达教授、谢青松教授对本书的编写给予了热情帮助和大力支持,在此向两位教授深表谢意。此外,本书的编写参考了大量的书籍和文献资料,谨向这些书籍和文献资料的作者表示感谢。在本书的编写出版过程中得到了清华大学出版社的大力支持和帮助,在此表示感谢。 由于时间仓促和作者水平所限,书中难免存在疏漏和欠妥之处,请各位专家、读者不吝指正。 作者2021年9月