《狂人C 程序员入门必备》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:键盘农夫著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2010
  • ISBN:9787115236494
  • 页数:482 页
图书介绍:本书以独特的视角讲解C语言的入门知识,贯穿大量实例进行生动讲解,并对程序员常见但容易忽略的谬误进行详细剖析,使读者更好地了解C语言。

第1篇 理解程序设计 1

第1章 基础知识 2

1.1什么是编程 3

1.1.1计算机如何工作 3

1.1.2内存中的程序是哪里来的 4

1.1.3可执行文件的制作 5

1.1.4 C语言的演化 6

1.2怎样用C语言编程 7

1.2.1学习C语言编程都需要什么 7

1.2.2最简单的C语言程序的基本结构 8

1.2.3Dev C﹢﹢ 9

1.3printf()函数初步 13

1.3.1简单的一般用法 13

1.3.2特殊的字符 13

1.4C语言的“字母”和“单词” 14

1.4.1 C语言的“字母” 14

1.4.2 C语言的“词” 15

小结 18

概念与术语 18

风格与习惯 19

常见错误 19

牛角尖 19

练习与自测 20

第2章 数据类型 23

2.1什么是数据类型 24

2.1.1“三个世界”理论 24

2.1.2问题世界:“万物皆数” 24

2.1.3代码世界:书写规则及含义 24

2.1.4机器世界里的“机器数” 25

2.1.5输出问题 27

2.1.6计算2的1到10次幂 28

2.1.7代码质量的改进 29

2.2让程序记住计算结果——变量 31

2.2.1计算机的记忆功能 31

2.2.2在代码中实现“记忆” 32

2.3int类型——总结与补充 35

2.3.1计算机表示负整数的几种方法 35

2.3.2计算机码制和C语言的关系 36

2.3.3暂时不必关心的一些细节 37

2.3.4int类型值的范围 37

2.3.5int类型常量在代码中的其他写法 38

2.3.6Dev C﹢﹢中int类型的机器数 38

2.4对数据类型的进一步讨论 39

2.4.1int数据类型的运算 40

2.4.2数学公式与数据类型 43

2.4.3数据类型——代码与编译器的约定 44

2.5莫名其妙的“整型” 45

2.5.1unsigned int类型 45

2.5.2long、short关键字描述的整数类型 46

2.5.3没有常量的char类型 47

2.5.4其他 51

2.6浮点类型 51

2.6.1 double类型常量的代码书写规则 51

2.6.2浮点类型数据存储模型 52

2.6.3浮点类型的一些特性 53

2.6.4浮点类型的运算 55

2.6.5 浮点类型的输出及其他 55

2.7数据类型与算法 57

2.7.1错误的数据类型 57

2.7.2所谓算法 58

2.7.3一个技巧 59

2.7.4更高效率的写法 59

2.8算法的特性 61

小结 61

概念与术语 61

风格与习惯 63

常见错误 63

牛角尖 63

练习与自测 64

第3章 运算符、表达式及语句 66

3.1 C的“动词”及“动词”的“宾语” 67

3.2表达式——C语言的“词组” 67

3.2.1初等表达式 67

3.2.2被误解的“()” 67

3.2.3带运算符的表达式 68

3.2.4不像表达式的表达式 68

3.2.5表达式:专业与副业 68

3.2.6赋值运算符左侧的标识符称为左值 69

3.2.7函数调用是表达式不是语句 69

3.3谁是谁的谁 71

3.3.1流行的谬误:优先级决定运算次序 71

3.3.2“左结合性”是运算对象先与左面的运算符相结合吗 72

3.3.3运算符、表达式小结 72

3.4右值的类型转换 74

3.4.1明确写出的显式转换——cast运算 75

3.4.2 cast运算的规则 75

3.4.3 赋值中的转换 77

3.4.4 1﹢1.0=? 77

3.4.5算术转换:早已废弃的规则和依然有效的规则 78

3.5语句的概念 81

3.5.1关于语句的闲话 81

3.5.2空语句有两种 82

3.5.3表达式语句 83

3.5.4顺序结构 83

3.5.5复合语句 84

3.6例题 84

3.6.1简单的类型转换 84

3.6.2最基础的算法——交换变量的值 85

3.6.3编程不是列公式 86

3.7算法和数据结构初窥 88

3.8在程序运行时提供数据 90

小结 91

概念与术语 91

风格与习惯 92

常见错误 93

牛角尖 93

练习与自测 93

第4章 选择语句 95

4.1关系运算 96

4.1.1“<”的数学含义及代码含义 96

4.1.2 4种关系运算符 96

4.1.3常见误区及与常识不符的结果 96

4.2 if语句 97

4.2.1语法格式及含义 97

4.2.2例题 97

