《C语言程序设计 现代方法》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:(美)金(King,K.N.)著;吕秀锋译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2007
  • ISBN:9787115167071
  • 页数:408 页
图书介绍:时至今日,C语言仍然是计算机领域的通用语言之一,但今天的C语言已经和最初的时候大不相同。本书最主要的一个目的就是通过一种“现代方法”来介绍C语言,实现客观评价C语言、强调标准化C语言、强调软件工程、延缓介绍C语言的低级特性、不再强调“手工优化”、强调与C++语言的兼容性的目标。本书分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾都有一个“问与答”小节给出一系列与本章内容相关的问题及其答案,此外还包含适量的习题。本书是为大学本科阶段的C语言课程编写的教材,同时也非常适合作为其他一些课程的辅助读物。

第1章 C语言概述 1

1.1 C语言的历史 1

1.1.1 起源 1

1.1.2 标准化 1

1.1.3 C++语言 2

1.2 C语言的优缺点 3

1.2.1 C语言的优点 3

1.2.2 C语言的缺点 4

1.2.3 高效地使用C语言 5

问与答 5

第2章 C语言基本概念 7

2.1 编写一个简单的C程序 7

2.1.1 程序:显示双关语 7

2.1.2 编译和链接 8

2.2 简单程序的通用形式 8

2.2.1 指令 9

2.2.2 函数 9

2.2.3 语句 10

2.2.4 显示字符串 10

2.3 注释 11

2.4 变量和赋值 12

2.4.1 类型 12

2.4.2 声明 12

2.4.3 赋值 13

2.4.4 显示变量的值 13

2.4.5 程序:计算箱子的空间重量 13

2.4.6 初始化 14

2.4.7 显示表达式的值 15

2.5 读入输入 15

2.6 定义常量 16

2.7 标识符 17

2.8 C语言程序的布局 18

问与答 20

练习 21

第3章 格式化的输入/输出 23

3.1 printf函数 23

3.1.1 转换说明 24

3.1.2 程序:用printf函数格式化数 25

3.1.3 转义序列 25

3.2 scanf函数 26

3.2.1 scanf函数的工作方法 27

3.2.2 格式串中的普通字符 28

3.2.3 混淆printf函数和scanf函数 29

3.2.4 程序:计算持有的股票的价值 29

问与答 30

练习 31

第4章 表达式 33

4.1 算术运算符 33

4.1.1 运算符的优先级和结合性 34

4.1.2 程序:计算通用产品代码的校验位 35

4.2 赋值运算符 36

4.2.1 简单赋值 36

4.2.2 左值 37

4.2.3 复合赋值 37

4.3 自增运算符和自减运算符 38

4.4 表达式求值 39

4.5 表达式语句 41

问与答 42

练习 43

第5章 选择语句 45

5.1 逻辑表达式 45

5.1.1 关系运算符 45

5.1.2 判等运算符 46

5.1.3 逻辑运算符 46

5.2 if语句 47

5.2.1 复合语句 48

5.2.2 else子句 48

5.2.3 级联式if语句 49

5.2.4 程序:计算股票经纪人的佣金 50

5.2.5 “悬空else”的问题 51

5.2.6 条件表达式 51

5.2.7 布尔值 52

5.3 switch语句 53

5.3.1 break语句的作用 55

5.3.2 程序:显示法定格式的日期 55

问与答 56

练习 58

第6章 循环 61

6.1 while语句 61

6.1.1 无限循环 62

6.1.2 程序:显示平方值的表格 63

6.1.3 程序:数列求和 63

6.2 do语句 64

6.3 for语句 65

6.3.1 for语句的惯用法 66

6.3.2 在for语句中省略表达式 67

6.3.3 逗号运算符 67

6.3.4 程序:显示平方值的表格(改进版) 68

6.4 退出循环 69

6.4.1 break语句 69

6.4.2 continue语句 70

6.4.3 goto语句 71

6.4.4 程序:账目簿结算 71

6.5 空语句 73

问与答 74

练习 76

第7章 基本类型 78

7.1 整型 78

7.1.1 整型常量 79

7.1.2 读/写整数 80

7.1.3 程序:数列求和(改进版) 81

7.2 浮点型 81

7.2.1 浮点常量 82

7.2.2 读/写浮点数 83

7.3 字符型 83

7.3.1 转义序列 84

7.3.2 字符处理函数 85

7.3.3 读/写字符 86

7.3.4 程序:确定消息的长度 87

7.4 sizeof运算符 88

7.5 类型转换 89

7.5.1 常用算术转换 89

