C语言是一种经典的计算机语言,被计算机专业人员和应用人员广泛地使用。作为计算机专业的入门课程,C语言对培养读者的专业素养和专业兴趣意义重大。应从什么样的角度分析C语言呢?学了一门C语言,读者应具备怎样的专业素养呢?

C语言只是一种沟通人与计算机的媒介,人通过它提供的“命令”来使用计算机,因此,一方面它的命令需便于人们的理解使用,另一方面命令的结果要由计算机确定,即命令是由计算机执行的。从计算机采用二进制和由五大部件组成这两个常识出发,本书通俗直观地分析了C语言是如何指挥计算机提供服务的。本书并没有从“专业”的角度分析,只是以“有什么用和怎么用”为中心解构了C语言。在利用C语言操作计算机的过程中,读者自然地掌握了计算机的特点及用法,从而具备了使用计算机时应有的专业素养。因此,本书也适用非计算机专业的读者

课堂教学是教育的基础,而教材又是课堂教学的基石。基于以启发读者思维、提高发现问题能力、解决问题能力和创造能力为核心的教材势必会对创新人才的培养起到事半功倍的效果。现行的一些C语言教材不仅立意不高,以灌输语法为主,而且对C语言概念认知不清,误导读者。

经过多年C语言教学实践的积累和探索,作者编写了这本概念明白准确、注重实用、支持自学的C语言教材,以期引起大家思考。

本书的最大特色在于:全面、准确、通俗地解析了C语言的概念,对于C语言的重难点,不仅有生动的解释,而且还通过详尽的实例进行了直观的分析,令人茅塞顿开,更令初学者津津乐道。正因为洞悉了C语言的知识点,并以实用为出发点,所以本书没有让读者陷入语法学习的泥潭,而始终把应用能力的培养作为归宿。具体表现在:

(1)生动地为初学者分析了数据类型。

C语言中数据采用了固定长度的存储单元。对于整数,固定的长度意味着取值范围的限制;对于小数,固定的长度意味着精度的限制。固定长度的数据为计算机的处理带来了便利,但也限制了它的计算能力。理论上算盘可以处理“任意大”的数,但作为工具,算盘的计算能力有限,计算机与此类似。计算机实际上是一台“整数认不全,小数认不准”的机器。

(2)准确地为初学者界定了序列点的作用。

C语言中常用表达式“命令”计算机完成一些操作。C语言表达式求值时会根据序列点、优先级和结合性确定操作符的计算顺序,但现行的许多C语言教材忽略了序列点的影响,这使得读者只能“死记硬背”一些表达式的求值顺序,如逗号表达式从左向右依次求值,逻辑与左边的子表达式先求值等。不讨论序列点,读者就不可能明白为什么这些表达式求值时不先执行高优先级的操作符。序列点的作用非常简单:求值时先考虑序列点的影响;含有序列点的操作符的左边操作数要先于右边操作数求值。讨论了序列点,不仅可以更好地诠释含有序列点的操作符的作用,给读者呈现完整的知识点,更重要的是有了“标准”,读者才能主动地参与分析讨论。

(3)直观地为初学者分析了怎样使用指针变量

C语言中,计算机的内存是由许多种存储单元组成。常见的存储单元有着固定的长度和编码格式,只能存储一类数据,用于存储整数的存储单元不能存储小数。C语言中提供了使用常见存储单元的两种方式:直接引用和间接引用。在C语言中用类似未知数的变量标识计算机中的存储单元,程序中对变量的操作将在计算机中转换成对相关存储单元的操作,如有可存储整数的变量a,语句a=3;执行时,计算机会把整数3存储到与变量a相关的存储单元中。程序中通过变量使用计算机中与之相关的存储单元就是所谓的直接引用。C语言中的指针变量虽然也标识了存储单元,但指针变量的存储单元中存储的是其它存储单元的地址而不是常见的普通数据。当一个指针变量的存储单元中存储了某个存储单元的地址后,常说指针变量指向了这个存储单元。有指针变量p,如p的存储单元存储了变量a的地址,则称指针变量p指向了变量a,此时可以用表达式*p使用与变量a相关的存储单元,其中的*是间接引用操作符。利用指针变量,通过间接引用操作符(以*p的形式)使用指针变量指向的存储单元就是所谓的间接引用。提到C语言,大家都觉得指针难学难用,实际上指针变量的用法很简单只不过要两步:先通过指针变量的赋值操作使指针变量指向某个存储单元(或从指向一个存储单元变为指向另一个存储单元);再通过间接引用操作符(以*p的形式)使用指针变量指向的存储单元。

