第1章 C语言程序设计初步 1
1.1 程序与程序语言 1
1.2 C语言简史 2
1.3 使用C语言的理由 2
1.4 编程前的准备工作 3
1.5 程序开发周期(程序设计的步骤) 4
1.5.1 创建源程序 4
1.5.2 编译源程序 4
1.5.3 通过链接建立可执行文件 5
1.5.4 运行程序 5
1.6 第一个C语言程序 6
1.6.1 常见的编译错误 7
1.6.2 链接程序时易出现的错误消息 7
1.7 总结 8
1.8 问与答 8
1.9 作业 8
1.9.1 小测验 8
1.9.2 练习 9
第2章 C语言程序的组成部分 10
2.1 简单C语言程序的组成 10
2.1.1 main()函数 11
2.1.2 #include编译预处理指令 11
2.1.3 变量声明语句 11
2.1.4 函数原型的声明语句 12
2.1.5 程序语句 12
2.1.6 函数定义 12
2.1.7 程序注释 13
2.1.8 使用花括号 13
2.2 关键字与标识符 13
2.2.1 关键字 13
2.2.2 标识符 14
2.3 计算机内存 14
2.4 使用变量存储信息 14
2.4.1 变量和变量名 15
2.4.2 数值变量的类型 15
2.4.3 变量声明 17
2.4.4 typedef关键字 18
2.4.5 初始化变量 18
2.5 使用常量 19
2.5.1 字面常量 19
2.5.2 为字面常量定义符号名 22
2.5.3 使用关键字const声明变量具有恒定的值 23
2.6 信息读写基础 24
2.6.1 利用printf()函数在屏幕上显示信息 24
2.6.2 使用puts()函数显示消息 29
2.6.3 使用scanf()函数输入数值数据 29
2.6.4 专门的字符输入输出函数 31
2.7 总结 32
2.8 问与答 33
2.9 作业 34
2.9.1 小测验 34
2.9.2 练习 35
第3章 语句、表达式和运算符 37
3.1 语句 37
3.1.1 空白对语句的影响 37
3.1.2 创建空语句 38
3.1.3 复合语句 38
3.2 表达式 38
3.3 运算符 39
3.3.1 赋值运算符、赋值表达式和赋值语句 39
3.3.2 常用的算术运算符 40
3.3.3 复合赋值运算符 41
3.3.4 自增、自减运算符 42
3.3.5 算术运算符的优先级和结合性 43
3.3.6 数据类型的转换 44
3.3.7 逗号运算符 45
3.4 关系运算符和选择语句 47
3.4.1 关系运算符 47
3.4.2 if语句 47
3.4.3 else子句 50
3.5 逻辑运算符 52
3.6 条件运算符 54
3.7 总结 55
3.8 问与答 55
3.9 作业 56
3.9.1 小测验 56
3.9.2 练习 57
第4章 程序流程的控制 59
4.1 算法 59
4.1.1 使用伪码表示算法 60
4.1.2 使用流程图表示算法 60
4.1.3 使用N-S流程图表示算法 61
4.2 顺序结构程序设计 62
4.3 选择结构程序设计 63
4.3.1 选择结构形式的控制语句 63
4.3.2 switch结构与break语句 65
4.4 循环结构程序设计 69
4.4.1 while语句 70
4.4.2 do...while语句 72
4.4.3 for语句 76
4.5 嵌套循环 80
4.6 continue语句和break语句对循环的影响 83
4.6.1 break语句 83
4.6.2 continue语句 84
4.7 goto语句 85
4.8 死循环 88
4.9 总结 90
4.10 问与答 91
4.11 作业 92
4.11.1 小测验 92
4.11.2 练习 92
第5章 使用函数封装代码 96
5.1 什么是函数 96
5.1.1 函数的定义 97
5.1.2 函数的用法 97
5.2 函数的工作原理 98
5.3 函数和结构化程序设计 99
5.3.1 结构化程序设计的特点 99
5.3.2 结构化程序设计 99
5.3.3 自顶向下、逐步细化的设计方法 100
5.4 编写函数 100
5.4.1 函数头 100
5.4.2 函数的返回类型 101
5.4.3 函数名 101
5.4.4 函数的参数列表 101
5.4.5 函数体 103
5.4.6 函数原型 105
5.5 标准库函数和头文件 105
5.6 调用函数 106
5.6.1 函数调用的形式 107
5.6.2 函数的传值调用 107
5.6.3 调用随机函数 108
5.6.4 调用exit()函数 113
5.6.5 递归调用函数 113
5.7 函数的位置 115
5.8 变量的作用域 116
5.8.1 外部变量 117
5.8.2 局部变量 119
5.9 总结 122
5.10 问与答 123
5.11 作业 124
5.11.1 小测验 124
5.11.2 练习 124
第6章 数值型数组 127
6.1 为什么要引入数组 127
6.1.1 一维数组 128
6.1.2 一维数组元素 128
6.1.3 多维数组 131
6.2 命名和声明数组 132
6.2.1 初始化数组 134
6.2.2 初始化多维数组 134
6.2.3 数组的字节长度的计算 135
6.3 数值数组的常用操作 136
6.4 总结 140
6.5 问与答 140
6.6 作业 141
6.6.1 小测验 141
6.6.2 练习 141
第7章 指针 143
7.1 指针是什么 143
7.1.1 内存单元地址 143
7.1.2 创建指针变量 143
7.2 指针和简单变量 144
7.2.1 声明指针 144
7.2.2 初始化指针 145
7.2.3 使用指针 145
7.2.4 指针与变量类型 147
7.3 指针和数组 148
7.3.1 数组元素的存储 148
7.3.2 数组名与指针 149
7.3.3 应用指向数组的指针变量 150
7.4 指针的运算 151
7.5 指针在函数参数传递中的应用 153
7.5.1 数组名作为函数的参数 153
7.5.2 指针作为函数的参数 156
7.5.3 指针作为函数的返回值 160
7.6 总结 161
7.7 问与答 161
7.8 作业 162
7.8.1 小测验 162
7.8.2 练习 162
第8章 字符和字符串 164
8.1 字符和字符变量 164
8.1.1 字符的存储形式 164
8.1.2 字符处理函数 165
8.2 字符串和字符数组 166
8.2.1 字符数组 166
8.2.2 初始化字符数组 166
8.3 字符串和指针 167
8.4 不存储在数组中的字符串 167
8.4.1 编译时分配字符空间 168
8.4.2 动态分配内存空间 168
8.4.3 使用malloc()函数 169
8.5 显示字符串 171
8.6 从键盘读取字符串 172
8.6.1 使用gets()函数接收字符串 172
8.6.2 使用scanf()函数输入字符串 175
8.7 常用的字符串处理函数 176
8.7.1 确定字符串的长度 176
8.7.2 复制字符串 177
8.7.3 拼接字符串 179
8.7.4 比较字符串 179
8.8 总结 184
8.9 问与答 184
8.10 作业 185
8.10.1 小测验 185
8.10.2 练习 185
第9章 结构体、共用体和typedef 183
9.1 什么是结构体 183
9.2 简单结构体 184
9.2.1 定义结构体 184
9.2.2 声明结构体变量 185
9.2.3 引用结构体变量的成员 186
9.2.4 结构体变量的初始化 187
9.2.5 结构体变量的存储及长度 189
9.3 包含其他结构体的结构体 189
9.4 结构体数组 191
9.5 结构体和指针 193
9.5.1 指针作为结构体的成员 193
9.5.2 创建指向结构体的指针 194
9.5.3 使用结构体指针和结构体数组 197
9.6 结构体和函数 199
9.7 共用体 202
9.7.1 定义、声明和初始化共用体 202
9.7.2 引用共用体的成员 203
9.8 使用typedef为已有的数据类型建立别名 205
9.9 总结 205
9.10 问与答 206
9.11 作业 206
9.11.1 小测验 206
9.11.2 练习 207
第10章 指针进阶 209
10.1 声明和使用指向指针的指针 209
10.2 指针和多维数组 210
10.2.1 指针与多维数组的关系 210
10.2.2 指向多维数组的指针变量的声明和引用 212
10.3 指针数组 213
10.3.1 回顾字符串与指针的关系 214
10.3.2 声明和使用char型指针数组 214
10.4 指向函数的函数指针 217
10.4.1 声明一个函数指针 218
10.4.2 初始化和引用函数指针 218
10.5 链表 221
10.5.1 链表的基本概念 221
10.5.2 操纵链表时常用的几种动态内存分配函数 222
10.5.3 创建链表和向链表中添加新结点 223
10.5.4 从链表中删除个结点 228
10.6 总结 235
10.7 问与答 236
10.8 作业 236
10.8.1 小测验 236
10.8.2 练习 237
第11章 文件 239
11.1 文件的基本概念 239
11.1.1 将字符串“Hello Word!”写入一个磁盘文件 239
11.1.2 文件与流 240
11.1.3 文件的类型 240
11.1.4 文件名 240
11.1.5 文件缓冲区 241
11.1.6 文件指针 241
11.1.7 标准文件 242
11.1.8 文件操作 242
11.2 打开文件和关闭文件 243
11.2.1 打开文件 243
11.2.2 关闭文件 244
11.2.3 刷新文件缓冲区 244
11.3 读写文件数据 245
11.3.1 字符的输入和输出 245
11.3.2 以格式化方式读写文件 248
11.3.3 检测文件尾 250
11.3.4 二进制文件的输入和输出 252
11.4 顺序文件存取和随机文件存取 254
11.4.1 rewind()函数 255
11.4.2 ftell()函数 256
11.4.3 fseek()函数 257
11.5 实用的文件处理方法 259
11.5.1 利用库函数remove()删除文件 259
11.5.2 利用rename()函数修改文件名 260
11.5.3 建立带行号的C语言源程序 260
11.6 总结 262
11.7 问与答 262
11.8 作业 263
11.8.1 小测验 263
11.8.2 练习 263
第12章 编译器的用法 265
12.1 设计和运行含有多个源代码文件的C语言程序 265
12.1.1 什么情况下建立含有多个源代码文件的C语言程序 265
12.1.2 设计含有多个源代码文件的C语言程序的过程 265
12.1.3 设计和组成模块的基本原则 267
12.1.4 外部变量在模块化程序设计中的作用 267
12.2 常用的编译预处理指令 268
12.2.1 宏定义 268
12.2.2 预处理指令#include 270
12.2.3 条件编译指令 271
12.2.4 预处理指令#undef 275
12.3 使用命令行参数 275
12.4 总结 278
12.5 问与答 279
12.6 作业 279
12.6.1 小测验 279
12.6.2 练习 280
附录A 字符ASCII码对照表 281
附录B 运算符的优先级 285
附录C C语言标准库中的常用函数 286
附录D 部分作业的参考答案 292
参考文献 302