第三章:让程序学会判断——分支结构
你好!欢迎来到第三章!在前两章,我们学会了让计算机输入、输出和计算。但程序只会按顺序执行,就像一条直线。如果想让程序根据不同情况做出不同反应,就需要用到分支结构。这一章我们会学习如何让程序“动脑筋”,根据条件决定做什么。就像你在生活中,如果下雨就带伞,如果晴天就去公园,程序也可以这样!
3.1 if语句¶
3.1.1 if语句程序范例¶
最简单的判断就是:如果……就……。看看这个程序,它判断你的年龄是否满18岁。
#include <iostream>
using namespace std;
int main() {
int age;
cout << "请输入你的年龄:";
cin >> age;
if (age >= 18) {
cout << "你已经成年了!" << endl;
}
cout << "程序结束。" << endl;
return 0;
}
运行结果示例1(输入20):
请输入你的年龄:20
你已经成年了!
程序结束。
运行结果示例2(输入15):
请输入你的年龄:15
程序结束。
3.1.2 if语句的用法¶
if 语句的格式:
if (条件) {
// 条件为真时执行的语句
}
- 条件:通常是一个比较表达式,比如
age >= 18,score == 100。条件的结果要么是真(true),要么是假(false)。 - 如果条件为真,就执行大括号
{}里的代码;如果为假,就跳过这些代码,继续执行后面的语句。 - 如果大括号里只有一条语句,可以省略大括号,但初学者建议都加上,避免出错。
比较运算符¶
| 运算符 | 含义 | 例子 |
|---|---|---|
== |
等于 | a == b |
!= |
不等于 | a != b |
> |
大于 | a > b |
< |
小于 | a < b |
>= |
大于等于 | a >= b |
<= |
小于等于 | a <= b |
注意:判断是否相等要用两个等号
==,一个等号=是赋值,千万不能搞混!
3.1.3 编程实例讲解¶
实例1:判断奇偶数¶
题目:输入一个整数,如果它是偶数,就输出“偶数”。
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
if (num % 2 == 0) { // 能被2整除就是偶数
cout << num << " 是偶数" << endl;
}
return 0;
}
实例2:判断是否及格¶
题目:输入一门课的成绩(0-100),如果大于等于60,输出“及格”。
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入成绩:";
cin >> score;
if (score >= 60) {
cout << "恭喜,及格了!" << endl;
}
return 0;
}
3.1.4 阶段性编程练习¶
- 练习1:输入一个整数,如果它是负数,输出“这是一个负数”。
- 练习2:输入一个整数,如果它能被5整除,输出“能被5整除”。
- 练习3:输入一个字符,如果它是大写字母(’A’到’Z’),输出“大写字母”。(提示:字符比较可以用
ch >= 'A' && ch <= 'Z',但逻辑运算符还没学,可以先不练,或者用后面知识。) - 练习4:输入两个整数,如果第一个数大于第二个数,输出“第一个数更大”。
3.2 if…else语句¶
3.2.1 if…else程序范例¶
if 只能处理条件为真的情况,但如果条件为假也想做点什么,就需要 if...else,就像“如果……就……否则……”。
#include <iostream>
using namespace std;
int main() {
int age;
cout << "请输入你的年龄:";
cin >> age;
if (age >= 18) {
cout << "你已经成年了,可以看电影!" << endl;
} else {
cout << "你还未成年,需要家长陪同。" << endl;
}
return 0;
}
运行示例(输入15):
请输入你的年龄:15
你还未成年,需要家长陪同。
3.2.2 if…else语句的用法¶
格式:
if (条件) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
if和else是成对出现的。- 条件为真,执行
if后面的代码块;条件为假,执行else后面的代码块。 - 两者只会执行其中一个。
3.2.3 编程实例讲解¶
实例3:判断奇偶,输出不同信息¶
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
if (num % 2 == 0) {
cout << num << " 是偶数" << endl;
} else {
cout << num << " 是奇数" << endl;
}
return 0;
}
实例4:判断是否通过考试¶
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入成绩:";
cin >> score;
if (score >= 60) {
cout << "通过考试!" << endl;
} else {
cout << "未通过,继续努力!" << endl;
}
return 0;
}
3.2.4 阶段性编程练习¶
- 练习1:输入一个整数,判断它是否大于0,输出“正数”或“非正数”(包括0和负数)。
- 练习2:输入一个年份,判断它是否是闰年。闰年条件:能被4整除但不能被100整除,或者能被400整除。(提示:条件较复杂,可以先留到学了逻辑运算再做,或者直接给出条件。)
- 练习3:输入一个整数,判断它是否是7的倍数,输出相应信息。
- 练习4:输入两个整数,输出较大的那个数。
3.3 分支的嵌套¶
3.3.1 分支嵌套程序范例¶
有时候,我们需要在一个判断里面再做判断,就像“如果下雨,就带伞;如果雨很大,就穿雨衣”。这就是分支嵌套。
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入你的成绩:";
cin >> score;
if (score >= 60) {
cout << "及格了!";
if (score >= 90) {
cout << "而且成绩优秀!" << endl;
} else {
cout << "继续加油!" << endl;
}
} else {
cout << "不及格,要努力了!" << endl;
}
return 0;
}
运行示例(输入95):
及格了!而且成绩优秀!
3.3.2 分支嵌套的用法¶
- 在
if或else的代码块里,可以再放其他的if...else语句。 - 嵌套的层数不要太多,否则代码会变得难读。一般两层就够用了。
注意:else 总是和它上面最近的 if 配对。为了避免混乱,一定要用好大括号 {}。
3.3.3 编程实例讲解¶
实例5:根据分数评定等级¶
题目:输入成绩(0-100),输出等级:
- 90-100:优秀
- 80-89:良好
- 70-79:中等
- 60-69:及格
- 0-59:不及格
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入成绩:";
cin >> score;
if (score >= 60) {
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 80) { // 这里用了else if,是多重选择,但也可以嵌套
cout << "良好" << endl;
} else if (score >= 70) {
cout << "中等" << endl;
} else {
cout << "及格" << endl;
}
} else {
cout << "不及格" << endl;
}
return 0;
}
这个例子其实混合了嵌套和
else if,我们会在下一节正式学习多重选择。
实例6:判断三个数中的最大值¶
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cout << "请输入三个整数:";
cin >> a >> b >> c;
if (a >= b) {
if (a >= c) {
cout << "最大值是:" << a << endl;
} else {
cout << "最大值是:" << c << endl;
}
} else {
if (b >= c) {
cout << "最大值是:" << b << endl;
} else {
cout << "最大值是:" << c << endl;
}
}
return 0;
}
3.3.4 阶段性编程练习¶
- 练习1:输入三个整数,输出最小值。(参考上面的最大值)
- 练习2:输入一个年份,判断它是否是闰年,并输出对应的信息。如果是闰年,再判断它是否是世纪闰年(能被400整除)。
- 练习3:输入一个整数x,求分段函数的值:
- 当 x > 0 时,y = 2x + 1
- 当 x = 0 时,y = 0
- 当 x < 0 时,y = x - 1
输出y的值。 - 练习4:模拟自动售货机:输入金额(整数),如果金额大于等于商品价格(比如5元),则输出“购买成功”,并找零;否则输出“金额不足”。(可以嵌套判断,比如金额足够时再判断是否恰好等值)
3.4 多重选择分支¶
3.4.1 多重选择分支程序范例¶
当有多个条件需要依次判断时,可以用 if...else if...else 结构。就像成绩分等级一样。
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入成绩:";
cin >> score;
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 80) {
cout << "良好" << endl;
} else if (score >= 70) {
cout << "中等" << endl;
} else if (score >= 60) {
cout << "及格" << endl;
} else {
cout << "不及格" << endl;
}
return 0;
}
3.4.2 多重选择分支的用法¶
格式:
if (条件1) {
// 条件1为真执行
} else if (条件2) {
// 条件1为假且条件2为真执行
} else if (条件3) {
// 条件1、2为假且条件3为真执行
} else {
// 所有条件都为假执行
}
- 程序从上往下判断,遇到第一个为真的条件,就执行对应的代码块,然后跳出整个
if...else if...else结构。 - 最后的
else是可选的,表示所有条件都不满足时做什么。
3.4.3 编程实例讲解¶
实例7:根据月份判断季节¶
题目:输入月份(1-12),输出对应的季节:
- 3-5月:春季
- 6-8月:夏季
- 9-11月:秋季
- 12,1,2月:冬季
#include <iostream>
using namespace std;
int main() {
int month;
cout << "请输入月份:";
cin >> month;
if (month >= 3 && month <= 5) {
cout << "春季" << endl;
} else if (month >= 6 && month <= 8) {
cout << "夏季" << endl;
} else if (month >= 9 && month <= 11) {
cout << "秋季" << endl;
} else if (month == 12 || month == 1 || month == 2) {
cout << "冬季" << endl;
} else {
cout << "月份输入错误" << endl;
}
return 0;
}
实例8:简单的计算器(加减乘除)¶
#include <iostream>
using namespace std;
int main() {
double a, b;
char op; // 运算符
cout << "请输入表达式(如 3 + 5):";
cin >> a >> op >> b;
if (op == '+') {
cout << a + b << endl;
} else if (op == '-') {
cout << a - b << endl;
} else if (op == '*') {
cout << a * b << endl;
} else if (op == '/') {
if (b != 0) {
cout << a / b << endl;
} else {
cout << "除数不能为0" << endl;
}
} else {
cout << "不支持的运算符" << endl;
}
return 0;
}
3.4.4 阶段性编程练习¶
- 练习1:输入一个整数,判断它是正数、负数还是零。
- 练习2:输入一个0-6的数字,输出对应的星期几(0代表星期日,1代表星期一,以此类推)。
- 练习3:输入一个年份和月份,输出该月的天数(考虑闰年2月)。
- 练习4:编写一个程序,根据用户输入的消费金额,计算折扣后的应付金额:
- 满100元打9折
- 满200元打8折
- 满300元打7折
- 其他情况无折扣
3.5 switch语句¶
3.5.1 switch语句程序范例¶
当判断的条件是整型或字符型的固定值时,用 switch 语句更清晰。比如根据数字输出星期几。
#include <iostream>
using namespace std;
int main() {
int day;
cout << "请输入星期几(1-7):";
cin >> day;
switch (day) {
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
case 3:
cout << "星期三" << endl;
break;
case 4:
cout << "星期四" << endl;
break;
case 5:
cout << "星期五" << endl;
break;
case 6:
cout << "星期六" << endl;
break;
case 7:
cout << "星期日" << endl;
break;
default:
cout << "输入错误,请输入1-7之间的数字" << endl;
}
return 0;
}
3.5.2 switch语句的用法¶
格式:
switch (表达式) {
case 常量1:
语句;
break;
case 常量2:
语句;
break;
...
default:
语句;
}
- 表达式的结果必须是整型(int、char等),不能是浮点型或字符串。
- case 常量:常量必须是固定的值,不能是变量。
- 程序会找到与表达式值相等的
case,然后从那里开始执行,直到遇到break或switch结束。 break用来跳出switch,如果不写break,会继续执行下一个case的代码(这叫做“穿透”)。default是可选的,当所有case都不匹配时执行。
3.5.3 编程实例讲解¶
实例9:根据成绩等级给出评语¶
#include <iostream>
using namespace std;
int main() {
char grade;
cout << "请输入成绩等级(A、B、C、D):";
cin >> grade;
switch (grade) {
case 'A':
cout << "优秀,继续努力!" << endl;
break;
case 'B':
cout << "良好,再接再厉!" << endl;
break;
case 'C':
cout << "中等,要加油!" << endl;
break;
case 'D':
cout << "及格边缘,需加强!" << endl;
break;
default:
cout << "无效等级" << endl;
}
return 0;
}
实例10:简易四则运算(用switch)¶
#include <iostream>
using namespace std;
int main() {
double a, b;
char op;
cout << "请输入表达式(如 3+5):";
cin >> a >> op >> b;
switch (op) {
case '+':
cout << a + b << endl;
break;
case '-':
cout << a - b << endl;
break;
case '*':
cout << a * b << endl;
break;
case '/':
if (b != 0)
cout << a / b << endl;
else
cout << "除数不能为0" << endl;
break;
default:
cout << "不支持的运算符" << endl;
}
return 0;
}
3.5.4 阶段性编程练习¶
- 练习1:输入一个数字1-12,输出对应的月份英文名(January, February…)。
- 练习2:输入一个字符,判断它是元音字母(a, e, i, o, u,包括大小写)还是辅音字母。(提示:多个case可以共用一段代码,比如
case 'a': case 'e': ...) - 练习3:模拟一个简单的菜单:
- 输入1:显示“开始游戏”
- 输入2:显示“加载存档”
- 输入3:显示“退出游戏”
- 其他:显示“无效选项” - 练习4:输入两个整数和一个运算符(+、-、*、/、%),用switch完成运算。
3.6 逻辑运算¶
3.6.1 逻辑运算程序范例¶
有时候一个条件需要多个判断组合,比如“成绩在80到90之间”需要同时满足大于等于80且小于等于90。这就需要逻辑运算符。
#include <iostream>
using namespace std;
int main() {
int score;
cout << "请输入成绩:";
cin >> score;
if (score >= 80 && score <= 90) { // 并且
cout << "成绩良好" << endl;
}
if (score < 60 || score > 100) { // 或者
cout << "成绩异常" << endl;
}
if (!(score >= 60)) { // 非
cout << "不及格" << endl;
}
return 0;
}
3.6.2 逻辑运算的用法¶
| 运算符 | 名称 | 含义 | 例子 |
|---|---|---|---|
&& |
与 | 两边都为真,结果才为真 | a>0 && a<10 |
|| |
或 | 两边至少一个为真,结果为真 | a==0 || b==0 |
! |
非 | 取反,真变假,假变真 | !(a>b) |
优先级:! 最高,然后是 &&,最后是 ||。可以用括号改变顺序。
真值表(简单理解)¶
true && true→truetrue && false→falsefalse && true→falsefalse && false→falsetrue || true→truetrue || false→truefalse || true→truefalse || false→false!true→false!false→true
3.6.3 编程实例讲解¶
实例11:判断闰年(用逻辑运算)¶
#include <iostream>
using namespace std;
int main() {
int year;
cout << "请输入年份:";
cin >> year;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
cout << year << " 是闰年" << endl;
} else {
cout << year << " 不是闰年" << endl;
}
return 0;
}
实例12:判断三角形类型¶
题目:输入三条边长,判断是否能构成三角形,如果能,是等边、等腰还是普通三角形。
#include <iostream>
using namespace std;
int main() {
double a, b, c;
cout << "请输入三条边长:";
cin >> a >> b >> c;
// 三角形条件:任意两边之和大于第三边
if (a + b > c && a + c > b && b + c > a) {
if (a == b && b == c) {
cout << "等边三角形" << endl;
} else if (a == b || a == c || b == c) {
cout << "等腰三角形" << endl;
} else {
cout << "普通三角形" << endl;
}
} else {
cout << "不能构成三角形" << endl;
}
return 0;
}
3.6.4 阶段性编程练习¶
- 练习1:输入一个整数,判断它是否同时满足:能被3整除,且能被5整除。
- 练习2:输入三个整数,判断它们是否都相等。
- 练习3:输入一个字符,判断它是否是大写字母或小写字母。
- 练习4:输入一个年份和月份,判断该月有多少天(使用逻辑运算处理闰年2月)。
3.7 第3章编程作业¶
恭喜你学完了分支结构!来挑战几个综合题目吧。
作业1:简单的猜拳游戏¶
编写程序,让用户输入剪刀(0)、石头(1)、布(2),电脑随机出拳(用 rand() % 3),判断胜负并输出结果。提示:需要随机数种子 srand(time(0))。
作业2:个人所得税计算器¶
输入月收入(整数),计算应缴个人所得税。假设税率如下:
- 不超过3000元的部分,税率3%
- 超过3000至12000元的部分,税率10%
- 超过12000至25000元的部分,税率20%
- 超过25000元的部分,税率25%
输出应缴税额(保留两位小数)。比如月收入10000,计算方法是:30003% + (10000-3000)10% = 90 + 700 = 790元。
作业3:日期合法性判断¶
输入年、月、日,判断这个日期是否合法(考虑闰年2月天数)。
作业4:求解一元二次方程¶
输入一元二次方程的系数 a, b, c(a≠0),计算判别式 Δ = b² - 4ac,根据Δ的情况输出根:
- Δ > 0:两个不同的实根
- Δ = 0:两个相等的实根
- Δ < 0:无实根
输出根的值(如果有),保留两位小数。
好了,第三章的内容就到这里!你已经学会了让程序做判断。加油!