(4)直观地为初学者分析了怎样编程

编程可简单地理解为把解决问题的步骤翻译成C语言语句的过程。简单的问题通常只有一种情况,只需一种处理流程,编程时直接把处理流程翻译成C语言语句即可。复杂的问题大多包含多种情况,每种情况需要一种处理流程,编程时需用逻辑表达式准确地区分不同的情况。逻辑表达式的值为真时表明出现了某种情况,应采用对应的处理流程;当值为假时表明出现了另外一种情况,应采用另外的处理流程。这类“操作”可以用C语言中的选择结构实现。有了选择结构,C语言程序可以根据实际出现的情况,选用匹配的处理流程,解决复杂的问题。

研究发现通过在一定条件下不断地重复某些处理流程可以解决大多数的问题。当条件成立时,不断地重复执行某些处理流程,这类“操作”可以用C语言中的循环结构实现。编程时,弄清“什么在重复”和“怎样重复”这两个问题是正确构造循环结构的关键,循环结构的构造能力直接反映了程序员的编程能力。

解决复杂的问题有时需要采用“自顶向下,逐步求精”的策略。“自顶向下”是指先忽略复杂问题的细节,从宏观上找出问题的本质;“逐步求精”是指关注细节,归纳总结出具体问题的规律。在本书循环嵌套一节中通过编程输出两个类似图形的对比直观地演示了利用“自顶向下,逐步求精”分析问题的过程。

分析问题,给出解决问题的步骤,再“逐步”翻译成C语言语句,这就是本书讨论编程题的过程。由于用循环解决了大多数的问题,故称计算机是只会“重复”的机器。

(5)直观地为初学者分析了怎样编写递归函数

递归函数超越了“代码组织”的范畴而变成了解决“特定问题”的有效手段。如果在分析问题时发现原问题可以转化为“性质相同,规模较小”的子问题,则此类问题大多可以用递归算法解决。

以求阶乘为例,设函数fac可以求出整数n的阶乘,显然函数调用fac(n)的返回值就是n!。在求整数n的阶乘时,如果整数n的规模较小(如是0或1),就直接返回它的阶乘;否则,整数n的阶乘就是n*(n-1)!。函数可定义为:

unsigned int fac(intn)

{

if(n == 0 || n == 1)

return 1;

//返回n * (n - 1)!的值

}

怎样求出(n-1)!呢?函数调用fac(n)的返回值是n!,显然函数调用fac(n-1)的返回值就是(n-1)的阶乘,函数定义中可用语句return n*fac(n-1);求出并返回n*(n-1)!的值。

由于采用“由递归算法得到递归函数,再由递归函数的执行过程,体会递归算法”的方法,生动直观地分析了递归函数的定义和执行过程,学习后初学者并不觉得递归函数有多难,反而赞叹其神奇。

(6)直观地为初学者分析了使用文件时需注意的关键问题

计算机外存中用文件管理数据,外存中的数据断电后不丢失,因此,文件中的数据可以长期保存。整数123在文件中既能以字符串的形式保存(字符1字符2和字符3),又能以整数编码的形式保存(即int型)。字符串形式的数据可以用多种软件查看内容,但在计算机中不能直接参与类似乘除的运算;整数编码形式的数据正好相反。在文件和程序间传递数据时,需特别注意数据编码形式的选择和转换。

总之,本书全面、准确而又生动地分析了如何通过C语言使用计算机。由于讲解通俗易懂,实例有完整的分析过程,本书也支持读者自主学习。试用期间,教学内容的分析和组织获得了学生及专家的一致认可,教学效果显著。

本书共分13章,内容简介如下。

第1章 C语言和计算机:先分析了C语言如何指挥计算机的五大组成部件,接着介绍了C语言的函数和程序,演示了VC6.0编译器的用法,讨论了printf函数的特点,最后简析了C语言语句各组成部分的作用。

第2章 基本数据类型:讲述了C语言最基本的数据类型。分析了整型、浮点型和字符型的特点和用法。在输出各种类型的数据时,特别强调了数据的输出值与数据实际值的关系。深度探究中主要讨论了输入函数在使用中遇到的问题。

第3章 表达式:首先分析表达式的概念、特点和求值原则,并以此为主线结合操作符的作用讲述了赋值表达式、算术表达式和逗号表达式。赋值表达式中,强调了对表达式的全面理解,简明地分析了类型不匹配时的赋值原则。算术表达式中,强调了同类型的数据才能运算的原则,并引导读者讨论VC6.0中支持的加法运算以增加感性认识。逗号表达式中,分析了逗号操作符的作用和怎样才能保证其作用的实现,准确地界定了序列点的作用。深度探究中讨论了表达式的理解,即表达式既有作用又表现为一个的值,还讨论了自增操作符的误用,强调了值与编译程序相关的表达式不应该出现在程序中。

