前言

C语言是一种经典的计算机语言,被计算机专业人员和应用人员广泛地使用。C语言通常是计算机专业的第一门专业基础课,对培养学生的专业素养、专业兴趣意义重大。C语言概念多且杂,初学者往往难以理解和掌握。“C语言”利用“循环”解决问题,用“单一”的方法解决“所有”的问题,这种“化繁为简”的境界也非初学者能轻易体会。C语言是同计算机交流的工具,不了解计算机就不可能精通C语言。学习C语言时,初学者往往对计算机一知半解。多种因素导致初学者很难掌握C语言。

课堂教学是教育的基础,而教材又是课堂教学的基石。基于以启发读者思维、提高发现问题能力、解决问题能力和创造能力为核心的教材势必会对创新人才的培养起到事半功倍的效果。国内的一些C语言教材立意不高,以介绍语法为主,国外的C语言教材与中国学生的结合性差。

语言的作用在于交流,学习C语言与学习英语异曲同工。仅凭记单词背语法想学好英语,是枯燥的,乏味的,绝对行不通的。学习C语言的关键在于编程能力的培养。所谓编程就是把解决问题的方法用C语言表述出来,从而让计算机实际地解决问题。

国外“经典”的C语言教材过分追求技术之美,忽视了学习C语言时学生的基础与初次接触编程时的不适应,这样的教材虽然可以让编程爱好者津津乐道,但却使相当一部分初学者望而却步。从软件工程的角度看,程序的可读性和效率之间应该有所折中。

鉴于C语言在计算机专业中的地位和作用,作者编写了这本理念新颖、视角独特的C语言教材,以期引起大家思考。

本教材的特点如下:

1)注重启发读者思考

C语言毕竟是与机器交流的工具,它的知识点都“有章可循”。让读者 “死记硬背”这些知识点不仅效果差,而且还会使他们思维窒息。本教材在呈现知识点时注重引导读者思考知识点中蕴含的科学规律,让读者既知其然,又知其所以然。如:补码的符号位为何可以参加算术运算?C语言中的整数为何构成一个环?float型为何只能精确到小数点后的67位?同为传值调用形参为指针时为何可以改变实参的值?全局变量的作用域为何可以扩展?为何不能用整数为指针变量赋值?为何常用文本文件保存程序的输出结果?等等。

2)以培养读者的编程能力为宗旨

本教材着重强调了用计算机解决问题的规律(循环)及如何把解决问题的步骤用C语言准确地描述出来。每道例题都给出以自然语言描述的算法及转化为何种C语句的提示。经试用,对学生读、写程序能力的培养效果明显。程序中的每条语句学生知道计算机是如何执行的,反之遇到问题能想出算法,算法中的每步知道该使用何种语句来描述。

3)深入浅出

虽然揭示了知识点中蕴含的科学规律,但在组织素材时考虑到读者为初学者,引导读者思考的基础全为他们已掌握的知识。有时以实例演示来代替科学的推理,这种作法可能不够严谨,但必定会得到更多读者的理解。如在2.2节中以码长1个字节的整型为例,模拟了计算机如何对127+1127+127-128-1127-1求值,然后引导读者得出结论:计算机中的整数构成一个环;超出取值范围时运算结果必然因溢出而出错。

4)概念清晰

想系统而有条理地呈现C语言多而杂的知识点,而不是简单地介绍和机械地强调,必须能抓住它们的本质特征,找出它们之间的内在联系,然后用启发式的方式呈现,让读者思考并最终掌握。有太多学过C语言的学生对其中太多的知识点存在太多的误区。如在计算机中3.123.22会等于6.23,一维数组与一维指针相像,二维数组与指向指针的指针相像等等。这些问题出现的根本原因在于,现行许多C语言教材没有准确地定义一些重要的概念。本教材对C语言中的重要概念都给出了新颖的定义或解释,这些定义可能不够严谨,但初学者理解定义后会似醍醐灌顶。如现行许多C语言书中称数组变量为符号常量,本教材把数组定义为一个“虚拟的变量”(符号常量与变量有本质的区别),从此定义出发,清晰而简洁地分析了数组与指针的区别和联系。何谓指针,是C语言的难中之难,重中之重。现行许多C语言书都称指针为地址,本教材强调指针指向的是内存空间,表现为相关地址,换言之指针为某类存储单元的地址,地址是有类型的。把指针强调为有类型的地址,抓住了本质,这样一来与指针相关的许多问题都可迎刃而解了,如指针变量为何要那样定义,整数为何不能直接赋值给指针变量等等。还有文件等许多概念,本教材都给出了令人信服、与众不同的解释。正因为洞悉了C语言的知识点,所以本教材才得以突出重点,突破难点,没有让读者陷入知识点的泥潭,而是始终把能力培养作为出发点和归宿。

5)练习题别具匠心

本教材不仅每章都有典型例题,而且习题部分也别具匠心。练习也是一本教材的重要组成部分,好的练习题可以让读者百思不厌,回味无穷。作者在成千上万道C语言练习题中精挑细选,力争找出能使读者多思精练的习题。习题均以启发读者思考,突破知识点,培养能力为目的,难度由浅入深,层层递进,兼顾各类读者。习题的侧重点不同,有巩固知识点的,有对例题举一反三的,有拓展思路的,有开阔视野的,还有经典赏析的。

总之,这是一本支持研究性教学的全新的C语言教材。

本教材共分12章,主要内容如下。

1章:C语言与计算机。介绍了冯·诺依曼计算机的工作原理及C语言与计算机的联系;VC6.0编译器;C语言的一些语法规则;printf函数的简单使用。通过VC6.0的调试功能观察了一个C程序的执行顺序。