4.2.3()内的表达式 100

4.2.4()后面的语句 100

4.3判等运算 104

4.4表达复杂的条件 106

4.5 if—else语句 107

4.6鸡肋——Bool类型(C99) 109

4.7判断三角形种类 111

4.8显得很有学问的运算符 117

4.9大师如是说goto 118

4.10给程序更多选项——switch语句 119

4.10.1 switch语句的一种应用形式 119

4.10.2 switch语句中的break语句 122

4.11程序开发的过程 124

小结 127

概念与术语 127

风格与习惯 127

常见错误 128

牛角尖 128

练习与自测 129

第5章 从循环到穷举 130

5.1造句:当就 131

5.1.1语法要素 131

5.1.2猴子吃桃问题更简洁的写法 133

5.1.3错误的循环变量 134

5.1.4次数不定的循环 135

5.1.5逗号表达式及其应用 136

5.2 do—while语句 138

5.2.1语法要素 138

5.2.2例题 139

5.3 for语句 140

5.3.1语法要素 140

5.3.2“﹢﹢”之惑 142

5.3.3 for语句应用 146

5.4不规则的循环及对循环的修整 150

5.4.1循环语句中的break语句 150

5.4.2 continue语句 151

5.5循环的嵌套与穷举法 151

5.5.1循环的嵌套 151

5.5.2穷举法 154

小结 157

概念与术语 157

风格与习惯 158

常见错误 158

牛角尖 159

练习与自测 159

第2篇 结构化程序设计与简单的数据结构 161

第6章 最复杂的运算符——“()” 162

6.1什么是函数 163

6.2步骤1:函数的声明 163

6.3步骤2:函数的定义 165

6.3.1函数定义的结构 165

6.3.2函数定义的位置 165

6.3.3函数头的写法、形参 165

6.3.4函数体的写法、return关键字 166

6.4步骤3:函数的调用 167

6.5程序的执行过程 168

6.6例题——为什么使用函数 170

6.7使用函数小结 171

6.7.1使用函数的步骤和方法 171

6.7.2常见问题 171

6.8函数与结构化程序设计 174

6.8.1明确程序功能 174

6.8.2确定程序的基本框架 175

6.8.3设计数据结构和算法 176

6.8.4任务的分解及函数原型 178

6.8.5完成函数定义 178

6.8.6 编程的步骤 180

6.8.7代码结构 180

6.9变量的作用域 181

6.10递归 182

6.10.1什么是递归 182

6.10.2递归是函数对自身的调用 183

6.10.3 递归的实现过程 184

6.10.4递归与循环 186

6.10.5递归的力量——Hanoi塔问题 187

6.10.6间接递归 190

6.11对局部变量的进一步修饰 190

6.11.1几乎一直是摆设的关键字——auto 191

6.11.2 static类别的局部变量 192

6.12使用库函数 193

6.13inline关键字(C99) 195

小结 196

概念与术语 196

风格与习惯 197

忠告 197

牛角尖 198

练习与自测 198

第7章 作为类型说明符和运算符的“[]” 199

7.1使用数组 200

7.1.1老式的解决办法 200

7.1.2首先要定义数组 200

7.1.3如何称呼数组中的各个数据对象 200

7.1.4完整的演示 201

7.2深入理解数组 202

7.2.1数组是一种数据类型 202

7.2.2数组定义的含义 202

7.2.3数组名是什么 203

7.2.4一维数组元素的引用 203

7.2.5数组元素引用是一个表达式 204

7.2.6数组名有值吗 204

7.2.7重复一遍 204

7.3熟练应用一维数组 205

7.3.1一维数组的遍历 205

7.3.2翻卡片问题 206

7.3.3筛法 207

7.3.4一维数组元素的赋初值 208

7.4数组名做实参 209

7.4.1数组名的值究竟是什么 209

7.4.2对应的形参 209

7.4.3调用原理 210

7.4.4不可以只有数组名这一个实参 210

7.4.5 const关键字 211

7.4.6例题——冒泡法排序 213

7.4.7测试与调试技巧——使用文件输入输出 215

7.5多维数组 216

7.5.1二维数组的定义 216

7.5.2二维数组元素的赋初值 218

7.5.3二维数组元素的引用和遍历 218

7.5.4更高维的数组 219

7.5.5生命游戏(Game of Life) 220

小结 225

概念与术语 225

风格与习惯 226

常见错误 226

牛角尖 226

练习与自测 227

第8章结构体、共用体与位运算 228

8.1结构体 229

8.1.1从一个简单例题说起 229

8.1.2声明结构体的类型 230

8.1.3定义结构体变量 231

8.1.4结构体数据的基本运算 231

8.1.5结构体变量赋初值及成员值的输入问题 233

8.1.6结构体“常量”(C99) 234

