大家好!今天到了我們的第四天,我居然到目前都有按時發文!雖然趕稿趕得很緊張XD 那今天我們先來設想一個情境,今天你收到一個任務,要計算一份檔案中的資料有多少男生多少女生,該如何讓電腦懂得判斷"男生"與"女生"這兩個人類語言的詞彙呢?。
我們直接看一個範例
sex = "male"
if(sex == "male"):
print("男生")
else:
print("不是男生")
這段程式電腦可以判斷 sex 裡面所存的內容,大家可以拿去執行看看,修改看看 sex 裡面的資料,
有沒有發現,在if的括號中有一個符號長 "==" 這樣,這對電腦來說是比較運算子,如果左值等於右值,則會回傳 true,不等於則回傳 false,這兩個回傳的數值稱為布林變數。
布林是電腦科學中的邏輯資料型別,以發明布林代數的數學家喬治·布爾為名。它只有兩種值的原始類型,通常是真(true)和假(false)。[wikipedia]
這是什麼意思呢? 當有人問你"你還好嗎?"的時候,你最簡單的回答就是"好"和"不好",當然也可能有"不知道",不過這是另一個故事,如果我們有機會講到 SQL 的時候再談,電腦也是如此,他總是喜歡用最簡單的回應來回應你,上述程式碼你問他"sex 裡面的資料和 male 相同嗎?" 他會回答你"是(true)" 或 "否(false)",我們可以把布林變數當成電腦用最敷衍你的方式回應,但這樣子的回答非常方便後續的操作,因為沒有一些亂七八糟的東西混在裡面,簡單而直觀。
if(判斷式1):
#如果判斷式1為真,執行此區
elif(判斷式2):
#如果判斷式2為真,執行此區
else:
#如果上述判斷式皆為假,執行此區
電腦的判斷式不只可以判斷相不相同喔,大於和小於也可以,用法幾乎是一樣的,只是把符號換一下而已,下表列出幾個常用比較運算子。
比較運算子 | 符號 | 範例 | 範例回傳 |
---|---|---|---|
等於 | == | 1 == 1 | true |
不等於 | != | 2 != 5 | true |
大於 | > | 5 > 6 | false |
大於等於 | >= | 1 >= 0 | true |
小於 | < | 5 < 6 | true |
小於等於 | <= | 7 <= 6 | false |
注意!比較要用 == 而不是 =,用錯會出事!!!!
注意!比較要用 == 而不是 =,用錯會出事!!!!
注意!比較要用 == 而不是 =,用錯會出事!!!!
請試著判斷看看下面的判斷式會回應 true
還是 false
呢?
0 < 5
7 >= 6
true != false
0 == 0
"true" == "true"
true = !false
1 = 1 #給我注意這一個!
如果有多個條件需要同時判斷怎麼辦呢? 日常生活中我們可能會說:"如果明天沒下雨而且我有空的話,那我們就去夜衝" 這樣子的說法換成電腦的虛擬碼會長這樣:
if(明天沒下雨 and 我有空):
去看電影()
同樣的程式碼也可以寫成這樣,這對於寫過 C style 語言的讀者來說應該很熟悉
if(明天沒下雨 && 我有空):
去看電影()
這兩種方式都是相等的,不過前者比較直觀好懂,後來我偏好使用前者。
當然,除了"且"我們還有"或"和"非",直接看下面虛擬碼舉例:
#你來我家找我或我去學校都可以拿東西給你
if(你到我家 or 我到學校):
拿東西給你()
等義於
#你來我家找我或我去學校都可以拿東西給你
if(你到我家 || 我到學校):
拿東西給你()
最後,是一個比較特殊的用法,他會把布林變數相反,有點像是唱反調的概念XD
#你去參加聚餐我就不去
if(not(你參加聚餐)):
我參加()
#你去參加聚餐我就不去
if(!你參加聚餐):
我參加()
簡單列成一個整理表
含意 | 用法 | 符號用法 |
---|---|---|
且 | A and B | A && B |
或 | A or B | A || B |
非 | not(A) | !A |
請試著判斷以下的布林變數結果:
(true || false) and false
0 and 1
not(0)
!false && true
!true or not(1)
親和數我個人覺得是一種很浪漫的數組,指其中一個數的因數和會等於另一個數本身的數值,且兩個數字都有這樣的特性,我們就稱他們為親和數數組,畢達哥拉斯曾說:「朋友是你靈魂的倩影,要像220與284一樣親密。」因為(220,284)是最小的親合數組
220 的所有因數有 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110
284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110
284 的所有因數有 1, 2, 4, 71, 142
220 = 1 + 2 + 4 + 71 + 142
但是這樣的數字有哪些? 難道我們要一個一個做因數分解再加總來比對嗎? 恩,對啊,這樣最簡單~ 不過!我們沒有必要自己算啦,利用電腦判斷的能力,我們就可以叫電腦為我們完成這份工作。
下面是我用C語言寫出來的搜尋程式,當初為何選C呢?? 因為速度快啊!但同樣的邏輯 Python 當然也可以做到~
#include<stdio.h>
#include<math.h>
int main(int argc, char *argv[])
{
long long limit;
long long start;
printf("Enter START END -->");
scanf("%lld %lld",&start,&limit);
printf("Program Start!\n");
for(long long number1 = start; number1<=limit ; number1++)
{
long long factor;
factor = 2;
long long totalA = 1;
long long number1_s = sqrt(number1);
while( factor < number1_s )
{
if( number1%factor == 0 )
{
//printf("%lld\n",factor);
totalA += factor;
totalA += number1/factor;
}
factor = factor+1;
}
factor = 2;
long long number2 = totalA;
long long totalB = 1;
long long number2_s = sqrt(number2);
while( factor < number2_s )
{
if( number2%factor == 0 )
{
totalB += factor;
totalB += number2/factor;
}
if(totalB > number1)
break;
factor = factor+1;
}
//printf("和 -> %d:%d",totalA,totalB);
if(totalA == number2 && totalB == number1 && number1 != number2)
{
printf("發現親和數 -> %lld:%lld\n",number1,number2);
}
}
return 0;
}
程式輸出
找親和數有甚麼用呢? 其實也沒有太大的意義啦XD 曾經我用這個方法找到了一組十位數的親和數組,等著給我未來的靈魂伴侶(? 她分解她的數加總就是我,而我分解我的數加總就是她,只是一直還沒有送出去哈哈哈。
好啦! 今天介紹的比較陳述句有沒有懂呢? 如果不懂可以再下面留言問我喔~ 我的目標是寫出一篇全年齡都能懂得程式語言教學,所以你看不懂不是你的問題,是我的錯!請和我提出讓我可以有改進的機會,謝謝各位讀者~ 最後給大家一個小練習,看看能不能做出來呢?
閏年判斷,請寫出一個程式可以判斷特定西元年是否為閏年?
Tip:
<閏年規則>
參考解答:
year = 2019
year = int(input("請輸入年份:")) #取得使用者鍵盤輸入
if (year % 400 == 0):
print("Yes") #是閏年
elif (year % 100 == 0):
print("No") #不是閏年
elif (year % 4 == 0):
print("Yes") #是閏年
else:
print("No") #不是閏年
有發現程式碼中有一個 input(輸出字串) 嗎? 這是讓使用者可以從鍵盤輸入資料的內建函式,自己操作看看吧,相信你們可以了解怎麼用的!