Skip to content

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 与 x1>xn 中任何一个都不相等的话,程序将执行 default 中的程序段 n+1 。

如果不理解 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 来判断每一个分支,具体请参考下面的程序。