内容正文:
7.1、7.2节:模块化程序设计和C语言程序的组成、库函数
C语言程序设计
电子工业出版社
理解模块化程序设计思想,掌握C语言程序的基本组成
掌握函数的定义方法与常用标准库函数的使用
能运用模块化思想编写结构清晰的C语言程序
能调用标准库函数解决简单的输入输出与计算问题
培养“分而治之”的结构化编程思维
建立代码的可读性、可维护性与复用性意识
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:从“乐高积木”到“程序帝国”
思考一下:如何搭建一座城堡?
“随性拼凑”方案
把所有积木混在一起,不做任何规划,东拼一块西凑一块。
结果往往是:结构歪歪扭扭,缺胳膊少腿,不仅不稳固,还很难看,甚至中途就倒塌了。
“科学规划”方案
先在脑海中构思城堡的整体结构,比如塔楼、围墙、大门。
然后按照“先搭地基、再建主体、最后装饰”的顺序,分类使用积木。这,是不是一个更好的主意?
教学导入:乐高积木的启示——模块化思想
💡 积木搭建的智慧
聪明的做法是:先分别搭建好城堡的各个部分——比如坚固的“地基”、高耸的“塔楼”、华丽的“城门”。每个部分都是一个独立、功能明确的模块。最后,再把这些预制好的模块像搭积木一样组合起来,一座宏伟的城堡就诞生了!
🚀 核心思想:模块化程序设计
这种“分而治之,各个击破,最后组合”的思想,就是我们今天要学习的核心。它将复杂的任务拆解为简单的单元,让程序设计变得有序、高效。
教学导入:迁移到编程世界
💡 编程的奇妙隐喻
在编程的宏大宇宙中,一个复杂的软件程序就像一座精密的城堡。而那些实现特定功能、可独立复用的代码块,就是一块块功能强大的“乐高积木”。
我们将这些神奇的“积木”正式命名为:
函数
编写程序的过程,就像搭积木一样充满创造力:调用预先定义好的函数模块,将它们自由组合、层层嵌套,最终构建出实现复杂业务逻辑的功能大厦。
🚀 本课目标:了解模块化程序设计、C语言程序的组成、库函数。
知识讲授
认识“函数”
模块化程序设计和C语言程序的组成
库函数
第一部分
模块化程序设计和C语言程序的组成
知识讲授
知识讲授:了解模块化程序设计
什么是模块化程序设计?
💡核心定义
模块化程序设计是一种软件设计思想,它将一个大型、复杂的程序分解为若干个小的、功能相对独立的模块(即函数)。每个模块负责完成一个特定的子功能,最后通过模块间的调用组合成完整的程序。
CORE PHILOSOPHY / 核心思想
分而治之
DIVIDE AND CONQUER
“把复杂的大问题拆解为简单的小问题,逐个击破”
知识讲授:模块化程序设计的优势
提高代码复用性
将功能封装为独立的模块(函数),可在程序的不同逻辑节点被多次调用。这不仅避免了重复编写冗余代码,还极大地节省了开发与维护的时间成本,提升了编程效率。
💡 生动类比:乐高积木系统
正如乐高的“轮子模块”,无需每次为不同载具重新设计轮子,同一个轮子既可以组装在“汽车模型”上,也可以应用在“飞机模型”上,实现了核心组件的灵活复用。
知识讲授:模块化程序设计的优势
增强代码可读性
每个函数都被赋予了明确的单一功能,通过语义化的函数名就能快速理解其核心作用。此时,主程序不再是杂乱的代码堆砌,而更像一份清晰的“操作流程清单”,让整体逻辑结构一目了然。
核心类比:城堡蓝图
模块化编程就如同绘制一座城堡的蓝图。地基负责承重、塔楼负责瞭望、城门负责通行,每个部分各司其职,结构清晰。程序员在阅读代码时,就像查阅蓝图一样,能迅速定位到特定功能的实现位置。
知识讲授:模块化程序设计的优势
03.便于代码维护与调试
程序出错时,可快速定位至问题模块进行独立修改,互不干扰。只要模块接口保持稳定,修改内部实现逻辑完全不会影响到调用它的其他代码。
💡 形象类比:城堡与塔楼
就像城堡的某个塔楼损坏了,我们只需要针对性地修理这个塔楼即可,完全不需要把整个城堡推倒重建,极大节省了维护成本。
知识讲授:模块化程序设计的优势
支持团队协作
在大型软件项目中,不同的程序员可以负责不同的功能模块,实现任务拆分与并行开发,有效规避代码冲突,显著提升整体开发效率。
趣味类比:建造城堡
就像中世纪建造宏伟的城堡,有人专注于稳固地基,有人负责高耸的塔楼,还有人设计内部的防御结构。分工明确,各尽其职。
并行开发 · 效率倍增
打破代码孤岛,让团队协作更流畅,让大型项目的开发维护变得轻松有序。
知识讲授:C语言程序的基本结构
头文件包含 (`#include`)
引入标准库或自定义的头文件,告诉编译器需要使用哪些外部功能模块。
全局变量声明
定义在所有函数之外的变量,其作用域通常覆盖整个程序,可被多个函数共享。
函数定义 (程序主体)
包含程序的入口 `main()` 函数,以及实现具体功能的若干自定义函数。
代码注释
对代码逻辑的解释说明,不会被编译器执行,但能显著提高代码的可读性。
💡 核心法则:程序的执行总是从 main() 函数开始!
例题分析:计算三个学生的平均分
📝 场景设定
编写一个程序,从控制台输入三个学生的数学成绩(0-100分),程序将自动计算出这三个成绩的平均分,并将最终结果保留两位小数后格式化输出。
💡 探索思路
为了直观感受「模块化编程」的核心优势,我们将分别使用「线性流程」和「函数封装」两种方式来实现该需求。通过对比两种实现的代码结构,深刻体会模块化设计带来的复用性与可读性。
例题分析
程序文本:非模块化的实现方式
#include <stdio.h>
main()
{// 所有功能逻辑混杂在主函数中
float s1, s2, s3, sum, avg;
printf("输入成绩1: ");
scanf("%f", &s1);
printf("输入成绩2: ");
scanf("%f", &s2);
printf("输入成绩3: ");
scanf("%f", &s3);
sum = s1 + s2 + s3;
avg = sum / 3;
printf("平均分: %.2f
", avg); }
代码痛点深度剖析
逻辑高度混杂
输入、计算、输出全部耦合在main函数中,流程不清晰。
代码臃肿冗余
缺乏复用性,新增功能需重复编写相似代码,体积迅速膨胀。
维护扩展困难
牵一发而动全身,修改一处逻辑可能影响整体,排查Bug效率低。
例题分析
例题分析
程序文本:模块化的实现方式
#include<stdio.h>
// 1. 获取成绩模块
float getScore()
{ float s; scanf("%f", &s);
return s; }
// 2. 计算平均分模块
float calcAvg(float a,float b,float c)
{ return (a + b + c) / 3.0; }
main() // 3. 主函数:程序总指挥
{ float s1,s2,s3;
s1=getScore(),s2=getScore(),s3=getScore();
printf("平均分: %.2f", calcAvg(s1,s2,s3));
}
✨ 模块化设计核心优势
逻辑结构清晰
主函数像“目录”,一眼看懂程序执行流程,降低阅读成本。
功能高度内聚
每个函数只做一件事,职责单一,互不干扰,方便单独调试。
系统易于扩展
新增功能只需添加新函数,无需修改原有逻辑,维护更高效。
例题分析
课堂问答
概念题
什么是模块化程序设计?它的核心思想是什么?
模块化程序设计是一种将大型程序分解为若干小的、功能独立的模块(函数)的设计思想。核心思想是“分而治之”。
理解题
相比于将所有代码写在 main 函数中,使用模块化设计有哪些好处?
主要有四个核心优势:提高代码复用性、增强代码可读性、便于后期维护与调试、更好地支持团队并行开发。
辨析题
在 C 语言中,程序的执行总是从 main 函数开始吗?
是的。main 函数是 C 语言程序的唯一入口点,无论程序包含多少个其他函数,其执行流程总是从 main 函数的第一条可执行语句开始。
背诵记忆
模块化程序设计
💡 核心思想
“分而治之”。将复杂的大型程序拆解为若干个功能单一、可独立解决的小模块。
🌟 核心优势
代码复用性高 | 逻辑可读性强
后期维护便捷 | 支持团队协作
C语言程序结构
🧩 基本组成
通常包含:头文件引用、全局变量声明、函数定义以及必要的注释说明。
🚪 唯一入口
main() 函数是程序运行的起点。无论程序包含多少函数,系统只会从main函数开始执行。
函数:功能的封装
📝 函数定义
实现特定功能的独立代码块。通常由“函数头”(声明)和“函数体”(实现)两部分组成。
▶️ 函数调用
在主程序或其他函数中,通过“函数名+参数”的方式,执行该函数所封装的具体功能。
练习题1:以下哪一项不是模块化程序设计的优势?( )
A. 提高代码复用性
B. 使代码更臃肿复杂
C. 便于代码维护
D. 增强代码可读性
答案:B
解析:模块化设计的核心优势就是将复杂的代码分解为简单、独立的模块,从而提高可读性和可维护性,而不是让代码变得臃肿。
课堂练习
练习题2:在C语言程序中,程序的执行入口是哪个函数?( )
A. getScore()
B. main()
C. calculateAverage()
D. printf()
答案:B
解析:main()函数是C程序的唯一入口点,程序的执行总是从main函数开始。
课堂练习
第二部分
知识讲授
库函数
知识讲授
知识讲授:库函数的概念
📚 什么是库函数?
由C语言标准提供的、实现了常用功能(如输入输出、数学计算、字符串处理等)的函数集合。就像程序员的“百宝箱”。
🛠️ 核心使用步骤
01. 引入头文件 (告诉编译器“我要用这个工具”)
stdio.h (IO)
math.h (计算)
string.h (字符)
02. 直接调用:像使用自定义函数一样,传入参数即可使用标准库的强大功能。
知识讲授:#include 命令的使用
核心作用
告诉预处理器,将指定的头文件内容完整插入到当前代码位置,实现代码复用。
系统标准库
#include <file.h>
编译器优先在系统指定的标准库目录中查找文件。
用户自定义
#include "file.h"
优先在当前项目目录查找,未找到再去标准库目录。
⚠️ 特别注意
#include 是预处理命令,不是C语言语句,结尾绝对不要加分号 ;。
图示:头文件包含与依赖关系
知识讲授:输入输出函数 (stdio.h)
printf() · 格式化输出函数
将数据按照指定的格式输出到控制台屏幕上,是C语言程序中最基础、最常用的输出手段。
int age = 20; float h = 1.75f;
// 输出整数 (d: decimal)
printf("年龄:%d 岁
", age);
// 输出浮点数,保留两位小数 (.2f)
printf("身高:%.2f 米
", h);
💡 核心要点:
通过格式控制符(如 %d, %f)来指定输出数据的类型和显示格式。
scanf() · 格式化输入函数
从键盘读取用户输入的数据,并按照指定格式将数据存储到对应的变量内存地址中。
int num1; float num2;
printf("请输入整数和小数: ");
// & 符号是取地址符,必不可少!
scanf("%d %f", &num1, &num2);
printf("你输入的整数是: %d
", num1);
⚠️ 易错警告:
读取普通变量时,变量名前必须加上取地址符 &,否则程序运行会出错!
知识讲授:数学函数 (math.h)
函数名 功能 函数名 功能
sqrt(x) 求x的平方根,x>=0 log(x) 求x的对数,以e(2.71828)为底,x>0
pow(x,y) 求xy log10(x) 求x的对数,以10为底,x>0
exp(x) 求ex sin(x) 求x的正弦,x的单位为弧度
abs(x) 求x的绝对值,x为int型数 cos(x) 求x的余弦,x的单位为弧度
fabs(x) 求x的绝对值,x为doubel型浮点数 tan(x) 求x的正切,x的单位为弧度
rand() 产生0~32767范围内的随机整数
数学函数用于数学计算,调用数学库函数时,要求程序在调用数学库函数前应包含头文件:#include<math.h>
知识讲授:字符串函数 (string.h)
strlen() 计算字符串长度
格式:strlen(字符数组名)
功能:计算字符串的有效字符个数,不包括末尾的结束符 '\0'。
strcpy() 字符串拷贝
格式:strcpy(字符数组名1,字符数组名2)
功能:将字符数组名1 的内容(含 '\0')完整复制到字符数组名2。
strcmp() 字符串比较
格式:strcmp(字符数组名1,字符数组吗2)
功能:比较两个字符串的内容,区分大小写。
strcat() 字符串连接
格式:strcat(字符数组名1,字符数组名2)
功能:将字符数组2中的字符串连接到字符数组1中的字符串后面,并删除字符数组1中字符串后的串结束标志'\0'。
知识讲授:字符函数 (ctype.h)
核心概念:ctype.h 是 C 标准库中专门用于字符分类和转换的头文件,提供了一系列便捷的函数来判断字符类型(如字母、数字)或进行大小写转换,是文本处理中不可或缺的工具。
isalpha(ch)
判断字符 ch 是否为字母
(a-z, A-Z)
isdigit(ch)
判断字符 ch 是否为数字
(0-9)
islower(ch)
判断字符 ch 是否为
小写字母 (a-z)
toupper(ch)
将小写字母 ch 转换为
对应的大写字母
tolower(ch)
将ch字符转换为小写字符
知识讲授:字符函数 (ctype.h)
程序文本
#include <stdio.h>
#include <ctype.h> //调用字符库函数
main()
{ char ch;
printf("请输入一个字符:");
scanf("%c", &ch);
if (isalpha(ch)) //判断是否为字母
{ printf("这是一个字母。
");
if (islower(ch)) //判断是否为小写字母
printf("大写为:%c
",toupper(ch)); //转换为大写字母
}
else if (isdigit(ch)) //判断是否为数字
printf("这是一个数字。
");
else
printf("特殊字符。
"); }
知识讲授:字符函数 (ctype.h)
例题分析:一个简单的“个人信息卡”程序
程序核心功能
引导用户依次输入姓名、年龄和身高数据,程序利用pow()函数自动计算身高的平方值,最终将所有信息格式化输出为一张完整的个人信息卡。
输入 & 输出
数学计算
程序文本
#include<stdio.h>
#include<math.h>
main()
{ char name[50];
// 定义字符数组存储姓名
int age;
float height;
// 定义年龄与身高
scanf("%s%d%f",name,&age,&height);
double h_sq =pow(height,2);
// 计算平方
printf("
===== 信息卡 =====
");
printf("姓名:%s
", name);
printf("年龄:%d 岁
", age);
printf("身高平方:%.4f
",h_sq);
}
例题分析:一个简单的“个人信息卡”程序
例题分析:一个简单的“个人信息卡”程序
输入输出函数应用
熟练运用标准库中的 printf 与 scanf,实现数据的交互输入与结果展示。
数学函数调用
引入 math.h 头文件,直接使用 pow() 等数学函数,高效完成数值计算。
格式化输出技巧
利用格式控制符对输出结果进行排版,使“个人信息卡”展示更美观、清晰。
💡核心思想:站在“巨人”的肩膀上,利用标准库函数提高开发效率。
功能模块可视化示意
背诵记忆
库函数基础
📖 核心定义
C语言标准提供的、预先封装好的通用功能函数,无需重复造轮子。
⚙️ 使用流程
1. 预处理:通过#include引入对应头文件。
2. 调用:在代码中直接使用函数名调用。
常用头文件速查
<stdio.h> 输入输出
核心函数:printf()输出,scanf()输入
<math.h> 数学计算
核心函数:sqrt()开方,pow()次方运算
<string.h> 字符串处理
核心函数:strlen()长度,strcpy()拷贝
避坑关键细节
预处理指令#include结尾不要加分号,它不是C语句。
使用scanf()读取普通变量时,变量名前必须加取地址符&。
使用字符串操作函数时,务必确保目标数组空间足够,防止溢出。
课堂问答
概念题
什么是库函数?使用库函数的前提是什么?
库函数是C语言标准提供的、预先定义好的函数。使用前提是在程序开头通过#include指令包含对应的头文件。
辨析题
strlen("abc") 和 sizeof("abc") 的结果分别是什么?为什么?
strlen返回3,它计算字符个数,不含结束符\0。sizeof返回4,它计算整个字符串所占字节数,包含了末尾的结束符\0。
思考题
为什么scanf读取int/float需加&,而读取字符串(char[])时不需要?
scanf需要变量地址。int/float需用&取地址。而char[]数组名本身就代表了数组首元素的地址,因此不需要再加&符号。
课堂练习
【编程题】功能实现要求
1. 提示用户从控制台输入一个圆的半径 (r)。
2. 调用pow()函数计算面积:面积 = 3.14159 × r²。
3. 调用sqrt()函数计算内接正方形边长:边长 = √(2 × r²)。
4. 格式化输出结果,要求所有数值保留两位小数。
关键提示:
由于需要使用数学库函数,请务必在代码开头包含头文件:#include <math.h>
几何模型参考图
图示:圆的内接正方形及其几何关系
虚线代表正方形的对角线(即圆的直径)
课堂练习
程序文本
// 引入标准输入输出库与数学库
#include<stdio.h>
#include<math.h>
#define PI 3.14159// 定义常量圆周率
main()
{
float radius;// 定义存储半径的变量
printf("请输入圆的半径:");
scanf("%f", &radius);// 获取用户输入
float area = PI * pow(radius, 2);// 计算圆面积
float side = sqrt(2 * pow(radius, 2));// 计算内接正方形边长
printf("圆的面积是:%.2f
", area);
printf("内接正方形的边长是:%.2f
", side);
}
课堂练习
课堂小结
课堂小结
模块化程序设计
核心思想:遵循“分而治之”原则,将复杂的大问题逻辑拆解为若干个独立的小模块。
实现方式:通过开发者自定义函数封装特定功能,在主程序中进行调用。
核心优势:代码复用性强· 逻辑清晰易读 · 便于团队协作与后期维护。
标准库函数
核心逻辑:直接利用C语言标准库提供的“现成工具”,无需重复造轮子。
调用步骤:通过#include包含对应的头文件后,即可在代码中直接调用。
高频头文件:输入输出stdio.h· 数学计算math.h· 字符串处理string.h
💡 核心总结:函数是C语言的核心,是构建复杂程序的基石。
作业布置:
1.预习7.3节 函数得定义与调用。
2.编写程序,从键盘上输入一个数,使用数学函数求出该数的绝对值并输出。
3. 编写程序,从键盘上输入一个角度值,使用数学函数求该角度的正弦值并输出。
课后任务
谢谢观看
THANKS
$