图书目录

目    录

第1章  C语言概述 1

1.1  为什么要选择C语言 2

1.1.1  选择C语言的好处 2

1.1.2  C语言的特点 2

1.1.3  如何学好C语言 3

1.2  进制转换 4

1.2.1  十进制数的表示 4

1.2.2  二进制数的表示 5

1.2.3  二进制数、十六进制数

和八进制数转换为十进制数 6

1.2.4  十进制数转换为二进制数 6

1.2.5  十进制数转换为十六进制数 9

1.2.6  十进制数转换为八进制数 11

1.2.7  二进制数与十六进制数、

八进制数的转换 12

1.3  计算机中数的表示 13

1.3.1  计算机中的正数与负数表示 14

1.3.2  原码和补码 14

1.3.3  浮点数 17

1.4  小结 19

第2章  C语言开发环境 21

2.1  Turbo C 2.0开发环境介绍 22

2.1.1  运行Turbo C 2.0 22

2.1.2  Turbo C 2.0环境设置 23

2.1.3  Turbo C 2.0的使用 25

2.2  Win-TC开发环境介绍 27

2.2.1  Win-TC开发环境概述 27

2.2.2  Win-TC的使用 28

2.3  LCC开发环境介绍 30

2.3.1  使用LCC开发环境创建

项目 30

2.3.2  LCC开发环境的介绍 32

2.3.3  LCC的使用 33

2.4  Visual C++ 6.0开发环境介绍 34

2.4.1  使用Visual C++ 6.0新建

项目 34

2.4.2  使用Visual C++ 6.0新建源

程序文件 36

2.4.3  使用Visual C++ 6.0开发

环境 37

2.5  小结 38

第3章  基本数据类型 39

3.1  变量 40

3.1.1  为什么要使用变量 40

3.1.2  什么是变量——变量在计算机

中的表示 40

3.1.3  如何定义变量 41

3.1.4  为什么要有数据类型 41

3.1.5  C语言有哪些数据类型 42

3.1.6  什么符号可以作为变量名——

用户定义的标识符 43

3.1.7  关键字——已经被占用的

标识符 44

3.1.8  初识变量赋值 44

3.2  整型变量 45

3.2.1  为什么要使用整型变量 45

3.2.2  基本整型变量 46

3.2.3  基本整型变量的输入——使用

scanf函数 47

3.2.4  基本整型变量的输出——使用

printf函数 49

3.2.5  长整型变量——解决大整数

问题 50

3.2.6  短整型变量——节省内存

空间 52

3.2.7  无符号整型变量——只包括

非负的整数 53

3.2.8  整型变量的应用举例 54

3.3  实型变量 57

3.3.1  为什么使用实型变量 57

3.3.2  单精度浮点型变量 57

3.3.3  双精度浮点型变量 60

3.3.4  长双精度浮点型变量 61

3.3.5  实型变量的应用举例 62

3.4  字符型数据类型 64

3.4.1  为什么要使用字符型变量 64

3.4.2  字符型变量 64

3.4.3  字符型数据的输入与字符型变量

值的输出——使用%c和%s 65

3.4.4  字符型变量的应用举例 66

3.5  常量 68

3.5.1  为什么使用常量 68

3.5.2  整型常量 68

3.5.3  浮点型常量 69

3.5.4  字符型常量与字符串型常量 69

3.5.5  常量与常数 70

3.6  小结 70

习题 70

第4章  运算符与表达式 73

4.1  表达式 74

4.1.1  运算符有哪些 74

4.1.2  什么是表达式 74

4.1.3  运算符的优先级与结合性 75

4.1.4  自动类型转换 76

4.2  算术运算符与算术表达式 77

4.2.1  基本算术表达式 77

4.2.2  自增表达式——++a和a++ 79

4.2.3  自减表达式——--a和a-- 82

4.2.4  算术运算符的混合运算——算术

运算符的优先级与结合性 83

4.2.5  算术表达式应用举例 84

