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