Appearance
L1-11 逻辑判断与选择结构二
条件语句与逻辑表达式
妈妈:如果你写完了语文作业就去玩游戏
如果把妈妈当做是程序的设计者,那么这样一句话用 if 语句怎么表示呢?
c++
if(写完语文作业)
{
玩游戏;
}
“写完语文作业”就是我们 if 语句中的条件。
在学习运算符时举过这样一个例子:
妈妈: 如果你写完了语文作业或者数学作业就去玩游戏
我们用 if 语句怎么表示呢?
c++
if(写完语文作业)
{
玩游戏;
}
else if(写完数学作业)
{
玩游戏;
}
如果“写完语文作业”这个条件成立,那程序就会立即执行“玩游戏”这个操作,忽略后面的 else if 。否则程序将继续检验“写完数学作业”是否成立,如果成立就执行“玩游戏”的操作,否则什么都不做。
其实我们还可以用逻辑或运算符来表示这句话:
c++
if(写完语文作业 || 写完数学作业)
{
玩游戏;
}
这句话和上面的 if...else if 所得到的效果时一样的。我们之前讲过,当两个条件用逻辑或运算符 || 连接时,两个条件有一个成立,整句话就成立,值为 true; 只有当两个条件都不成立时,整句话才不成立,值为 false; 所以,只要“写完语文作业”和“写完数学作业”有至少一项成立, if 语句就会认为其条件成立,从而执行“玩游戏”这个操作。
所以 if 后面的条件语句,可以是一个 bool 变量,也可以是一个逻辑表达式。
从上面的例子我们可以看出, if 语句的用法十分灵活,在使用时我们可以根据需求和喜好选择不同的方式使用 if 语句。
下面我们举几个例子:
用 if 语句实现:如果 a 小于 b 或者 a 等于 3 就输出 a 的值这句话。
c++
if(a < b || a == 3)
cout << a << endl;
用 if 语句实现:如果 a<b 就让 a 的值加 1,否则如果 a==c 就输出 OK ,否则让 b 的值增加 2 这句话。
c++
if(a < b) {
a = a + 1;
cout << "a=" << a << endl;
}
else if(a == c)
cout << "OK" << endl;
else {
b = b + 2;
cout << "b=" << b << endl;
}
用程序实现:输入一个整数到变量 a, 如果输入的整数是负数就输出 negative, 如果是正数输出 positive ,如果是 0 输出 zero 。
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
if (a > 0)
cout << "positive";
else if (a < 0)
cout << "negative";
else
cout << "zero";
}
用程序实现:输入三个整数 a b c,输出三个整数中的最大值。
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c, max;
cin >> a >> b >> c;
if (a >= b && a >= c)
max = a;
else if (b >= a && b >= c)
max = b;
else
max = c;
cout << max << endl;
}
单选题
else 语句可以独立使用,前面可以没有 if 语句( )
A. 对
B. 错
题解
错误,else语句不可以独立使用,前面与 if 语句搭配使用
单选题
下列语句,a=3 时,程序会输出( )
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
if (a)
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
A. Yes
B. No
C. YES
D. NO
题解
选择A,if(a)和if(a!=0)等价,因为输入a为3,所以输出Yes
其实 if 语句中的条件无所谓格式,只要其运算结果为 bool 类型的变量即可。
下面有一个特殊的例子:
c++
int a;
cin >> a;
if(a)
cout << "Yes" << endl;
else
cout << "No" << endl;
那么当我们输入什么值时,程序会输出 Yes 呢?
有同学可能会疑惑,变量 a 是一个整数类型的变量,那如果输入的数不是 1 或 0 , if 语句该怎么判断这样一个不是 bool 类型值的条件呢?
其实,聪明的编译器会帮我们把数值转化成 bool 类型的值的,如果 a 不等于 0 ,就会被转化成 true ,只有当 a 等于 0 时,程序才会认为它是 false 。
单选题
下面语句中可以替代 if(!a) cout<<a;
的是?( )
A. if(a==0)cout<<a;
B. if(a==1)cout<<a;
C. if(a!=1)cout<<a;
D. if(a!=0)cout<<a;
题解
if(a);
如果a为真就继续,这里的真包括非0数字和非0字符,
if(!a);
就是如果a为假就继续,这个和最后一个等价
if(a!=0);
这个就是如果a不等于0
if(a==0)
如果a等于0
总结:if(a)
和 if(a!=0)
等价。if(!a)
和 if(a==0)
等价
填空题
我希望输入一个大于 0 的整数 n,让这段程序输出的结果为 3,那么 n 最小是( )?
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
if (n % 2 == 1)
cnt++;
if (n % 3 == 2)
cnt++;
if (n % 4 == 3)
cnt++;
if (n % 5 == 4)
cnt++;
cout << cnt;
return 0;
}
题解
cnt 等于 3 可知 n 应该同时满足: (n % 2 = 1) 相当于 2 的倍数少 1 (n % 3 = 2) 相当于 3 的倍数少 1 (n % 4 = 3) 相当于 4 的倍数少 1 因此可知 n 是 2、3、4 的最小公倍数减 1 为 11
switch语句
我们还可以用 switch 语句来完成选择结构。
相比 if 语句,switch 语句在分支条件较多时可以使得代码可读性更强。我们这就来看看 switch 语句的使用方法。
switch 语句使用格式:
c++
switch (变量或值,记为a)
{
case x1:
程序段1;
break;
case x2:
程序段2;
break;
case x3:
程序段3;
break;
......
case xn:
程序段n;
break;
default:
程序段n+1;
break;
}
程序在执行时将顺序判断每个 xi, 当遇到第一个和 a 相等的 xi 时,会从程序段 i 开始执行所有被 switch 控制的程序段(如果遇见 break 语句则跳过剩余被 switch 语句控制的程序段)。如果 a 与
如果不理解 break 可以当做格式先记下,后面我们会深入学习 break 。
text
int a;
cin >> a;
switch (a)
{
case 1:
cout << "Hello" << endl;
break;
case 2:
cout << "Good" << endl;
break;
case 3:
cout << "Like" << endl;
break;
case 4:
cout << "Nice" << endl;
break;
default:
cout << "I don't Know" << endl;
break;
}
这是一段标准的 switch case 程序,需要注意的是, case 后面跟的是具体的数值,而不是一个逻辑表达式。所以 switch case 适用的范围并不很广泛。
习题
课堂练习:判断三角形
输入三个整数 a,b,c,分别表示三条线段的长度,请编程判断:这三根线段能否组成三角形,如果可以则输出 yes,否则输出 no。
注:三角形的三条边需要满足最长边的长度小于两条短边的长度。
输入格式
输入一行三个整数 a,b,c,代表三根线段的长度;
输出格式
输出 yes
或者 no
,代表能否组成三角形;
输入样例
text
1 2 3
输出样例
text
no
数据范围
对于25%的数据,1≤a,b,c≤100;
对于100%的数据,1≤a,b,c≤10000;
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a + b > c && a + c > b && b + c > a) {
cout << "yes" << endl;
} else {
cout << "no" << endl;
}
return 0;
}
题解 1
三条线段可以组成三角形的条件需要满足:长边的长度小于两条短边之和。
所以逐条线段判断,如果是最长边,判断长度是否小于另外 2 条边的和。如果小于,则可以组成三角形,否则不行。
题解 2
不论长边还是短边,都需要满足小于另外两条边的条件,因此可以省掉找出最长边的步骤,直接判断每条边是否小于另外两边之和。
课后作业:启蒙练习-求和
编程实现输入两个整数a,b, 当a+b==1时输出one,a+b==2时输出two,a+b==3时输出three,a+b==4时输出four,a+b==5时输出five,a+b==6时输出six,a+b==7时输出seven,a+b==8时输出eight,a+b==9时输出nine,否则输出None。
输入格式
输入两个整数 a,b,以空格隔开。
输出格式
输出相应单词
输入样例
text
3 5
输出样例
text
eight
参考答案:
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
switch (a + b) {
case 1:
cout << "one" << endl;
break;
case 2:
cout << "two" << endl;
break;
case 3:
cout << "three" << endl;
break;
case 4:
cout << "four" << endl;
break;
case 5:
cout << "five" << endl;
break;
case 6:
cout << "six" << endl;
break;
case 7:
cout << "seven" << endl;
break;
case 8:
cout << "eight" << endl;
break;
case 9:
cout << "nine" << endl;
break;
default:
cout << "None" << endl;
}
return 0;
}
题解 1
利用 switch 检测 a+b 的值,并按照要求输出结果即可。
题解 2
使用 if 逐个判断
进阶习题:启蒙练习-分数评级
程序读入一个整数S,作为一个学生的期末成绩,请你输出他的成绩评级。
评级规则: A级:90 <= S <= 100,B级:80 <= S < 90,C级:70 <= S < 80,D级:60 <= S < 70,E级:0 <= S < 60。
输入格式
输入一个数S,表示该学生的分数
输出格式
输出一个大写字母,表示学生成绩的评级
输入样例
text
72
输出样例
text
C
参考答案:
c++
#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 << 'E' << endl;
return 0;
}
题解 1
虽然是多路分支,但每个分支对应的都是一个区间,而不是具体的某个值,因此并不适用 switch 。考虑用 else if 来判断每一个分支,具体请参考下面的程序。