语法基础课——第二讲 判断语句

语法基础课——第二讲 判断语句,第1张

语法基础课——第二讲 判断语句


第二讲 判断语句

学习语言最好的方式就是实践,每当掌握一个新功能时,就要立即将这个功能应用到实践中. ——闫学灿


if语句

一般的程序是顺序执行的,从main函数内的第一个语句开始,执行完第一个语句后执行第二个语句,执行完第二个语句后执行第三个语句,以此类推,直到执行到return 0,是这样的一个顺序的流程.

但是人类的语言并不是平铺直叙,这样一条路走到黑的,还有另外一种逻辑.

例如,顺序结构是这样的:

起床 → to → 穿衣服 → to → 洗漱 → to → 吃早饭 → to → 拿起书包 → to → 出门.

还可能有另外一种情况:

起床 → to → 穿衣服 → to → 洗漱 → to → 吃早饭 → to → 拿起书包 { 如 果 今 天 下 雨 → 带 上 一 把 伞 出 门 如 果 今 天 不 下 雨 → 不 用 带 伞 出 门 begin{cases} 如果今天下雨 &to& 带上一把伞出门 \如果今天不下雨 &to &不用带伞出门end{cases} {如果今天下雨如果今天不下雨​→→​带上一把伞出门不用带伞出门​.

这里展示了一个流程中可能存在两种不同的情况,第一讲中的内容是不足以实现它的,所以代码中会有一个全新的语法,可以让程序分叉.

程序的有些分叉不一定能走到,只有满足一定条件的情况下,才可以走到某些分叉.

例如,我们在考试后得到了一个分数,有如下代码 2-1:

//代码 2-1
#include 
#include 
using namespace std;
int main()
{
    int score;
    cin >> score;
    if (score >= 60)
    {
        cout << "及格";
    }
    else
    {
        cout << "不及格";
    }
    return 0;
}

对于代码 2-1,当输入的分数 ⩾ 60 geqslant 60 ⩾60 时,会输出及格,否则会输出不及格.

代码 2-1的第 9 9 9 行到第 16 16 16 行即为整个的if语句,首先以 if(如果) 开头,随后是一个括号(()),括号中是一个判断表达式(即条件),如果条件成立(为真)的话,会执行条件下花括号({})内部的语句,如果条件不成立的话,会执行 else(否则) 下面的花括号({})内部的语句.

代码 2-1的第 9 9 9 行末尾千万不要加分号(;),即写成if (score >= 60);.

首先,C++语言中是允许空语句的存在的,即;本身就是一个语句;其次,若加上了分号(;),相当于在满足条件后,会执行一个空语句就跳出了整个if语句.

如果条件成立的话,不一定只执行一个语句,可以在花括号({})写上数条语句,它们会顺次执行.

if结构还有一些变形:

    else的内容可以被忽略掉.
#include 
#include 
using namespace std;
int main()
{
    int score;
    cin >> score;
    if (score >= 60)
    {
        cout << "及格";
    }
    return 0;
}

但是if的内容不能忽略掉.

    当if或else下的花括号({})内只有一个语句时,可以将花括号({})省略.
#include 
#include 
using namespace std;
int main()
{
    int score;
    cin >> score;
    if (score >= 60)
        cout << "及格";
    else
        cout << "不及格";
    return 0;
}

当然,也可以写成如下形式:

#include 
#include 
using namespace std;
int main()
{
   	int score;
   	cin >> score;
   	if (score >= 60) cout << "及格";
   	else cout << "不及格";
   	return 0;
}

因为C语言不是按照缩进或行来划分语句的,而是以分号(;)与花括号({})来划分语句的.

判断表达式 含义写法大于a > b小于a < b大于等于a >= b(这里不能分开写成a > = b,表格后面的也不能分开写)小于等于a <= b等于a == b(因为a = b的含义是把b的值赋给a,所以这里判断等于是两个等号(=))不等于a != b

练习:输入一个整数 x x x,输出 x x x 的绝对值.

如果 x 大于等于 0,则输出 x 本身
否则,输出 -x
#include 
#include 
using namespace std;
int main()
{
    int x;
    cin >> x;
    if (x >= 0)
    {
        cout << x << endl;
    }
    else 
    {
        cout << -x << endl;
    }
    return 0;
}

如上代码可以简写为:

#include 
#include 
using namespace std;
int main()
{
   	int x;
   	cin >> x;
   	if (x >= 0) cout << x << endl;
   	else cout << -x << endl;
   	return 0;
}

练习:输入两个整数,输出两个数中较大的那个

#include 
#include 
using namespace std;
int main()
{
    int a,b;
    cin >> a >> b;
    if (a > b) cout << a << endl;
    else cout << b << endl;
    return 0;
}
嵌套语句
//代码 2-2
#include 
#include 
using namespace std;
int main()
{
    int a,b;
    cin >> a >> b;
    if (a > b)
    {
        cout << a << endl;
        if (a > 5)
        {
            cout << "a大于5!" << endl;
        }
        else
        {
            cout << "a小于等于5!" << endl;
        }
    }
    else cout << b << endl;
    return 0;
}

如上代码 2-2,if结构中是可以嵌套if结构的,不仅可以加在if后的花括号({})中,还可以加在else后的花括号({})中.

练习:输入三个整数,输出三个数中最大的那个

先用人的语言描述一下,注意人在思考代码逻辑时,一定要把自己想象成一种“低级”生物,不能说“我一眼就看出来了”,因为机器并不能一眼就看出来;机器能进行的规则就是“每次判断两个数的大小”(不能同时比较三个数),在这种情况下,怎样找出三个数中的最大值.

如果 a >= b
	如果 a >= c
		a 是最大值
	否则
		c 是最大值(因为此时 c > a >= b)
否则
	如果 b >= c
		b 是最大值
	否则
		c 是最大值
#include 
#include 
using namespace std;
int main()
{
    int a, b, c;
    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;
}

注意,if和else是有一个就近原则的,即==else一定和往上离它最近的,尚未配对的if相对应==,而且每个if只能对应一个else.

例如下代码:

#include 

using namespace std;

int main()
{
    int a = 1, b = 2, c = 3;
    if (a == 1)
        if (b == 1) cout << "b == 1" << endl;
    else cout << "b == 2" << endl;
    return 0;
}

虽然看似else cout << "b == 2" << endl;好像对应着if (a == 1),但实际上根据就近原则,它其实对应着if (b == 1) cout << "b == 1" << endl;,故运行结果为:

b == 2

所以如上代码如果书写规范,应该为:

if (a == 1)
        if (b == 1) cout << "b == 1" << endl;
    	else cout << "b == 2" << endl;

但如果是用花括号({})括起来的if语句,这就不需要else来配对,例如下代码:

#include 

using namespace std;

int main()
{
    int a = 1, b = 2, c = 3;
    if (a == 1)
    {
        if (c == 3) cout << "c == 3" << endl;
    }
    else cout << "b == 2" << endl;
    return 0;
}

这样,if (c == 3) cout << "c == 3" << endl;就可以没有else来对应,而else cout << "b == 2" << endl;则对应着if (a == 1),故运行结果为:

c == 3

所以C++语言对代码缩进实际上是没有要求的,但是为了方便阅读,在我们书写代码时,要时刻注意if和哪个else对应,需要将它们对齐,这样才能做到逻辑清晰、不易出错.

变量的作用域

在程序的某个花括号({})中定义的变量,是不能在此花括号({})外使用的.

也就是说,变量有所谓的生命周期,例如下代码就是非法的:

#include 

int main()
{
   int a = 1, b = 1;
   if (a == b)
   {
       int x;
   }
   x = 1;
   return 0;
}

非法:指某种说法、代码或者定义不符合规则.

因为变量x只能在if确定的花括号({})内使用,在花括号外部使用是不被允许的.

当然,花括号并不单单依赖于main函数和if语句,也可以写成如下代码:

#include 

int main()
{
   int a = 1;
   {
       int a = 3;
       a += 5;
       printf("%dn", a);
   }
   printf("%dn", a);
   return 0;
}

运行结果如下:

5
1

即花括号({})本身就起到了生成作用域的作用,且允许变量名发生冲突;当变量名发生冲突时,会优先使用当前作用域内的同名变量,产生的所有 *** 作,都不会对当前作用域外的同名变量产生影响.

花括号提供了多个语句同归于一个作用域的作用,既能让if语句内包含多个语句,也能够产生新的作用域.

if else 连写

输入一个 0 0 0 到 100 100 100 之间的分数,

如果大于等于 85 85 85 ,输出 A;

如果大于等于 70 70 70 并且小于 85 85 85,输出 B;

如果大于等于 60 60 60 并且小于 70 70 70,输出 C;

如果小于 60 60 60 ,输出 D;

#include 
#include 
using namespace std;
int main()
{
    int grade;
    cin >> grade;
    if (grade >=85) cout << 'A' <= 70) cout << 'B' << endl;
        else // 蕴含着 grade < 70
        {
            if (grade >= 60) cout << 'C' << endl;
            else //蕴含着 grade < 60
            {
                cout << 'D' << endl;
            }
        }
    }
    return 0;
}