4.3  赋值运算符与赋值表达式及其应用 86

4.3.1  赋值运算符与赋值表达式 86

4.3.2  类型转换 89

4.3.3  赋值表达式的应用举例 91

4.4  关系运算符与关系表达式及其应用 93

4.4.1  关系运算符和关系表达式 93

4.4.2  关系表达式应用举例 94

4.5  逻辑运算符与逻辑表达式及其应用 95

4.5.1  逻辑运算符和逻辑表达式 95

4.5.2  逻辑表达式应用举例 97

4.6  逗号表达式 98

4.6.1  逗号运算符与逗号表达式 99

4.6.2  逗号表达式中应注意的问题 99

4.6.3  逗号表达式应用举例 99

4.7  小结 100

第5章  顺序结构程序设计 101

5.1  语句和程序 102

5.1.1  什么是简单语句 102

5.1.2  为什么使用复合语句 103

5.1.3  什么是复合语句 103

5.1.4  使用复合语句应注意的

问题 104

5.1.5  为什么要有程序 105

5.1.6  C语言程序的框架结构 106

5.2  顺序结构程序设计 107

5.2.1  顺序结构程序设计的特点——

自上而下执行每一个语句 107

5.2.2  顺序结构程序设计——求圆的

面积 107

5.2.3  顺序结构程序——求一元二次

方程ax2+bx+c=0的根 110

5.2.4  顺序结构程序设计应用举例——

将小写字母转换为大写字母 111

5.3  小结 113

第6章  选择结构程序设计 115

6.1  条件运算符 116

6.1.1  为什么要有条件运算符 116

6.1.2  条件运算符与条件表达式 116

6.2  if选择语句 119

6.2.1  为什么要有if选择语句——

理解容易 119

6.2.2  if选择语句——单分支选择

结构 120

6.2.3  if-else选择语句——双分支的

选择结构 124

6.2.4  if...else if…else选择语句——

多分支选择结构 126

6.2.5  if选择语句的嵌套 131

6.2.6  设置标志变量 135

6.2.7  if选择语句与条件运算符——

相互转换 136

6.3  switch选择语句 137

6.3.1  switch选择语句 137

6.3.2  switch选择语句应用举例 138

6.4  选择结构程序设计应用举例 143

6.5  小结 151

第7章  循环结构程序设计 153

7.1  为什么要有循环结构 154

7.1.1  如何重复输出多个hello 

world 154

7.1.2  如何求连续的n个自然数

的和 154

7.2  while循环语句 155

7.2.1  while循环语句——当型

循环 155

7.2.2  while循环语句应用举例 158

7.3  do-while循环语句 160

7.3.1  为什么要有do-while 160

7.3.2  do-while循环语句——直到型

循环 160

7.3.3  比较while循环结构和do-while

循环结构 162

7.4  for循环语句 165

7.4.1  for循环语句概述 165

7.4.2  for循环语句的灵活性 169

7.4.3  几种循环语句的比较 174

7.5  goto语句与goto语句构成的循环

语句 175

7.5.1  goto语句——无条件转移

语句 175

7.5.2  goto语句构成的循环语句——

向前跳转 176

7.5.3  goto语句与while语句、for

语句的比较 177

7.6  break语句 178

7.6.1  循环中的“提前开溜” 178

7.6.2  使用break语句 179

7.7  continue语句 181

7.7.1  为什么要有continue语句 181

7.7.2  使用continue语句 181

7.7.3  continue语句与break语句的

区别 182

7.7.4  continue语句应用举例 183

7.8  多重循环程序设计 184

7.8.1  为什么要有循环的嵌套——

一层循环是不能解决所有

问题的 184

7.8.2  循环的嵌套——循环结构中

还可以有循环结构 185

7.8.3  多重循环应用举例——输出

乘法口诀表 187

7.9  循环结构程序应用举例 190

7.9.1  循环结构程序应用举例——

求π的近似值 190

