内容正文:
2026年道县优质教学资源评选活动
---第6章数组与函数综合应用《班级身高统计:用C语言实现身高排序》教学设计
作品名称: 第6章 数组与函数综合应用——《班级身高 统计:用C语言实现身高排序》
作品类型: 教学设计
学 校: 永州市工业贸易中等专业学校
姓 名: 何应辉
章 节: 第6章 数组综合实践
课程基本信息
主备人
何应辉
课型
新授课(理实一体化)
学科
计算机专业
C语言程序设计
年级
中职一年级
学段
中职
版本章节
谭浩强《C语言程序设计》第5版
第6章数组综合实践
教学目标
知识目标
1. 理解冒泡排序的基本原理:相邻比较、交换、多趟冒泡。
2. 掌握用双重循环实现数组元素升序排列的方法。
技能目标
1. 能独立编写冒泡排序核心代码,对整数数组进行排序。
2. 学会利用程序进行即时功能验证与调试。
素养目标
1. 体验“问题抽象→算法设计→编码实现→测试验证”的规范流程。
2. 培养严谨的编程习惯,体会编程解决日常生活问题的乐趣。
教学重难点
重点:冒泡排序中相邻比较和交换的动作。
难点:理解为什么需要重复多趟(每趟确定一个最大数),以及内层循环范围递减的意义。
学情分析
教材分析:本课选自谭浩强《C语言程序设计》第5版第6章“数组”。教材在第6.1节引入一维数组的定义和引用,第6.3节介绍冒泡排序。但教材例题要求学生独立编写完整的排序函数,对于刚刚接触数组的中职生难度较大。所以不讲函数,只讲main里面的排序过程;先用手动排队体验一下,再补全关键代码。这样学生更容易接受。不要求学生编写完整函数,符合零基础学生的认知起点。
学生基础:学生已经会定义数组、用 for 循环遍历数组。但是让他们自己写双重循环,很多人会搞不清楚边界。他们动手意愿强,但怕抽象的推导。
对策:这节课不先讲代码。先叫几个学生上来扮演身高卡片,手动比较交换;然后对照着看代码,最后让他们填一个缺了两三行的排序程序。全程不碰函数。
教学方法:
1. 任务驱动法。以“编写程序完成班级身高排序”为总任务,将知识点分散到整节课。避免学生对大段的理论知识有厌学情绪,让学生在完成具体任务的过程中掌握知识,也能提高学生的专注力。
2. 可视化教学法。板书左侧展示手动模拟过程,右侧对应代码,形成图文对照。将抽象代码与具体过程一一对应,便于学生理解和记忆。
教学准备
教师准备:① 编译好“班级身高统计”单文件程序(main.exe),课堂上可直接运行演示;② 准备冒泡排序动画PPT或板书模拟卡片;③ 印制“学生活动纸”(包含一组未排序的身高数字,留出空白让学生手动模拟交换过程)。
学生准备:① 复习for循环的基本语法;② 每人一支笔、一张空白纸(用于手动模拟)。
软硬件环境:教师机安装Windows + Dev-C++(仅教师演示),学生可不用电脑,机房如有则可每人一台观察程序运行。
教学过程
教学环节
教师活动
学生活动
设计意图
1. 情境激发(5分钟)
运行写好的程序,屏幕上显示一堆乱序的身高:165,172,158,180。然后一敲回车,变成从小到大排好。问学生:“如果让你们手动排,你们会怎么排?程序又是怎么做到的?”
学生看运行效果,有人会随口说“比较大小”。我顺着问:“怎么比?比完怎么办?”
不绕弯子,直接看结果,让他们觉得排序有用,也想知道背后的逻辑。
2. 算法体验(15分钟)
不打开代码。先叫四个学生上来,每人拿一张身高卡片(165,172,158,180)。我当裁判,让他们按“相邻两个人比,高的站右边”规则自己交换位置。每完成一趟,我在黑板上记下现在的顺序。问学生:“你们发现没有,每趟做完,最右边的那个人是不是就是剩下里面最高的?”
台上的学生拿着卡片换位置,台下的跟着看热闹也动脑子。最后一起总结:4个人需要比3趟,每一趟比较的次数越来越少。
通过身体活动理解“冒泡”过程,避免直接接触代码的抽象感,很容易理解“冒泡”是怎么回事。
3. 代码映射(15分钟)
打开代码,投影出来。用不同颜色标出三块:外循环(趟数)、内循环(比较次数)、交换那三行。一边指着黑板上的手动记录,一边解释循环变量为什么是 i<n-1 和 j<n-1-i。然后问:“如果我想从大到小排,改哪里?”
学生在座位上看着屏幕,试着在纸上写写 if 的条件应该怎么改。有人会小声说改成 <。
手动体验和代码一一对应,他们就不会觉得双重循环特别抽象。
4. 分层尝试(10分钟)
发“挑战卡”,就是少了比较条件和交换语句的排序代码(代码附在后面)。我说:“你们只要把缺的那几行填对,这个排序程序就能跑。” 有时间就让他们到电脑上打进去运行看看。
学生自己填。大部分能填对。同桌之间可以互相看一眼。
填空比从头写简单多了,但核心逻辑他们亲手补了,印象深。
5. 收尾拓展(5分钟)
我问:“如果学校有1000个学生,用这种方法排序快不快?有没有其他排序方法?” 简单提一下选择排序,让他们课后自己搜一搜。最后5分钟,用板书总结一下冒泡排序的三个关键词:比较、交换、重复。
学生记下来,有些好学的会问“那个选择排序怎么写”。
既总结本课,又留个钩子,为以后学其他排序算法做点铺垫。
板书设计/课堂小结
板书左侧(固定):
冒泡排序手动演示过程(针对4个数字)
初始:165, 172, 158, 180
第1趟:165,158,172,180 (180已到位)
第2趟:158,165,172,180 (172到位)
第3趟:158,165,172,180 (完成)
板书右侧(代码对应):
for(i=0; i<n-1; i++) {
for(j=0; j<n-1-i; j++) {
if(a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
小结:排序就是反复“比较-交换”。外层管几趟,内层管每趟比几次。
教学反思
大部分学生通过手动扮演和看代码,能把冒泡排序的主要步骤说清楚。挑战卡的填空正确率也挺高,不少人填完特别高兴,觉得自己能写排序了。
做得好的地方:没讲函数,就盯着排序本身。学生动手交换卡片那个环节气氛很好,对C程序不太理解的同学也愿意上来试试。
不太满意的地方:最后让学生填完代码上机验证的时间给少了,大概只有10分钟,下次可以把前面的讲解压缩5分钟,留出更多上机演示时间。
下次改进:让学生两人一组,互相检查填空代码,找同桌的错误代码,修改正确。在演示程序里把每一趟排序后的数组都打印出来,能帮助学生理解内层循环边界,也能理解排序算法是怎样工作的。
— - 1 - —
学科网(北京)股份有限公司
附件:
1. 完整教师演示代码(可直接运行)
#include <stdio.h>
int main() {
int a[5] = {165, 172, 158, 180, 170}; // 5个学生身高
int n = 5;
int i, j, temp;
// 输出排序前的数组
printf("排序前:");
for (i = 0; i < n; i++) printf("%d ", a[i]);
printf("
");
// 冒泡排序核心代码
for (i = 0; i < n - 1; i++) { // 趟数
for (j = 0; j < n - 1 - i; j++) { // 每趟比较次数递减
if (a[j] > a[j + 1]) { // 比较
// 交换
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
// 输出排序后的数组
printf("排序后:");
for (i = 0; i < n; i++) printf("%d ", a[i]);
printf("
");
return 0;
}
2. 学生“挑战卡”填空代码
#include <stdio.h>
int main() {
int a[5] = {165, 172, 158, 180, 170};
int n = 5, i, j, temp;
printf("排序前:");
for (i = 0; i < n; i++) printf("%d ", a[i]);
printf("
");
// 冒泡排序(请补全)
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
// 请补全比较条件,使数组升序排列
if (____________) {
// 请补全交换代码(3行)
____________;
____________;
____________;
}
}
}
printf("排序后:");
for (i = 0; i < n; i++) printf("%d ", a[i]);
return 0;
}
参考答案:
比较条件:a[j] > a[j+1]
交换:
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
$