内容正文:
5.7、5.8、5.9节:循环结构程序设计应用
C语言程序设计
电子工业出版社
掌握循环结构的嵌套使用
理解穷举法、递推法等算法思想
学会编写综合性的C语言程序
能够运用循环结构解决实际问题
培养逻辑思维和程序调试能力
提升代码阅读和分析能力
培养严谨的编程习惯
增强解决复杂问题的信心
感受编程的乐趣和实用性
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:兔子繁殖问题
🐰 问题描述
假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔。一年内没有发生死亡。
问:一对刚出生的兔子,一年内繁殖成多少对兔子?
引导思考
这个问题的规律是什么?如果用程序来模拟这个繁殖过程,我们应该如何设计算法?
经典递推问题
教学导入:神秘的水仙花数
什么是“水仙花数”?
它是指一个3位数,其各位数字的立方和等于该数本身。
例如:153是一个水仙花数,因为1³ + 5³ + 3³ = 153。
思考与挑战
如何找出所有的水仙花数?这需要我们对数字的每一位进行操作,循环结构可以帮我们实现吗?
教学导入:谁是最后一名?
核心线索提示
1. 共9人,总分相同
2. 无并列名次,同家无连续名次
3. 已知:李一、王二
问题背景描述
张、王、李三家各有三个小孩,共九个孩子进行短跑比赛。规则:第一名得9分,第二名得8分,依此类推至第九名得1分。
已知条件:各家总分相同;所有孩子名次均不并列;同一家的孩子没有获得相连的名次;第一名是李家孩子,第二名是王家孩子。
编程思维引导
如何将复杂的逻辑条件转化为代码?
尝试利用循环遍历所有可能的名次组合,结合条件判断筛选出符合所有规则的答案。
知识讲授
循环结构程序设计应用
程序举例
趣味程序与项目实例开发
第一部分
程序举例
知识讲授
知识讲授
知识讲授:斐波那契数列
问题分析
斐波那契数列的规律是前两项为1,从第三项开始,每一项都是前两项之和。1,2,3,5,8,13,21,34…………
算法思路
使用递推法,初始化前两项,然后通过循环不断计算并输出后续项。
i<=18
真
假
i=1;
循环体执行语句
结束
i++;
输出:a,b
int i,a=1,b=2,c;
开始
for
知识讲授:斐波那契数列
程序文本【例1】斐波那契数列
#include <stdio.h>
main()
{
int i;
int a=1, b=2, c;//定义 a=1, b=1 作为数列前两项
printf("%d\t%d\t", a, b);
for (i=1; i<=18; i++)
//利用for循环迭代18次(计算第3到20项)
{
c = a + b; // 计算当前项
printf("%d\t", c);//每次计算后立即打印 c 的值
a = b; // 变量迭代
b = c;
}
printf("
");
}
知识讲授:斐波那契数列
知识讲授:水仙花数
问题分析
需要遍历所有三位数,对每个数分解出个位、十位、百位,计算其立方和,判断是否等于原数。
算法思路
使用穷举法,通过循环遍历 100 到 999 的所有数,对每个数进行数字分解和条件判断。
核心逻辑
百位 = n / 100
十位 = (n / 10) % 10
个位 = n % 10
i<1000
真
假
分解个位、十位、百位
结束
i++;
输出:i
定义变量并初始化
开始
while
i==ge*ge*ge+shi*shi*shi+bai*bai*bai
真
假
知识讲授:水仙花数
程序文本【例2】水仙花数
#include<stdio.h>
main()
{
int i=100,j,ge,shi,bai;
printf("
所有的水仙花数有:");
while(i<1000)
{
j=i;
ge=j%10;
j=j/10;shi=j%10;
j=j/10;bai=j;
if(i==ge*ge*ge+shi*shi*shi+bai*bai*bai)
printf("
%d",i);
i++;
}
}
bai=i/100;
shi=(i-bai*100)/10;
ge=i%10;
知识讲授:水仙花数
知识讲授:一元钱换硬币
问题分析
将一元钱换成1分、2分、5分的硬币,每种硬币至少一枚,求有多少种换法。
算法思路
采用穷举法,通过三重循环分别遍历1分、2分、5分硬币的数量,判断面值总和是否为100分。
知识讲授:一元钱换硬币
程序文本【例3】一元钱换硬币
#include<stdio.h>
main()
{
int a,b,c;
for(a=1;a<100;a++)
for(b=1;b<50;b++)
for(c=1;c<20;c++)
if(a*1+2*b+5*c==100){
printf("1元钱可换成:%4d枚1分硬币
",a);
printf("\t%7d枚2分硬币
",b);
printf("\t%7d枚5分硬币
",c); }
}
知识讲授:一元钱换硬币
背诵记忆
循环的嵌套
在一个循环内部再嵌套一个或多个循环,用于处理复杂的重复性任务。
穷举法
一种暴力搜索算法,将所有可能的情况都列举出来,逐一验证是否符合条件。
递推法
从已知的初始条件出发,通过递推公式逐步计算出后续结果。
💡 核心思想:利用逻辑结构(嵌套)与思维模式(穷举、递推)解决复杂计算问题。
课堂问答
Q1:什么是穷举法?
穷举法是一种暴力搜索算法,它将所有可能的情况都列举出来,逐一进行验证,直到找到符合条件的解。
Q1:递推法和穷举法的主要区别是什么?
递推法是从已知的初始条件出发,通过递推公式逐步计算出后续的结果;而穷举法则是直接遍历所有可能的情况来寻找答案。
例题分析:亲密数
什么是亲密数?
如果整数A的全部真因数(不包括A本身)之和等于B,且整数B的全部真因数之和等于A,则称A和B为亲密数。
例如,220和284就是一对亲密数。
算法思路分析
步骤一:定义函数计算真因数之和。使用for循环从1遍历到num/2,累加因数。
步骤二:遍历范围数n,计算其和m。若m > n,计算m的和k。若k == n,则n和m是亲密数。
思考拓展:如何修改程序,使其能够进行多次计算,直到用户选择退出?提示:可以使用while循环来实现。
例题分析:亲密数
程序文本:亲密数
#include<stdio.h>
main()
{
int a,i,b,n;
for(a=1;a<3000;a++)
{
for(b=0,i=1;i<=a/2;i++)
if(!(a%i)) b+=i;
for(n=0,i=1;i<=b/2;i++)
if(!(b%i)) n+=i;
if(n==a&&a<b)
printf("%4d--%4d ",a,b);
}
}
例题分析:亲密数
课堂练习
题目要求
编写程序,打印 100 以内的所有素数。
解题提示
素数是指大于1的自然数,除了1和它本身,不能被其他自然数整除。建议使用嵌套循环来判断一个数是否为素数。
课堂练习
程序文本
#include<stdio.h>
#include<math.h>
main()
{ int i, j, flag;
for(i=2;i<=100;i++)
{ flag = 1;// 假设当前数是素数
for(j=2;j<=sqrt(i);j++) {
if(i % j == 0)
// 如果能被整除,说明不是素数
{ flag = 0;break; }
}
if(flag) printf("%d ", i);
}
printf("
"); }
课堂练习
第二部分
知识讲授
趣味程序与项目实例开发
知识讲授
趣味逻辑推理程序
通过编程解决经典逻辑谜题,锻炼算法思维与代码逻辑能力。
学生成绩管理系统
开发小型数据管理项目,掌握数据录入、查询与统计的完整流程。
本堂课将理论与实践结合,从逻辑思维训练过渡到实际项目开发,提升综合编程素养。
知识讲授:谁家孩子跑得最慢
问题回顾
回顾赛跑问题:明确已知的总分条件、无并列名次规则,以及“同一家孩子名次不相连”的关键限制,确立求解目标。
逻辑思路
将问题转化为9个名次的排列组合问题。通过程序遍历所有可能性,根据题目约束条件进行筛选,过滤掉不符合的情况。
核心策略
利用多重循环模拟名次排列,结合条件判断语句(if)逐一校验逻辑规则,最终输出满足所有条件的唯一解。
💡 核心要点:程序设计的本质是将人类的逻辑推理过程,转化为计算机可执行的“遍历+筛选”算法。
知识讲授:谁家孩子跑得最慢
知识讲授:谁家孩子跑得最慢
程序文本:C语言趣味程序实例5
#include<stdio.h>
int score[4][4];
main()
{ int i,j,k,who;
score[1][1]=7; /*score[1]:张家三个孩子的得分*/
score[2][1]=8; /*score[2]:王家三个孩子的得分*/
score[3][1]=9; /*score[3]:李家三个孩子的得分*/
for(i=4;i<6;i++) /*i:张家孩子在4~6分段可能的分数*/
for(j=4;j<7;j++) /*j:王家孩子在4~6分段可能的分数*/
for(k=4;i!=j&&k<7;k++) /*k:李家孩子在4~6分段可能的分数*/
if(k!=i&&k!=j /*分数不能并列*/
&&15-i-score[1][1]!=15-j-score[2][1]
&&15-i-score[1][1]!=15-k-score[3][1]
&&15-j-score[2][1]!=15-j-score[3][1])
{ score[1][2]=i;score[1][3]=15-i-7;
score[2][2]=j;score[2][3]=15-j-8;
score[3][2]=k;score[3][3]=15-k-9;}
将满足条件的结果记入数组
知识讲授:谁家孩子跑得最慢
程序文本:C语言趣味程序实例5
for(who=0,i=1;i<=3;i++,printf("
"))
for(j=1;j<=3;j++)
{
printf("%d ",score[i][j]); /*输出各家孩子的得分情况*/
if(score[i][j]==1) /*记录最后一名孩子的家庭序号*/
who=i;
}
if(who==1) /*输出最后的判断结果*/
printf("The last one arrived to end is a child from family Zhang.
");
else if(who==2)
printf("The last one arrived to end is a child from family Wang.
");
else
printf("The last one arrived to end is a child from family Li.
");
}
知识讲授:谁家孩子跑得最慢
知识讲授:学生成绩管理系统——成绩统计
项目需求分析
编写程序实现学生成绩的自动化管理。核心需求包括:录入学生人数及对应成绩;计算平均分、最高分与最低分;统计不及格(<60分)和优秀(≥90分)学生人数。
核心功能模块
1.数据录入:接收用户输入的学生数量(num)与各科成绩(score)。
2.统计分析:遍历数据计算均值(average)、极值(max、min)及人数分布(flunk:不及格学生人数、excellent:优秀学生人数)。
3.结果输出:格式化展示所有统计结果。
代码实现要点
利用循环结构(如For/While)遍历成绩数组;通过条件判断(If-Else)统计不同分数段人数;使用累加器计算总分以求得平均分。
知识讲授:学生成绩管理系统——成绩统计
for 循环实现(已知人数)
适用场景:明确知道学生人数时使用。
核心逻辑:通过固定次数的循环,依次读取每位学生成绩,在循环体内完成累加、最值比较及统计(不及格/优秀)。
while 循环实现(未知人数)
适用场景:人数未知,需通过特定输入(如-1)终止循环。
核心逻辑:利用条件控制循环持续,每次输入成绩后判断是否结束,同样在循环内进行数据统计。
核心总结:本项目综合运用循环结构与条件判断,通过累加器(sum)、计数器(num)和标志变量实现了完整的成绩统计功能。
知识讲授:学生成绩管理系统——成绩统计(for循环)
程序文本
#include<stdio.h>
main()
{ float score,sum=0,max=0,min=100,average;
int num,i,flunk=0,excellent=0;
printf("请输入学生人数:");
scanf("%d",&num);
if(num<=0) return 0;
for(i=1;i<=num;i++)
{ printf("请输入第%d个学生的成绩:",i);
scanf("%f",&score);
sum+=score;
if(score>max) max=score;
if(score<min) min=score;
if(score<60) flunk++;
if(score>=90) excellent++; }
average=sum/num;
printf("学生平均成绩为:%.1f
",average);
printf("学生成绩最高为:%.1f
",max);
printf("学生成绩最低为:%.1f
",min);
printf("不及格学生数目为:%d
",flunk);
printf("优秀的学生数目为:%d
",excellent);
}
知识讲授:学生成绩管理系统——成绩统计(for循环)
知识讲授:学生成绩管理系统——成绩统计(while循环)
程序文本
#include<stdio.h>
main()
{ float score=0,sum=0,max=0,min=100,average;
int num=0,i,flunk=0,excellent=0,have=1;
while(have==1)
{ sum+=score;
if(score>max) max=score;
if(score<min&&num!=0) min=score;
if(score<60&&num!=0) flunk++;
if(score>=90) excellent++;
printf("请输入学生成绩:");
scanf("%f",&score);
if(score==-1) have=0;
else num++; }
average=sum/num;
printf("输入的学生人数为:%d
",num);
printf("学生平均成绩为:%.1f
",average);
printf("学生成绩最高为:%.1f
",max);
printf("学生成绩最低为:%.1f
",min);
printf("不及格学生数目为:%d
",flunk);
printf("优秀的学生数目为:%d
",excellent);
}
知识讲授:学生成绩管理系统——成绩统计(while循环)
背诵记忆
复杂逻辑的实现
如何将自然语言描述的逻辑条件转化为程序中的条件判断语句,掌握逻辑与、或、非的组合运用。
循环的灵活运用
根据实际需求选择合适的循环类型(for, while, do-while),并能正确处理不确定次数的循环场景。
项目开发流程
理解从需求分析、功能设计到代码实现的基本步骤,建立规范的编程思维模式。
关键点回顾:逻辑是程序的骨架,循环是程序的肌肉,流程是程序的蓝图。
课堂问答
Q1
在成绩等级统计程序中,定义多个计数器变量(如countA, countB)的目的是什么?
A1
为了分别统计不同成绩等级的学生人数,实现分类统计的功能。
Q2
在成绩等级统计程序中,if-else if多分支语句起到了什么作用?
A2
if-else if语句用于根据成绩的不同范围(分数段)进行条件判断,从而决定将成绩计入哪个等级的计数器中,是实现多条件分支判断的核心结构。
课堂练习
题目要求
修改学生成绩管理系统,增加成绩等级评定功能,对每个等级的人数进行统计:
90分以上为 A,80-89分为 B,70-79分为 C,60-69分为 D,60分以下为 E。
解题提示
在录入成绩后,使用多分支条件判断(if-else if)来评定成绩等级,并定义变量统计各等级的人数。
课堂练习
程序文本:新增成绩等级判断并统计各等级人数(部分代码)
//在原有变量基础上增加等级统计变量
intgradeA =0, gradeB =0, gradeC =0, gradeD =0, gradeE =0;
//在循环内部增加等级判断和统计
if(score >=90) { gradeA++; }
else if(score >=80) { gradeB++; }
else if(score >=70) { gradeC++; }
else if(score >=60) { gradeD++; }
else{ gradeE++; }
课堂小结
课堂小结
循环结构的应用
通过多个实例,掌握了for、while、do-while循环的使用,以及循环的嵌套逻辑。
算法思想进阶
深入学习了穷举法和递推法,理解并掌握了这两种核心算法在解决实际编程问题中的应用。
全流程项目开发
完整体验了从需求分析、逻辑设计到最终代码实现与测试的项目开发全流程。
课后任务
作业一:简易计算器程序
编写程序,实现一个简单的计算器,支持加、减、乘、除四则运算。用户输入两个数字和一个运算符,程序输出计算结果。
作业二:猜数字游戏
编写一个猜数字游戏。程序随机生成一个1到100之间的整数,然后提示用户输入一个数字进行猜测。如果用户猜错了,程序会提示“猜大了”或“猜小了”,直到用户猜对为止,并统计用户猜测的次数。
谢谢观看
THANKS
$