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 }
posted @ 2024-11-15 20:42  gdyyx  阅读(8)  评论(0编辑  收藏  举报