8.1.7一个不太专业的技巧 235

8.1.8结构体的其他定义方式及无名的结构体 236

8.2C语言中复数类型的历史和现状 237

8.2.1借助struct描述的复数类型 237

8.2.2-Complex、-Imaginary关键字(C99) 238

8.3共用体union 240

8.3.1概述 240

8.3.2对double类型的解析 241

8.4位运算 242

8.4.1位运算符 243

8.4.2更节省空间的筛法 248

8.5“小的变量”——位段 251

8.5.1位段概述 251

8.5.2如何定义位段 252

8.5.3位段的性质 252

8.5.4按二进制输出float类型数据 252

8.5.5对齐等问题 254

小结 254

概念 254

风格 256

常见错误 256

忠告 256

牛角尖 256

练习与自测 257

第9章 指针 258

9.1指针是什么 259

9.1.1指针是一类数据类型的统称 259

9.1.2指针是派生数据类型 259

9.1.3指针是一类数据的泛称 259

9.1.4指针专用的类型说明符——“*” 260

9.1.5指针的分类 260

9.2指向数据对象的指针 260

9.2.1什么是“数据对象” 260

9.2.2一元“&”运算 261

9.2.3数据指针变量的定义 263

9.2.4指针的赋值运算 264

9.2.5不是乘法的“*”运算 264

9.3指针的应用与误用 266

9.3.1指针有什么用 266

9.3.2C代码中的“×××到此一游” 268

9.3.3分桔子问题 268

9.4指针与一维数组 270

9.4.1数据指针与整数的加减法 270

9.4.2数据指针的减法 272

9.4.3数据指针的关系运算 272

9.4.4数据指针的判等运算 273

9.4.5“[]”运算 273

9.4.6数组名是指针 274

9.4.7数组名不仅仅是指针 275

9.4.8指向数组的指针 277

9.4.9与数组名对应的形参 278

9.5指针的应用(二) 279

9.6高维数组名 281

9.6.1高维数组名是指针 281

9.6.2高维数组名是内存 283

9.6.3“a[0]”或“*a”的含义 284

9.6.4数组与指针关系总结 285

9.6.5例题 285

9.7变量长度数组——VLA(C99) 87

9.7.1简述 287

9.7.2变量修饰类型(Variably modified type) 289

9.7.3变量长度数组与函数参数 290

9.8数组类型的字面量(C99) 291

9.9指针与结构体 292

9.9.1类型问题 292

9.9.2通过指针读写结构体的成员 293

9.10指针与函数 294

9.10.1函数名是指针 294

9.10.2指向函数指针的性质 295

9.10.3指向函数指针的运算 296

9.10.4例题 296

9.11指向虚无的指针 298

9.12参数不确定的函数 299

9.12.1printf()的函数原型 299

9.12.2“…”是什么 299

9.12.3实现原理 299

9.12.4标准形式 302

小结 303

概念与术语 303

常见错误 304

风格 304

牛角尖 304

练习与自测 305

第10章 字符串、字符数组及指向字符的指针 306

10.1字符串文字量 307

10.2字符串的输入与存储 309

10.2.1为输入的字符串准备存储空间 309

10.2.2 puts()函数 310

10.2.3字符数组的初始化 310

10.3例题 310

10.3.1求字符串长度 310

10.3.2比较两个字符串的大小 311

10.3.3 scanf中的转换 313

10.3.4字符处理库函数 316

10.4形参说明符“[]”里的修饰符(C99) 316

10.5常用的字符串函数 317

10.5.1字符串操作函数 317

10.5.2 sscanf、sprintf()函数 318

10.5.3 restrict关键字(C99)及memcpy()函数集 319

10.5.4字符串转换函数 320

10.6main()的参数 320

10.6.1指向指针的指针 320

10.6.2main()函数的第二种写法 321

10.7体现代码优美的数据类型——枚举类型 323

小结 325

概念 325

风格 326

常见错误 326

牛角尖 326

练习与自测 326

第3篇 复杂的数据结构、算法及其他话题 8

第11章 复杂的数据类型与算法 329

11.1 2222=0 330

11.2复杂数据类型的构造和解读 331

11.2.1数据类型的构造方法 331

11.2.2复杂数据类型的解读 335

11.2.3添乱的const等类型限定符 338

11.2.4 55555=19 338

11.3递归、穷举、回溯、排列 344

11.3.1 2、9、6能组成多少个两位数 344

11.3.2更自然地思考 345

11.3.3进一步的抽象和概括 347

11.3.4回溯法 348

11.3.5排列问题 352

11.4更自由地使用内存 356

11.4.1 100!=? 356

11.4.2老土的办法 356

11.4.3动态分配内存函数 358

11.4.4改进的方法 358

