目录
第 1 章 C 语言开发基础 1
1.1 C 语言介绍 1
1.1.1 C 语言的发展历程 1
1.1.2 C 语言的优点 2
1.2 搭建开发环境 2
1.2.1 安装轻量级开发工具Dev-C++ 2
1.2.2 安装 Visual Studio 3
1.3 分析 C 语言程序的结构 4
1.3.1 认识 C 语言程序 5
1.3.2 分析 C 语言程序的具体组成 5
1.3.3 使用 Visual Studio 开发 C 语言程序 6
1.3.4 使用 Dev-C++运行 C 语言程序 8
1.4 技术解惑 8
1.4.1 学习 C 语言有用吗 8
1.4.2 怎样学好 C 语言 9
1.5 常见面试题解析 9
1.6 课后练习 9
第 2 章 C 语言基础语法 10
2.1 标识符和关键字 10
2.2 数据类型 11
2.3 常量和变量 11
2.3.1 常量 12
2.3.2 变量 12
2.4 整型数据 14
2.4.1 整型常量 14
2.4.2 整型变量 16
2.5 实型数据 18
2.5.1 实型常量 18
2.5.2 实型变量 18
2.5.3 实型常量的类型 20
2.6 字符型数据 20
2.6.1 字符常量 20
2.6.2 字符串常量 22
2.6.3 字符变量 22
2.7 整型、实型和字符型数据间的转换 24
2.7.1 自动转换 24
2.7.2 强制转换 25
2.8 技术解惑 25
2.8.1 无符号整型变量和有符号整型变量的定义 25
2.8.2 字符变量的含义 26
2.8.3 如何理解字符型数据的取值范围 26
2.8.4 怎样将带小数点的字符型数据转换成浮点型数据 26
2.8.5 变量的深入分析 27
2.9 常见面试题解析 27
2.10 课后练习 28
第 3 章 运算符和表达式 29
3.1 运算符的种类 29
3.2 算术运算符和算术表达式 30
3.2.1 单目运算符 30
3.2.2 双目运算符 31
3.3 赋值运算符和赋值表达式 31
3.3.1 基本赋值运算符 32
3.3.2 复合赋值运算符 32
3.3.3 赋值表达式 33
3.4 关系运算符和关系表达式 34
3.4.1 关系运算符 34
3.4.2 关系表达式 34
3.5 逻辑运算符和逻辑表达式 35
3.5.1 逻辑运算符 35
3.5.2 逻辑表达式 35
3.6 逗号运算符和逗号表达式 37
3.6.1 逗号运算符 37
3.6.2 逗号表达式 37
3.7 求字节数的运算符 38
3.8 运算符的优先级 39
3.9 技术解惑 39
3.9.1 少数运算符在规定表达式中的求值顺序 39
3.9.2 在 C 语言中是否可以进行混合运算 40
3.9.3 在一个逻辑条件语句中常数项永远在左侧 40
3.9.4 赋值处理的自动类型转换 40
3.10 常见面试题解析 41
3.11 课后练习 42
第 4 章 输入和输出 43
4.1 初步认识 C 语句 43
4.1.1 C 语句简介 43
4.1.2 赋值语句 44
4.2 数据的输入和输出 45
4.2.1 putchar 函数 45
4.2.2 getchar 函数 46
4.2.3 printf 函数 47
4.2.4 scanf 函数 50
4.2.5 puts 函数 53
4.2.6 C11 标准函数 gets_s 54
4.3 技术解惑 54
4.3.1 scanf 函数和gets_s 函数的区别 54
4.3.2 C 语言的输入和输出问题 55
4.4 常见面试题解析 55
4.5 课后练习 56
第 5 章 流程控制 57
5.1 顺序结构 57
5.2 选择结构 58
5.2.1 单分支结构 58
5.2.2 双分支结构 59
5.2.3 多分支结构 61
5.2.4 条件运算符和条件表达式 63
5.3 循环结构 64
5.3.1 for 语句 64
5.3.2 while 语句 65
5.3.3 do while 语句 ..................... 67
5.3.4 goto 语句 67
5.3.5 break 语句和 continue语句 68
5.3.6 死循环/退出程序 69
5.4 技术解惑 70
5.5 常见面试题解析 71
5.6 课后练习 72
第 6 章 数组和字符串 73
6.1 一维数组 73
6.1.1 定义一维数组 73
6.1.2 引用一维数组的元素 73
6.1.3 初始化一维数组 74
6.2 多维数组 75
6.2.1 二维数组的用法 75
6.2.2 多维数组的用法 78
6.3 字符数组与字符串 80
6.3.1 字符数组 80
6.3.2 字符串与字符数组 80
6.3.3 字符数组的输入和输出 81
6.4 字符串处理函数 83
6.4.1 返回字符串长度的函数 83
6.4.2 字符串大小写转换函数 83
6.4.3 字符串复制函数 84
6.4.4 字符串比较函数 85
6.4.5 字符串连接函数 86
6.4.6 将字符串转换成数值的函数 87
6.5 字符处理函数 88
6.5.1 字符检测函数 88
6.5.2 字符大小写转换函数 89
6.6 技术解惑 90
6.6.1 C 语言对数组的处理非常有效吗 90
6.6.2 初始化一维数组的注意事项 90
6.7 常见面试题解析 91
6.8 课后练习 92
第 7 章 函数 93
7.1 函数的基础知识 93
7.1.1 函数的分类 93
7.1.2 函数的定义 94
7.2 函数声明和函数原型 95
7.2.1 函数声明 96
7.2.2 函数原型 96
7.3 函数的参数 96
7.3.1 形参和实参 97
7.3.2 以数组名作为函数的参数 97
7.3.3 以数组作为函数的参数 99
7.4 函数的返回值 100
7.5 函数的调用 102
7.5.1 函数调用的格式 102
7.5.2 函数调用的方式 102
7.5.3 被调函数的声明方式 103
7.6 函数的嵌套调用和递归调用 104
7.6.1 函数的嵌套调用 104
7.6.2 函数的递归调用 106
7.7 变量的作用域和存储类型 108
7.7.1 变量的作用域 108
7.7.2 变量的存储类型 111
7.8 内部函数和外部函数 114
7.8.1 内部函数 114
7.8.2 外部函数 115
7.9 库函数 116
7.10 技术解惑 117
7.10.1 确保函数的声明和定义是静态的 117
7.10.2 说明函数的时机 117
7.10.3 如果一个函数没有返回值,是否需要加上 return 语句 118
7.10.4 exit 函数和return语句的差异 118
7.11 常见面试题解析 118
7.12 课后练习 119
第 8 章 指针 121
8.1 基本概念 121
8.2 变量的指针和指向变量的指针变量 122
8.2.1 声明指针变量 122
8.2.2 指针变量的初始化 122
8.2.3 指针变量的引用 123
8.2.4 关于指针运算符的说明 124
8.2.5 指针变量的运算 125
8.2.6 以指针变量作为函数参数 126
8.2.7 void 类型的指针 128
8.3 指针和数组 129
8.3.1 数组元素的指针 130
8.3.2 指向一维数组元素的指针变量 131
8.3.3 通过指针引用数组元素 131
8.3.4 以数组名作为函数参数 134
8.4 指针和多维数组 136
8.4.1 多维数组的地址 136
8.4.2 指向多维数组的指针变量 138
8.5 指针和字符串 140
8.5.1 用指针访问字符串 140
8.5.2 以字符串指针作为函数参数 141
8.5.3 字符指针变量与字符数组的区别 142
8.6 指针数组和多级指针 143
8.6.1 指针数组 143
8.6.2 多级指针的定义和应用 144
8.6.3 指向指针的指针变量 146
8.6.4 main 函数的参数 146
8.7 指针函数和函数指针 147
8.7.1 指针函数 147
8.7.2 函数指针 147
8.8 技术解惑 150
8.8.1 初始化指针时的注意事项 150
8.8.2 为指针赋值时的注意事项 151
8.8.3 当指针用于数组时的注意事项 151
8.8.4 使用指针时的常见错误 152
8.9 常见面试题解析 152
8.10 课后练习 154
第 9 章 结构体、共用体和枚举 155
9.1 结构体 155
9.1.1 定义结构体 155
9.1.2 定义结构体变量 156
9.1.3 引用结构体变量 157
9.1.4 初始化结构体变量 158
9.2 结构体数组 159
9.2.1 定义结构体数组 160
9.2.2 初始化结构体数组 161
9.2.3 引用结构体数组 162
9.3 结构体指针变量 163
9.3.1 定义结构体指针变量 163
9.3.2 初始化结构体指针变量 164
9.3.3 引用结构体指针变量 164
9.3.4 指向结构体变量的指针 165
9.3.5 指向结构体数组的指针变量 166
9.4 在函数中使用结构体 166
9.4.1 将结构体变量的值传递给另一个函数 166
9.4.2 函数返回结构体类型的值 167
9.5 共用体 168
9.5.1 定义共用体和共用体变量 169
9.5.2 引用共用体变量 169
9.6 枚举 171
9.6.1 定义枚举类型 171
9.6.2 定义枚举变量 172
9.6.3 引用枚举变量 172
9.7 使用 typedef 定义类型 173
9.7.1 类型定义符typedef的基础知识 173
9.7.2 使用 typedef 175
9.8 技术解惑 175
9.8.1 可以省略结构名吗 175
9.8.2 是否可以定义一种通用数据类型以存储任意类型的数据 175
9.8.3 结构体和共用体的区别 176
9.8.4 定义结构体的问题 177
9.9 常见面试题解析 177
9.10 课后练习 178
第 10 章 链表 179
10.1 动态内存分配 179
10.1.1 动态内存分配的作用 179
10.1.2 实现动态内存分配及管理的方法 179
10.2 使用链表 182
10.2.1 链表简介 182
10.2.2 单向链表 184
10.2.3 创建链表 186
10.2.4 删除链表 186
10.2.5 在链表中插入节点 186
10.2.6 在链表中删除节点 187
10.2.7 双向链表 188
10.2.8 循环链表 188
10.3 技术解惑 188
10.4 常见面试题解析 189
10.5 课后练习 190
第 11 章 位运算 191
11.1 位运算符和位运算 191
11.1.1 按位与运算符 191
11.1.2 按位或运算符 192
11.1.3 按位异或运算符 193
11.1.4 取反运算符 193
11.1.5 左移运算符 194
11.1.6 右移运算符 194
11.1.7 位运算的应用实例 194
11.2 位域 196
11.2.1 位域的定义和位域变量的说明 196
11.2.2 位域的使用 197
11.3 技术解惑 197
11.3.1 从某个数中取出指定的某些位 197
11.3.2 位域的内存对齐原则 198
11.4 常见面试题解析 198
11.5 课后练习 199
第 12 章 预处理 200
12.1 预处理基础 200
12.2 宏定义 200
12.2.1 不带参数的宏定义 200
12.2.2 带参数的宏定义 202
12.2.3 字符串化运算符 204
12.2.4 并接运算符 205
12.3 文件包含 205
12.4 条件编译 207
12.4.1 #ifdef #else…#endif命令 207
12.4.2 #if defined #else …#endif 命令 208
12.4.3 #ifndef #else…#endif命令 208
12.4.4 #if !defined #else …#endif 命令 208
12.4.5 #ifdef #elif…#elif …#else #endif 命令........ 208
12.5 技术解惑 210
12.5.1 其他预编译指令 210
12.5.2 带参宏和函数的不同 211
12.5.3 预处理的本质 211
12.5.4 多行预处理指令的写法 211
12.6 常见面试题解析 211
12.7 课后练习 212
第 13 章 文件操作 213
13.1 文件基础 213
13.1.1 文件介绍 213
13.1.2 文本文件 213
13.1.3 文件指针 214
13.2 文件的打开与关闭 214
13.2.1 打开文件 214
13.2.2 关闭文件 216
13.3 文件读写函数 217
13.3.1 字符读写函数 218
13.3.2 字符串读写函数 219
13.3.3 格式化读写函数 221
13.3.4 数据块读写函数 222
13.3.5 其他读写函数 223
13.4 文件的随机读写 224
13.4.1 fseek 函数 225
13.4.2 rewind 函数 226
13.4.3 ftell 函数 226
13.5 文件管理函数 227
13.5.1 删除文件 227
13.5.2 重命名文件 228
13.5.3 复制文件 228
13.6 文件读写状态检测函数 230
13.6.1 feof 函数 230
13.6.2 ferror 函数 230
13.6.3 clearerr 函数 230
13.7 Win32 API 中的文件操作函数 231
13.7.1 创建和打开文件 231
13.7.2 读取、写入和删除文件 232
13.8 技术解惑 233
13.8.1 文件指针是文件内部的位置指针吗 233
13.8.2 fseek 函数的换行问题 233
13.8.3 gets 函数的溢出问题 233
13.8.4 feof 函数会多读一个数据吗 233
13.9 常见面试题解析 234
13.10 课后练习 235
第 14 章 错误处理和程序调试 236
14.1 常见错误分析 236
14.1.1 语法错误 236
14.1.2 逻辑错误(语义错误) 237
14.1.3 内存错误 240
14.2 错误的检出与分离 245
14.3 调试时的注意事项 246
14.3.1 上机前要先熟悉程序的运行环境 246
14.3.2 在编程时要为调试做好准备 246
14.4 技术解惑 247
14.5 常见面试题解析 248
14.6 课后练习 248
第 15 章 内存管理 249
15.1 C 语言中的内存模型 249
15.2 栈和堆 250
15.2.1 栈操作 250
15.2.2 堆操作 250
15.3 动态管理 251
15.3.1 使用函数 malloc 动态分配内存空间 251
15.3.2 使用函数 calloc 分配内存空间并初始化 252
15.3.3 使用函数realloc重新分配内存空间 253
15.3.4 使用函数 free 释放内存空间 254
15.4 常见面试题解析 255
15.5 课后练习 256
第 16 章 学生成绩管理系统 257
16.1 系统总体描述 257
16.1.1 项目开发的目标 257
16.1.2 项目的意义 257
16.1.3 系统功能描述 257
16.2 系统总体设计 258
16.2.1 功能模块设计 258
16.2.2 数据结构设计 260
16.2.3 构成函数介绍 260
16.3 系统的具体实现 262
16.3.1 预处理 262
16.3.2 主函数 262
16.3.3 系统主菜单函数 263
16.3.4 表格显示记录 264
16.3.5 记录查找定位 264
16.3.6 格式化输入数据 265
16.3.7 增加学生记录 265
16.3.8 查询学生记录 266
16.3.9 删除学生记录 267
16.3.10 修改学生记录 268
16.3.11 插入学生记录 269
16.3.12 统计学生记录 270
16.3.13 排序处理 270
16.3.14 存储学生记录 271
第 17 章 人工智能和 AIGC 自动化编程 274
17.1 人工智能介绍 274
17.1.1 人工智能的方向和技术 274
17.1.2 人工智能在生活中的作用 275
17.2 自动化编程和 AIGC 275
17.2.1 自动化编程介绍 275
17.2.2 AIGC 介绍 276
17.2.3 AIGC 和自动化编程的关系 276
17.2.4 常用的 AIGC 自动化编程工具 277
17.3 ChatGPT 278
17.3.1 ChatGPT 的主要特点 278
17.3.2 ChatGPT 在编程方面的功能 278
17.4 Kimi 279
17.4.1 Kimi 的主要特点 279
17.4.2 Kimi 在编程方面的功能 279
第 18 章 AIGC 自动化编程实战 280
18.1 随身学习助手 280
18.1.1 基于 ChatGPT 的学习助手 280
18.1.2 基于 Kimi 的学习助手 281
18.2 代码摘要和解释 282
18.2.1 基于 ChatGPT 的代码摘要和解释 282
18.2.2 基于 Kimi 的代码摘要和解释 282
18.3 代码生成并添加注释 283
18.3.1 基于 ChatGPT 的代码生成和注释 283
18.3.2 基于 Kimi 的代码生成和注释 284
18.4 代码补全 285
18.4.1 基于 ChatGPT 的代码补全 285
18.4.2 基于 Kimi 的代码补全 286
18.5 代码重构和优化 287
18.5.1 基于 ChatGPT 的代码重构和优化 288
18.5.2 基于 Kimi 的代码重构和优化 288
18.6 代码纠错 289
18.6.1 基于 ChatGPT 的代码纠错 290
18.6.2 基于 Kimi 的代码纠错 291
19.1 基于 ChatGPT 实现的背景介绍 292
19.2 基于 Kimi 的需求分析 293
19.3 一个简易版的俄罗斯方块游戏 294
19.4 方块设置和控制 297
19.4.1 设置方块形状 298
19.4.2 方块控制 298
19.5 使用 ChatGPT 增加功能 300
19.5.1 增加方块预览功能 300
19.5.2 增加计分功能 300
19.5.3 增加游戏说明 301
19.6 代码讲解 302
19.6.1 功能总结和技术栈 302
19.6.2 代码剖析 303