08C++選擇結構(2)

gdyyx發表於2024-11-15

一、邏輯變數

教學影片
儲存類似燈亮或燈滅、是男還是女等結果只有兩種可能的資料時,可以使用邏輯型變數。
邏輯型變數用關鍵字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 }

相關文章