11.4.5 C99中的柔性数组成员(C99) 360

11.4.6进一步的思考 361

11.4.7用链表解决问题 362

11.5 typedef 364

小结 365

概念 365

风格 366

常见错误 366

忠告 366

牛角尖 366

练习与自测 367

第12章 程序的输入与输出 369

12.1面向文件的输入与输出 370

12.1.1把程序输出写入文件 370

12.1.2C程序怎样读文件 374

12.1.3格式化输入、输出的格式 375

12.1.4 fprintf()与printf()函数的等效性 379

12.2文卷、流、“FILE”及“FILE*” 380

12.2.1文卷(File) 380

12.2.2流(stream) 381

12.2.3“FILE”结构体 381

12.2.4FILE 381

12.2.5文本流和二进制流 382

12.2.6自动打开的流 383

12.2.7EOF 383

12.2.8其他几个用于文本文卷的I/O函数 383

12.3二进制文卷的读写 384

12.3.1二进制流 384

12.3.2用fwrite()写二进制文卷 384

12.3.3用fread()读二进制文卷 385

12.3.4feof()函数和ferror()函数 386

12.3.5讨论 388

12.4定位问题 388

12.4.1ftell()函数 388

12.4.2fseek()函数 388

12.4.3rewind()函数 388

12.4.4fgetpos()函数和fsetpos()函数 388

12.5制作素数表 389

小结 392

概念 392

常见错误 393

风格 393

牛角尖 393

练习与自测 393

第13章 程序组织与编译预处理 394

13.1简介 395

13.1.1一般特点 395

13.1.2预处理的几个阶段 395

13.2文件包含 396

13.3 Tic-Tac-Toe游戏 397

13.3.1分割——思考、手段和意义 397

13.3.2总结 401

13.3.3回到起点 403

13.3.4“走两步” 404

13.3.5重复#include的问题 405

13.3.6如何处理测试用的代码 406

13.3.7再次回到起点 408

13.3.8抽象的棋盘 408

13.4重新开始 409

13.4.1明确任务 409

13.4.2程序功能的初步定义 409

13.4.3输出 411

13.4.4抽签 412

13.5宏定义与宏替换 416

13.5.1类似对象的宏 416

13.5.2把东西都塞到柜子里去 417

13.5.3类似函数的宏 419

13.5.4显示空的棋盘 422

13.6使用外部变量 423

13.6.1外部变量 423

13.6.2外部变量的应用 426

13.7走棋 427

13.7.1多态 428

13.7.2拼接单词 430

13.7.3 static函数 432

13.7.4完成“棋手”模块 432

13.7.5 抽象棋盘——对封装的模拟 434

13.7.6具象棋盘的处理 438

13.7.7反省与检讨 438

13.8预处理命令的其他话题 439

13.8.1再谈宏 439

13.8.2其他编译预处理命令 441

小结 442

概念 442

常见错误 444

风格 444

牛角尖 444

练习与自测 444

第14章 标准库简介 446

14.1使用标准库的一些常识 447

14.1.1标准头与标准头文件 447

14.1.2使用库的禁忌 448

14.1.3并存的宏与函数 448

14.1.4函数定义域问题 448

14.2对语言的补充 449

14.2.1标准定义stddef.h 449

14.2.2 iso646.h 450

14.2.3 limits.h和float.h 450

14.2.4 stdarg.h 450

14.2.5 stdbool.h(C99) 451

14.2.6 stdint.h(C99) 451

14.3stdio.h 452

14.3.1数据类型 452

14.3.2宏 452

14.3.3函数 453

14.4通用函数:stdlib.h 454

14.4.1数值转换 455

14.4.2系列伪随机数生成函数 455

14.4.3内存管理函数 456

14.4.4环境通信函数 456

14.4.5查找与排序函数 459

14.4.6整数算术函数 460

14.4.7多字节、宽字节字符 460

14.5inttypes.h(C99) 460

14.6string.h 462

14.7数值计算 462

14.7.1 math.h(C89) 462

14.7.2 math.h(C99) 463

14.7.3 complex.h(C99) 465

14.7.4 tgmath.h(C99) 465

14.7.5 fenv.h(C99) 465

14.8错误处理:errno.h 466

14.8.1 errno:一个左值 466

14.8.2 errno的值 467

14.9断言与调试:assert.h 468

14.10非本地跳转setjmp.h 468

14.11信号处理signal.h 470

14.12time.h 471

14.13国际化问题 475

14.13.1 locale.h 475

14.13.2 ctype.h与wctype.h(C99) 475

14.13.3 wchar.h 476

附录 477

附录A C语言的关键字 478

附录B C语言的数据类型 479

附录C ASCII表 480

附录D C语言运算符 481

参考文献 482