第1篇 C语言基础 2
第1章 C语言概述 2
1.1 C语言发展历史 2
1.1.1 C语言发展过程 2
1.1.2 C语言标准 3
1.2 C语言的特点 4
1.2.1 简洁紧凑 4
1.2.2 灵活高效 4
1.2.3 强大的控制结构 5
1.2.4 可移植性 5
1.2.5 C语言的缺点 5
1.2.6 C与C+++的关系 6
1.3 C语言程序开发过程 6
1.3.1 定义程序目标 6
1.3.2 设计程序 6
1.3.3 编写源代码 7
1.3.4 编译和链接 7
1.3.5 测试 8
1.3.6 维护和修改 8
1.3.7 总结 8
1.4 创建第一个C程序 9
1.4.1 C程序结构 9
1.4.2 输入程序代码 9
1.4.3 编译链接程序 10
1.4.4 调试程序 11
1.4.5 程序语句的含义 12
第2章 C程序的组成 13
2.1 一个完整的C程序 13
2.1.1 分析程序目标 13
2.1.2 设计程序 13
2.1.3 编写代码 14
2.1.4 编译运行程序 15
2.2 C程序的组成 16
2.2.1 包含指令 16
2.2.2 定义常量 16
2.2.3 声明函数原型 17
2.2.4 main函数 17
2.2.5 程序语句 17
2.2.6 函数定义 18
2.2.7 注释 18
2.3 C程序组成总结 19
第3章 C语言开发环境 20
3.1 C语言开发环境简介 20
3.1.1 C语言开发环境的组成 20
3.1.2 常用开发环境 20
3.2 使用Dev-C++ 22
3.2.1 Dev-C++操作界面 22
3.2.2 设置选项 22
3.2.3 用Dev-C++创建C程序 23
3.2.4 编译程序 24
3.2.5 运行Dev-C++编译的程序 25
3.3 使用Visual C++ 26
3.3.1 Visual C++操作界面 27
3.3.2 用Visual C++创建C程序 27
3.3.3 编译程序. 29
3.3.4 运行Visual C++生成的程序 30
3.4 Linux C语言开发环境 31
3.4.1 Linux C语言开发环境的构成 31
3.4.2 代码编辑器. 31
3.4.3 GCC编译器 33
3.4.4 在emacs中编译C程序 33
3.4.5 在Linux中编写C程序 34
第4章 数据的表示 37
4.1 数据的存储 37
4.1.1 内存单元 37
4.1.2 字符的存储 38
4.1.3 数值的存储 38
4.2 数据类型简介 39
4.3 常量 40
4.3.1 直接常量 40
4.3.2 符号常量 40
4.4 变量 42
4.4.1 标识符 42
4.4.2 声明变量 43
4.4.3 变量初始化 45
4.5 整数类型 45
4.5.1 整数类型及存储 45
4.5.2 整型常量的表示 48
4.5.3 整型数据输出 50
4.6 字符类型 53
4.6.1 字符常量 53
4.6.2 字符变量及初始化 53
4.6.3 转义字符 54
4.6.4 字符型数据的输出 55
4.7 实数类型 56
4.7.1 实数类型及存储 56
4.7.2 实型常量的表示 58
4.7.3 实型变量 59
4.7.4 实型数据输出. 60
4.8 混合运算及类型转换 61
4.8.1 混合运算 61
4.8.2 强制数据类型转换 63
4.9 C99新增数据类型 64
4.9.1 逻辑型(_Bool) 64
4.9.2 复数类型(_Complex和_Imaginary) 64
4.10 总结 65
第5章 表达式、运算符和语句 66
5.1 表达式 66
5.1.1 简单表达式 66
5.1.2 逗号表达式 66
5.2 运算符 67
5.2.1 运算符概述 68
5.2.2 算术运算符 68
5.2.3 赋值运算符 73
5.2.4 关系运算符 75
5.2.5 逻辑运算符 76
5.2.6 位运算符 78
5.2.7 条件运算符 78
5.2.8 其他运算符 80
5.3 表达式的运算顺序 81
5.3.1 运算符优先级 81
5.3.2 运算符的结合性 82
5.3.3 自增自减运算符注意事项 83
5.4 语句 84
5.4.1 语句书写方式 84
5.4.2 表达式语句 85
5.4.3 空语句 86
5.4.4 复合语句 86
5.4.5 标号语句 87
第6章 格式化输出/输入 88
6.1 格式化输出—printf函数 88
6.1.1 printf函数的格式 88
6.1.2 printf的格式字符 89
6.1.3 修饰符 91
6.1.4 printf函数实例 93
6.1.5 动态设置输出宽度和精度 98
6.1.6 printf函数的返回值 99
6.1.7 理解输出列表 99
6.2 格式化输入—scanf函数 102
6.2.1 scanf函数的格式 102
6.2.2 scanf函数格式字符串 103
6.2.3 scanf函数注意问题 105
6.2.4 scanf函数的返回值 107
6.3 其他常用输入/输出函数 107
6.3.1 getchar函数 108
6.3.2 getch函数 108
6.3.3 gets函数 109
6.3.4 putch函数 110
6.3.5 puts函数 110
第7章 分支结构程序设计 112
7.1 分支程序流程 112
7.2 if语句 113
7.2.1 基本if语句 113
7.2.2 if else语句 116
7.2.3 再论条件表达式 117
7.3 嵌套if语句 117
7.3.1 嵌套if语句的形式 117
7.3.2 if语句嵌套实例 118
7.4 if else if语句 122
7.4.1 if else if语句格式 122
7.4.2 if else if实例 123
7.5 多路分支―switch 123
7.5.1 switch语句格式 123
7.5.2 switch实例 125
7.5.3 使用多重标号 126
7.5.4 switch和if比较 129
第8章 循环结构程序设计 130
8.1 循环结构的程序流程 130
8.2 while循环 131
82.1 while语句格式 131
8.2.2 理解循环条件 134
8.2.3 理解循环体 135
8.2.4 while循环需注意的问题 137
8.3 for循环 137
8.3.1 for语句格式 138
8.3.2 for语句的各种样式 139
8.3.3 for语句实例 142
8.4 do while语句 144
8.4.1 while语句不足 145
8.4.2 do while语句格式 146
8.5 循环嵌套 147
8.5.1 了解循环嵌套 147
8.5.2 循环嵌套的结构 149
8.5.3 循环嵌套实例 150
8.6 break和continue语句 154
8.6.1 break语句 154
8.6.2 continue语句 155
8.7 goto语句 157
第9章 使用数组 159
9.1 了解数组 159
9.1.1 使用数组的好处 159
9.1.2 数组的概念 160
9.1.3 数组的维数 161
9.2 一维数组 162
9.2.1 一维数组的声明 162
9.2.2 一维数组的存储 164
9.2.3 引用一维数组 165
9.2.4 一维数组的初始化 167
9.3 二维数组 168
9.3.1 二维数组的声明 169
9.3.2 二维数组的存储 169
9.3.3 二维数组的初始化 173
9.4 字符数组和字符串 174
9.4.1 字符数组 174
9.4.2 了解字符串 175
9.4.3 字符串的输入输出 177
9.5 数组的实例 178
9.5.1 字符串反转 178
9.5.2 查找最大数 179
9.5.3 数据排序 180
第10章 使用函数 183
10.1 函数的概念 183
10.1.1 函数概念 183
10.1.2 函数的分类 184
10.1.3 定义函数 185
10.1.4 main函数 186
10.2 函数的工作过程 187
10.2.1 程序结构 187
10.2.2 函数执行过程 187
10.3 编写函数 188
10.3.1 函数头 188
10.3.2 返回类型 189
10.3.3 参数列表 189
10.3.4 函数体 190
10.3.5 函数原型 190
10.4 函数的参数 192
10.4.1 参数传递过程 192
10.4.2 值调用 192
10.4.3 引用调用 194
10.4.4 数组调用 196
10.4.5 main的参数 198
10.5 函数调用 200
10.5.1 函数调用方式 201
10.5.2 被调函数的说明 201
10.5.3 返回函数结果 203
10.5.4 函数的嵌套调用 204
10.6 递归函数 205
10.6.1 函数的递归调用 205
10.6.2 递归的基本原理 207
10.6.3 递归函数设计 208
10.6.4 递归的优缺点 210
第11章 模块化程序设计方法 211
11.1 模块化程序设计概念 211
11.2 程序模块结构 212
11.2.1 C程序的组织 212
11.2.2 多文件模块的编译链接 213
11.2.3 文件包含. 215
11.2.4 内部函数与外部函数 216
11.3 变量的作用域 217
11.3.1 局部变量 217
11.3.2 在复合语句中的变量 218
11.3.3 全局变量 219
11.3.4 全局变量和局部变量同名 222
11.4 变量的存储类型 223
11.4.1 了解存储类型 223
11.4.2 自动变量 224
11.4.3 寄存器变量 225
11.4.4 外部变量 226
11.4.5 静态变量 227
11.5 函数、文件、变量的关系 729
第12章 使用指针 230
12.1 内存和变量 230
12.1.1 计算机内存 230
12.1.2 变量的存储 231
12.2 指针和简单变量 232
12.2.1 指针的概念 232
12.2.2 创建指针 233
12.2.3 初始化指针 234
12.2.4 使用指针 235
12.2.5 给函数传递指针 238
12.3 指针和数组 239
12.3.1 指针、数组和地址间的关系 239
12.3.2 指针运算 241
12.3.3 用指针操作数组元素 242
12.4 指向多维数组的指针 245
12.4.1 理解二维数组的地址 245
12.4.2 多维数组的指针表示 247
12.4.3 指向多维数组的指针变量 248
12.4.4 数组名作为函数的参数 252
12.4.5 指向数组的指针小结 255
12.5 指针和字符串 256
12.5.1 字符串的指针表示 256
12.5.2 字符串指针作函数参数 258
12.5.3 字符数组和字符指针的区别 259
12.6 指针数组 260
12.6.1 指针数组的概念 261
12.6.2 用指针数组处理字符串 263
12.6.3 指针数组作函数参数 264
12.7 指向指针的指针 266
12.7.1 理解指向指针的指针 266
12.7.2 二级指针变量与数组 268
12.8 指针和函数 272
12.8.1 返回指针的函数 272
12.8.2 指向函数的指针 274
12.9 指针和const 276
12.9.1 用const控制指针 277
12.9.2 const的几种特殊用法 277
12.10 指针总结 278
12.10.1 明确分辨各种指针类型 278
12.10.2 理解指针的4项内容 279
第13章 结构、联合和枚举 280
13.1 结构的概念 280
13.1.1 定义结构类型 280
13.1.2 定义结构变量 281
13.1.3 使用结构变量 282
13.2 结构的嵌套 284
13.2.1 包含数组的结构 284
13.2.2 包含指针的结构 285
13.2.3 包含结构的结构 285
13.3 初始化结构变量 288
13.4 结构数组 289
13.4.1 结构数组的定义和引用 290
13.4.2 结构数组的初始化 291
13.4.3 结构数组实例 291
13.5 结构指针 292
13.5.1 定义结构指针 292
13.5.2 使用结构指针 293
13.5.3 用指针处理结构数组 294
13.6 向函数传递结构 295
13.6.1 传递结构变量的值 295
13.6.2 传递结构指针到函数 296
13.7 联合 297
13.7.1 定义联合类型 297
13.7.2 使用联合变量 298
13.7.3 在结构中嵌套联合类型 298
13.8 枚举 300
13.8.1 定义枚举类型 300
13.8.2 使用枚举变量 301
13.9 使用typedef 301
第14章 位运算和位域 303
14.1 了解二进制数 303
14.1.1 数据的存储 303
14.1.2 整数的二进制表示 304
14.1.3 实数的二进制表示 305
14.1.4 使用其他进制. 305
14.2 位运算 307
14.2.1 位逻辑运算符 307
14.2.2 移位运算符 309
14.2.3 位运算的复合赋值运算符 310
14.2.4 位运算的用途 310
14.3 位域 311
14.3.1 定义位域结构 311
14.3.2 位域的使用 312
14.3.3 位域与联合的使用 314
第15章 文件输入/输出 316
15.1 文件与数据流 316
15.1.1 程序的输入/输出概念 316
15.1.2 流的概念 316
15.1.3 预定义的流 317
15.1.4 文件的基本概念 317
15.1.5 缓冲文件系统 318
15.2 文件的打开与关闭 318
15.2.1 文件指针 319
15.2.2 打开文件函数—fopen 319
15.2.3 关闭文件函数—fclose 321
15.3 从文件中读写字符 322
15.3.1 写字符函数—putc和fputc 322
15.3.2 读字符函数—getc和fgetc 323
15.3.3 合并文件 325
15.4 从文件中读写字符串 326
15.4.1 写字符串函数—fputs 326
15.4.2 读字符串函数—fgets 327
15.4.3 文件格式输出函数—fprintf 328
15.4.4 文件格式输入函数—fscanf 330
15.5 二进制文件的读写 332
15.5.1 写入整型数据函数—putw 332
15.5.2 读取整型数据函数—getw 333
15.5.3 写数据块函数—fwrite 333
15.5.4 读数据块函数—fread 335
15.5.5 文件检测函数 337
15.6 文件的随机读写 337
15.6.1 获取当前位置函数—ftell 337
15.6.2 重置文件位置指针函数—rewind 339
15.6.3 设置文件位置指针—fseek函数 340
15.7 管理缓冲区 342
15.8 输入/输出的重定向功能 343
15.8.1 操作系统的重定向功能 344
15.8.2 重定向输出 344
15.8.3 重定向函数—freopen 345
15.9 文件管理 346
15.9.1 重命名文件 346
15.9.2 删除文件 347
15.9.3 复制文件 348
15.9.4 创建临时文件 349
第16章 预处理 351
16.1 预处理简介 351
16.1.1 预处理功能 351
16.1.2 预处理命令 351
16.2 宏定义命令—#define 352
16.2.1 无参数的宏 352
16.2.2 带参数的宏 354
16.2.3 预处理操作符#和## 355
16.3 条件编译 357
16.3.1 使用#if 357
16.3.2 使用#ifdef和#ifndef 359
16.3.3 使用#defined和#undef 360
16.4 其他预处理命令 361
16.4.1 预定义的宏名 361
16.4.2 重置行号和文件名命令—#line 361
16.4.3 修改编译器设置命令—#pragma 362
16.4.4 产生错误信息命令—#error 362
16.5 内联函数 362
第2篇 C语言高级程序设计 365
第17章 处理字符串 365
17.1 字符串的存储 365
17.1.1 字符串的静态存储 365
17.1.2 字符串的动态存储 366
17.2 字符和字符串检测函数 368
17.2.1 字符检测函数简介 368
17.2.2 检测字符串长度函数—strlen 369
17.3 查找字符串 370
17.3.1 查找字符位置—strchr 370
17.3.2 查找相同字符—strspn 372
17.3.3 查找包含字符位置—strcspn 372
17.3.4 查找包含字符—strpbrk 373
17.3.5 查找子串―strstr 375
17.4 比较字符串 376
17.4.1 比较字符串—strcmp 376
17.4.2 比较部分字符串memcmp 377
17.4.3 比较时忽略大小写―stricmp 379
17.5 连接字符串 380
17.5.1 连接字符串—strcat 380
17.5.2 连接部分字符—stmcat 382
17.6 复制字符串 383
17.6.1 复制字符串—strcpy 383
17.6.2 复制部分字符—strncpy 384
17.6.3 更省事的复制函数—strdup 385
17.7 字符和字符串的转换 386
17.7.1 大小写字符的转换 386
17.7.2 转换大小写字符串 387
17.7.3 字符串与数值的转换 388
17.8 其他字符串函数 389
17.8.1 字符串反转—strrev 389
17.8.2 替换字符串中的字符—strset 390
17.8.3 分解字符串—strtok 391
第18章 数学函数和时间函数 393
18.1 数学函数 393
18.1.1 三角函数 393
18.1.2 双曲三角函数 394
18.1.3 指数函数和对数函数 395
18.1.4 其他数学函数 398
18.2 日期时间函数 399
18.2.1 表示日期时间的数据结构 399
18.2.2 获取日期时间 400
18.2.3 转换日期时间的表示形式 401
18.2.4 格式化日期时间 404
第19章 常用算法应用 408
19.1 排序 408
19.1.1 排序概述 408
19.1.2 冒泡排序法 409
19.1.3 选择排序法 410
19.1.4 插入排序法 411
19.1.5 Shell排序法 412
19.1.6 快速排序法 413
19.1.7 字符串的排序 414
19.2 查找 416
19.2.1 顺序查找 416
19.2.2 折半查找 417
19.3 队列 418
19.3.1 队列的概念 418
19.3.2 队列的操作 419
19.4 堆栈 422
19.4.1 堆栈的概念 422
19.4.2 堆栈的实现 422
19.5 链表 424
19.5.1 链表的概念 424
19.5.2 链表的基本操 425
19.5.3 测试链表的功能 430
第20章 存储管理 432
20.1 内存组织方式 432
20.1.1 内存组织方式 432
20.1.2 堆和栈的比较 433
20.2 C语言的动态存储管理 434
20.2.1 分配内存函数—malloc 434
20.2.2 另一个分配内存的函数—calloc 436
20.2.3 调整已分配内存—realloc 437
20.2.4 释放分配的内存—free 439
20.2.5 丢失的内存 440
第21章 控制鼠标 442
21.1 鼠标驱动程序 442
21.1.1 通过中断访问鼠标驱动程序 442
21.1.2 新的开发环境 443
21.1.3 调用中断服务 444
21.2 鼠标库函数 445
21.2.1 定义头文件mouse.h 445
21.2.2 通过中断控制鼠标 446
21.2.3 初始化鼠标 447
21.2.4 复位鼠标 447
21.2.5 移动鼠标 448
21.2.6 显示鼠标指针 448
21.2.7 隐藏鼠标指针 449
21.2.8 获取按下按钮信息 449
21.2.9 获取释放按钮信息 450
21.2.10 获取鼠标状态信息 451
21.2.11 获取鼠标指针位置信息 451
21.2.12 保存鼠标指针位置 452
21.2.13 捕获键盘或鼠标 452
21.2.14 鼠标指针区域 453
21.3 鼠标应用实例 454
21.3.1 了解屏幕函数 454
21.3.2 实例程序 455
第22章 数据加密 458
22.1 密码技术的概念 458
22.2 加密方法 458
22.2.1 换位加密法 459
22.2.2 替换加密法 462
22.2.3 位加密法 464
22.3 MD5加密简介 466
22.3.1 MD5简介 466
22.3.2 MD5算法描述 467
第23章 数据压缩 469
23.1 数据压缩基础 469
23.1.1 数据压缩概述 469
23.1.2 数据压缩相关概念 469
23.1.3 常见压缩算法简介 470
23.2 LZW原理 471
23.2.1 LZW的相关概念 471
23.2.2 LZW压缩过程 471
23.2.3 LZW解压缩过程 473
23.3 LZW实现代码 473
23.3.1 程序构思 473
23.3.2 定义数据结构 474
23.3.3 压缩函数 474
23.3.4 搜索哈希表 476
23.3.5 输出压缩数据 477
23.3.6 解压缩函数 478
23.3.7 输入编码数据 480
23.3.8 解码函数 480
23.3.9 主程序 481
第24章 图形编程 483
24.1 显示系统简介 483
24.1.1 显示系统基本概念 483
24.1.2 显示卡种类 484
24.1.3 显示模式 484
24.2 绘图基础 486
24.2.1 设置显示模式 486
24.2.2 控制显示缓冲区 487
24.3 图形函数 488
24.3.1 绘制点 488
24.3.2 读取点的信息 489
24.3.3 绘制直线 489
24.3.4 绘制矩形 491
24.3.5 绘制圆 492
24.3.6 绘制多边形 493
24.4 编辑图形 494
24.4.1 复制图形 494
24.4.2 移动图形 495
24.4.3 保存图形 495
24.4.4 载入图形 496
第25章 调用汇编程序 498
25.1 AT&T汇编简介 498
25.1.1 了解汇编的两种格式 498
25.1.2 将C语言输出为汇编程序 500
25.2 GCC内嵌汇编 501
25.2.1 基本内联汇编 501
25.2.2 扩展内联汇编 501
25.2.3 内联汇编实例 505
25.3 调用汇编程序 507
25.3.1 C编译程序的调用约定 507
25.3.2 C语言调用汇编的结构 508
25.3.3 建立汇编函数的框架 509
25.3.4 调用汇编函数 510
第26章 程序设计实例 512
26.1 程序分析 512
26.1.1 模块划分 512
26.1.2 设计数据结构 513
26.2 头文件 514
26.3 主模块 515
26.3.1 main函数 515
26.3.2 检查初始化状态 516
26.3.3 检查登录密码 517
26.3.4 从文件创建链表 518
26.3.5 显示主菜单 519
26.3.6 将链表保存到文件 522
26.4 输入员工信息 523
26.5 查询员工信息 525
26.5.1 查询子菜单 525
26.5.2 查询函数 527
26.5.3 通用显示函数 528
26.6 显示员工信息 529
26.7 修改员工信息 530
26.7.1 修改子菜单 530
26.7.2 修改数据 532
26.8 删除员工信息 533
26.9 统计员工信息 535
26.10 重设系统密码 535
附录A ASCII关键字 537
附录B ANSI C关键字 540