内容正文:
4.5、4.6节:程序举例与C语言趣味程序实例4
C语言程序设计
电子工业出版社
掌握if语句和switch语句的嵌套使用方法
理解并能运用复杂条件判断的逻辑
能够独立编写包含多分支选择结构的C语言程序
能够运用所学知识分析并解决实际问题
培养严谨、规范的编程习惯
感受编程的乐趣和在实际生活中的实用性
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:动脑思考
核心问题
如何让计算机判断一个年份是否为闰年?
关键提示:闰年定义
闰年的定义是:能被 4 整除但不能被 100 整除,
或者能被 400 整除的年份。
思考:如何将这个数学逻辑转化为 C 语言代码?
教学导入:动脑思考
核心问题
如何设计一个程序,实现英寸和厘米之间的快速换算?
思考提示
需要考虑用户输入的是英寸还是厘米,并根据用户的选择进行相应的计算(涉及多分支判断)。
教学导入:趣味谜题
谜题背景
三对情侣参加婚礼,新郎是 A、B、C,新娘是 X、Y、Z。有人询问了六位新人中的三位,但听到的回答都是假的。请通过逻辑推理找出谁和谁结婚。
假口供线索
A 说:他将和 X 结婚。
X 说:她的未婚夫是 C。
C 说:他将和 Z 结婚。
思考挑战:能否根据这些矛盾的证词,推导出三对新人的正确组合?
知识讲授
程序举例与C语言趣味程序实例4
程序举例
C语言趣味程序实例4
第一部分
程序举例
知识讲授
知识讲授:程序举例(判断闰年)
核心问题
输入一个年份,通过程序逻辑判断该年份是否为闰年。
闰年判断规则
满足以下任意一个条件即为闰年:
1. 能被 4 整除,但不能被 100 整除;
2. 能被 400 整除。
知识讲授:程序举例(判断闰年)
程序文本
#include<stdio.h>
main()
{
int year;
printf("
请输入年份:
");
scanf("%d",&year);
if((year%4==0&&year%100!=0)||year%400==0)
printf("%d年是闰年。
",year);
else
printf("%d年不是闰年。
",year);
}
知识讲授:程序举例(判断闰年)
知识讲授:程序举例(单位换算)
问题描述
实现一个简单的单位换算程序,支持用户输入数值和方向,将英寸换算成厘米,或将厘米换算成英寸。
实现思路
利用if 条件语句判断用户选择的换算方向(英寸→厘米 或 厘米→英寸),然后执行对应的数学运算公式输出结果。
知识讲授:程序举例(单位换算)
知识讲授:程序举例(单位换算)
程序文本
#include<stdio.h>
main()
{
float y,r=2.54;
int flag;
printf("请输入要换算的数据和换算的方式(1.英寸→厘米,2.厘米→英寸):
");
scanf("%f,%d",&y,&flag);
if(flag==2||flag==1)
if(flag==1)
printf("%8.2f英寸=%8.2f厘米",y,y*r);
else
printf("%8.2f厘米=%8.2f英寸",y,y/r);
else
printf("数据错误!
");
}
知识讲授:程序举例(单位换算)
mou
知识讲授:程序举例(利润提成计算-if版)
问题描述
根据企业的利润数额,按照不同等级的提成比例,计算应发放的奖金总额。
代码实现逻辑
使用嵌套的 if 语句进行多分支条件判断。随着提成等级增加,嵌套层次会变深,代码可读性下降。
代码痛点
多层嵌套导致代码冗长、逻辑复杂,维护成本高。
某企业利润提成的规则如下:
(1)利润低于或等于10万元时,可提成奖金10%。
(2)利润高于10万元、低于20万元时,低于10万元的部分按10%提成,另外10万元可以提成7.5%。
(3)利润高于20万元、低于40万元时,其中20万元按前面的方法发放,另外20万元可以提成5%。
(4)利润高于40万元按前面的方法提成,高于部分按3%提成。
知识讲授:程序举例(利润提成计算-if版)
pf<=10
pr=pf*0.10
pf<20
pr=10*0.10+
(pf-10)*0.075
pf<40
pr=10*0.10+10*0.075
+(pf-20)*0.05
pr=10*0.10+10*0.075+
20*0.05+(pf-40)*0.03
假
假
假
真
真
真
知识讲授:程序举例(利润提成计算-if版)
程序文本【3.3】输出各种类型的数据
#include<stdio.h>
main()
{
int pf;
float pr;
printf("
请输入利润总数(单位:万元):
");
scanf("%d",&pf);
if(pf<=10)
pr=pf*0.10;
else if(pf<20)
pr=10*0.10+(pf-10)*0.075;
else if(pf<40)
pr=10*0.10+10*0.075+(pf-20)*0.05;
else
pr=10*0.10+10*0.075+20*0.05+(pf-40)*0.03;
printf("
应发的奖金是:%f万元。",pr);
}
知识讲授:程序举例(利润提成计算-if版)
知识讲授:程序举例(利润提成计算-switch版)
改进思路
使用 switch 语句改写利润提成计算程序,替代复杂的 if-else 嵌套结构,让代码逻辑更直观、结构更清晰,提升可读性与维护性。
核心技巧:范围转定点
将利润(万元)除以 10,得到 0~6 之间的整数,将连续的区间判断转化为 switch 擅长的“精确值匹配”问题,巧妙解决 switch 不支持范围判断的限制。
💡 总结:switch 语句在处理多分支“等值判断”时具有天然优势。通过数学运算将范围问题转化为定点问题,是编写高效 switch 代码的常用技巧。
知识讲授:程序举例(利润提成计算-switch版)
pf/10
pr=pf*0.10
pr=10*0.10+
(pf-10)*0.075
pr=10*0.10+10*0.075
+(pf-20)*0.05
pr=10*0.10+10*0.075+
20*0.05+(pf-40)*0.03
0
1
2
3
4
知识讲授:程序举例(利润提成计算-switch版)
程序文本【3.3】输出各种类型的数据
#include<stdio.h>
main()
{ int pf;
float pr;
printf("
请输入利润总数(单位:万元):
");
scanf("%d",&pf);
switch(pf/10)
{
case 0:pr=pf*0.10;break;
case 1:pr=10*0.10+(pf-10)*0.075;break;
case 2:case 3:pr=10*0.10+10*0.075+(pf-20)*0.05;break;
default:pr=10*0.10+10*0.075+20*0.05+(pf-40)*0.03;
}
printf("
应发的奖金是:%f万元。",pr);
}
知识讲授:程序举例(利润提成计算-switch版)
背诵记忆
闰年判断条件
能被4整除但不能被100整除,或者能被400整除。
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
Switch使用场景
当需要根据一个表达式的不同取值执行不同操作时,switch比嵌套if更清晰高效。
多分支结构实现
利用嵌套if-else或switch实现。处理区间问题时,可利用整数除法等技巧转换为case条件。
记忆挑战:请大家花3分钟时间快速记忆以上三个核心知识点。随后我们将进行随机提问,检验大家的掌握情况。
课堂问答
核心疑问
在例3(利润提成)中,为什么使用switch(pf/10)而不是直接使用switch(pf)?
编程思路解析
利用整数除法特性,将连续的利润数值转换为离散的整数(如0, 1, 2...),从而将复杂的区间判断转化为简单的分支匹配,极大地简化代码结构。
💡 关键技巧:当遇到大范围区间判断时,寻找数值规律进行“降维打击”,将连续问题离散化是一种非常实用的编程优化思维。
课堂练习
编程任务 (Task)
编写程序,输入一个整数,判断该数是正数、负数还是零。
请思考:如何通过条件判断来区分这三种情况?
实现要求 (Requirement)
必须使用if-else if-else语句结构来实现逻辑判断。
请在草稿纸上画出流程图或直接编写代码,稍后我们将邀请同学分享思路。
课堂练习
程序文本
#include"stdio.h"
main()
{
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if(num > 0)
printf("%d是正数。
", num);
else if(num < 0)
printf("%d是负数。
", num);
else
printf("%d是零。
", num);
}
课堂练习
第二部分
知识讲授
分支结构程序设计实例
知识讲授:趣味程序实例4(谁和谁结婚)
人物关系示意
问题回顾:
新郎 A、B、C 与新娘 X、Y、Z 结婚,三位新人的口供均为假,需据此推导真实关系。
假口供 → 真实逻辑条件:
A说“与X结婚”(假) →A ≠ X(X 不是 1)
X说“未婚夫是C”(假) →X ≠ C(X 不是 3)
C说“与Z结婚”(假) →C ≠ Z(Z 不是 3)
隐含唯一性条件:
每位新娘只能嫁给一位新郎,即 X、Y、Z 的值必须互不相同。
知识讲授:趣味程序实例4(谁和谁结婚)
x!=1&&x!=3&&z!=3
&&x!=y&&x!=z&&y!=z
知识讲授:趣味程序实例4(谁和谁结婚)
程序文本
#include<stdio.h>
main()
{
int x,y,z;
for(x=1;x<=3;x++)
for(y=1;y<=3;y++)
for(z=1;z<=3;z++)
if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z)
{
printf("X will marry to %c.
",'A'+x-1);
printf("Y will marry to %c.
",'A'+y-1);
printf("Z will marry to %c.
",'A'+z-1);
}
}
知识讲授:趣味程序实例4(谁和谁结婚)
背诵记忆
穷举法
一种暴力搜索算法,通过枚举所有可能的情况来寻找问题的解,是解决未知规律问题的有效手段。
逻辑表达式的构建
将自然语言描述的逻辑条件(如“大于”、“不等于”)准确地转化为C语言的关系表达式。
多重循环的应用
在穷举法中,常使用多重循环(嵌套循环)来遍历多个变量的所有组合,实现对复杂解空间的搜索。
例题分析
题目描述
有一个三位数,它的各位数字之和是15,百位数字比十位数字大5,个位数字是十位数字的3倍。
请编程找出这个三位数。
解题思路:穷举法
1. 遍历范围:循环穷举所有的三位数(100-999)。
2. 数字分解:将每个数拆解为百位、十位、个位数字。
3. 条件判断:检查是否满足三个数学条件。
4. 输出结果:输出符合条件的那个数。
核心提示:在编程中,我们通常使用取模(%)和整除(//)运算来分离数字的各个位。例如:百位 = num // 100,十位 = (num // 10) % 10,个位 = num % 10。
例题分析
程序文本
#include"stdio.h"
main()
{ int num, bai, shi, ge;
// 穷举所有三位数
for(num = 100; num < 1000; num++)
{
// 分解数字
bai=num/100;
shi=(num/10)%10;
ge=num%10;
// 判断条件:和为15,差为5,倍为3
if(bai+shi+ge==15&&bai-shi==5&&ge==3*shi)
printf("满足条件的三位数是:%d
", num);
}
}
例题分析
课堂问答
思考问题
在“谁和谁结婚”的程序中,为什么要使用三重 for 循环?
核心解析
问题涉及三个新娘(X、Y、Z)的配对,每个新娘有3种选择(A、B、C)。
三重循环可遍历3×3×3=27种组合,确保不遗漏任何情况,从而找到唯一解。
总结:多重循环的本质是为了解决多维变量组合的问题。当逻辑涉及多个独立变量的排列组合时,嵌套循环是最直接有效的暴力枚举手段。
课堂练习
经典问题:百鸡百钱
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱。
现有条件:100文钱要买100只鸡。
求解目标:公鸡、母鸡、小鸡各买多少只?
编程实现要求
核心算法:穷举法 (Brute Force)
具体实现:使用三重循环遍历所有可能的鸡的数量组合。
约束条件:
总钱数 = 5 * 公鸡 + 3 * 母鸡 + 小鸡 / 3
总数量 = 公鸡 + 母鸡 + 小鸡
思考提示:请思考如何设定循环变量的范围以提高效率?例如,公鸡最多只能买多少只?小鸡的数量必须满足什么条件?
课堂练习
程序文本
#include "stdio.h"
main()
{
int x, y, z;
// x:公鸡数量, y:母鸡数量, z:小鸡数量
for(x=0; x<=20; x++) // 公鸡最多20只
for(y=0; y<=33; y++) // 母鸡最多33只
{ z = 100 - x - y; // 小鸡数量
if(z%3==0&&5*x+3*y+z/3==100)
{printf("公鸡:%d只,母鸡:%d只,小鸡:%d只
",x,y,z);}
}
}
课堂练习
课堂小结
课堂小结
4.5 程序举例:分支结构进阶
嵌套使用:熟练掌握 if 语句与 switch 语句的嵌套逻辑,处理复杂条件。
多分支应用:能够解决闰年判断、单位换算及利润提成计算等实际问题。
区间转换技巧:学会利用整数除法将连续的数值区间转换为 switch 语句可匹配的离散 case。
4.6 趣味程序:穷举法思想
穷举法核心:理解“遍历所有可能,寻找符合条件解”的暴力搜索思想。
逻辑转换:掌握将自然语言描述的逻辑条件转化为 C 语言逻辑表达式的能力。
多重循环实现:学会利用嵌套循环(多重循环)来处理多维数据的穷举问题。
总结:通过这两节课的学习,我们不仅巩固了分支结构的语法基础,更重要的是掌握了将实际问题抽象为程序逻辑的思维方式。
课后任务
编程题一:月份天数判断
结合本节课所学知识,编写一个程序,根据用户输入的年份和月份,判断该月有多少天。
提示:需要考虑平年和闰年的2月天数不同。
编程题二:猜数字游戏
设计一个简单的猜数字游戏。程序随机生成一个1到100之间的整数,让用户猜测,程序根据用户的输入提示“猜大了”或“猜小了”,直到用户猜对为止,并统计用户猜的次数。
谢谢观看
THANKS
$