08C++选择结构(2)
一、逻辑变量
教学视频
存储类似灯亮或灯灭、是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量。
逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真),false和true是逻辑常量,又称布尔常量。
流程图如下:
#include <typeinfo> //变量类型头文件,还是有问题;无法判断int
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
bool light=false;
int n;
cout<<"请输入拉开关几下:";
cin>>n;
cout<<typeid(n).name()<<endl;
if (n>=0 && (n-int(n)==0)) //判断是否输入正常的开关次数 ,是否为整数。
if (n%2==1) //奇数次开关,则灯亮;否则灯灭。
{
light=!light;
cout<<"灯亮";
}
else
cout<<"灯灭";
else
cout<<"输入次数错误!";
return 0;
}
英汉小词典:
bool:布尔
false:假
true:真
练习:
1、表达式(5==6)的值是( )
A.true B.false C.1 D.2
2、阅读程序写结果。
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
bool flag;
int n;
cin>>n;
if (n%2==0) flag=true;
else flag=false;
if (flag) cout<<"yes";
else cout<<"no";
return 0;
}
输入:12
flag和n的输出:
3、完善第11、16行程序。
格莱尔家里有7扇房门,编号分别为1到7.格莱尔的爸爸把所有的门都打开,格莱尔的妈妈把所有编号是2的倍数的房门作相反的处理(原来开着的门关上,原来关上的门打开),格莱尔把所有编号是3的倍数的房门作相反的处理,问共有几扇门是开着的?
1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 bool door1,door2,door3,door4,door5,door6,door7;
6 int s=0;
7 door1=door2=door3=door4=door5=door6=door6=door1=true;
8 door2=!door2;
9 door4=!door4;
10 door6=!door6;
11 ;
12 door6=!door6;
13 if(door1)s++;
14 if(door2)s++;
15 if(door1)s++;
16 ;
17 if(door1)s++;
18 if(door1)s++;
19 if(door1)s++;
20 cout<<s<<endl;
21 return 0;
22 }
二、逻辑运算符
教学视频
例程:试编一个程序,输入一个整数,若是3和5的公倍数,则输出“欧耶欧耶”。
流程图如下:
程序:
#include <typeinfo> //变量类型头文件,还是有问题;无法判断int
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
int n;
cout<<"请输入一个整数:";
cin>>n;
if(n%3==0)
if(n%5==0) cout<<"欧耶欧耶"<<endl;
return 0;
}
这个问题的条件有两个,能被3整除且能被5整除,即n%3和n%5等于零这两条件都要满足。此时,需要用到表示“而且”的逻辑运算符&&(逻辑与)
流程图:
程序:
#include <typeinfo> //变量类型头文件,还是有问题;无法判断int
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
int n;
cout<<"请输入一个整数:";
cin>>n;
if(n%3==0)
if(n%5==0) cout<<"欧耶欧耶"<<endl;
return 0;
}
逻辑运算符:逻辑与(而且)——— && 逻辑或(或者)——— || 逻辑非(否)——— !
(1)逻辑与&&:
逻辑与是一个双目运算符,使用时&&的两边各一个表达式,如果运算符的左右两边的表达式都为真,表达式整体才为真,否则即为假,如表达式:5&&6、1&&-1、1<2&&5都为真,3-3&&5、10--&&0这两个表达式都为假。
(2)逻辑或||:
逻辑或运算符也是一个双目运算符,使用时候要求两边各一个表达式,如果运算符左右两边的表达式只要有一个为真,那么逻辑或表达式的整体就为真,否则都为假,如表达式:3-3||5为真,0||5-5为假。
(3) 逻辑非!:
逻辑非是一个单目运算符,它表示取反的意思,放在表达式的左边,如!a ,即原先为真的表达式取反之后变为假,原先为假的表达式取反之后变为真。如表达式!0结果为1,!(2>1)结果为0。
练习:
(1)判断整数n不能被3整除的表达式,下列( )是错误的。
A.n%3!=0 B.(n%3==1||n%3==2) C.!(n%3==0) D.(n%3==1&&n%3==2)
(2)阅读程序写结果。
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
int n;
int s=0;
cin>>n;
if (n%3==0 || n%5==0) s++;
cin>>n;
if (n%3==0 && n%5==0) s++;
cin>>n;
if (!(n%5==0)) s++;
cout<<s;
return 0;
}
输入:15 15 15
n,s的输出:
(3)完善第18、21行程序。
再摸拟“比尔庄园”登录,输入正确的用户名和密码,输出欢迎语句“亲爱的小朋友,欢迎你!”,否则提示“用户名或密码不正确!”
8 #include <iostream> //包含输入输出流头文件iostream
9 #include <string>
10 using namespace std; //指明程序 使用命名空间std(标准)
11 int main()
12 {
13 const int USER=201701;
14 const string PSW="Computer2020@sina.com";
15 int user;
16 string psw;
17 cout<<"用户名:";
18 ;
19 cout<<"密码:";
20 cin>>psw;
21 if ( )
22 cout<<"亲爱的小朋友,欢迎你!"<<endl;
23 else
24 cout<<"用户名或密码不正确!";
25 return 0;
26 }
三、逻辑运算符的优先级
教学视频
地球绕太阳公转一周的时间称为一个回归年,大约是365.2422天。而我们所使用的日历是基于365天的一年,这样每年就会有大约0.2422天的差异。为了弥补这个差异,每四年增加一天,即闰年中的2月有29天。但是,这样又稍微多出了一些时间,因此又设定了能被100整除但不能被400整除的年份不是闰年的规则,以进一步调整误差。
例程:
试编一个程序,输入一个年份,判断是闰年还是平年。
注:四年一闰,百年不闰,四百年再闰。判断闰年的条件是:年份能被4整除但不能被100整除;或者能被400整除。
流程图如下:
#include <typeinfo> //变量类型头文件,还是有问题;无法判断int
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
bool flag;
int year;
cout<<"请输入一年份:";
cin>>year;
if ((year%4==0 && year%100!=0) || year%400==0)
flag=true;
else
flag=false;
if (flag)
cout<<year<<"是闰年"<<endl;
else
cout<<year<<"是平年"<<endl;
return 0;
}
逻辑运算符的优先级:
练习:
(1)在C++中,表达式(11>12)&&(12<15)||(13+2==15)的值是()
A.10 B.0 C.true D.false
(2)阅读程序写结果。
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
int x,y;
cin>>x>>y;
if (x>y && y!=0) cout<<x/y<<endl;
else if (x!=0) cout<<y/x<<endl;
return 0;
}
输入:96 10
x,y的输出:
(3)完善第8、11行程序。
风之巅小学每学期都要进行“吃好、睡好、心情好”的“新三好学生”评比。评比时需要对“吃好”“睡好”“心情好”这三项进行量化打分,80分及以上为优秀,三项都达到优秀的就评为“新三好”,只有两项优秀的则被评为“双优生”。编一程序,输入某位同学的每项分值,判断是“新三好”还是“双优生”。
输入:95 98 100 输入:75 95 85
输出:新三好 输出:双优生
1 #include <iostream> //包含输入输出流头文件iostream
2 #include <string>
3 using namespace std; //指明程序 使用命名空间std(标准)
4 int main()
5 {
6 int eat,sleep,mood;
7 cin>>eat>>sleep>>mood;
8 if ( )
9 cout<<"新三好";
10 else
11 if (eat<80 && sleep>=80 && mood>=80 || eat>=80 && sleep>=80 && mood<80 || )
12 cout<<"双优生";
13 return 0;
14 }
四、复合语句
教学视频
试编一程序,输入两个整数,比较大小,并按从小到大的顺序输出。
编程思想:当a小于或等于b时,先输出a,再输出b;否则先输出b,再输出a。
流程图如下:
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{ int a,b;
cout<<"a,b=";
cin>>a>>b;
if (a<=b)
cout<<a<<" "<<b<<endl;
else
cout<<b<<" "<<a<<endl;
return 0;
}
另一种方法:第1步先判断a是否大于b,当a大于b时,交换a和b的值;第2步输出a与b。
流程图:
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
int a,b,t;
cout<<"a,b=";
cin>>a>>b;
if (a>b)//若在if-else中间有多条语句时,用花括号括起来。
{
t=a;
a=b;
b=t;
}
cout<<a<<" "<<b<<endl;
return 0;
}
注意,上面采用了复合语句(语句块),和使程序清晰易读的“逐层缩进”布置。
练习:
(1)判断a不等于0,且b等于0的正确的逻辑表达式是( )
A.a!=0&&b==0 B.!(a!=0&&b=0) C.!(a==0&&b==0) C.a!==0||b!==0)
(2)阅读程序写结果。
#include <iostream> //包含输入输出流头文件iostream
using namespace std; //指明程序 使用命名空间std(标准)
int main()
{
char ch;
int sum,n;
cin>>ch;
sum=0;
if (ch>='a' && ch<='z')
{
n=ch-'a'+1;
sum+=n;
}
else
sum=27;
cout<<sum;
return 0;
}
输入:b
ch,sum,n的输出:
(3)完善第22,25行程序。
设当前电梯停在第10层,此时第20层和第7层同时有人按下按钮,电梯总是选择离它近的楼层,于是先服务在第7层的人,再服务第20层的人。编程模拟电梯调度,输入3个数,第1个数表示电梯当前停在的楼层,后两个数表示同时需要使用电梯人楼层,按服务先后的次序输出楼层。
8 #include <iostream> //包含输入输出流头文件iostream
9 using namespace std; //指明程序 使用命名空间std(标准)
10 int main()
11 {
12 int n,n1,n2,len1,len2;
13 cout<<"输入当前电梯停在的楼层:";
14 cin>>n;
15 cout<<"输入同时需要服务的两个楼层:";
16 cin>>n1>>n2;
17 if (n-n1>0) //求出当前电梯到n1的楼层数 len1
18 len1=n-n1;
19 else
20 len1=n1-n;
21 if (n-n2>0) //求出当前电梯到n2的楼层数 len2
22 ;
23 else
24 len2=n2-n;
25 if ( ) //先到距离近的楼层服务
26 cout<<n1<<"---->"<<n2;
27 else
28 cout<<n2<<"---->"<<n1;
29 return 0;
30 }