C语言内涵教程
书 号:9787113163815
丛 书 名:普通高等学校计算机类专业特色教材.精选系列
作 者:周二强
译 者:
开 本:16开
装 帧:平装
正文语种:
出 版 社:中国铁道出版社有限公司
定 价:36元
-
内容简介
本书从“有什么用”的角度重新解析了C语言中的概念,以通俗易懂的实例演示了“怎么用”,真正做到了学以致用。同时,从浅显的实例中启发思考“为什么这样用?”。主要内容有:C语言和计算机的关系、用选择结构和循环结构编程、函数的作用、指针变量的作用。本书适用于各类学校的C语言程序设计课程。 -
前言
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*(n1)!。阶乘函数可定义为:
unsigned int fac(int n)
{
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语言的函数和程序,演示了VC 6.0编译器的用法,讨论了printf函数的特点,最后简析了C语言语句各组成部分的作用。
第2章 基本数据类型:讲述了C语言最基本的数据类型。分析了整型、浮点型和字符型数据的特点和用法。在输出各种类型的数据时,特别强调了数据的输出值与数据实际值的关系。深度探究中主要讨论了输入函数在使用中遇到的问题。
第3章 表达式:首先分析表达式的概念、特点和求值原则,并以此为主线结合操作符的作用讲述了赋值表达式、算术表达式和逗号表达式。赋值表达式中,强调了对表达式的全面理解,简明地分析了类型不匹配时的赋值原则。算术表达式中,强调了同类型数据才能运算的原则,并引导读者讨论VC 6.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月 -
目录
第1章 C语言和计算机 1
1.1 计算机工作原理 2
1.2 在C语言中使用计算机的
五大组成部件 3
1.3 C语言函数和程序 5
1.4 “懂”C语言的计算机 9
1.4.1 虚拟的C语言计算机 9
1.4.2 用VC 6.0编译程序 9
1.5 与虚拟C语言计算机深入
交流 13
1.5.1 C语言的一些语法
规则 13
1.5.2 printf函数的使用 14
1.5.3 一个复杂程序的
执行顺序 16
1.6 C语言语句简析 19
练习1 20
第2章 基本数据类型 23
2.1 整型 24
2.1.1 整型分类 24
2.1.2 整型字面量 26
2.1.3 整型数据的输入/输出 27
2.1.4 查看整数的存储状态 31
2.1.5 整型的使用 32
2.2 浮点型 33
2.2.1 浮点型分类 33
2.2.2 浮点型字面量和浮点型
数据的输入/输出 34
2.2.3 浮点型的误差 36
2.3 字符型 37
2.3.1 字符型数据的编码 37
2.3.2 字符型字面量 39
2.3.3 字符型数据的
输入/输出 40
2.4 再谈printf函数的使用 42
2.5 典型例题 43
2.6 深度探究 45
2.6.1 输入缓冲区 45
2.6.2 scanf函数对空格符或
换行符的处理 47
2.6.3 匹配不成功对scanf函数
的影响 48
2.6.4 当用户一次输入多个
数据时,数据之间的
分隔符 50
2.6.5 验证程序中变量的
实际值是确定的 50
练习2 51
第3章 表达式 55
3.1 概述 56
3.2 赋值表达式 59
3.2.1 赋值操作符 59
3.2.2 类型不匹配时的
赋值操作 61
3.2.3 复合赋值操作符 63
3.3 算术表达式 63
3.3.1 算术表达式求值 63
3.3.2 强制类型转换操作符 65
3.3.3 自增自减操作符 66
3.4 逗号表达式 67
3.5 典型例题 68
3.6 深度探究 71
3.6.1 表达式的理解 71
3.6.2 自增操作符的误用 72
练习3 73
第4章 逻辑运算和选择结构 76
4.1 C语言中的“逻辑型” 77
4.2 关系表达式 78
4.3 逻辑表达式 79
4.3.1 逻辑操作符 79
4.3.2 逻辑表达式求值 81
4.4 简单的if选择结构 82
4.4.1 if选择结构分析 82
4.4.2 if选择结构用法 85
4.5 if-else选择结构 86
4.5.1 if-else选择结构的
形式和用法 86
4.5.2 选择结构嵌套 88
4.6 条件操作符 92
4.7 switch选择结构 93
4.7.1 基本的switch选择
结构 93
4.7.2 有break语句的switch
选择结构 95
4.8 典型例题 96
练习4 101
第5章 循环结构 107
5.1 while循环结构 108
5.1.1 while循环结构分析 108
5.1.2 while循环结构用法 111
5.2 for循环结构 115
5.2.1 for循环结构分析 115
5.2.2 for循环结构用法 116
5.3 break语句和continue语句 118
5.4 循环嵌套 120
5.5 do-while循环结构 123
5.6 典型例题 124
练习5 129
第6章 数组 134
6.1 一维数组 135
6.1.1 一维数组定义 135
6.1.2 一维数组初始化 137
6.1.3 一维数组应用 138
6.2 多维数组 142
6.2.1 二维数组定义及
初始化 142
6.2.2 二维数组应用 143
6.2.3 三维数组简介 145
6.3 字符型数组和字符串 146
6.3.1 字符型数组应用 146
6.3.2 字符串分析 148
6.3.3 字符串输入/输出 148
6.3.4 字符串相关程序
示例 149
6.4 综合实例 151
练习6 153
第7章 函数 158
7.1 函数定义 159
7.2 函数调用与函数声明 161
7.2.1 函数调用分析 161
7.2.2 函数声明的作用 164
7.2.3 使用参数类型为一维
数组的函数 165
7.3 作用域 166
7.3.1 变量作用域 166
7.3.2 文件作用域扩展 169
7.3.3 全局变量作用域可以
扩展的原因 170
7.3.4 使用关键字static限制
文件作用域 172
7.4 用函数编程 174
7.4.1 用函数编程示例 174
7.4.2 函数重用 176
7.5 递归 178
7.5.1 递归算法与递归函数 178
7.5.2 递归算法示例 181
7.6 库函数简介 185
7.6.1 getchar函数、getch函数
和getche函数 185
7.6.2 rand函数、srand函数
和time函数 187
7.6.3 字符串处理函数 187
7.7 综合实例 189
7.8 深度探究 191
7.8.1 例7-23中reverse函数
存在的问题 191
7.8.2 变量的存储类型 192
练习7 192
第8章 预处理 197
8.1 程序编译 198
8.2 宏定义 198
8.2.1 简单宏 198
8.2.2 参数化宏 199
8.3 文件包含 201
8.4 条件编译 202
练习8 204
第9章 指针 207
9.1 指针类型 208
9.1.1 变量的左值和右值 208
9.1.2 指针变量的定义
和赋值 210
9.2 指针变量的作用 211
9.2.1 指针操作符 211
9.2.2 指针变量用法 211
9.2.3 空指针 213
9.3 指针与函数 214
9.3.1 指针作为函数参数 214
9.3.2 指针作为函数
返回值 217
9.4 地址可以参与的运算 218
9.5 指针与数组 219
9.5.1 指针与一维数组 220
9.5.2 指针与二维数组 223
9.5.3 指针与字符串 226
9.6 main函数和命令行参数 230
9.7 指向函数的指针变量 231
9.8 使用堆空间 233
9.9 典型例题 235
9.10 深度探究 240
9.10.1 有pi=&i,则*pi与
变量i标识了同一个
存储单元 240
9.10.2 表达式的值 240
9.10.3 指针变量的称谓 241
9.10.4 数组元素a[i]的理解 241
9.10.5 数组变量与指针
变量的比较 242
练习9 242
第10章 用户自定义数据类型 250
10.1 结构型 251
10.1.1 结构型的定义 251
10.1.2 指向结构型的
指针变量 253
10.1.3 链表 255
10.2 联合型 258
10.3 枚举型 259
10.4 为类型自定义别名 260
10.5 深度探究 261
存储单元的类型 261
练习10 262
第11章 文件 265
11.1 文件概述 266
11.2 文件的打开和关闭 266
11.2.1 文本文件与二进制
文件 266
11.2.2 (新建后)打开文件 267
11.2.3 文件关闭 268
11.3 文件读/写 268
11.3.1 fputc函数和fgetc
函数 268
11.3.2 文件结束状态 270
11.3.3 fprintf函数和fscanf
函数 272
11.3.4 fwrite函数和fread
函数 274
11.4 标准设备文件 275
11.5 文件随机读/写 276
11.5.1 调整文件当前位置指针
变量指向的位置 276
11.5.2 既可读又可写
的文件 277
练习11 278
第12章 位运算 281
12.1 位操作符 282
12.1.1 按位与操作符& 282
12.1.2 按位或操作符| 282
12.1.3 异或操作符^ 283
12.1.4 取反操作符~ 283
12.1.5 左移操作符<< 283
12.1.6 右移操作符>> 284
12.2 位运算示例 284
12.3 位段 285
练习12 286
第13章 数字化信息编码 287
13.1 二进制 288
13.1.1 位权 288
13.1.2 十进制数转换成
二进制数 288
13.1.3 二进制的计算 290
13.2 计算机的计算 291
13.3 整数的编码 292
13.4 计算机中整数的特点 294
13.4.1 整数加法示例 294
13.4.2 须参与运算的补码
符号位 295
13.4.3 计算机中整数构成
一个环 296
13.5 小数的编码 297
13.5.1 定点小数 297
13.5.2 浮点数编码 298
13.5.3 浮点数的特点 299
13.6 字符的编码 300
13.6.1 机内码 300
13.6.2 输入码和字形码 301
13.7 八进制和十六进制 302
附录 303
附录A C语言关键字 303
附录B 格式化输入输出 303
格式化输出 303
格式化输入 307
附录C ASCII码表 309
附录D 常用的C语言库函数 310
附录E C语言操作符 313
参考文献 314
-
作者介绍
主要著译者顺序姓名学历职称学科专长通讯地址1周二强 硕士 讲师 教研室副主任软件工程专业 工作单位河南城建学院计算机科学与工程系 邮政编码 电话 186375307532 工作单位 邮政编码 电话 3 工作单位 邮政编码 电话 审校者(主审者) 学历 工作单位 邮政编码 电话 职称 工作单位 邮政编码 电话 周二强,男,1972年12月生,河南宝丰县人,研究生,2005年7月毕业于北京工业大学,软件工程专业。毕业后在河南城建学院计算机科学与工程系任教至今,从事软件工程方面的教学和研究工作。2008年4月被聘为讲师。2009年9月在第九届教师授课竞赛活动中获“卓越杯”三等奖。2009年9月荣获学生最喜爱的“百名优秀教师”称号。2010年8月在2010年全省教育系统教学技能竞赛(高校计算机)中,荣获三等奖。2011年河南省编程大赛中,所带两只参赛队伍均取得银奖。2012年4月,所讲C语言课获得了教育部本科评估专家的高度认可。 -
编辑推荐
本书特色体现在两个方面,一是在知识点上有突破,二是在教学理念上有突破。212年教育部组织专家对我校进行了本科教学水平评估,评估专家恰巧听了我的一节C语言课,课后大加赞叹,认为掌握现代高等教育的精髓,给予了高度的认可。 -
书评书荐
-
附件下载
图书推荐