如上是用嵌套语句来实现的代码,但其实代码逻辑本身并没有那么复杂,可以写成如下代码:

//代码 2-3
#include 
#include 
using namespace std;
int main()
{
    int grade;
    cin >> grade;
    if (grade >=85) cout << 'A' <= 70) cout << 'B' << endl;
    else if (grade >= 60) cout << 'C' << endl;
    else cout << 'D' << endl;
    return 0;
}

如上代码 2-3可以视为,因为else后面只有一个if语句,所以可以去掉花括号({}),变为如下代码:

#include 
#include 
using namespace std;
int main()
{
   	int grade;
   	cin >> grade;
   	if (grade >=85) cout << 'A' <= 70) cout << 'B' << endl;
        	else // 蕴含着 grade < 70
         		if (grade >= 60) cout << 'C' << endl;
            	else //蕴含着 grade < 60
               	cout << 'D' << endl;
    return 0;
}

又由于C语言代码的语句的划分并不是通过缩进和换行实现的,而是通过分号(;)与花括号({})实现的,所以可以去掉else与if之间的换行(但需要保留一个空格' '表示这两个单词是彼此分开的),变为代码 2-3.

练习:

    简单计算器输入两个数,以及一个运算符+, -, *, /,输出这两个数运算后的结果。当运算符是/,且除数是 0 0 0 时,输出"Divided by zero!"; 当输入的字符不是+, -, *, /时,输出"Invalid operator!".
