摘要
在学习 C 语言if语句和if-else嵌套时,很多同学容易停留在“语法能背下来,但不知道怎么用”的阶段。
本文以教材中“交换两个变量并输出较大值”的示例为基础,把它放进一个真实的学校奖励统计场景中,完整演示:
- 如何从键盘输入数据
- 如何交换两个变量的值
- 如何使用
if-else判断并输出结果 else和最近未配对if的真实含义
通过一步一步拆解代码,让你真正明白:这些 if 规则不是死记硬背的,而是写程序时一定会遇到的问题。
描述(实际使用场景)
假设现在有这样一个场景:
学校正在统计各学院本学期获得的奖励数量。
甲学院获得了a项奖励,乙学院获得了b项奖励。
由于数据是人工录入的,有时会把甲、乙学院的数据顺序录反,所以程序需要做两件事:
交换甲学院和乙学院的奖励数值,保证数据顺序正确
在交换之后,输出奖励数量较多的学院所对应的奖励数
这个场景在实际中非常常见,比如:
- 成绩排名时交换分数
- 销售统计时修正录入顺序
- 对比两个部门、两个班级的数据大小
而你学到的if、if-else、变量交换,正好就能解决这个问题。
题解答案(思路说明)
整个程序的思路可以拆成几步:
定义三个整型变量a、b、t
a:甲学院奖励数b:乙学院奖励数t:临时变量,用来交换数据
从键盘输入a和b的值
使用中间变量t完成a和b的交换
使用if-else判断哪个值更大
输出较大的奖励数
这里的重点不在“交换本身”,而在于:
- 程序执行是一步一步来的
else永远和最近那个还没配对的 if绑定
题解代码分析(完整代码 + 逐行讲解)
完整示例代码
#include<stdio.h>intmain(){inta,b,t;// a:甲学院奖励数,b:乙学院奖励数,t:中间变量printf("请输入甲学院和乙学院的奖励数:");scanf("%d,%d",&a,&b);// 交换 a 和 b 的值t=a;a=b;b=t;// 判断并输出较大值if(a>b)printf("奖励数量较多的是:%d\n",a);elseprintf("奖励数量较多的是:%d\n",b);return0;}变量定义部分
inta,b,t;这里定义了三个整型变量:
a和b是核心数据t是专门用来做交换的中转站
很多初学者会问:“为什么一定要用 t?”
原因很简单,如果直接写:
a=b;b=a;那a原来的值就丢了,根本没机会保存。所以必须借助一个中间变量。
输入数据
scanf("%d,%d",&a,&b);这行代码完成了两件事:
- 从键盘读取两个整数
- 分别存入
a和b
注意这里的细节:
&a、&b是地址输入格式要求用英文逗号分隔,比如:
5,8
交换变量的核心逻辑
t=a;a=b;b=t;可以按顺序理解:
- 把
a原来的值放进t - 再把
b的值给a - 最后用
t把原来的a赋给b
这是 C 语言中最经典、最基础的交换写法,后面学排序、数组时还会反复用到。
if-else 判断逻辑
if(a>b)printf("奖励数量较多的是:%d\n",a);elseprintf("奖励数量较多的是:%d\n",b);这里正好对应教材里的几个规则:
else不能单独存在else永远匹配最近的、还没有配对的 if
因为每个分支里只有一条语句,所以可以省略{},但一旦写多行就必须加。
示例测试及结果
示例 1
输入:
3,5程序执行过程:
- 初始:a = 3,b = 5
- 交换后:a = 5,b = 3
- 判断:a > b 成立
输出结果:
奖励数量较多的是:5示例 2
输入:
10,2程序执行过程:
- 初始:a = 10,b = 2
- 交换后:a = 2,b = 10
- 判断:a > b 不成立,执行 else
输出结果:
奖励数量较多的是:10时间复杂度
整个程序中:
- 输入是常数操作
- 交换是 3 条赋值语句
- 判断是 1 次比较
不管输入什么数,执行步骤都是固定的。
时间复杂度:O(1)
空间复杂度
程序只使用了:
- 3 个整型变量
没有数组、没有动态内存分配。
空间复杂度:O(1)
总结
通过这个小程序,你其实已经把好几个关键点连在了一起:
- 学会了用中间变量交换数据
- 真正理解了
if-else的执行逻辑 - 明白了
else为什么总是和最近的if配对 - 知道这些语法在真实场景中是怎么用的
后面你再学if 嵌套、成绩等级判断、区间判断时,本质都是在这个基础上往上加逻辑而已。
如果你愿意,下一步我可以帮你把这个例子扩展成 if 嵌套版本,比如输出“奖励多 / 奖励少 / 奖励相同”,刚好对上你教材后面的 4.1.2 内容。