7.9.2  循环结构程序应用举例——

求101~200之间的所有

质数 193

7.9.3  循环结构程序应用举例——

质数问题的改进算法 195

7.9.4  循环结构程序应用举例——

百鸡问题 196

7.10  小结 198

第8章  数组 199

8.1  为什么要有数组 200

8.1.1  多变量的解决之道——数组的

引入 200

8.1.2  数组就是这个样子——初识

数组 201

8.1.3  数组的数组——维度的

出现 202

8.2  一维数组 204

8.2.1  一维数组是这样定义的 204

8.2.2  一维数组的引用——其实

很简单 205

8.2.3  一维数组的初始化——方法

有许多 206

8.2.4  一维数组的应用举例——求

数组各元素的平均值 208

8.2.5  一维数组的应用举例——数组

元素的倒排 209

8.2.6  一维数组的应用举例——冒泡

排序 211

8.3  二维数组 214

8.3.1  二维数组原来是这样

定义的 214

8.3.2  二维数组的引用——其实

并不难 216

8.3.3  二维数组的初始化——多样的

初始化 217

8.3.4  二维数组应用举例——计算

各科成绩的平均分 220

8.3.5  二维数组应用举例——矩阵的

转置 222

8.3.6  二维数组应用举例——有趣的

魔方阵 223

8.4  字符数组 227

8.4.1  字符数组是这样定义的 227

8.4.2  字符数组的初始化 228

8.4.3  字符数组的连续输出——

格式符%s 230

8.4.4  字符数组的连续输入——

格式符%s 231

8.4.5  常用的字符串处理函数 232

8.4.6  字符数组的应用举例 236

8.5  小结 240

第9章  函数 241

9.1  为什么要有函数及函数的分类 242

9.1.1  为什么要有函数 242

9.1.2  函数有哪些——库函数

和用户函数 243

9.2  函数的定义形式 243

9.2.1  不带参数的函数定义形式 243

9.2.2  带参数的函数定义形式——

有参数列表 244

9.2.3  带参数的函数定义形式——

形参定义的传统方式 245

9.3  局部变量与全局变量 246

9.3.1  局部变量 246

9.3.2  全局变量 248

9.4  函数的参数与函数的值 250

9.4.1  形式参数与实际参数 250

9.4.2  函数的返回值 252

9.5  函数的调用 254

9.5.1  函数调用的一般形式 254

9.5.2  函数调用的方式 256

9.5.3  对被调用函数的声明 257

9.6  函数的嵌套调用 260

9.6.1  函数的嵌套调用过程 260

9.6.2  函数的嵌套应用举例 261

9.7  函数的递归调用 262

9.7.1  什么是递归——自己调用

自己 262

9.7.2  递归函数应用举例——

求n! 263

9.7.3  递归函数调用应用举例——

Fibonacci数列 265

9.8  数组作为函数的参数 266

9.8.1  数组元素作为函数的参数——

只能传递一个数组元素 266

9.8.2  数组名作为函数的参数——

可以传递整个数组 268

9.8.3  数组名作为参数传递——实际

上传递的是数组的首地址 271

9.8.4  多维数组名作为函数的参数——

传递整个数组 275

9.9  变量的存储 277

9.9.1  什么是动态存储与静态存储——

生存期不同 278

9.9.2  auto变量——自动类型

变量 278

9.9.3  static变量——静态变量 278

9.9.4  register变量——使运行速度

更快的变量 281

9.9.5  extern变量——声明外部

变量 282

9.10  内部函数与外部函数 284

9.10.1  内部函数——使用static 284

9.10.2  外部函数——使用extern 285

9.11  函数应用举例 286

9.11.1  函数应用举例——递归求解

 n个数的最大值 286

9.11.2  函数应用举例——递归求解a

 与b的最大公约数 288

9.11.3  函数应用举例——字符数组

 元素逆序存放 289

9.12  小结 290

第10章  预处理命令 291

