选择结构(理论)

选择/分支结构:根据条件判定的结果,选择执行不同的程序代码。现实中有大量类似的例子,例如根据红绿灯的颜色决定前进、停止等。


文章目录

  • 一、关系运算符与关系表达式
    • 1、关系运算符:
    • 2、关系表达式
  • 二、逻辑运算符与逻辑表达式
  • 三、选择结构
    • 1、单分支
    • 2、双分支
    • 3、条件表达式(三目运算符?:)
    • 4、分支嵌套
    • 5、多分支
    • 6、switch


一、关系运算符与关系表达式

1、关系运算符:

小于大于小于等于大于等于等于不等于
<><=>===!=

注意:
▶ \blacktriangleright == 与 = 的区别(a=5是赋值语句;a==5是逻辑运算,结果为True或False)
▶ \blacktriangleright <、>、<=、>=的优先级大于== 、!=
▶ \blacktriangleright 优先级:算术运算符 > 关系运算符 > 赋值运算符

2、关系表达式

概念:用关系表达式将表达式连接起来称为关系表达式。
\space\space\space\space\space\space\space        关系表达式的值非真既假,在C++语言中,用非0代表真,用0代表假。关系表达式的结果只有两个,真为1,0为假。
\space\space\space\space\space\space\space        一般格式为:<项目1><关系运算符><项目2>
注意:
▶ \blacktriangleright 表达式的值:如果关系表达式成立,其值为1,表示真;否则为0,表示假
▶ \blacktriangleright 字符与字符比较时按位依次比较他们的ASCII码

ASCII码规律:
(1)小写字母的ASCII码值>大写字母的ASCII码值>数字的ASCII码值
(2)同类字符的ASCII码值递增
(3)‘0’:48 ‘A’:65 ‘a’:97,同一英文字符小写-大写=32

#include
using namespace std;
int main(){int a=10,b=20;cout<<(a<b)<<" "<<(a>=b)<<" "<<(a!=b)<<endl;cout<<('a'>'0')<<endl;cout<<('a'<'b')<<endl;return 0;
}

二、逻辑运算符与逻辑表达式

逻辑运算符:非(!)>与(&&)>或(||)
非(!)表示取反,与(&&)表示同时成立(交集),或(||)表示只需要成立一个(并集)

AB!AA&&BA||B
00100
01101
10001
11011

注意:
▶ \blacktriangleright 逻辑运算符的优先级:非>与>或
▶ \blacktriangleright 总优先级:! → \rightarrow 算术 → \rightarrow 关系 → \rightarrow 逻辑 → \rightarrow 赋值 → \rightarrow 逗号
▶ \blacktriangleright 作为条件时,所有非0值均为真;作为结果,只有0和1两种
▶ \blacktriangleright 数学条件:1 ⇒ \Rightarrow C++表达式:1

例题:输入n,判断某年n是否为闰年
分析:n为闰年的情况有两种:
1、能被4整除且不能被100整除(2200不是闰年)
2、能被400整除
逻辑表达式:(n%4==0 && n%100!=0) || n%400==0

三、选择结构

1、单分支

if(条件){语句或语句组
}

代码执行流程:首先计算表达式的值,若为真,则执行语句;否则,不执行语句。

例如,求一个数的绝对值

int a;
cin>>a;
if(a<0)a=-a;
cout<<a<<endl;

2、双分支

if(条件){语句或语句组1
}
else{语句或语句组2
}

例如,求一个数的绝对值

int a;
cin>>a;
if(a>=0)cout<<a<<endl;
elsecout<<-a<<endl;

3、条件表达式(三目运算符?:)

形式:条件?值1:值2
当条件成立时,表达式的值为值1,否则为值2
例如,求ab中的最大值的公式如下:a>b?a:b

4、分支嵌套

if(条件1)语句1
else{if(条件2)语句2else语句3  //语句3亦可是双分支
}

例如,求分段函数,如下所示:
y = { 0 ( x < 0 ) x ( 0 < = x < = 5 ) x 2 ( x > 5 ) y=\begin{cases} 0\space(x<0)\\ x\space(0<=x<=5)\\ x^2\space(x>5) \end{cases} y= 0 (x<0)x (0<=x<=5)x2 (x>5)
根据用户输入的x的值计算函数y的值

#include
using namespace std;
int main(){int x,y;cin>>x;if(x<0)y=0;else{if(x<=5)y=x;elsey=pow(x,2);}cout<<y<<endl;return 0;	
}

5、多分支

if(条件1)语句1
else if(条件2)语句2
else if(条件3)语句3
...
else语句n

例:输入3个整数,从小到大排序后输出
输入样例:20 7 33
输出样例:7 20 33

分析:a,b,c这三个数排序一共有6种可能:abc、acb、bac、bca、cab、cba,最简单的思路就是使用六个if语句,如下

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

上述程序看上去没有错误,而且能够通过样例,但是输入"1 1 1得不到任何输出"!这个例子说明,即使通过了题目中给出的样例,程序仍有可能存在问题。
提示:算法竞赛的目标是编程对于任意输入均可以得到正确的结果,而不仅仅是样例。
将程序稍作修改:把所有的"<“改成”<=“。尝试后会发现仍然存在问题。对于"1 1 1”,程序会输出六行"1 1 1"。
解决方案:将多个单分支改为多分支,将if改为else if,else if可读作“再如果”,即上一个“如果”不成立才会去判断下一个“如果”,所有“如果”后的语句中只执行一个。

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

此时输入"1 1 1",我们会发现仍然存在一个问题,没有输出,因此一般多分支的最后一个分支只写else(当上面所有“如果”都不成立的的情况下执行),这样可以保证此分支结构必有输出。

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

6、switch

switch语句根据条件的不同取值来执行不同的语句。格式如下:

switch (值或表达式)
{case1:代码段Abreak;case2:代码段Bbreak;……default:代码段Nbreak;
}

如果表达式的值是值1,就执行代码段A;如果表达式的值是值2,就执行代码段B……否则执行代码段N。
注意:
1、default部分可以省略。
2、如果不使用break,那么紧随其后的case部分代码也会被执行,直到遇到break或switch语句结束为止!
3、switch结尾要有一个分号。

【问题描述】输入一个日期,判断它所在年份是否为闰年,并输出所在月份的天数。闰年的判断方法:四年一闰,百年不闰,四百年又闰。

#include
using namespace std;
int main(){int year,month,day;bool b=false;cin>>year>>month>>day;// 判断是否为闰年if(year%400==0)b=true;else if (year%100!=0 && year%4==0)b=true;if(b)cout<<year<<"是闰年。"<<endl;elsecout<<year<<"不是闰年。"<<endl;// 判断所在月份的天数switch (month){case 1: case 3: case 5: case 7: case 8: case 10: case 12:cout<<"这个月有31天。"<<endl;break;case 4: case 6: case 9: case 11:cout<<"这个月有30天。"<<endl;break;case 2:cout<<"这个月有"<<(b?29:28)<<"天。"<<endl;break;}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部