第4章 逻辑运算和选择结构:先从逻辑运算的特点和作用开始,分析了关系表达式和逻辑表达式。接着讨论了借助逻辑运算匹配不同的处理流程进而解决复杂的问题的过程,并用if选择结构实现了这个过程,从怎么用的角度直观地讲述了选择结构。最后分析了if-else选择结构和switch选择结构。分析问题,用逻辑表达式合理地组织可能的情况,是用选择结构编程的关键。

第5章 循环结构:首先通过while循环结构的学习总结了典型循环结构的3个特点,接着讲述了既紧凑又优雅的for循环结构。最后介绍了do-while循环结构的常见用法。编程时许多问题都是借助循环解决的,“什么在重复”和“怎样重复”是分析的重点。正如本章循环嵌套一节所示,解决复杂的问题时可以考虑使用“自顶向下,逐步求精”的策略。

第6章 数组:首先讲述了一维数组的定义、初始化和应用,接着分析了多维数组的特点,最后分析了字符数组和字符串。数组不仅解决了定义多个变量的麻烦,而且数组定义的多个变量依据下标构成了有序的一组,便于用统一的方法对大批量的数据进行处理。

第7章 函数:先讲述了函数的定义、调用和参数为一维数组时的特殊之处,又讨论了函数的封闭性和全局变量的使用。接着,演示了如何用函数编程,详细分析了递归算法与递归函数。还介绍了一些常用的库函数。最后,用函数编程的思想分析了综合实例,整个过程既体现了自顶向下、逐步求精的思想,又体现了小组成员之间的分工协作,互相配合。深度探究中从函数的功能及函数重用的角度反思了例7-23,还简介了变量的存储类型。

第8章 预处理:介绍了程序编译的过程、宏定义、文件包含及条件编译。宏定义中,强调了怎样使宏定义没有副作用。介绍文件包含时,演示了当某类头文件被多次包含进源文件时可能出现的错误,及避免此类错误时常用的两种方法:只包含函数声明和用条件编译。

第9章 指针:首先明确了指针的概念,指针是有类型的地址,接着分析了指针的作用,借助间接引用操作符使用指针变量指向的存储单元。讨论了与函数结合后,指针具有的现实意义,在函数中可以通过指针变量使用被调函数中的存储单元,即扩展了程序中存储单元的使用范围。讨论了指针与数组的关系,准确而直观地分析数组变量与指针变量的区别和联系。在分析指针与字符串的关系时,又引入了指针数组、指向指针的指针变量等概念。介绍了main函数的标准形式和命令行参数。介绍了指向函数的指针变量。在介绍堆空间时分析了void型指针变量及内存泄露。深度探究中讨论了间接引用操作符的作用,表达式能否位于赋值操作符的左边,对照普通变量指针变量如何称呼等问题。

第10章 用户自定义数据类型:讲述了结构型,分析了其与数组的区别与联系,讨论了链表的理解与使用。介绍了联合型和枚举型。最后介绍了为类型自定义别名。深度探究中讨论了存储单元类型的“改变”。

第11章 文件:首先分析了文件的特点和作用,特别强调了文本文件和二进制文件的区别和联系。接着讲述了利用库函数fputc和fgetc以字节为单位存取文件数据。以printf函数和scanf函数为例,通过分析在文件和程序间传递数据时需注意的问题,介绍了fprintf函数和fscanf函数的用法。介绍了fwrite函数和fread函数的用法。还讨论了标准设备文件,并再次分析了printf函数和scanf函数执行过程,深化了对C语言和计算机的理解。最后讨论了文件的随机读写。

第12章 位运算:介绍了各种位操作符,分析了位操作符的作用,简介了位段。

第13章 数字化信息编码:分析了二进制,讨论了计算机中整数、小数、和字符的编码。本章还对比分析了十进制的计算、理论上二进制的计算以及计算机的计算,强调计算机采用了“纯粹的二进制”。本章的内容实为附录,为学有余力的读者准备。无需掌握本章的知识照样可以借助C语言使用计算机,工具的原理不应成为使用工具的障碍。

在本书的写作过程中得到了许多人的帮助,家人、朋友、同事、学生及网络上素昧平生的C语言爱好者,在此对他们致以最衷心的感谢。特别感谢中国铁道出版社的胡冰艳老师和巨凤老师为本书的出版付出的努力。由于本人水平有限,书中难免有错漏及词不达意之处,恳请大家原谅并不吝赐教,联系方式:zeq126@126.com。

                            周二强

                           2013年3月