10.1  宏定义 292

10.1.1  为什么要有宏定义 292

10.1.2  不带参数的宏定义 292

10.1.3  宏定义与常量定义的区别 294

10.1.4  带参数的宏定义 294

10.1.5  宏定义中的参数与函数的

 参数的区别 295

10.2  文件包含命令 297

10.2.1  为什么要有文件包含

 命令 297

10.2.2  文件包含命令——#include 297

10.3  条件编译 299

10.3.1  第一种条件编译命令——

 #ifdef 300

10.3.2  第二种条件编译命令——

 #ifdef…#elif…#endif 301

10.3.3  第三种条件编译命令——

 #ifndef 302

10.3.4  第四种条件编译命令——

 #if 303

10.4  小结 304

第11章  指针 305

11.1  指针的相关概念 306

11.1.1  为什么要有指针和指针

 变量 306

11.1.2  什么是地址 306

11.1.3  什么是指针变量——存放

 地址的变量 307

11.2  指针变量 308

11.2.1  定义指针变量 308

11.2.2  使用指针变量 310

11.2.3  指针变量作为函数参数 313

11.3  数组与指针 317

11.3.1  指向数组元素的指针 317

11.3.2  通过指针引用数组元素 318

11.3.3  指针变量的自增运算

 和自减运算 322

11.3.4  数组指针作为函数的参数 323

11.3.5  指向多维数组的指针变量 329

11.4  字符串与指针 336

11.4.1  指向字符串的指针变量 336

11.4.2  字符串指针作为函数的

 参数 342

11.4.3  字符数组与字符指针变量的

 比较 346

11.5  指针数组与指向指针的指针 347

11.5.1  指针数组 347

11.5.2  指向指针的指针 351

11.5.3  指针数组作为main函数的

 参数 353

11.6  函数与指针 354

11.6.1  函数指针调用函数 354

11.6.2  指向函数的指针作为函数

 参数 355

11.7  返回指针值的函数 358

11.7.1  为什么函数要返回指针值——

 可以返回多个值 358

11.7.2  返回指针类型的函数 358

11.8  小结 360

第12章  结构体和共用体 361

12.1  结构体 362

12.1.1  为什么要有结构体 362

12.1.2  结构体类型的定义 363

12.1.3  定义结构体变量 363

12.1.4  引用结构体变量 365

12.1.5  结构体变量的初始化 367

12.2  结构体数组 369

12.2.1  为什么要有结构体数组 369

12.2.2  定义结构体数组 369

12.2.3  结构体数组的初始化 370

12.2.4  结构体数组应用举例 371

12.3  指针与结构体 375

12.3.1  指向结构体变量的指针 375

12.3.2  指向结构体数组的指针 376

12.3.3  结构体变量和指向结构体的

 指针作为函数的参数 378

12.4  typedef类型定义 382

12.4.1  typedef——为数据类型重新

 起个名字 382

12.4.2  使用typedef时应注意的

 问题 384

12.4.3  typedef的应用举例 384

12.5  共用体 387

12.5.1  为什么要有共用体——节省

 内存,多选一 387

12.5.2  定义共用体 388

12.5.3  引用共用体变量 389

12.5.4  使用共用体应该注意的

 问题 390

12.5.5  共用体应用举例 390

12.6  枚举类型 393

12.6.1  为什么要有枚举类型——变量

 的值只有有限的几种 393

12.6.2  定义枚举类型及变量 394

12.6.3  使用枚举类型时应注意的

 问题 394

12.6.4  枚举类型应用举例 395

12.7  小结 396

第13章  位运算 397

13.1  为什么要有位运算与位运算符 398

13.1.1  为什么要有位运算——提高

 效率 398

13.1.2  位运算符 398

13.1.3  位运算符的优先级

 与结合性 399

13.2  位运算符和位运算 399

13.2.1  按位与运算符和按位

 与运算 399

13.2.2  按位或运算符与按位

 或运算 401