2章:数字化信息编码与C语言数据类型。详细介绍了数值型数据的数字化信息编码;总结了计算机中整数的运算规律;介绍了C语言中相关数据类型所对应的编码和特点,同时介绍了基本类型的数据在C语言中的输入输出。

3章:操作符与表达式。C语言中许多语句的执行过程实为对相关表达式求值的过程,本章紧紧围绕优先级、结合性、序列点和数据类型转换等求值原则,介绍了如何对C语言中的赋值表达式、算术表达式和逗号表达式进行求值。

4章:逻辑运算与选择结构程序。首先介绍了C语言中逻辑数据的编码特点及逻辑运算的表现形式,接着介绍了关系表达式和逻辑表达式的求值。在介绍if结构时,分析了选择结构对程序的影响。通过流程图的直观呈现,分析了选择结构的嵌套和switch结构有无break语句时的区别。

5章:循环结构。通过while结构的学习总结了典型循环结构的3个特点,接着介绍了既紧凑又优雅的for循环结构。通过比较介绍了循环结构中的break语句和continue语句。循环的嵌套是学习的重点与难点。最后介绍了do-while循环结构的常见用法。

6章:数组。数组不仅解决了定义多个变量的麻烦,而且通过数组定义的多个变量依据下标构成了有序的一组,便于用统一的方法对大批量的数据进行处理。本章先介绍了一维数组的定义、初始化和应用,接着介绍了多维数组。学习二维数组的关键在于如何理解“一维数组的元素类型可以仍是一维数组”。在介绍二维数组的应用时进一步培养了读者构造C语言循环结构的能力。三维数组只是简单地介绍。介绍了字符数组与普通数组以及其与字符串的区别与联系。本章有一个综合示例:求大数的阶乘。先利用数组解决了大数如何表示的问题,再根据大数的表示模拟了计算过程,最后是计算结果的输出。通过此例,不仅培养了读者的综合能力,还渗透了程序可看成数据结构加算法的思想。

7章:函数。本章先介绍了函数的定义,并演示了如何用include命令包含已经定义了的函数。讨论了函数的封闭性和全局变量的使用问题。详细分析了函数的传值调用。递归是C语言中的重点也是难点。递归函数与递归算法密切相关。本教材采用“由递归算法得到递归函数,再由递归函数的执行过程,体会递归算法” 的方法来突破重难点。并演示了如何用递归算法解决不同类型的问题。最后有选择地介绍了一些库函数。本章的综合实例是确定公元ymd日是星期几。在给出了算法之后,把算法中的步骤用函数表示,在写出了main函数之后,再详细分析被调用函数的实现。整个过程既体现了自顶向下、逐步求精的思想,又体现了小组成员之间的分工协作,互相配合。

8章:预处理。本章介绍了程序编译的过程、宏定义、文件包含及条件编译。在介绍宏定义时,强调了怎样使宏定义没有副作用和参数化宏与函数的区别和联系。在介绍文件包含时,演示了当某类头文件被多次包含进源文件时可能出现的错误,及如何避免类似的错误。

9章:指针。指针是C语言的精华。从变量的左值和右值出发,明确了指针的概念。指针是有类型的地址,虽然表现为整数,但其为有“类型”的整数,因此,不能用整数给指针变量赋值。在介绍指针操作符时,着重分析了间接引用操作符的作用。证明了当指针变量pi指向变量i时,通常情况下*pi可以与变量i可以互换使用。通过实例介绍了野指针。指针类型作为函数参数和函数返回值时有许多特殊性。通过分析“特殊性”,既巩固了对指针的理解,又明白了前面章节遗留的问题。介绍了指针变量支持的运算,并尝试分析了表达式的左值性和右值性问题。数组变量有左值和右值,是一个虚拟的变量。通过数组状态图及对和数组相关表达式(如sizeof(a)a = 3sizeof(a+1)*a+1*(a+1))的求值,使读者对数组变量有了准确的认知,并启发读者思考指针变量和数组变量的区别与联系。本章还分析了指针与二维数组、指针与字符串的关系。在分析时又引入了指针数组、指向指针的指针变量等概念。介绍了main函数的标准形式和命令行参数。介绍了指向函数的指针变量。在介绍堆空间时强调了void型指针变量及内存泄露。在本章的典型例题中,通过库函数qsort的使用,演示了如何使用指向函数的指针变量。

10章:用户自定义数据类型。介绍了结构型,分析了其与数组的区别与联系。用链表组织结构型变量。介绍了联合型和枚举型。最后介绍了为类型自定义别名。

11章:文件。文件用于在外存中保存数据,C语言主要使用缓冲文件系统。程序中文件的相关信息被保留在FILE结构型变量中。根据存储数据的编码格式可以把文件分为文本文件和二进制文件。文件读写函数fputc函数和fgetc函数与fwrite函数和fread函数存取数据的长度单位不同,而fprintf函数和fscanf函数多用于文本文件的读写。文件的结束状态是一个容易使读者困惑的概念。本章还介绍了标准设备文件及文件的随机读写,并分析了使用可读写文件时需注意的问题。

12章:位运算。位运算多用于存储空间受限的计算环境。本章介绍了位操作符,分析了位操作符的作用。最后简单地介绍了位段。

由于思路和知识点的组织形式与现行的C语言教材差异较大,可借鉴的材料不多,本书从动笔到完稿历时二年。在本书的编写过程中,参考了大量的文献资料,在此谨向这些文献资料的作者表示诚挚的谢意,特别感谢那些网络上素昧平生的C语言爱好者。对编辑付弘宇老师的付出表示衷心的感谢。

由于作者水平有限,本教材难免有错漏不当之处,望广大读者朋友们不吝赐教。联系方式:zeq126@126.com

                           周二强

                          2011年2月

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值