7.5.2 赋值中的转换 90

7.5.3 强制类型转换 91

7.6 类型定义 92

问与答 93

练习 95

第8章 数组 98

8.1 一维数组 98

8.1.1 数组下标 98

8.1.2 程序:数列反向 100

8.1.3 数组初始化 100

8.1.4 程序:检查数中重复出现的数字 101

8.1.5 对数组使用sizeof运算符 101

8.1.6 程序:计算利息 102

8.2 多维数组 103

8.2.1 多维数组初始化 104

8.2.2 常量数组 105

8.2.3 程序:发牌 105

问与答 106

练习 107

第9章 函数 110

9.1 函数的定义和调用 110

9.1.1 程序:计算平均值 110

9.1.2 程序:显示倒数计数 111

9.1.3 程序:显示双关语(改进版) 112

9.1.4 函数定义 113

9.1.5 函数调用 114

9.1.6 程序:判定素数 115

9.2 函数声明 116

9.3 实际参数 117

9.3.1 实际参数的转换 118

9.3.2 数组型实际参数 119

9.4 return语句 120

9.5 程序终止 121

9.6 递归函数 122

9.6.1 快速排序算法 123

9.6.2 程序:快速排序 124

问与答 125

练习 128

第10章 程序结构 131

10.1 局部变量 131

10.2 外部变量 132

10.2.1 程序:用外部变量实现栈 132

10.2.2 外部变量的利与弊 133

10.2.3 程序:猜数 134

10.3 程序块 137

10.4 作用域 137

10.5 构建C程序 138

问与答 144

练习 144

第11章 指针 146

11.1 指针变量 146

11.2 取地址运算符和间接寻址运算符 147

11.2.1 取地址运算符 147

11.2.2 间接寻址运算符 148

11.3 指针赋值 148

11.4 指针作为实际参数 149

11.4.1 程序:找出数组中的最大元素和最小元素 151

11.4.2 用const保护实际参数 152

11.5 指针作为返回值 153

问与答 153

练习 155

第12章 指针和数组 156

12.1 指针的算术运算 156

12.1.1 指针加上整数 157

12.1.2 指针减去整数 157

12.1.3 指针相减 158

12.1.4 指针比较 158

12.2 指针用于数组处理 158

12.3 用数组名作为指针 160

12.3.1 程序:数列反向(改进版) 161

12.3.2 数组型实际参数(改进版) 161

12.3.3 用指针作为数组名 162

12.4 指针和多维数组 163

12.4.1 处理多维数组的元素 163

12.4.2 处理多维数组的行 163

12.4.3 用多维数组名作为指针 164

问与答 164

练习 166

第13章 字符串 168

13.1 字符串字面量 168

13.1.1 字符串字面量中的转义序列 168

13.1.2 延续字符串字面量 169

13.1.3 如何存储字符串字面量 169

13.1.4 字符串字面量的操作 170

13.1.5 字符串字面量与字符常量 170

13.2 字符串变量 170

13.2.1 初始化字符串变量 171

13.2.2 字符数组与字符指针 172

13.3 字符串的读/写 173

13.3.1 用printf函数和puts函数写字符串 173

13.3.2 用scanf函数和gets函数读字符串 173

13.3.3 逐个字符读字符串 174

13.4 访问字符串中的字符 175

13.5 使用C语言的字符串库 176

13.5.1 strcpy函数 177

13.5.2 strcat函数 177

13.5.3 strcmp函数 178

13.5.4 strlen函数 178

13.5.5 程序:显示一个月的提示列表 179

13.6 字符串惯用法 181

13.6.1 搜索字符串的结尾 181

13.6.2 复制字符串 182

13.7 字符串数组 184

13.7.1 命令行参数 185

13.7.2 程序:核对行星的名字 186

问与答 187

练习 189

第14章 预处理器 192

14.1 预处理器的工作方式 192

14.2 预处理指令 194

14.3 宏定义 194

14.3.1 简单的宏 194

14.3.2 带参数的宏 196

14.3.3 #运算符 197

14.3.4 ##运算符 198

14.3.5 宏的通用属性 199

14.3.6 宏定义中的圆括号 199

14.3.7 创建较长的宏 200

14.3.8 预定义宏 201

14.4 条件编译 202

14.4.1 #if指令和#endif指令 202

14.4.2 defined运算符 203

14.4.3 #ifdef指令和#ifndef指令 203

14.4.4 #elif指令和#else指令 203

14.4.5 使用条件编译 204

14.5 其他指令 205

14.5.1 #error指令 205

14.5.2 #line指令 205