13.2.3  按位异或运算符与按位

 异或运算 401

13.2.4  按位取反运算符与按位

 取反运算 403

13.2.5  左移运算符与左移运算 404

13.2.6  右移运算符与右移运算 405

13.2.7  与位运算符相结合的赋值

 运算符 405

13.3  位运算应用举例 406

13.3.1  以二进制形式输出一个数——

 按位与运算并输出1或0 406

13.3.2  取一个整数的中间几位 407

13.4  位段 409

13.4.1  定义位段 409

13.4.2  引用位段成员 410

13.4.3  使用位段需要说明的问题 411

13.5  小结 412

第14章  文件 413

14.1  文件的相关概念 414

14.1.1  为什么要有文件 414

14.1.2  文件的分类——二进制文件

 和文本文件 414

14.1.3  缓冲文件系统 414

14.2  打开与关闭文件 415

14.2.1  文件类型指针——FILE* 415

14.2.2  打开文件——使用fopen

 函数 416

14.2.3  关闭文件——使用fclose

 函数 417

14.3  读取文件与写入文件 418

14.3.1  使用fputc函数写文件和

 使用fgetc函数读取文件 418

14.3.2  使用fputs函数写文件和使用

 fgets函数读取文件 422

14.3.3  使用fwrite函数写文件和

 使用fread函数读取文件 424

14.3.4  使用fprintf函数写文件和

 使用fscanf函数读取文件 426

14.4  文件的定位 428

14.4.1  rewind函数——移动位置

 指针到文件的开始位置 428

14.4.2  fseek函数——移动位置指针

 到任意位置 429

14.4.3  ftell函数——得到位置指针

 的当前位置 431

14.5  文件状态检测 432

14.5.1  feof函数——检测位置指针

 是否到了文件末尾 432

14.5.2  ferror函数——检测是否操作

 文件错误 432

14.5.3  clearerr函数——清除错误

 标志 433

14.6  文件的输入与输出操作函数

 总结 433

14.7  小结 434

第15章  链表 435

15.1  链表的相关概念 436

15.1.1  为什么要有链表——节省

 内存单元,不用事先定义

 空间大小 436

15.1.2  什么是链表 436

15.1.3  简单链表——静态链表 438

15.1.4  动态存储分配 442

15.2  链表的操作 443

15.2.1  创建链表 443

15.2.2  链表的输出操作 447

15.2.3  链表的插入操作 449

15.2.4  链表的删除操作 453

15.2.5  链表的综合操作 456

15.3  链表操作应用举例 457

15.3.1  链表操作应用举例——逆置

 链表 457

15.3.2  链表操作应用举例——

 约瑟夫问题 463

15.4  小结 467

第16章  键盘和鼠标 469

16.1  键盘操作 470

16.1.1  键盘编码 470

16.1.2  键盘操作函数 470

16.2  鼠标操作 472

16.2.1  鼠标的工作原理 473

16.2.2  鼠标综合应用举例 477

16.3  小结 484

第17章  网络编程基础 485

17.1  网络基础知识 486

17.1.1  什么是计算机网络 486

17.1.2  网络协议 486

17.1.3  协议分层 487

17.1.4  网络参考模型 488

17.1.5  端口 491

17.2  WinSocket基础 491

17.2.1  套接字Socket 491

17.2.2  基于TCP的Socket编程 491

17.2.3  基于UDP的Socket编程 493

17.3  WinSocket相关函数 493

17.3.1  WSAStartup函数——启动

 套接字库 494

17.3.2  Socket函数——建立

 套接字 494

17.3.3  bind函数——绑定本地IP

 地址和端口 495

17.3.4  listen函数——侦听客户端

 请求 496

17.3.5  accept函数——等待客户端的

 请求 496

17.3.6  send函数——发送数据 496

17.3.7  recv函数——接收数据 497

17.3.8  connect函数——建立

 连接 497

17.3.9  recvfrom函数——接收

 数据 497

