适用对象: 已完成第 1 课(环境搭建、cout/cin、变量)的同学 使用方式: 自学讲义。本课比第 1 课厚——知识点 4 个、练习 8 题,做完大约需要 1.5 小时。开始前先默写一遍固定模板 6 行,全对再往下读 学完本课,你应该能:
if / elif / else 翻译成 C++ 的
if / else if / elseand / or / not 翻译成
&& / || / !,并且知道 0 < x < 10
这种写法在 C++ 里为什么是错的Python 你这样写:
print(7 + 3, 7 - 3, 7 * 3)
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1C++ 改成这样:
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << 7 + 3 << " " << 7 - 3 << " " << 7 * 3 << endl;
cout << 7 / 2 << endl; // 输出 3,不是 3.5!
cout << 7 % 2 << endl; // 输出 1
return 0;
}运行结果:
10 4 21
3
1
只有这几个不同:
| Python | C++ | 说明 |
|---|---|---|
+ - * |
+ - * |
完全一样 |
7 / 2 → 3.5 |
7 / 2 → 3 |
⚠️ 两个整数相除,C++ 只留整数部分 |
7 // 2 → 3 |
7 / 2 → 3 |
Python 的 // 才是 C++ 的 / |
7 % 2 → 1 |
7 % 2 → 1 |
取余数,用法一样 |
2 ** 10 |
没有 ** |
乘方另有办法,以后学 |
⚠️ 本课最大的坑:整数除法。 C++ 里
7 / 2 得
3——不是四舍五入,是直接扔掉小数部分。你以后写错的除法,八成栽在这。想要
3.5,就让至少一边是小数:
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << 7 / 2 << endl; // 3 整数 ÷ 整数 = 整数
cout << 7.0 / 2 << endl; // 3.5 有一边是小数,结果就是小数
cout << 1 / 2 << endl; // 0 ← 特别容易忽略:结果直接是 0!
return 0;
}📝 一句话:C++ 的 / 对整数来说就是 Python 的
//。
%(取余)在判断题里天天用:x % 2 == 0
就是偶数,x % 5 == 0 就是 5 的倍数——这个和 Python
完全一样。
elif
改叫 else if(20 分钟)Python 你这样写:
score = 95
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")C++ 改成这样:
#include <bits/stdc++.h>
using namespace std;
int main() {
int score = 95;
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 60) {
cout << "及格" << endl;
} else {
cout << "不及格" << endl;
}
return 0;
}只有这几个不同:
if (score >= 90)——Python
不用括号,C++ 必须有{ }(第 1
课说过:C++ 不看缩进,只看大括号)elif → else if(拆成两个词)else 后面没有条件,直接接 {嵌套 if 也一样,一层大括号套一层:
#include <bits/stdc++.h>
using namespace std;
int main() {
int score = 95;
if (score >= 60) {
cout << "及格了" << endl;
if (score >= 90) {
cout << "而且是优秀!" << endl;
}
}
return 0;
}⚠️ 大括号的建议:条件里哪怕只有一行代码,也把
{ } 写上。 C++
允许单行省略大括号,但省略之后再加一行代码就会出隐蔽的
bug——先养成"永远写大括号"的习惯,等你完全熟练了再说。
新建
check1.cpp:读入一个整数(考试分数),用上面的三档判断输出结果。分别输入
95、73、20 各跑一次,三种输出都要见到。
and 变 &&(15
分钟)比较运算符和 Python
完全一样:==、!=、>、<、>=、<=。
逻辑运算符要换写法:
| Python | C++ | 读法 |
|---|---|---|
and |
&& |
并且(两个都成立) |
or |
|| |
或者(成立一个就行) |
not |
! |
取反 |
Python 你这样写:
x = 7
if x > 0 and x % 2 == 1:
print("正奇数")C++ 改成这样:
#include <bits/stdc++.h>
using namespace std;
int main() {
int x = 7;
if (x > 0 && x % 2 == 1) {
cout << "正奇数" << endl;
}
return 0;
}(& 在数字 7 的上面,| 在回车键上方的
\ 键上,都要按住 Shift。! 在数字 1
的上面。)
0 < x < 10 能编译,但是是错的!Python 里 0 < x < 10 表示"x 在 0 和 10
之间",很好用。C++
里这么写不报错,但结果完全不对。亲手跑一遍:
#include <bits/stdc++.h>
using namespace std;
int main() {
int x = 20;
if (0 < x < 10) {
cout << "x 在 0 和 10 之间" << endl; // x = 20 也会打印这句!
}
cout << (3 > 5) << endl; // 输出 0:C++ 里"假"就是数字 0
cout << (3 < 5) << endl; // 输出 1:C++ 里"真"就是数字 1
return 0;
}运行结果(x 明明是 20):
x 在 0 和 10 之间
0
1
为什么? C++ 从左往右算:先算
0 < 20,成立,得到 1(C++
里真=1、假=0);再算
1 < 10,永远成立。所以这个条件对任何 x
都是真。
正确写法是拆成两半用 && 连接:
#include <bits/stdc++.h>
using namespace std;
int main() {
int x = 20;
if (x > 0 && x < 10) {
cout << "x 在 0 和 10 之间" << endl;
} else {
cout << "x 不在范围内" << endl;
}
return 0;
}📝
区间判断永远拆两半:x > 0 && x < 10。连着写的
0 < x < 10 是 Python 特权,C++ 没有。
照惯例,把错误亲手做出来。
错误 1:条件忘加小括号(Python 后遗症,报错)
#include <bits/stdc++.h>
using namespace std;
int main() {
int score = 95;
if score >= 90 { ← Python 写法,少了 ( )
cout << "优秀" << endl;
}
return 0;
}
编译器会说:error: expected '(' before 'score'
(翻译:score 前面我期待一个左括号)
错误 2:== 写成
=(不报错,最阴险)
判断相等是 ==,一个等号 =
是赋值。写混了编译器不报错,程序照跑,但逻辑全错。亲手跑:
#include <bits/stdc++.h>
using namespace std;
int main() {
int x = 3;
if (x = 5) { // 想写 x == 5,手滑写成了 =
cout << "x 等于 5" << endl;
}
cout << "x 现在是 " << x << endl;
return 0;
}运行结果(x 明明一开始是 3):
x 等于 5
x 现在是 5
x = 5 干了两件坏事:把 x 改成了
5,并且这个式子的值是 5(非零 = 真),条件永远成立。
📝 拿到"结果不对但不报错"的程序,第一件事:检查 if 里是不是把
== 写成了 =。
⭐ 基础题 1:找错(不用电脑,先用眼睛)
下面的程序想判断 n 是不是正数,有两处错误:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if n > 0 {
cout << "正数" << endl;
} else {
cout << "不是正数" << endl
}
return 0;
}
条件缺小括号,倒数第二个 cout 行末缺分号:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n > 0) {
cout << "正数" << endl;
} else {
cout << "不是正数" << endl;
}
return 0;
}⭐ 基础题 2:翻译(文件名 t2.cpp)
把下面的 Python 程序翻译成 C++,输入 35、20、5 各验证一次:
t = int(input())
if t >= 30:
print("热")
elif t >= 15:
print("舒服")
else:
print("冷")#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
if (t >= 30) {
cout << "热" << endl;
} else if (t >= 15) {
cout << "舒服" << endl;
} else {
cout << "冷" << endl;
}
return 0;
}⭐ 基础题 3:奇偶判断(文件名
t3.cpp)
输入一个正整数,偶数输出 偶数,奇数输出
奇数。
输入样例:
8
输出样例:
偶数
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n % 2 == 0) {
cout << "偶数" << endl;
} else {
cout << "奇数" << endl;
}
return 0;
}⭐⭐ 实战题 4:比大小(文件名
t4.cpp)
输入两个不相等的整数,输出较大的那个。上节课用过
max,这次不许用——练 if/else。
输入样例:
3 9
输出样例:
9
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if (a > b) {
cout << a << endl;
} else {
cout << b << endl;
}
return 0;
}⭐⭐ 实战题 5:闰年判断(文件名
t5.cpp)
输入年份,闰年输出 闰年,否则输出
平年。闰年规则:能被 4 整除但不能被 100
整除,或者能被 400 整除。用
2024(闰年)、1900(平年)、2000(闰年)验证。
输入样例:
2024
输出样例:
闰年
#include <bits/stdc++.h>
using namespace std;
int main() {
int y;
cin >> y;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
cout << "闰年" << endl;
} else {
cout << "平年" << endl;
}
return 0;
}规则原文有"并且"和"或者",直接翻译:&&
连接前两个条件,外面套括号,再 || 第三个。这题是
&&/|| 的经典组合,值得背下来。
⭐⭐ 实战题 6:成绩五档(文件名
t6.cpp)
输入成绩(0~100 的整数),按下表输出等级。用 95、85、75、65、30 各验证一次:
| 分数 | 输出 |
|---|---|
| 90 及以上 | A |
| 80~89 | B |
| 70~79 | C |
| 60~69 | D |
| 60 以下 | 不及格 |
#include <bits/stdc++.h>
using namespace std;
int main() {
int s;
cin >> s;
if (s >= 90) {
cout << "A" << endl;
} else if (s >= 80) {
cout << "B" << endl;
} else if (s >= 70) {
cout << "C" << endl;
} else if (s >= 60) {
cout << "D" << endl;
} else {
cout << "不及格" << endl;
}
return 0;
}else if 链从高往低写,前面的条件不成立才会走到后面,所以
s >= 80 不需要再写 s < 90。
⭐⭐⭐ 冲刺题 7:出租车计费(文件名
t7.cpp)
出租车 3 公里以内(含 3 公里)收起步价 10 元,超过 3 公里的部分每公里加 2 元。输入行驶公里数(正整数),输出车费。
输入样例1: 输入样例2:
2 8
输出样例1: 输出样例2:
10 20
#include <bits/stdc++.h>
using namespace std;
int main() {
int km;
cin >> km;
if (km <= 3) {
cout << 10 << endl;
} else {
cout << 10 + (km - 3) * 2 << endl;
}
return 0;
}8 公里 = 起步 10 元 + 超出的 5 公里 × 2 元 = 20 元。注意超出部分是
km - 3,别把前 3 公里也乘进去。
⭐⭐⭐ 冲刺题 8:石头剪刀布(文件名
t8.cpp)
甲、乙两人玩石头剪刀布,用数字表示出的东西:0 = 石头,1 = 剪刀,2 =
布。规则:石头胜剪刀,剪刀胜布,布胜石头。输入两个整数(甲出的、乙出的),输出
平局、甲胜 或 乙胜。
输入样例1: 输入样例2:
0 1 2 2
输出样例1: 输出样例2:
甲胜 平局
老老实实把三种"甲胜"的情况用 || 列出来:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if (a == b) {
cout << "平局" << endl;
} else if ((a == 0 && b == 1) || (a == 1 && b == 2) || (a == 2 && b == 0)) {
cout << "甲胜" << endl;
} else {
cout << "乙胜" << endl;
}
return 0;
}不是平局、也不是甲胜,那就只能是乙胜——最后一个 else
不用写条件。
取巧解法(想挑战的看):观察规则,甲胜恰好都是"乙的数字比甲大
1(循环意义下)",所以 (b - a + 3) % 3 == 1
就是甲胜。+3 是为了防止 b - a
出负数。两种写法都对,比赛里先写你最有把握的。
"如果…就 A 否则就 B"这种两选一,C++ 有个一行的写法:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 3, b = 9;
int big = a > b ? a : b; // a > b 吗?真就取 a,假就取 b
cout << big << endl;
return 0;
}条件 ? 值1 : 值2——条件成立取值 1,否则取值 2。相当于
Python 的
a if a > b else b。只适合简单的两选一,复杂逻辑还是老实写
if。
加餐挑战(文件名 t9.cpp):
输入三个互不相等的整数,从大到小输出。只用本课的 if/else(不许用
sort、max)。
输入样例:
3 9 5
输出样例:
9 5 3
先用 if 链找出最大的排第一,再比剩下两个:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a > b && a > c) {
if (b > c) cout << a << " " << b << " " << c << endl;
else cout << a << " " << c << " " << b << endl;
} else if (b > a && b > c) {
if (a > c) cout << b << " " << a << " " << c << endl;
else cout << b << " " << c << " " << a << endl;
} else {
if (a > b) cout << c << " " << a << " " << b << endl;
else cout << c << " " << b << " " << a << endl;
}
return 0;
}六种排法一种不落。写的时候在纸上把 6 种情况列出来再敲,比边敲边想快得多。(这题用 if 写很啰嗦?没错——以后学了数组和排序,它是三行的事。先感受一下"工具不趁手",以后才知道好工具好在哪。)
| Python | C++ | 备注 |
|---|---|---|
7 / 2 → 3.5 |
7 / 2 → 3 |
⚠️ 整数相除只留整数 |
7 // 2 |
7 / 2 |
C++ 的 / 就是整除 |
7 % 2 |
7 % 2 |
一样 |
2 ** 10 |
没有 ** |
乘方以后学 |
if x > 0: |
if (x > 0) { |
条件必须加 ( ) |
elif |
else if |
拆成两个词 |
and / or / not |
&& / || / ! |
|
0 < x < 10 |
x > 0 && x < 10 |
⚠️ 连写在 C++ 里是错的 |
a if a > b else b |
a > b ? a : b |
三目运算符(加餐) |
真假就是数字: C++ 里真 = 1,假 =
0。cout << (3 > 5) 输出 0。
两个新错误:
| 症状 | 原因 |
|---|---|
expected '(' before ... |
if 条件忘加小括号(Python 后遗症) |
| 不报错但结果不对 | 八成是 == 写成了 = |
本课新符号:
%、&&、||、!、else if、? :
7 / 2 等于几?1 / 2
呢?想要 3.5 该怎么写?0 < x < 10 在 C++ 里为什么对任何 x
都成立?