14.5.3 #pragma指令 206

问与答 206

练习 208

第15章 编写大规模程序 211

15.1 源文件 211

15.2 头文件 212

15.2.1 #include指令 212

15.2.2 共享宏定义和类型定义 213

15.2.3 共享函数原型 214

15.2.4 共享变量声明 215

15.2.5 嵌套包含 216

15.2.6 保护头文件 216

15.2.7 头文件中的#error指令 217

15.3 把程序划分成多个文件 217

15.4 构建多文件程序 223

15.4.1 makefile 223

15.4.2 链接期间的错误 224

15.4.3 重新构建程序 225

15.4.4 在程序外定义宏 226

问与答 227

练习 228

第16章 结构、联合和枚举 229

16.1 结构变量 229

16.1.1 结构变量的声明 229

16.1.2 结构变量的初始化 230

16.1.3 对结构的操作 231

16.2 结构类型 232

16.2.1 结构标记的声明 232

16.2.2 结构类型的定义 233

16.2.3 结构类型的实际参数和返回值 233

16.3 数组和结构的嵌套 234

16.3.1 嵌套的结构 234

16.3.2 结构数组 235

16.3.3 结构数组的初始化 235

16.3.4 程序:维护零件数据库 236

16.4 联合 241

16.4.1 使用联合来节省空间 242

16.4.2 使用联合来构造混合的数据结构 243

16.4.3 为联合添加“标记字段” 243

16.5 枚举 244

16.5.1 枚举标记和枚举类型 245

16.5.2 枚举作为整数 245

16.5.3 用枚举声明“标记字段” 246

问与答 246

练习 247

第17章 指针的高级应用 250

17.1 动态存储分配 250

17.1.1 内存分配函数 250

17.1.2 空指针 251

17.2 动态分配字符串 251

17.2.1 使用malloc数为字符串分配内存 252

17.2.2 在字符串函数中使用动态存储分配 252

17.2.3 动态分配字符串的数组 253

17.2.4 程序:显示一个月的提示列表(改进版) 253

17.3 动态分配数组 254

17.3.1 使用malloc函数为数组分配存储空间 255

17.3.2 calloc函数 255

17.3.3 realloc函数 256

17.4 释放存储 256

17.4.1 free函数 257

17.4.2 “悬空指针”问题 257

17.5 链表 257

17.5.1 声明结点类型 258

17.5.2 创建结点 258

17.5.3 -〉运算符 259

17.5.4 在链表的开始处插入结点 259

17.5.5 搜索链表 261

17.5.6 从链表中删除结点 262

17.5.7 链表排序 264

17.5.8 程序:维护零件数据库(改进版) 264

17.6 指向指针的指针 268

17.7 指向函数的指针 269

17.7.1 函数指针作为实际参数 269

17.7.2 qsort函数 270

17.7.3 函数指针的其他用途 271

17.7.4 程序:列三角函数表 272

问与答 273

练习 276

第18章 声明 278

18.1 声明的语法 278

18.2 存储类型 279

18.2.1 变量的特性 279

18.2.2 auto存储类型 280

18.2.3 static存储类型 280

18.2.4 extern存储类型 281

18.2.5 register存储类型 282

18.2.6 函数的存储类型 282

18.2.7 小结 283

18.3 类型限定符 284

18.4 声明符 284

18.4.1 解释复杂声明 285

18.4.2 使用类型定义来简化声明 286

18.5 初始化式 287

问与答 288

练习 289

第19章 程序设计 291

19.1 模块 291

19.1.1 内聚性与耦合性 293

19.1.2 模块的类型 293

19.2 信息隐藏 293

19.3 抽象数据类型 296

19.4 C++语言 297

19.4.1 C语言与C++语言之间的差异 297

19.4.2 类 299

19.4.3 类定义 300

19.4.4 成员函数 300

19.4.5 构造函数 302

19.4.6 构造函数和动态存储分配 303

19.4.7 析构函数 304

19.4.8 重载 304

19.4.9 面向对象编程 306

19.4.10 派生 306

19.4.11 虚函数 308

19.4.12 模板 310

19.4.13 异常处理 310

问与答 311

练习 312

第20章 低级程序设计 314

20.1 按位运算符 314

20.1.1 移位运算符 314

20.1.2 按位求反运算符、按位与运算符、按位异或运算符和按位或运算符 315

20.1.3 用按位运算符访问位 316

20.1.4 用按位运算符访问位域 317

20.1.5 程序:XOR加密 317

20.2 结构中的位域 318

20.3 其他低级技术 320