《C语言内涵教程》前言相关推荐

  1. 《设计模式之禅》前言

    终于可以写前言了,这说明<设计模式之禅>已经基本完成,可以长嘘一口气了. 为什么写<设计模式之禅>      今年5月份,我在JavaEye上发了一个帖子,其中提到自己已经工作 ...

  2. 设计模式领域公认的3本经典著作之一《设计模式之禅》 [豆瓣评分 8.70]

    下载地址...... 关注公众号:程序员白楠楠,领取. 需要的朋友点我获取:设计模式之禅 图书简介...... 本书是设计模式领域公认的3本经典著作之一,"极具趣味,容易理解,但讲解又极为严 ...

  3. 读秦小波《设计模式之禅》 -- 工厂模式

    设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都 ...

  4. 设计模式之禅--思维导图

    原图ProcessOn里搜索:设计模式之禅

  5. 23种设计模式彩图-设计模式之禅

    <The Zen of Design Patterns> -<设计模式之禅> 书中的23种设计模式彩图:

  6. 设计模式之禅【六大设计原则】

    大旗不挥,谁敢冲锋--6大设计原则 单一职责原则 "你设计的类符合SRP原则吗?"--保准对方立马"萎缩"掉,而且还一脸崇拜的看着你,心想"老大确实英 ...

  7. 设计模式之禅【原型模式】

    真刀实枪之原型模式 先发个个性化电子账单来引出今天的主角 个性化服务 一般银行都会要求个性化服务,添加一些个人信息在提示信息之前. 递送的成功率 邮件的递送成功率有一定的要求,由于大批的发送邮件,会被 ...

  8. 设计模式之禅之单一职责原则

    声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 单一职责原则(Single Responsibility Principle) 1.定义:    在接口 ...

  9. 设计模式之禅【状态模式】

    真刀实枪之状态模式 从电梯说起 随着城市的发展,有两样东西的发明在城市的发展中起到非常重要的作用 汽车:横向发展 电梯:纵向发展 既然说电梯,那就看看电梯有哪些动作 开门 关门 运行 停止 好了,动作 ...

  10. 设计模式之禅【组合模式】

    真刀实枪之组合模式 从公司的人事架构谈起吧 公司的组织架构 从上图中可以分析出: 有分支的节点(树枝节点) 无分支的节点(叶子节点) 根节点(无父节点) 有了树状结构图,再看看类图长啥样吧! 这个类图 ...

最新文章

  1. 一步步教你轻松学朴素贝叶斯模型算法理论篇1
  2. Centos 安装Docker
  3. fatal: unable to access ‘‘: TCP connection reset by peer
  4. BZOJ 2208[Jsoi2010]连通数
  5. SAP Spartacus url里默认electronics-spa的由来
  6. ASP.Net中怎样获得存储过程传出的参数。
  7. Mybatis-Generator(MBG)教程与Idea的MBG插件
  8. Java工作笔记-使用fastjson把对象直接生成为Json
  9. 旋转卡壳 背诵用模板
  10. java 双循环是如何执行的_java – 双循环赛
  11. DB2常用错误代码大全
  12. 怎么将一个类的成员函数作为指针传递给另一个类的成员函数
  13. 通俗易懂的Monte Carlo的积分方法(三)
  14. Sublime Text实现代码自动生成,快速编写HTML/CSS代码
  15. Problem J. Jumbled Compass---Urozero Autumn Training Camp 2016-Day 1||签到模拟时针转动
  16. 阿塞拜疆对加密货币收入及利润征税
  17. curl证书过期_centos7内核升级及curl访问https证书过期处理
  18. Learn OpenGL 笔记6.9 Deferred Shading(延迟着色)
  19. 硬件工程师入门基础知识(一)基础元器件认识(一)
  20. 人工智能将改变教育的未来:让我们变得更聪明

热门文章

  1. centos7安装yum命令,yum命令被玩坏了怎么办?
  2. 东南大学计算机科学与技术夏令营,2019东南大学网络空间安全学院夏令营招生通知...
  3. spring mvc Discus
  4. html5坐标原点在哪,文化 _ 你知道上海的城市坐标原点吗
  5. double类型的输出方式
  6. C++中cout的格式使用
  7. Element Table 反选
  8. Unit Conversion 常用单位转换
  9. 正向代理和反向代理区别
  10. 猿人学第二题,手撕OB混淆给你看(step06-控制流平坦化)