#include 
#include 
using namespace std;
int main()
{
    int a, b;
    char c;
    cin >> a >> b >> c;
    if (c == '+') cout << a + b << endl;
    else if (c == '-') cout << a - b << endl;
    else if (c == '*') cout << a * b << endl;
    else if (c == '/')
    {
        if (b == 0) cout << "Divided by zero!" << endl;
        else cout << a / b << endl;
    }
    else cout << "Invalid operator!" << endl;
    return 0;
}
    判断闰年。闰年有两种情况:

​ (1) 能被 100 100 100 整除时,必须能被 400 400 400 整除;

​ (2) 不能被 100 100 100 整除时,被 4 4 4 整除即可。

​ 输入一个年份,如果是闰年输出"yes",否则输出"no".

#include 
#include 
using namespace std;
int main()
{
    int year;
    cin >> year;
    if (year % 100 == 0)
    {
        if (year % 400 == 0) cout << "yes" << endl;
        else cout << "no" << endl;
    }
    else 
    {
        if (year % 4 == 0) cout << "yes" << endl;
        else cout << "no" << endl;
    }
    return 0;
}
条件表达式

人类是一种比较复杂的生物,所以不能通过单一的情况作出某些判断.

例如期末要评选三好学生,三好学生一定要有表率作用,老师不会仅从一个方面来考察同学,老师一定会从多个方面来考察同学,例如:

    期末成绩优秀;为人比较受欢迎;有责任心;

因此如果一个同学期末成绩优秀并且为人比较受欢迎并且有责任心,则我们可以给其颁发一个三好学生.

逻辑可以写为:

如果 成绩优秀 并且 受欢迎 并且 有责任心
	那么给他颁发三好学生

当然,用上面讲过的语句是可以实现该逻辑的,可以写为:

if (成绩优秀)
	if (受欢迎)
		if (有责任感)
			给他颁发三好学生

但实现起来是比较复杂的,并且若逻辑改写为:

如果 成绩优秀 并且 (受欢迎 或者 有责任感)
	那么给他颁发三好学生

这样的逻辑用上面讲过的语句去实现是较为困难的:

if (成绩优秀)
{
	if (受欢迎) 给他颁发三好学生
	else if (有责任感) 给他颁发三好学生
}

有没有什么方式可以用一条语句来实现这个逻辑呢?

符号含义写法&&与(第一个条件满足并且第二个条件满足)a && b||或(要么第一个条件满足,要么第二个条件满足)a || b!非(若不满足某个条件)!a

短路原则

条件表达式会从左到右依次执行每个条件,例如:

当使用a && b时,若a条件不满足,则不论b是否满足,肯定都不会满足整个条件,故在判断a条件不满足后会直接判断其不满足,往后的条件表达式就不会执行.当使用a || b时,若a条件满足,则不论b是否满足,肯定都会满足整个条件,故在判断a条件满足后会直接判断其满足,往后的条件表达式就不会执行.

此外,这三种运算符是可以组合起来的,可以将&&看成乘法( × times ×),将||看成加法( + + +),就可以拼在一起组合起来(但执行顺序不变,即&&和||的优先级是相同的).

例题:输入三个数,输出三个数中的最大值.

#include 
#include 
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    if (a >= b && a >= c) cout << a << endl;
    else if(b >= a && b >= c) cout << b << endl;
    else cout << c << endl;
    return 0;
}

注意C++语言中判断符号是不能连着写的,例如a >= b >= c是不对的.

因为判断表达式和条件表达式的值是布尔类型的,所以如上语句会先判断a >= b是否成立,若成立则值为 1 1 1,否则值为 0 0 0,随后这个值将会和c进行比较并得到一个布尔类型的值.

所以实际上if语句的括号(())内可以填入判断表达式和条件表达式,只有在它们的值为真(即为 1 1 1)时,if下面花括号({})内的语句才可以执行.

练习:用一条if语句,判断闰年

#include 
#include 
using namespace std;
int main()
{
    int year;
    cin >> year;
    if ((year % 100 == 0 && year % 400 ==0) || (year % 100 != 0 && year %4 == 0))
        cout << "yes" < 

如上代码可以简化为:

#include 
#include 
using namespace std;
int main()
{
   	int year;
   	cin >> year;
   	if ((year % 4 == 0 && year % 100) || year % 400 == 0) cout << "yes" < 
 

当year不能被 100 100 100 整除时,一定有year % 100 != 0,由于非 0 0 0 即为真的原则,而这里的!=0就可以忽略不写.


本文档基于 AcWing语法基础课 制作

视频链接:1.2 判断语句 - AcWing

文档版本:

var1.0 完成于2022.01.29.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5714858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存