17.3.10  sendto函数——发送

 数据 497

17.4  基于TCP的简单网络程序 498

17.4.1  服务器端的程序实现 498

17.4.2  客户端程序的实现 501

17.5  基于UDP的简单网络聊天程序 503

17.5.1  服务器端程序的实现 503

17.5.2  客户端程序的实现 505

17.6  小结 506

第18章  常用算法 507

18.1  算法基础 508

18.1.1  什么是算法及算法的描述

 语言 508

18.1.2  算法的特性 509

18.1.3  算法设计的目标 509

18.1.4  算法的时间复杂度和空间

 复杂度 510

18.2  迭代算法 511

18.2.1  算法思想 511

18.2.2  求一个数的平方根 511

18.2.3  角谷猜想 512

18.2.4  牛顿迭代法 513

18.3  递推算法 515

18.3.1  认识递推 515

18.3.2  斐波那契数列 516

18.3.3  分西瓜 517

18.3.4  该存多少钱 518

18.4  穷举算法 518

18.4.1  算法思想 519

18.4.2  完全数 519

18.4.3  背包问题 520

18.5  递归算法 521

18.5.1  算法思想 522

18.5.2  数制转换 522

18.5.3  组合问题 523

18.6  分治算法 525

18.6.1  算法思想 525

18.6.2  求n个数的最大值

 和最小值 525

18.6.3  赛程安排问题 527

18.7  贪心算法 530

18.7.1  算法思想 530

18.7.2  加油站问题 531

18.7.3  找零钱问题 532

18.8  矩阵算法 534

18.8.1  打印魔方阵 534

18.8.2  打印拉丁方阵 536

18.8.3  将矩阵旋转90度 537

18.9  小结 539

第19章  简单数据结构——栈和队列 541

19.1  队列 542

19.1.1  队列的定义 542

19.1.2  队列的表示与实现 543

19.1.3  顺序循环队列 544

19.1.4  顺序循环队列的实现 545

19.1.5  链式队列的表示与实现 547

19.1.6  队列的应用——商品货架

 模拟 549

19.2  栈 553

19.2.1  栈的定义 553

19.2.2  顺序栈的存储结构与实现 553

19.2.3  链式栈的存储结构与实现 555

19.2.4  栈的应用举例——算术

 表达式求值 557

19.3  小结 563

第20章  常用技术——排序 565

20.1  排序的基础知识 566

20.1.1  排序的相关概念 566

20.1.2  排序算法的分类 567

20.2  插入类排序 567

20.2.1  直接插入排序 568

20.2.2  折半插入排序 569

20.2.3  希尔排序 571

20.3  选择类排序 573

20.3.1  简单选择排序 573

20.3.2  堆排序 575

20.4  交换类排序 582

20.4.1  冒泡排序 582

20.4.2  快速排序 584

20.5  归并类排序 587

20.5.1  二路归并排序算法思想 587

20.5.2  二路归并排序算法实现 588

20.6  分配类排序 591

20.6.1  基数排序算法思想 591

20.6.2  基数排序算法实现 592

20.7  各种排序方法的比较 598

20.8  小结 599

第21章  学生成绩管理系统 601

21.1  系统总体设计 602

21.1.1  项目开发目标 602

21.1.2  系统功能描述 602

21.2  系统详细设计 603

21.2.1  主函数的运行流程 603

21.2.2  功能模块设计 604

21.2.3  数据结构设计 606

21.2.4  函数功能描述 606

21.3  系统实现与系统测试 608

21.3.1  编码 608

21.3.2  系统测试 621

21.4  小结 625

第22章  C语言常见错误与程序调试

  技术 627

22.1  常见错误 628

22.1.1  错误分类 628

22.1.2  常见错误举例 628

22.2  程序调试 632

22.2.1  Visual C++ 6.0开发环境的

 程序调试 632

22.2.2  程序调试应用举例 638

22.3  小结 643

后记 645

参考文献 651