本书是一本讲解C程序设计的入门教材,根据学生对新知识学习和认知的规律,从C语言和C程序的基本要素以及程序设计的基本方法开始,循序渐进地引入对程序设计专业化的要求和相关的知识。全书全面地介绍了c语言的基本语法及c语言程序的设计方法,内容包括:C程序的创建及其基本结构,常量、变量和表达式,条件语句和开关语句,循环语句和goto语句,函数,数组,指针初步,程序设计的基本方法, 结构和联合,输入/输出和文件。
再版说明
第1版作者自序
教学建议
例题索引
第0章 引言1
第1章 C程序的创建及其基本结构8
1.1 C程序的创建过程8
1.2 C程序的基本组成10
1.3 调试初步—语法错误的定位15
1.4 数据的输入/输出和标准文件18
习题19
第2章 常量、变量和表达式20
2.1 常量20
2.1.1 数字常量20
2.1.2 字符常量23
2.1.3 字符串字面量23
2.2 变量24
2.2.1 变量名和变量类型24
2.2.2 变量的赋值和类型转换26
2.2.3 变量的初始化27
2.2.4 类型限定符const27
2.3 算术表达式28
2.3.1 算术运算符28
2.3.2 增量和减量运算符30
2.3.3 位运算31
2.3.4 复合赋值运算符31
2.4 强制类型转换32
2.5 数据输出/输入函数printf()和scanf()36
2.5.1 数值的输出函数printf()36
2.5.2 数值的输入函数scanf()37
2.6 常量的符号表示方法39
2.6.1 常量宏39
2.6.2 枚举常量40
习题41
第3章 条件语句和开关语句44
3.1 关系运算符和逻辑运算符44
3.2 运算符的优先级46
3.3 从实际问题中的条件到逻辑表达式47
3.4 条件语句48
3.4.1 条件语句中的条件49
3.4.2 复合语句49
3.4.3 条件语句的嵌套和级联51
3.4.4 使用条件语句时的注意事项54
3.4.5 条件运算符和条件表达式55
3.5 switch语句56
习题59
第4章 循环语句和goto语句61
4.1 while语句61
4.2 for语句64
4.3 do while语句67
4.4 循环语句的选择和使用69
4.5 逗号表达式69
4.6 循环语句的嵌套70
4.7 循环语句中的非常规控制73
4.8 goto语句76
习题77
第5章 函数80
5.1 函数的基本概念80
5.2 函数的调用81
5.3 函数的结构84
5.4 函数的定义85
5.5 函数的调用关系和返回值89
5.6 局部变量和全局变量90
5.6.1 局部变量91
5.6.2 全局变量92
5.6.3 对全局变量的访问93
5.7 函数参数的传递94
5.8 标准库函数95
5.8.1 常用的头文件95
5.8.2 常用的数据输入/输出函数96
5.8.3 字符类型判断函数98
5.8.4 字符串处理函数100
5.8.5 其他常用函数100
5.9 递归初步101
习题104
第6章 数组106
6.1 一维数组106
6.1.1 一维数组的定义和初始化106
6.1.2 一维数组元素的使用108
6.1.3 数组的复制111
6.1.4 作为函数参数的一维数组111
6.1.5 数组元素的排序和查找114
6.2 使用一维数组的常用数据结构118
6.2.1 散列表118
6.2.2 栈120
6.2.3 队123
6.3 字符串和字符数组125
6.3.1 字符串126
6.3.2 字符数组126
6.4 常用的标准字符串函数127
6.4.1 字符串输出函数127
6.4.2 字符串输入函数130
6.4.3 字符串复制和追加函数131
6.4.4 字符串比较函数133
6.4.5 字符串检查函数134
6.4.6 字符串扫描函数sscanf()135
6.5 二维数组136
6.5.1 二维数组的定义136
6.5.2 二维数组元素的引用137
6.5.3 二维数组元素的遍历138
6.5.4 二维数组元素的排列方式140
6.5.5 作为参数的二维数组142
习题145
第7章 指针初步148
7.1 地址与指针148
7.2 指针变量150
7.2.1 指针变量的定义和赋值150
7.2.2 通过指针访问数据151
7.2.3 作为函数参数的指针152
7.2.4 返回指针的函数154
7.3 指针运算156
7.3.1 指针与整数的加减156
7.3.2 指针相减157
7.3.3 指针的比较157
7.3.4 指针的强制类型转换和void *160
7.3.5 不合法的指针运算161
7.3.6 指针类型与数组类型的差异161
7.4 指针与数组162
7.5 指向二维数组的指针164
7.6 多重指针165
7.7 指针数组166
7.7.1 一维指针数组166
7.7.2 命令行参数168
7.8 函数指针170
7.8.1 函数指针变量的定义170
7.8.2 具有函数指针参数的库函数171
习题174
第8章 结构和联合177
8.1 结构177
8.1.1 结构类型的定义177
8.1.2 结构成员的访问179
8.1.3 包含结构的结构182
8.2 联合186
8.2.1 联合类型的定义186
8.2.2 联合成员的访问187
8.3 类型定义语句190
8.4 复杂类型的解读193
习题194
第9章 输入/输出和文件196
9.1 输入/输出的基本过程和文件类型196
9.2 文件的打开、创建和关闭197
9.3 文件数据的正文格式读写199
9.4 读写操作中的定位202
9.5 文件数据的二进制格式读写205
习题207
第10章 程序设计的基本方法210
10.1 程序设计的基本过程210
10.2 问题分析211
10.2.1 程序功能和输入/输出数据211
10.2.2 对程序性能的要求213
10.2.3 程序中的错误处理213
10.2.4 程序的测试214
10.2.5 问题分析的结果214
10.3 方案设计216
10.3.1 解题思路216
10.3.2 算法的描述218
10.3.3 数据结构和算法的选择225
10.4 编码:从算法到代码231
10.4.1 代码的结构232
10.4.2 代码的检查238
10.4.3 代码中的注释239
10.5 程序的调试239
10.5.1 调试的基本方法240
10.5.2 调试工具的基本功能和使用241
10.5.3 标准输入/输出的重新定向243
10.6 初学者程序中容易出现的错误244
10.6.1 容易混淆的运算符244
10.6.2 运算符优先级和结合关系244
10.6.3 变量的初始化245
10.6.4 数组的使用245
10.6.5 条件和边界245
10.6.6 字符函数的参数和返回值类型246
10.6.7 编程习惯和工作方法246
习题247
附录A 部分习题参考答案250
附录B vi/vim的常用命令271
附录C 使用MS VC++ 6.0 IDE创建C程序的基本过程273
附录D 使用CodeBlocks创建和运行C程序277
附录E cc/gcc的常用命令行选项280
附录F 常用的标准库函数名及其头文件281
附录G ASCII编码283
附录H 调试工具GDB的常用命令284
附录I 不同版本的C语言标准之间的主要区别285
附录J 基本数据类型的长度287
参考文献和推荐书目288
例题索引
【例1-1】最简单的C程序10
【例1-2】产生可见效果的C程序11
【例1-3】生成直角三角形12
【例1-4】生成质数表13
【例1-5】生成镶边的等腰三角形13
【例1-6】猜数游戏14
【例2-1】十进制数转换为十六进制数21
【例2-2】十六进制数转换为十进制数21
【例2-3】表达式的类型和值29
【例2-4】计算球体体积29
【例2-5】星期几29
【例2-5-1】星期几29
【例2-6】求一元二次方程的根29
【例2-7】时钟指针34
【例2-8】整数的表示方式37
【例2-9】浮点数和字符序列的输出格式37
【例2-10】读入数据38
【例2-11】计算实数乘积的整数部分38
【例3-1】判断闰年47
【例3-2】水仙花数47
【例3-3】获奖47
【例3-4】名次预测48
【例3-5】计算并输出一元二次方程的根50
【例3-6】判断季节52
【例3-7】四则运算52
【例3-8】求最大值55
【例3-9】输出比较结果的文字值55
【例3-10】成绩信息56
【例3-7-1】四则运算—使用switch语句57
【例3-10-1】成绩信息58
【例4-1】自然数的累加61
【例4-2】最大公约数62
【例4-3】数据读入63
【例4-4】行数统计63
【例4-5】阶乘64
【例4-2-1】最大公约数65
【例4-6】水仙花数65
【例4-7】π的近似值66
【例4-8】输出提示信息,读入应答67
【例4-2-2】最大公约数68
【例4-9】平行四边形图案70
【例4-10】连续正整数70
【例4-11】阶乘之和72
【例4-1-1】自然数的累加73
【例4-1-2】自然数的累加74
【例4-10-1】连续正整数74
【例4-12】乒乓球赛75
【例4-13】数据求和75
【例4-8-1】输出提示信息,读入应答77
【例5-1】三角形的面积83
【例5-2】星期几86
【例5-3】最大公约数87
【例5-4】水仙花数88
【例5-5】π的近似值88
【例5-6】判断整数的奇偶90
【例5-7】局部变量和全局变量的访问92
【例5-8】全局变量的共享93
【例5-9】错误的变量交换函数94
【例5-10】printf()的格式98
【例5-11】最大公约数的递归计算102
【例5-12】组合公式的计算102
【例5-13】阿克曼函数的计算102
【例5-14】梵塔(Hanoi Tower) 103
【例6-1】摄氏—华氏温度对照表108
【例6-2】字符分类统计109
【例6-3】质数表109
【例6-4】数组复制111
【例6-5】三维向量的点积112
【例6-6】n维向量的点积113
【例6-7】平均年龄113
【例6-8】n维向量加法函数114
【例6-9】选择排序114
【例6-10】数组元素的顺序查找115
【例6-11】数组元素的二分查找117
【例6-12】首个重复字母的位置118
【例6-13】区间合并119
【例6-14】质数表的生成120
【例6-15】括号匹配121
【例6-16】一个int型的队123
【例6-17】N位超级质数124
【例6-18】字符串倒置127
【例6-19】平行四边形图案128
【例6-20】由参数确定输出的小数位数129
【例6-21】分析日期和时间信息135
【例6-22】第几天137
【例6-23】矩阵相加138
【例6-24】矩阵元素的Z形扫描138
【例6-25】星期几140
【例6-26】数据中的最长行141
【例6-27】矩阵加法函数142
【例6-28】使用二维数组绘制函数图像143
【例7-1】数据中的最长行151
【例7-2】数据统计函数153
【例7-3】删除换行符154
【例7-4】字符串替换155
【例7-5】指针的加减运算156
【例7-6】指针相减157
【例7-7】多行数据的平均值158
【例7-8】子串逆置159
【例7-9】超长整数加法163
【例7-10】星期几167
【例7-11】计算命令行参数的代数和169
【例7-12】使用qsort()对一维double数组排序171
【例7-13】输入数据的编号172
【例7-14】查质数表174
【例8-1】结构类型的定义178
【例8-2】输入数据的编号180
【例8-3】矩形182
【例8-4】同心圆182
【例8-5】单向链表183
【例8-6】排序二叉树的节点插入、查找和中序遍历185
【例8-7】联合类型的定义186
【例8-8】联合成员的访问187
【例8-9】后缀表达式求值188
【例8-10】显示当前时间192
【例9-1】打开文件198
【例9-2】日程列表200
【例9-3】正文数据的字符数203
【例9-4】文件按行倒置输出203
【例9-2-1】日程列表的排序显示204
【例9-5】二进制数据的字符数206
【例10-1】矩阵乘法212
【例10-2】两条线段的交点212
【例10-3】流程控制关键字的统计212
【例10-1-1】矩阵乘法215
【例10-4】平方数216
【例10-5】字符串循环移位218
【例10-6】数字删除218
【例10-7】整数中的数字分离219
【例10-8】组合的生成220
【例10-9】Cantor表的第n项221
【例10-10】单向链表的逆置223
【例10-11】公式求解225
【例10-12】花朵数227
【例10-13】整数的出现次数230
【例10-14】最简分数排序230
【例10-15】6174问题232
【例10-16】序列的第N项234
【例10-17】小数化为分数237