《C语言程序设计》笔记* 潘建瑜 华东师范大学·数学科学学院 2023年3月3日 本笔记仅供课堂教学使用 https://math.ecnu.edu.cn/~jypan
《C 语言程序设计》笔记* 潘建瑜 华东师范大学 • 数学科学学院 2023 年 3 月 3 日 *本笔记仅供课堂教学使用 https://math.ecnu.edu.cn/~jypan
目录 第一讲编程基础 1.1C语言概述 111C语言源程序结构.································· 1 1.1.2C语言源程序书写规范 1.1.3 1.2C语言基础知识.... 1.21C语言字符集,标识符,关键字·。…·。· 1.2.2C语言数据类型 1.2.3 变量与常量 12.4运算与表达式.... 6 1.2.5常用数学函数 1.3C语言格式化输入输出 8 13.1C语言格式化输出..·· 8 1.3.2C语言格式化输入 9 第二讲选择与循环 10 2.1 关系运算与逻辑运算 10 2.2.1IF语句 6 2.2.2 SWITCH结构 23循环结构.·... 23.1WHLE循环. 。 2.3.2 DO WHILE循环 2.3.3 FOR循环 123 2.3.4循环的非正常终止 第三讲数组 li 3.1一维数组 3.2 二维数组。…………… 15 33字符串… 第四讲函数 8 4.1函数的声明、定义与调用 4.2作用域、局部变量与全局变量 21 4.4函数嵌套与递归 23 4.5内联函数 24 第五讲指针 5.1指针的定义与运算
目 录 第一讲 编程基础 1 1.1 C 语言概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 C 语言源程序结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 C 语言源程序书写规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.3 程序编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 C 语言基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.1 C 语言字符集, 标识符, 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.2 C 语言数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.3 变量与常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.4 运算与表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.5 常用数学函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 C 语言格式化输入输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.1 C 语言格式化输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.2 C 语言格式化输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 第二讲 选择与循环 10 2.1 关系运算与逻辑运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 选择结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.1 IF 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.2 SWITCH 结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3 循环结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.1 WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.2 DO WHILE 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.3 FOR 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.4 循环的非正常终止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 第三讲 数组 14 3.1 一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2 二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.3 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 第四讲 函数 18 4.1 函数的声明、定义与调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.2 作用域、局部变量与全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.3 函数间的参数传递 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.4 函数嵌套与递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.5 内联函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 第五讲 指针 25 5.1 指针的定义与运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 ii
目录 。iiⅲ 5.2指针与一维数组 5.3指针与二维数组 5.4指针与函数. 29 5.5特久动态内存分配 5.6应用:矩阵乘积的快速算法 5.6.1 矩阵乘积的普通方法 5.6.2 Strassen万法. 5.7应用:Gauss消去法求解线性方程组 5.71Gaus消去过程 35 5.7.2 选主元Gauss消去法 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 58上机练习..,,..,., 第六讲文件读写操作 6.1文件的打开和关闭 38 6.2文本文件的读写 。。·。”。。·。。4,4。。。”。”。。。。。。””4。·。4 38 6.2.1 0 第七讲预编译处理与多文件结构 71预编译处理………… 72多文件结构 43 http://math.ecnu.edu.cn/-jypan
目 录 · iii · 5.2 指针与一维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.3 指针与二维数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.4 指针与函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.5 持久动态内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.6 应用: 矩阵乘积的快速算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.6.1 矩阵乘积的普通方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.6.2 Strassen 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.7 应用: Gauss 消去法求解线性方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.7.1 Gauss 消去过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.7.2 选主元 Gauss 消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.8 上机练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 第六讲 文件读写操作 38 6.1 文件的打开和关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2 文本文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.2.1 二进制文件的读写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.2.2 其他文件操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 第七讲 预编译处理与多文件结构 42 7.1 预编译处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 7.2 多文件结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.3 编译选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 http://math.ecnu.edu.cn/~jypan
第一讲编程基础 1.1C语言概述 C语言是一门广泛使用的面向过程高级编程设计语言,其语法丰富,且灵活高效,是当前高性能科 学计算和大型软件开发的常用编程语言. ·l972年,贝尔实验室D.Ritchie开发 ·1978年,B.Kernighan和D.Ritchie《C程序设计语言》,被称为K&R标准 。1989年,ANSI C标准形成C89,1990年ISO发布C90 ·1999,IS0正式发布新的标准C99,引入一些新特性,如内联函数 ·2011年,C11标准发布,添加许多新功能,同时修改C99库的某些部分为可选,提高与C+的兼 容性 ·2017年,发布C171C18,是当前标准,仅进行技术更正 1.1.1C语言源程序结构 1#include<stdio.h>/预处理命令,载入头文件 int main()/l主函数 3{ 4 printf("Hello Math!\n");/标准输出 return 0; 6} 。一个C语言源程序由一个或多个源文件组成 ·每个源文件可由一个或多个函数组成: 。一个源程序有且只能有一个main函数,即主函数; ·程序执行从main开始,在main中结束; 。源程序中可以有预处理命令(以“#”开头),通常应放在源文件或源程序的最前面; 1.1.2c语言源程序书写规范 ·每条语句以分号“;”结尾,但预处理命令,函数头和右花括号“}”之后不需要加分号结构除外): ·标识符、关键字之间要有间隔,可以是空格或间隔符(如运算符、括号等): ·C语言区分大小写: 。注释符:/**/(整段注释,称为段注释符),当前的大部分C语言编译器也支持行注释符/1(单行 注释) ·一行可以写多个语句,一个语句也可以分几行书写; ·常用锯齿形书写格式. ·注意:所有标点符号必须在英文状态下输入! 业书写规范的程序建议: 。花括号{}要对齐: ·一行写一个语句,一个语句写一行;
第一讲 编程基础 1.1 C 语言概述 C 语言是一门广泛使用的面向过程高级编程设计语言, 其语法丰富, 且灵活高效, 是当前高性能科 学计算和大型软件开发的常用编程语言. • 1972 年,贝尔实验室 D. Ritchie 开发; • 1978 年,B. Kernighan 和 D. Ritchie《C 程序设计语言》,被称为 K&R 标准; • 1989 年,ANSI C 标准形成 C89,1990 年 ISO 发布 C90 • 1999,ISO 正式发布新的标准 C99,引入一些新特性,如内联函数 • 2011 年, C11 标准发布,添加许多新功能,同时修改 C99 库的某些部分为可选,提高与 C++ 的兼 容性 • 2017 年, 发布 C17/C18,是当前标准,仅进行技术更正 1.1.1 C 语言源程序结构 ✞ ☎ 1 #include <stdio.h> // 预处理命令, 载入头文件 2 int main() // 主函数 3 { 4 printf("Hello Math!\n"); // 标准输出 5 return 0; 6 } ✝ ✆ • 一个 C 语言源程序由一个或多个源文件组成; • 每个源文件可由一个或多个函数组成; • 一个源程序有且只能有一个 main 函数, 即主函数; • 程序执行从 main 开始, 在 main 中结束; • 源程序中可以有预处理命令 (以“#”开头), 通常应放在源文件或源程序的最前面; 1.1.2 C 语言源程序书写规范 • 每条语句以分号“;”结尾, 但预处理命令, 函数头和右花括号“}”之后不需要加分号 (结构除外); • 标识符、关键字之间要有间隔, 可以是空格或间隔符 (如运算符、括号等); • C 语言区分大小写; • 注释符: /* */ (整段注释, 称为段注释符), 当前的大部分 C 语言编译器也支持行注释符 // (单行 注释) • 一行可以写多个语句, 一个语句也可以分几行书写; • 常用锯齿形书写格式. • 注意: 所有标点符号必须在英文状态下输入! K 书写规范的程序建议: • 花括号 { } 要对齐; • 一行写一个语句, 一个语句写一行; 1
2 第一讲编程基础 ·使用TAB编进,有合造的空行,提升程序的可读性; ·有足够的注释 1.1.3程序编译 ·编译器:将“高级语言”翻译为“机器语言”的工具 ·一个现代编译器的主要工作流程: 源代码_编译目标代码链接,可执行程序 ·常见的C/Ct+语言编译器:Visual C+,GNUC++,Intel C++,Clang C/C+等等 ·IDE(Integrated Development Environment集成开发环境):用于程序开发的应用软件,一般包括代码 编辑器、编译器、调试器和图形用户界面等,常用的DE有 ·Visual Studio:由微软开发,适用Windows平台,大而全,有社区版(免费),支持dlang ·DevC+:小巧,免费,Windows平台上的ge,非常适合学习CC+ ·Code:Blocks:开放源码的全功能跨平台集成开发环境,免费; ·Qt Creator:跨平台开发环境,为应用程序开发提供一站式解决方案 ·VS Code+MinGW:微软免费IDE+GCC(微软有配置方法指导) 12C语言基础知识 1.2.1C语言字符集,标识符,关键字 ·合法的字符集有 ()字母:包括大写和小写,共52个: (2)数字:0到9共10个: ()空白符:空格符、制表符、换行符: (④标点符号和特殊字符: +-*/=!#%&()[]{}-~<>八":;·,? ·C语言标识符:用来标识变量名、函数名、对象名等的字符序列. ()由字母、数字、下划线组成,第一个字符必须是字母或下划线 (2)区分大小写,不能用关键字; (3)C语言不限制标识符长度,实际长度与编译器有关,建议不要超过32个字符: (④命名原则:见名知意,不宜混淆 ·分隔符:逗号、冒号、分号、空格、()、{} ·注释符:段注释符,以“/*”开头并以“*”结尾,另外,当前大部分编译器也支持行注释符“/” ·C语言关键字:具有特定意义的字符串,也称为保留字,包括:类型标识符、语句定义符(控制命 令人预处理命令等 http://math.ecnu.edu.cn/-jypan
· 2 · 第一讲 编程基础 • 使用 TAB 缩进, 有合适的空行, 提升程序的可读性; • 有足够的注释. 1.1.3 程序编译 • 编译器: 将“高级语言”翻译为“机器语言”的工具; • 一个现代编译器的主要工作流程: 源代码 编译 −−−−−−→ 目标代码 链接 −−−−−−→ 可执行程序 • 常见的 C/C++ 语言编译器: Visual C++, GNU C++, Intel C++, Clang C/C++ 等等 • IDE (Integrated Development Environment 集成开发环境): 用于程序开发的应用软件,一般包括代码 编辑器、编译器、调试器和图形用户界面等, 常用的 IDE 有 • Visual Studio : 由微软开发, 适用 Windows 平台, 大而全,有社区版(免费),支持 clang. • Dev C++ : 小巧, 免费, Windows 平台上的 gcc, 非常适合学习 C/C++. • Code::Blocks : 开放源码的全功能跨平台集成开发环境, 免费; • Qt Creator : 跨平台开发环境,为应用程序开发提供一站式解决方案 • VS Code + MinGW : 微软免费 IDE + GCC (微软有配置方法指导) 1.2 C 语言基础知识 1.2.1 C 语言字符集, 标识符, 关键字 • 合法的字符集有 (1) 字母: 包括大写和小写, 共 52 个; (2) 数字: 0 到 9 共 10 个; (3) 空白符: 空格符、制表符、换行符; (4) 标点符号和特殊字符: + ‐ * / = ! # % ^ & ( ) [ ] { } _ ~ < > \ ' " : ; . , ? • C 语言标识符: 用来标识变量名、函数名、对象名等的字符序列. (1) 由字母、数字、下划线组成, 第一个字符必须是字母或下划线; (2) 区分大小写, 不能用关键字; (3) C 语言不限制标识符长度, 实际长度与编译器有关, 建议不要超过 32 个字符; (4) 命名原则: 见名知意, 不宜混淆. • 分隔符: 逗号、冒号、分号、空格、( )、{ } • 注释符: 段注释符, 以“/*”开头并以“*/”结尾, 另外, 当前大部分编译器也支持行注释符“//” • C 语言关键字: 具有特定意义的字符串, 也称为保留字, 包括: 类型标识符、语句定义符(控制命 令)、预处理命令等; http://math.ecnu.edu.cn/~jypan