本书以问题求解为核心,通过对问题的分析、求解过程的讲解及演示,全面介绍C99语言及程序设计的思想与方法。体系上以问题为先导,通过对问题的分析求解,引入必要的语言和编程知识,并以文字、”黑板式”课堂讲解视频及编程全过程示范视频等多种教学方式,演示其恰如其分的应用。之后立即安排相关的练习,通过在线评测(OnlineJudge)平台,实现讲练结合、学做合一。内容上,安排了独立的综合运用所学编程知识解决较大问题的章节,以供相关实训环节(课程)或学生自行巩固提高综合编程能力使用。
穆扬,姜沐的笔名,男,副教授,硕士研究生,毕业于南京理工大学,先后在沈阳工业学院、南京理工大学、南京工业职业技术大学从事教学工作。长期从事程序设计教学工作,精通C语言标准,擅长以问题为先导按结构化程序设计和软件工程原则进行程序设计教学,著有C语言程序设计书籍多部。
第0章 从0开始 1
0.0 什么是编程 1
0.0.0 计算机的工作原理 1
0.0.1 内存中的程序来自何处 3
0.0.2 可执行文件的制作 3
0.1 怎样用C语言编程 6
0.1.0 学习C语言编程的条件 6
0.1.1 编写最简单的C程序 7
0.2 输出字符序列 11
0.2.0 输出简单字符序列 11
0.2.1 输出特殊字符 13
0.2.2 C语言的“单词” 16
第1章 整数类型及表达式 21
1.0 输出整数 21
1.0.0 输出整数问题 21
1.0.1 十进制常量 21
1.0.2 用printf()函数输出整数常量 22
1.0.3 整数常量的其他写法 23
1.1 整数的五则运算 23
1.1.0 整数的加减运算 23
1.1.1 整数的乘法运算 24
1.1.2 标识符 26
1.1.3 整数的除法运算 28
1.1.4 数据类型的概念 30
1.2 让程序拥有记忆 31
1.2.0 填数问题 31
1.2.1 用变量思考 37
1.3 程序在运行时输入数据 40
1.3.0 通过调用scanf()函数输入数据 40
1.3.1 scanf()函数的应用 41
1.3.2 scanf()函数的误用 44
1.4 其他整数类型 46
1.4.0 int类型回顾 46
1.4.1 unsigned类型 47
1.4.2 其他几对整数类型 49
1.4.3 字符类型 52
1.4.4 有关字符类型的问题 55
1.5 运算符和表达式 66
1.5.0 运算符 66
1.5.1 表达式 69
1.5.2 运算符的优先级和结合性 74
第2章 顺序与选择 77
2.0 几个问题 77
2.0.0 分橘子问题 77
2.0.1 找对手问题 79
2.0.2 大数相加问题 81
2.0.3 程序概述 83
2.1 语句概述 87
2.1.0 什么是语句 87
2.1.1 什么不是语句 89
2.1.2 关于语句的误区 89
2.2 if语句 90
2.2.0 判断整数是否是奇数 90
2.2.1 判断整数是奇数还是偶数 94
2.2.2 讨论 97
2.3 判断常用的几种运算 99
2.3.0 判断是否是3的倍数 99
2.3.1 判断各位数字是否全相同 103
2.3.2 条件运算符 108
2.3.3 关系运算符 110
2.3.4 冒泡法排序 116
2.4 switch语句 119
2.4.0 求第几天 119
2.4.1 求星期几 125
2.4.2 对switch语句的进一步说明和讨论 128
第3章 循环与近似计算 137
3.0 while语句 137
3.0.0 海盗问题 137
3.0.1 统计字符个数 140
3.0.2 四进制数转十进制数 142
3.0.3 序点的概念 145
3.1 do-while语句 149
3.1.0 统计字符个数 149
3.1.1 求逆序数和位数 151
3.2 for语句 155
3.2.0 由数字求整数 155
3.2.1 Fibonacci数列问题 160
3.2.2 第二种for语句 162
3.3 不规则的循环 163
3.3.0 判断素数 163
3.3.1 字符转换输出 167
3.4 穷举法 170
3.4.0 做对了多少道题 170
3.4.1 换零钱 172
3.4.2 谁是凶手 175
3.5 goto语句 178
3.6 浮点类型及应用 178
3.6.0 浮点数的基本概念 178
3.6.1 C语言中的实浮点类型 179
3.6.2 求调和级数的近似值 182
3.6.3 求平方根 184
3.6.4 求sin函数值 186
第4章 函数与指针 188
4.0 函数调用、函数声明与函数定义 188
4.0.0 函数调用(Function call) 188
4.0.1 函数声明(Function declaration) 189
4.0.2 函数定义(Function definition) 189
4.1 函数与结构化程序设计 191
4.1.0 结构化程序设计原则 191
4.1.1 完数问题 191
4.2 作用域和生存期 197
4.2.0 作用域 197
4.2.1 函数名的作用域 197
4.2.2 两种不易被察觉的错误写法 197
4.2.3 局部变量的作用域 198
4.2.4 生存期的概念 199
4.3 递归 202
4.3.0 什么是递归 202
4.3.1 求阶乘 203
4.3.2 求最大公约数 206
4.3.3 Hanoi塔问题 207
4.3.4 关于Hanoi塔的新问题 211
4.4 指向数据对象的指针概述 215
4.4.0 约分问题 215
4.4.1 指向数据对象的指针 217
4.4.2 在递归计数问题中的应用 224
第5章 数组与指针 227
5.0 两个简单的问题 227
5.0.0 摘苹果问题 227
5.0.1 分糖果问题 231
5.1 学会数数 234
5.1.0 翻卡片问题 234
5.1.1 筛法求素数表 236
5.2 向函数传递数组 238
5.2.0 筛法求素数表 238
5.2.1 排序问题 241
5.3 数组名的性质和指针的运算 244
5.3.0 数组名的类型 244
5.3.1 指向数据对象指针的运算 247
5.4 指向虚无的指针及函数形式的宏定义 256
5.4.0 分组问题 256
5.4.1 改进的写法 259
5.4.2 函数形式的宏定义 260
第6章 字符串及数组构成的数组 264
6.0 字符串、字符数组及指向字符的指针 264
6.0.0 字符串及裸串 264
6.0.1 字符串的输入与存储 268
6.1 字符串的常见操作及应用 269
6.1.0 求字符串长度 270
6.1.1 比较两个字符串的大小 271
6.1.2 scanf()函数中的转换 274
6.1.3 字符处理库函数 278
6.2 常用的字符串函数 279
6.2.0 字符串处理库函数 279
6.2.1 sscanf()与sprintf()函数 281
6.2.2 restrict关键字(C99)及memcpy()函数集 281
6.2.3 字符串转换库函数 282
6.3 由数组构成的数组 283
6.3.0 幻方问题 284
6.3.1 由数组构成的数组的数据类型 287
6.3.2 向函数传递由数组构成的数组 291
6.4 main()函数的参数 297
6.4.0 指向指针的指针 297
6.4.1 main()函数的另一种写法 297
6.4.2 求和问题 299
第7章 结构体、共用体及枚举类型 301
7.0 结构体类型 301
7.0.0 输出分数最高的学生信息 301
7.0.1 改进 304
7.0.2 进一步改进 308
7.0.3 成绩统计 311
7.1 共用体类型 315
7.1.0 概述 315
7.1.1 对double类型的解析 316
7.2 位运算 318
7.2.0 求反码 318
7.2.1 输出整数的二进制形式 319
7.2.2 按位异或运算——“^” 321
7.2.3 按位或运算——“|” 322
7.2.4 查找凶手 323
7.2.5 输出二进制形式的数值 324
7.2.6 位段 325
7.3 枚举类型 327
7.3.0 概述 327
7.3.1 球的颜色问题 328
7.4 _Bool类型 330
7.4.0 _Bool类型概述 330
7.4.1 stdbool.h文件 330
第8章 数据类型的深入讨论 332
8.0 指向函数的指针 332
8.0.0 局部排序 332
8.0.1 qsort()库函数的应用 340
8.0.2 bsearch()库函数的应用 344
8.1 复杂数据类型的构造方法和解读 345
8.1.0 复杂数据类型的构造方法 345
8.1.1 复杂数据类型的解读 350
8.1.2 typedef 352
8.2 更自由地使用内存 354
8.2.0 计算100! 354
8.2.1 动态分配内存函数 357
8.2.2 改进的写法 358
8.2.3 用链表解决问题 361
第9章 输入与输出 367
9.0 面向文件的输入与输出 367
9.0.0 把程序输出写入文件 367
9.0.1 C程序怎样读文件 371
9.0.2 格式化输入/输出的格式 372
9.0.3 fprintf()与printf()函数的等效性 377
9.1 文件、流、FILE及FILE * 378
9.1.0 文件 378
9.1.1 流 378
9.1.2 FILE 378
9.1.3 FILE * 379
9.1.4 文本流和二进制流 379
9.1.5 自动打开的流 380
9.1.6 EOF 380
9.1.7 其他几个用于文本文件的输入/输出函数 380
9.2 二进制文件的读/写 381
9.2.0 二进制流 381
9.2.1 用fwrite()函数写二进制文件 382
9.2.2 用fread()函数读二进制文件 383
9.2.3 feof()与ferror()函数 384
9.3 定位问题 385
9.3.0 ftell()函数 386
9.3.1 fseek()函数 386
9.3.2 rewind()函数 386
9.3.3 fgetpos()与fsetpos()函数 386
第10章 程序组织与编译预处理 387
10.0 编译预处理简介 387
10.0.0 预处理的一般特点 387
10.0.1 预处理的几个阶段 388
10.1 文件包含 388
10.1.0 #include预处理命令 388
10.1.1 用途 389
10.2 宏定义与宏替换 389
10.2.0 类似对象的宏 390
10.2.1 类似函数的宏 390
10.2.2 预处理单词 392
10.3 预处理命令的其他话题 393
10.3.0 再谈宏 393
10.3.1 其他预处理命令 395
10.4 使用外部变量 396
10.4.0 外部变量 396
10.4.1 static函数 399
第11章 标准库简介 400
11.0 使用标准库的一些常识 400
11.0.0 标准头与标准头文件 400
11.0.1 使用库的禁忌 401
11.0.2 并存的宏与函数 401
11.0.3 函数定义域问题 402
11.1 对语言的补充 402
11.1.0 stddef.h 402
11.1.1 iso646.h 403
11.1.2 limits.h和float.h 404
11.1.3 stdarg.h 404
11.1.4 stdbool.h(C99) 404
11.1.5 stdint.h(C99) 404
11.2 stdio.h 406
11.2.0 数据类型 406
11.2.1 宏 406
11.2.2 函数 406
11.3 stdlib.h 408
11.3.0 数值转换函数 408
11.3.1 伪随机数序列生成函数 409
11.3.2 内存管理函数 409
11.3.3 环境通信函数 409
11.3.4 查找与排序函数 412
11.3.5 整数算术函数 412
11.3.6 多字节、宽字节字符和字符串转换函数 413
11.4 string.h 413
11.5 数值计算 413
11.5.0 math.h(C89) 413
11.5.1 math.h(C99) 414
11.5.2 complex.h(C99) 418
11.5.3 tgmath.h(C99) 418
11.5.4 fenv.h(C99) 418
附录A C语言的关键字 420
附录B C语言的数据类型 421
附录C ASCII码表 422
附录D C语言的运算符 423
附录E Dev-C++使用简介 424
参考文献 426