c++
2026-10-15 15:54:21
发布于:浙江
C++编程教案(课时01–60)
(陈建华主编)
使用说明:适配绍兴小学生程序设计竞赛,五年级零基础,共60课时,每2课时一份教案,无递归、DP、图论等超纲内容。
统一教案模板:课题|学时:2学时 结构:一、教学目标;二、重难点;三、教学准备;四、教学过程;五、课后作业;六、板书要点
【课时1-2】课题:编程环境搭建 + 基础输出框架
学时:2学时
一、教学目标
- 掌握Dev-C5.11软件新建源码、编译、运行操作;看懂简单报错提示。
掌握C基础代码框架,学会cout输出、endl换行、单行//注释。 - 能够独立编写代码输出指定文字,初步建立代码规范意识。
二、重难点 重点:C基础框架,cout输出语句。 难点:区分中英文符号,看懂编译失败提示。
三、教学准备 机房电脑,Dev-C5.11,课件。
四、教学过程 - 课堂导入(5min) 介绍绍兴市小学生C竞赛,说明C是什么,本节课目标:写出第一行代码,在屏幕上输出文字。
- 新知讲授(30min) 基础代码框架讲解:#include<iostream>头文件、using namespace std;、int main(){}主函数。 cout用于屏幕输出;endl代表换行;//是单行注释,电脑不会执行注释内容。 课堂例题:
#include<iostream>
using namespace std;
int main(){
cout<<"东浦街道中心小学"<<endl;
cout<<"备战绍兴市信息学竞赛"<<endl;
return 0;
}
演示:新建文件,粘贴代码,编译运行;演示中文引号、缺少分号带来的编译错误。强调:所有标点必须英文半角。 - 课堂实操练习(40min) 练习1:输出自己姓名和班级两行文字。 练习2:输出3行星号***。 教师巡场,重点纠正中文符号、漏分号错误。
- 课堂小结(10min) ① 代码固定框架;② cout输出、endl换行;③ 标点必须英文;④ //注释。
- 课后作业 题目:输出4×4星号正方形 参考代码:
#include<iostream>
using namespace std;
int main(){
cout<<""<<endl;
cout<<""<<endl;
cout<<""<<endl;
cout<<""<<endl;
return 0;
} - 板书要点
#include<iostream>
using namespace std;
int main(){
cout<<"内容"<<endl;
return 0;
}
//英文符号!
【课时3-4】课题:变量、输入输出、四则运算|学时:2学时
一、教学目标 - 理解int整型变量含义,学会定义变量、cin读取键盘输入。
- 掌握加减乘除运算、取余%,理解整数除法规则。
- 能够读取两个整数,计算并输出和、差、积、余数。
二、重难点 重点:变量定义、cin输入、四则运算。 难点:区分除法/和取余%,整数除法舍去小数。
三、教学准备 机房电脑,Dev-C++。
四、教学过程 - 课堂导入(5min) 前面只能固定输出文字;本节课学习变量,让程序接收键盘输入,做数学计算。
- 新知讲授(30min) int:整数类型;定义格式int a,b;;cin >> a; 读取键盘输入。 运算符:+ - * / %;%是取余数,只能整数使用。 课堂例题:输入两个数字,输出两数之和
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
演示:输入5 3,输出8;5/2结果是2;5%2余数是1。 - 课堂实操练习(40min) 练习:输入两个整数,分别输出和、差。
- 课堂小结(10min) int定义整数;cin读输入;+ - * / %;%求余数。
- 课后作业 题目:输入两数,输出和、差、积、余数 参考代码:
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
cout<<a-b<<endl;
cout<<a*b<<endl;
cout<<a%b<<endl;
return 0;
} - 板书要点 int a,b; cin>>a>>b;
•
•
• / % %:求余数
【课时5-6】课题:变量交换、复合运算符、单位换算|学时:2学时
一、教学目标 - 学会借助临时变量交换两个变量的值。
- 理解复合运算符 += -= *= /=。
- 完成摄氏温度转华氏温度的单位换算程序。
二、重难点 重点:临时变量交换两个数。 难点:理解变量赋值是“覆盖”,不是数学等式。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 两杯液体互换,需要第三个空杯子;变量交换同理,需要临时变量。
- 新知讲授(30min) 变量交换例题:
#include<iostream>
using namespace std;
int main(){
int a,b,t;
cin>>a>>b;
t=a;a=b;b=t;
cout<<a<<" "<<b<<endl;
return 0;
}
复合运算符:sum += i等价于sum = sum + i。 温度公式:华氏温度 f = c * 9 / 5 + 32。 - 课堂实操练习(40min) 练习:输入两个数字,交换后输出。
- 课堂小结(10min) 交换三步骤:t=a; a=b; b=t;复合运算符简写;温度换算公式。
- 课后作业 题目:输入摄氏温度c,输出华氏温度f 参考代码:
#include<iostream>
using namespace std;
int main(){
int c,f;
cin>>c;
f = c * 9 / 5 + 32;
cout<<f<<endl;
return 0;
} - 板书要点 t=a; a=b; b=t; sum += i; f = c*9/5+32
【课时7-8】课题:关系运算、逻辑运算、if单分支|学时:2学时
一、教学目标 - 掌握关系运算符 > < >= <= == !=。
- 掌握逻辑运算符 && || !。
- 学会if单分支结构:满足条件才执行代码。
二、重难点 重点:if单分支语句。 难点:区分 == 判断相等 和 = 赋值;&&并且,||或者。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 程序不只是计算,还需要做判断,满足条件才执行一段代码。
- 新知讲授(30min) 关系运算;逻辑运算;if(条件){满足条件执行代码} 课堂例题:判断输入数字是否为偶数
#include<iostream>
using namespace std;
int main(){
int x;
cin>>x;
if(x%2==0) cout<<"even"<<endl;
return 0;
}
强调:判断相等必须写两个等号 ==。 - 课堂实操练习(40min) 练习:输入数字,如果大于10则输出big。
- 课堂小结(10min) if(条件){代码};==判断;&&并且,||或者。
- 课后作业 题目:输入年龄age,如果大于12输出old enough 参考代码:
#include<iostream>
using namespace std;
int main(){
int age;
cin>>age;
if(age>12){
cout<<"old enough"<<endl;
}
return 0;
} - 板书要点
< >= <= == != && 并且 || 或者 if(条件){ ... }
【课时9-10】课题:if-else双分支结构|学时:2学时
一、教学目标 - 掌握if-else二选一结构。
- 实现正负判断、两数取最大值。
二、重难点 重点:if-else,条件成立执行if,不成立执行else。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 单分支只有满足条件才执行;双分支:二选一,必定执行其中一段。
- 新知讲授(30min) 课堂例题:两数求最大值
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
if(a>b) cout<<a;
else cout<<b;
return 0;
} - 课堂实操练习(40min) 练习:输入数字,判断奇偶。
- 课堂小结(10min) if(条件){成立执行}else{不成立执行}
- 课后作业 题目:输入x,正数输出positive,否则negative 参考代码:
#include<iostream>
using namespace std;
int main(){
int x;
cin>>x;
if(x>0) cout<<"positive"<<endl;
else cout<<"negative"<<endl;
return 0;
} - 板书要点 if(){ }else{ }
【课时11-12】课题:多分支if-else if|学时:2学时
一、教学目标 - 掌握if-else if多分支分段判断。
- 完成季节判断、成绩等级划分。
二、重难点 重点:if-else if顺序判断。 难点:判断顺序,从上往下匹配,命中即退出。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 超过两种情况判断,使用多分支if-else if。
- 新知讲授(30min) 课堂例题:成绩等级判断
#include<iostream>
using namespace std;
int main(){
int score;
cin>>score;
if(score>=90) cout<<"A";
else if(score>=80) cout<<"B";
else if(score>=70) cout<<"C";
else if(score>=60) cout<<"D";
else cout<<"E";
return 0;
} - 课堂实操练习(40min) 练习:输入月份,判断春夏秋冬。
- 课堂小结(10min) 从上依次判断,匹配成功就不再往下判断。
- 课后作业 题目:输入月份,输出spring/summer/autumn/winter 参考代码:
#include<iostream>
using namespace std;
int main(){
int m;
cin>>m;
if(m3||m4||m5) cout<<"spring";
else if(m6||m7||m8) cout<<"summer";
else if(m9||m10||m==11) cout<<"autumn";
else cout<<"winter";
return 0;
} - 板书要点 if(){ }else if(){ }else{ }
【课时13-14】课题:switch分支 + 程序调试|学时:2学时
一、教学目标 - 掌握switch语句,理解case穿透现象和break作用。
- 学会简单调试,查找代码错误。
二、重难点 重点:break防止case穿透。 难点:忘记break带来的连续输出bug。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 固定整数选项判断,可以使用switch。
- 新知讲授(30min) 展示错误代码,运行观察case穿透;增加break。 改正后课堂例题:
#include<iostream>
using namespace std;
int main(){
int day;
cin>>day;
switch(day){
case 1:cout<<"Monday";break;
case 2:cout<<"Tuesday";break;
case 3:cout<<"Wednesday";break;
case 4:cout<<"Thursday";break;
case 5:cout<<"Friday";break;
case 6:cout<<"Saturday";break;
case 7:cout<<"Sunday";break;
}
return 0;
}
讲解:缺少break会继续执行后面case。 - 课堂实操练习(40min) 练习:输入数字1~4,输出对应方向。
- 课堂小结(10min) switch匹配case;每个case末尾加break,防止穿透。
- 课后作业 题目:改错,给星期switch代码加上break。
- 板书要点 switch(变量){ case 值:语句;break; }
【课时15-16】课题:while循环结构|学时:2学时
一、教学目标 - 理解while循环:先判断条件,条件成立反复执行。
- 掌握循环累加、计数,实现1~n求和。
二、重难点 重点:while循环结构。 难点:循环变量更新,忘记i++造成死循环。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) 重复执行相同代码,使用循环,不用重复抄写代码。
- 新知讲授(30min) 课堂例题:1~100求和
#include<iostream>
using namespace std;
int main(){
int i=1,sum=0;
while(i<=100){
sum+=i;
i++;
}
cout<<sum;
return 0;
}
重点:sum初始化为0;循环体内i++更新变量。 - 课堂实操练习(40min) 练习:while求1~n奇数和。
- 课堂小结(10min) while(条件){循环体};记得更新循环变量,防止死循环。
- 课后作业 题目:输入n,while求1~n累加和 参考代码:
#include<iostream>
using namespace std;
int main(){
int n,i=1,sum=0;
cin>>n;
while(i<=n){
sum += i;
i++;
}
cout<<sum<<endl;
return 0;
} - 板书要点 i=1;sum=0; while(i<=n){ sum+=i; i++; }
【课时17-18】课题:for循环与简单图案输出|学时:2学时
一、教学目标 - 掌握for循环三要素:初始化,条件,变量更新。
- 嵌套for循环入门,输出星号方阵。
二、重难点 重点:for循环写法。 难点:嵌套循环,外层控制行,内层控制列。
三、教学准备 机房电脑。
四、教学过程 - 课堂导入(5min) for循环更适合知道循环次数的场景。
- 新知讲授(30min) 课堂例题:5行5列星号方阵
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++) cout<<"*";
cout<<endl;
}
return 0;
}
外层i:行数;内层j:每行的星号。 - 课堂实操练习(40min) 练习:3行6列星号矩形。
- 课堂小结(10min) for(初始;条件;更新){};嵌套循环:外层行,内层列。
- 课后作业 题目:输入n,输出n行n列星号方阵 参考代码:
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<"*";
}
cout<<endl;
}
return 0;
} - 板书要点 for(i=1;i<=n;i++) 外层行,内层列
【课时19-20】课题:do-while循环 + 阶段一测试|学时:2学时
一、教学目标 - 掌握do-while循环:先执行一次,再判断条件。对比while、for三种循环区别。
- 阶段一综合测试,查漏补缺。
二、重难点 重点:do while至少执行一次。 难点:三种循环适用场景区分。
三、教学准备 机房电脑、阶段一试卷。
四、教学过程 - 课堂导入(5min) while先判断后执行;do while先执行,后判断。
- 新知讲授(20min) 课堂例题:循环输入数字直到输入0停止
#include<iostream>
using namespace std;
int main(){
int x;
do{
cin>>x;
cout<<"You input: "<<x<<endl;
}while(x!=0);
return 0;
} - 阶段测试(50min):阶段一测试卷,限时完成。
- 试卷讲评(15min),收集错题。
- 课后作业 题目:不断输入整数,输入0停止,统计非0数字个数 参考代码:
#include<iostream>
using namespace std;
int main(){
int x,cnt=0;
do{
cin>>x;
if(x!=0) cnt++;
}while(x!=0);
cout<<cnt<<endl;
return 0;
} - 板书要点 do{代码}while(条件); do while:至少跑一次。
【课时21-22】课题:一维数组基础|学时:2学时
一、教学目标 - 理解一维数组作用:存放一批同类型数据,学习数组定义,下标从1开始。
- 掌握数组循环读入、遍历输出。
- 能用数组存储多个成绩,计算总分。
二、重难点 重点:数组定义,循环读写数组元素。 难点:理解数组下标,区分数组名和下标;记住我们统一下标从1开始。
三、教学准备 机房电脑,Dev-C++5.11
四、教学过程 - 课堂导入(5min) 前面变量一次只能存1个数字;如果有6个、20个学生成绩,定义一堆变量很麻烦。数组可以一次性存放一组整数。
- 新知讲授(30min) 定义格式 int a[10]; 代表数组a最多存10个int;我们习惯使用 a[1],a[2]...,不用a[0]。 循环读入数组 + 遍历输出。 课堂例题:读入5个数字,依次输出
#include<iostream>
using namespace std;
int main(){
int a[10];
for(int i=1;i<=5;i++) cin>>a[i];
for(int i=1;i<=5;i++) cout<<a[i]<<" ";
return 0;
} - 课堂实操练习(40min) 练习:输入4个数字存入数组,逐个输出。
- 课堂小结(10min) 数组保存一组相同类型数据;定义时括号内写最大容量;循环读写;本课程下标从1开始。
- 课后作业 题目:输入6个学生分数,计算并输出总分
#include<iostream>
using namespace std;
int main(){
int a[10];
int sum=0;
for(int i=1;i<=6;i++){
cin>>a[i];
sum += a[i];
}
cout<<sum<<endl;
return 0;
} - 板书要点 int a[数组大小]; a[1],a[2]... 循环读入,循环遍历 sum累加,初始sum=0
【课时23-24】课题:数组最值与统计|学时:2学时
一、教学目标 - 掌握在数组中查找最大值、最小值的算法思路。
- 学会遍历数组,统计满足条件的数据个数。
- 理解最值变量初始化方法:赋值为数组第一个元素,不能直接写0。
二、重难点 重点:找最值的流程。 难点:最值初始化,负数数据场景下直接写0会出错。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 存好一组成绩后,竞赛题常问最高分、最低分。今天学习遍历数组找最值。
- 新知讲授(30min) 思路:先拿第一个数当做当前最值;依次拿后面每一个数字和当前最值比较,如果更大/更小就更新最值。 课堂例题:数组找最大值
#include<iostream>
using namespace std;
int main(){
int n,a[20];
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int maxx=a[1];
for(int i=2;i<=n;i++) if(a[i]>maxx) maxx=a[i];
cout<<maxx;
return 0;
} - 课堂实操练习(40min) 练习:输入n个数字,找出最小值。
- 课堂小结(10min) 最值初始化为数组第1项;循环逐个比较,满足条件更新最值。
- 课后作业 题目:输入n个成绩,输出最低分
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[20];
for(int i=1;i<=n;i++) cin>>a[i];
int minn = a[1];
for(int i=2;i<=n;i++){
if(a[i]<minn) minn = a[i];
}
cout<<minn<<endl;
return 0;
} - 板书要点 maxx = a[1]; for(i=2;i<=n;i++) if(a[i]>maxx) maxx=a[i];
【课时25-26】课题:冒泡排序(市赛必考)|学时:2学时
一、教学目标 - 理解冒泡排序原理:相邻两个数字比较,逆序就交换,每一轮把最大的“冒泡”到后面。
- 掌握冒泡排序代码实现,实现从小到大排序。
- 读懂双重循环:外层控制轮数,内层相邻比较。
二、重难点 重点:冒泡排序代码框架。 难点:内层循环边界;理解每一轮确定一个最大数。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 一组杂乱数字,需要从小到大排列,市赛高频考点。冒泡排序就像水里气泡,大数慢慢浮到末尾。
- 新知讲授(30min) 演示排序过程:每一轮相邻比较,前面比后面大就交换。 课堂例题:冒泡排序演示
#include<iostream>
using namespace std;
int main(){
int a[10]={0,7,2,9,1,5};
int n=5;
for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-i;j++)
if(a[j]>a[j+1]){int t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
} - 课堂实操练习(40min) 练习:输入5个数字,冒泡升序排序输出。
- 课堂小结(10min) 外层n-1轮;内层j<=n-i;相邻逆序交换;下标从1开始。
- 课后作业 题目:输入n个数,从小到大排序输出
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[20];
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-i;j++){
if(a[j]>a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
} - 板书要点 冒泡:相邻比较,大的往后移 for(i=1;i<=n-1;i++) for(j=1;j<=n-i;j++) if(a[j]>a[j+1])交换
【课时27-28】课题:字符与字符串处理|学时:2学时
一、教学目标 - 认识char字符数组保存字符串;掌握#include<cstring>头文件。
- 使用strlen获取字符串长度;遍历字符串每个字符。
- 判断字符范围,统计数字、字母数量。
二、重难点 重点:char数组,strlen函数。 难点:字符串下标从0开始(和int数组不一样,注意区分)。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 前面处理数字;竞赛还有一类题目:读入一串文字,统计里面字母、数字个数,用字符数组。
- 新知讲授(30min) char s[100]; 存放字符串;strlen(s)得到有效字符个数;字符串下标从0开始。 课堂例题:字符串遍历输出每个字符
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[100];
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++) cout<<s[i]<<endl;
return 0;
} - 课堂实操练习(40min) 练习:输入一串字符,统计大写字母个数。
- 课堂小结(10min) 字符串用char数组;必须引入cstring;strlen求长度;字符串下标0开始。
- 课后作业 题目:输入字符串,统计其中数字数量
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[100];
cin>>s;
int cnt=0;
int len = strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='0' && s[i]<='9') cnt++;
}
cout<<cnt<<endl;
return 0;
} - 板书要点
#include char s[100]; len=strlen(s); 字符判断:'0''9' 'A''Z'
【课时29-30】课题:自定义函数(gcd最大公约数)|学时:2学时
一、教学目标 - 理解自定义函数:封装一段可重复使用代码;学会函数参数、返回值。
- 掌握辗转相除法求最大公约数gcd。
- 公式:lcm(a,b)=a*b/gcd(a,b),求最小公倍数。
二、重难点 重点:函数定义、return返回值。 难点:辗转相除法逻辑。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 有些代码会反复使用,比如求最大公约数。把代码打包成函数,需要时直接调用。
- 新知讲授(30min) 函数写在main外面;参数传入,return返回结果。辗转相除法:不断取余直到余数为0。 课堂例题:求两个数最大公约数
#include<iostream>
using namespace std;
int gcd(int a,int b){
while(b!=0){
int t = a%b;
a = b;
b = t;
}
return a;
}
int main(){
int x,y;
cin>>x>>y;
cout<<gcd(x,y);
return 0;
} - 课堂实操练习(40min) 练习:调用gcd函数,求最小公倍数。
- 课堂小结(10min) 函数定义在main外面;return返回结果;辗转相除法求gcd。
- 课后作业 题目:输入两个整数,输出最小公倍数
#include<iostream>
using namespace std;
int gcd(int a,int b){
while(b!=0){
int t = a%b;
a = b;
b = t;
}
return a;
}
int main(){
int x,y;
cin>>x>>y;
int lcm = x * y / gcd(x,y);
cout<<lcm<<endl;
return 0;
} - 板书要点 int gcd(int a,int b){ while(b!=0){t=a%b;a=b;b=t;} return a; } lcm = x*y/gcd(x,y)
【课时31-32】课题:枚举算法基础|学时:2学时
一、教学目标 - 理解枚举思想:把所有可能情况全部列举,逐个判断是否符合条件。
- 学会用for循环实现枚举,解决简单数学枚举题。
- 掌握枚举范围的确定,减少无效循环。
二、重难点 重点:枚举思路,循环列举所有可能性。 难点:合理确定枚举上下限,避免超时。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 很多竞赛题目没有直接计算公式,可以把所有可能答案一个个试一遍,找到满足条件的解,这就是枚举。
- 新知讲授(30min) 例题:找出1~100内所有能同时被3和5整除的数字。
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=100;i++){
if(i%30 && i%50){
cout<<i<<" ";
}
}
return 0;
}
讲解:循环i从1到100,逐个判断条件,满足就输出。
3. 课堂实操练习(40min) 练习:枚举1~50之间所有偶数。
4. 课堂小结(10min) 枚举:列出全部可能;if筛选符合条件的答案;确定循环边界。
5. 课后作业 题目:枚举1~200,输出所有7的倍数
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=200;i++){
if(i%7==0) cout<<i<<" ";
}
return 0;
}
6. 板书要点 for(枚举变量;范围;++) if(条件) 输出答案
【课时33-34】课题:模拟算法入门|学时:2学时
一、教学目标
- 理解模拟算法:按照题目描述,一步一步用代码复现整个过程。
- 读懂模拟类题目,提取操作步骤,转化为顺序/循环代码。
- 训练读题能力,区分输入、输出、中间变量。
二、重难点 重点:读懂题意,把文字描述转化为代码步骤。 难点:不漏掉题目中的细节条件。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 有些题目不需要复杂公式,只要严格照着题目的描述一步步模拟操作即可得到结果,这类就是模拟题,市赛占比很高。
- 新知讲授(30min) 例题:小球反弹。一个小球从10米高处落下,每次落地反弹高度为原来一半,求第5次落地时一共经过多少米。
#include<iostream>
using namespace std;
int main(){
double h=10,sum=10;
for(int i=2;i<=5;i++){
h /=2;
sum += 2*h;
}
cout<<sum;
return 0;
} - 课堂实操练习(40min) 练习:模拟存钱,每年本金增加20%,初始100元,计算5年后总金额。
- 课堂小结(10min) 模拟核心:跟着题目流程走;仔细读题,抓住每一步变化。
- 课后作业 题目:杯子倒水模拟,A杯有100ml,B杯40ml,每次A倒20ml到B,循环直到A少于20ml,输出A、B最终水量。
#include<iostream>
using namespace std;
int main(){
int a=100,b=40;
while(a>=20){
a -=20;
b +=20;
}
cout<<a<<" "<<b;
return 0;
} - 板书要点 模拟=复刻题目过程 变量记录状态,循环更新
【课时35-36】课题:贪心算法入门|学时:2学时
一、教学目标 - 理解贪心思想:每一步都做当前最优选择,希望得到全局最优解。
- 掌握贪心适用场景:硬币找零(面额为倍数关系)。
- 区分贪心可以解决和不能解决的场景。
二、重难点 重点:局部最优策略。 难点:判断题目是否适合贪心算法。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 找零钱的时候,优先拿面值最大的硬币,减少硬币总个数,这就是贪心思路。
- 新知讲授(30min) 例题:硬币面额1元、5元、10元、20元,输入金额,求最少硬币数量。
#include<iostream>
using namespace std;
int main(){
int money,cnt=0;
cin>>money;
int coin[5]={0,20,10,5,1};
for(int i=1;i<=4;i++){
while(money>=coin[i]){
money -= coin[i];
cnt++;
}
}
cout<<cnt;
return 0;
} - 课堂实操练习(40min) 练习:用贪心策略,切割木棍,优先切最长段。
- 课堂小结(10min) 贪心:每一步选当前最好;不一定所有题目都适用。
- 课后作业 题目:金额67元,硬币20、10、5、1,计算最少硬币数。
#include<iostream>
using namespace std;
int main(){
int money=67,cnt=0;
int coin[5]={0,20,10,5,1};
for(int i=1;i<=4;i++){
while(money>=coin[i]){
money -= coin[i];
cnt++;
}
}
cout<<cnt;
return 0;
} - 板书要点 贪心:局部最优 优先选最大/最优选项
【课时37-38】课题:二维数组基础|学时:2学时
一、教学目标 - 理解二维数组:表格形式,行和列;定义int a[10][10],行下标、列下标从1开始。
- 掌握双重循环读入、遍历二维数组。
- 能够求矩阵每行的和。
二、重难点 重点:二维数组读写,双重循环。 难点:区分行、列循环变量。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 一维数组是一排数字;二维数组是一张表格,适合存储棋盘、成绩表。
- 新知讲授(30min) 例题:3行3列二维数组读入,原样输出。
#include<iostream>
using namespace std;
int main(){
int a[10][10];
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
} - 课堂实操练习(40min) 练习:4行2列成绩表,输出每一行总分。
- 课堂小结(10min) 二维数组是表格;i代表行,j代表列;双重for循环读写。
- 课后作业 题目:3行4列矩阵,求每一行数字之和
#include<iostream>
using namespace std;
int main(){
int a[10][10];
for(int i=1;i<=3;i++){
for(int j=1;j<=4;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=3;i++){
int sum=0;
for(int j=1;j<=4;j++) sum+=a[i][j];
cout<<sum<<endl;
}
return 0;
} - 板书要点 int a[行][列]; i行,j列 双层循环:i外层,j内层
【课时39-40】课题:读题训练+阶段二综合练习|学时:2学时
一、教学目标 - 训练信息学竞赛读题技巧,圈出输入输出、数据范围、特殊条件。
- 阶段二知识点综合训练:数组、函数、枚举、模拟。
- 规范代码书写习惯,排查常见bug。
二、重难点 重点:读题,抓题目关键条件。 难点:审题漏条件,边界数据考虑不全。
三、教学准备 机房电脑,阶段二练习题单。
四、教学过程 - 课堂导入(5min) 竞赛里,读错题目比不会写代码失分更多,本节课重点训练读题能力,综合复习阶段二知识。
- 新知讲授(20min) 读题三步法:①看输入输出;②标记限制条件;③构思算法(枚举/模拟/数组)。展示典型错题分析。
- 综合上机练习(50min),教师巡场答疑。
- 习题讲评(15min),整理错题本。
- 课后作业 综合习题:数组统计+枚举小题2道。
- 板书要点 读题三步:输入输出→限制→选算法 边界数据测试!
【课时41-42】课题:查找算法:顺序查找|学时:2学时
一、教学目标 - 掌握顺序查找:从头到尾遍历数组,查找目标值。
- 学会标记是否找到,记录目标所在位置。
- 理解查找失败的处理方式。
二、重难点 重点:顺序查找代码框架。 难点:找到目标后及时退出循环,处理找不到的情况。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 在一堆数字里面,寻找某个指定数字,可以逐个依次比对,也就是顺序查找。
- 新知讲授(30min) 例题:数组顺序查找,输出下标,找不到输出-1。
#include<iostream>
using namespace std;
int main(){
int n,target,a[50];
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>target;
int pos=-1;
for(int i=1;i<=n;i++){
if(a[i]==target){
pos=i;
break;
}
}
cout<<pos;
return 0;
} - 课堂实操练习(40min) 练习:输入一组数字,查找最小值所在位置。
- 课堂小结(10min) 顺序查找:从头到尾遍历;找到记录位置break;找不到标记-1。
- 课后作业 题目:顺序查找,统计目标数字一共出现多少次
#include<iostream>
using namespace std;
int main(){
int n,target,a[50],cnt=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>target;
for(int i=1;i<=n;i++){
if(a[i]==target) cnt++;
}
cout<<cnt;
return 0;
} - 板书要点 pos=-1; 循环遍历数组 if匹配:记录位置 break
【课时43-44】课题:二分查找基础|学时:2学时
一、教学目标 - 理解二分查找前提:数组必须预先有序。
- 掌握二分查找思路:取中间值比较,不断缩小查找区间。
- 对比顺序查找,理解二分查找速度优势。
二、重难点 重点:二分查找思路。 难点:区间左右边界更新,死循环问题。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 有序数组中找数字,不用一个个遍历,可以对半缩小范围,查找速度更快,市赛常考。
- 新知讲授(30min) 例题:升序数组二分查找。
#include<iostream>
using namespace std;
int main(){
int a[20]={0,1,3,5,7,9,11,13};
int l=1,r=7,mid,key;
cin>>key;
int ans=-1;
while(l<=r){
mid=(l+r)/2;
if(a[mid]==key){ans=mid;break;}
else if(a[mid]<key) l=mid+1;
else r=mid-1;
}
cout<<ans;
return 0;
} - 课堂实操练习(40min) 练习:对冒泡排序后的数组,使用二分查找。
- 课堂小结(10min) 二分查找前提:数组有序;mid取中间;比较后调整左右边界。
- 课后作业 题目:输入有序数组,二分查找目标值
#include<iostream>
using namespace std;
int main(){
int n,a[50],key;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>key;
int l=1,r=n,ans=-1;
while(l<=r){
mid=(l+r)/2;
if(a[mid]==key){ans=mid;break;}
else if(a[mid]<key) l=mid+1;
else r=mid-1;
}
cout<<ans;
return 0;
} - 板书要点 有序数组才能二分 mid=(l+r)/2 a[mid]<key → l=mid+1
【课时45-46】课题:字符串常用操作|学时:2学时
一、教学目标 - 复习char字符数组,新增字符串大小写转换。
- 字符串翻转,字符串拼接。
- ASCII码简单理解。
二、重难点 重点:字符ASCII运算,大小写转换。 难点:字符串下标管理。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 竞赛字符串题除了统计字符,还常考翻转、大小写转换。利用ASCII码差值完成大小写互换。
- 新知讲授(30min) 例题:字符串小写转大写。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[100];
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='a'&&s[i]<='z'){
s[i] -= 32;
}
}
cout<<s;
return 0;
} - 课堂实操练习(40min) 练习:字符串翻转输出。
- 课堂小结(10min) 小写字母减32变大写;大写加32变小写;strlen求长度。
- 课后作业 题目:输入字符串,大写转小写输出
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[100];
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i] +=32;
}
}
cout<<s;
return 0;
} - 板书要点 小写→大写:-32 大写→小写:+32
【课时47-48】课题:简单高精度(大整数加法)|学时:2学时
一、教学目标 - 理解普通int存不下超大数字,用数组存储大整数每一位。
- 掌握大整数加法思路:倒序存储,逐位相加,处理进位。
二、重难点 重点:数组保存大数,进位处理。 难点:倒序存储、最后处理最高位进位。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 当数字特别长,超出int范围,不能直接用变量相加,需要数组按位存储,模拟竖式加法。
- 新知讲授(30min) 例题:大整数加法。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s1[105],s2[105];
int a[105]={0},b[105]={0},c[105]={0};
cin>>s1>>s2;
int l1=strlen(s1),l2=strlen(s2);
for(int i=0;i<l1;i++) a[l1-i]=s1[i]-'0';
for(int i=0;i<l2;i++) b[l2-i]=s2[i]-'0';
int len=max(l1,l2);
for(int i=1;i<=len;i++){
c[i]=a[i]+b[i]+c[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[len+1]>0) len++;
for(int i=len;i>=1;i++) cout<<c[i];
return 0;
} - 课堂实操练习(40min) 练习:两组大数相加,修改代码测试。
- 课堂小结(10min) 大数存入数组;倒序方便进位;逐位相加,处理进位。
- 课后作业 题目:大整数加法,输入两个很长数字字符串输出和。(代码同上)
- 板书要点 大数:数组存每一位 倒序存放,模拟竖式加法,进位
【课时49-50】课题:阶段三综合复习+模拟测试|学时:2学时
一、教学目标 - 复习查找算法、字符串操作、高精度加法、二维数组。
- 综合模拟卷上机测试,训练竞赛时间分配。
- 整理高频错题,归纳易错点。
二、重难点 重点:综合运用多种算法解题。 难点:复杂题目选择合适算法。
三、教学准备 机房电脑,阶段三试卷
四、教学过程 - 课堂导入(5min) 临近竞赛,综合复盘前面学习内容,完整模拟一次上机测试。
- 上机测试(60min),限时独立完成。
- 试卷讲评(15min),梳理易错点。
- 课堂小结(10min) 做题顺序:先易后难;写完代码一定要测试边界样例。
- 课后作业 整理本次测试错题,重新独立编写代码。
- 板书要点 竞赛策略:先易后难 边界样例测试!
【课时51-52】课题:竞赛真题专项1:基础语法真题|学时:2学时
一、教学目标 - 训练绍兴市小学生信息学竞赛基础语法真题。
- 排查语法类常见错误,如缺少分号、中英文符号、数组越界。
- 训练读入输出、分支循环类真题。
二、重难点 重点:快速读懂基础真题,稳定拿到基础分。 难点:题目陷阱识别。
三、教学准备 机房电脑,真题习题集
四、教学过程 - 课堂导入(5min) 竞赛试卷70%是基础题,保证基础题不丢分是获奖关键。本节课刷语法类真题。
- 真题讲解(30min),分析题目陷阱。
- 上机实操练习(40min),学生独立完成真题。
- 课堂小结(10min) 基础题细心优先;注意输入输出格式。
- 课后作业 剩余语法真题,课后完成。
- 板书要点 基础题:细心! 检查:符号、分号、数组下标
【课时53-54】课题:竞赛真题专项2:数组与排序真题|学时:2学时
一、教学目标 - 数组、冒泡排序、最值查找类市赛真题训练。
- 训练数组类题目边界处理。
- 熟练写出冒泡排序模板。
二、重难点 重点:数组真题解题套路。 难点:数组下标越界、数据范围。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 数组与排序是竞赛必考大题,分值高,熟练模板可以快速拿分。
- 真题讲授(30min),演示冒泡排序在真题中的套用。
- 上机练习(40min)
- 课堂小结(10min) 数组题优先确定下标起点;排序题直接套用冒泡模板。
- 课后作业 数组真题2道,独立完成。
- 板书要点 数组下标注意范围 冒泡模板熟练默写
【课时55-56】课题:竞赛真题专项3:枚举、模拟真题|学时:2学时
一、教学目标 - 枚举、模拟类竞赛真题训练。
- 训练从长篇题目文字提取核心过程。
- 学会枚举范围优化。
二、重难点 重点:模拟题复刻过程。 难点:长题目读题耐心。
三、教学准备 机房电脑
四、教学过程 - 课堂导入(5min) 模拟、枚举题目文字多,只要耐心读题,一步一步模拟,就可以解出。
- 真题讲解(30min)
- 上机实操(40min)
- 课堂小结(10min) 模拟题:跟着题目描述一步步写代码。
- 课后作业 枚举模拟真题2道。
- 板书要点 模拟:复刻流程 枚举:确定范围
【课时57-58】课题:竞赛真题专项4:字符串、查找真题|学时:2学时
一、教学目标 - 字符串处理、顺序查找、二分查找真题训练。
- 区分字符数组和普通数组下标差异:int数组我们习惯下标从1开始,char字符串下标从0开始。
- 熟练掌握字符串长度获取、字符遍历、查找类题目的答题模板。
二、重难点 重点:字符串读取、字符统计、顺序查找模板。 难点:二分查找必须先排序;字符串下标容易和整型数组混淆,造成访问错位。
三、教学准备 机房电脑,真题习题集
四、教学过程 - 课堂导入(5min) 市赛中字符串和查找题型经常作为中档题出现,容易在下标细节丢分。本节课针对性刷题,区分两种数组下标习惯。
- 真题讲授(30min) 讲解真题案例:输入一行字符串,统计元音字母数量;有序数组二分查找真题。 强调易错点: ① strlen获取的长度不包含末尾结束符; ② 二分查找前提一定是升序有序数组;无序数组只能用顺序查找。 真题示例代码:统计元音字母
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[105];
cin>>s;
int len = strlen(s);
int cnt=0;
for(int i=0;i<len;i++){
if(s[i]'a'||s[i]'e'||s[i]'i'||s[i]'o'||s[i]=='u'){
cnt++;
}
}
cout<<cnt<<endl;
return 0;
} - 上机实操(40min) 学生独立完成2道字符串真题+2道查找真题,教师巡场,重点纠正下标错误。
- 课堂小结(10min) 字符串char数组下标从0;int数组训练用下标从1;二分查找先排序。
- 课后作业 字符串、查找真题各1道,独立写代码测试样例。
- 板书要点 char s[]:下标0开始 int a[]:训练下标1开始 二分查找:数组必须有序
【课时59-60】课题:赛前综合模拟冲刺+考点复盘|学时:2学时
一、教学目标 - 整套绍兴小学生程序设计竞赛全真模拟上机测试,熟悉比赛节奏。
- 梳理全部60课时核心考点清单,归纳高频坑点。
- 讲解竞赛应试策略:读题、样例测试、代码调试、时间分配。
二、重难点 重点:整套试卷限时完成,熟练应试流程。 难点:合理分配时间,细心规避各类代码细节bug。
三、教学准备 机房电脑,全真模拟卷、考点清单
四、教学过程 - 课堂导入(5min) 60课时全部内容学习完毕。本节课全真模拟,完整复刻竞赛环境,检验整体学习效果,考前查漏补缺。
- 全真上机模拟(60min) 限时独立完成整套竞赛模拟卷,严格遵守比赛规则,独立写代码、测试样例。
- 试卷讲评与考点复盘(15min) 逐题讲解,整理所有高频易错点汇总:
- 标点符号必须英文半角;
- == 判断相等,= 是赋值;
- 循环记得更新循环变量,防止死循环;
- int数组下标习惯从1,字符串char数组下标从0;
- 二分查找前提:数组有序;
- 冒泡排序内层循环边界;
- 大整数加法需要处理进位;
- 写完代码一定要测试样例、边界数据(0、最大值、负数)。
- 课堂小结(10min) 竞赛答题顺序:先易后难;拿到题目先读输入输出;写完代码必须测试样例;遇到bug优先检查符号、下标。
- 课后作业 ① 整理本次模拟卷错题,重新独立编写代码; ② 通读全套知识点笔记,记忆代码模板。
- 板书要点 竞赛应试口诀: 先读题,再构思 写代码,测样例 查符号,看下标 先易后难稳得分
文档结尾说明
文档名称:五年级C++信息学教案_课时
适用:绍兴市小学生程序设计竞赛,五年级零基础信息学兴趣班
总课时:60课时(每2课时一份教案,合计30份教案模块)
这里空空如也



















有帮助,赞一个