20.3.1 定义依赖机器的类型 320

20.3.2 用联合从多个视角看待数据 320

20.3.3 将指针作为地址使用 321

20.3.4 程序:设置Num Lock键 322

20.3.5 volatile类型限定符 323

问与答 323

练习 323

第21章 标准库 325

21.1 标准库的使用 325

21.1.1 对标准库中使用的名字一些限制 325

21.1.2 使用宏隐藏函数 325

21.2 标准库概述 326

21.3 〈stddef.h〉:常用定义 327

问与答 328

练习 328

第22章 输入/输出 329

22.1 流 329

22.1.1 文件指针 330

22.1.2 标准流和重定向 330

22.1.3 文本文件与二进制文件 330

22.2 文件操作 331

22.2.1 打开文件 332

22.2.2 模式 332

22.2.3 关闭文件 333

22.2.4 为流附加文件 333

22.2.5 从命令行获取文件名 334

22.2.6 程序:检查文件是否可以打开 334

22.2.7 临时文件 335

22.2.8 文件缓冲 336

22.2.9 其他文件操作 337

22.3 格式化的输入/输出 337

22.3.1 ...printf类函数 337

22.3.2 ...printf类函数的转换说明 338

22.3.3 ...printf类函数的转换说明示例 339

22.3.4 ...scanf类函数 341

22.3.5 ...scanf类函数的格式化字符串 342

22.3.6 ...scanf类函数的转换说明 342

22.3.7 scanf函数的示例 343

22.3.8 检测文件末尾和错误条件 344

22.4 字符的输入/输出 346

22.4.1 输出函数 346

22.4.2 输入函数 346

22.4.3 程序:复制文件 347

22.5 行的输入/输出 348

22.5.1 输出函数 348

22.5.2 输入函数 348

22.6 块的输入/输出 349

22.7 文件的定位 350

22.8 字符串的输入/输出 352

问与答 353

练习 356

第23章 库对数值和字符数据的支持 360

23.1 〈float.h〉:浮点型的特性 360

23.2 〈limits.h〉:整数类型的大小 361

23.3 〈math.h〉:数学计算 362

23.3.1 错误 362

23.3.2 三角函数 363

23.3.3 双曲函数 363

23.3.4 指数函数和对数函数 363

23.3.5 幂函数 364

23.3.6 就近取整函数、绝对值函数和取余函数 364

23.4 〈ctype.h〉:字符处理 365

23.4.1 字符测试函数 365

23.4.2 程序:测试字符测试函数 366

23.4.3 字符大小写转换函数 367

23.4.4 程序:测试大小写转换函数 367

23.5 〈string.h〉:字符串处理 367

23.5.1 复制函数 368

23.5.2 拼接函数 368

23.5.3 比较函数 369

23.5.4 搜索函数 370

23.5.5 其他函数 372

问与答 372

练习 372

第24章 错误处理 374

24.1 〈assert.h〉:诊断 374

24.2 〈errno.h〉:错误 375

24.3 〈signal.h〉:信号处理 376

24.3.1 信号宏 376

24.3.2 signal函数 377

24.3.3 预定义的信号处理函数 377

24.3.4 raise函数 378

24.3.5 程序:测试信号 378

24.4 〈setjmp.h〉:非局部跳转 379

问与答 380

练习 381

第25章 国际化特性 383

25.1 〈locale.h〉:本地化 383

25.1.1 类别 383

25.1.2 setlocale函数 384

25.1.3 localeconv函数 384

25.2 多字节字符和宽字符 386

25.2.1 多字节字符 387

25.2.2 宽字符 387

25.2.3 多字节字符函数 388

25.2.4 多字节字符串函数 389

25.3 三字符序列 389

问与答 390

练习 391

第26章 其他库函数 392

26.1 〈stdarg.h〉:可变长度实参 392

26.1.1 调用带有可变实参列表的函数 393

26.1.2 V...printf类函数 393

26.2 〈stdlib.h〉:通用的实用工具 394

26.2.1 字符串转换函数 394

26.2.2 程序:测试字符串转换函数 395

26.2.3 伪随机序列生成函数 397

26.2.4 程序:测试伪随机序列生成函数 397

26.2.5 与环境的通信 398

26.2.6 搜索和排序实用工具 399

26.2.7 程序:确定航空里程 399

26.2.8 整数算术运算函数 400

26.3 〈time.h〉:日期和时间 401

26.3.1 时间处理函数 401

26.3.2 时间转换函数 403

26.3.3 程序:显示日期和时间 405

问与答 406

练习 407