iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 4
0

大家好!今天到了我們的第四天,我居然到目前都有按時發文!雖然趕稿趕得很緊張XD 那今天我們先來設想一個情境,今天你收到一個任務,要計算一份檔案中的資料有多少男生多少女生,該如何讓電腦懂得判斷"男生"與"女生"這兩個人類語言的詞彙呢?。

電腦的判斷基礎 -- If else 陳述句

我們直接看一個範例

sex = "male"

if(sex == "male"):
    print("男生")
else:
    print("不是男生")

https://ithelp.ithome.com.tw/upload/images/20190920/20120282Cq3rLFJ5K5.jpg

這段程式電腦可以判斷 sex 裡面所存的內容,大家可以拿去執行看看,修改看看 sex 裡面的資料,

有沒有發現,在if的括號中有一個符號長 "==" 這樣,這對電腦來說是比較運算子,如果左值等於右值,則會回傳 true,不等於則回傳 false,這兩個回傳的數值稱為布林變數

布林變數 boolean

布林是電腦科學中的邏輯資料型別,以發明布林代數的數學家喬治·布爾為名。它只有兩種值的原始類型,通常是真(true)和假(false)。[wikipedia]

這是什麼意思呢? 當有人問你"你還好嗎?"的時候,你最簡單的回答就是"好"和"不好",當然也可能有"不知道",不過這是另一個故事,如果我們有機會講到 SQL 的時候再談,電腦也是如此,他總是喜歡用最簡單的回應來回應你,上述程式碼你問他"sex 裡面的資料和 male 相同嗎?" 他會回答你"是(true)" 或 "否(false)",我們可以把布林變數當成電腦用最敷衍你的方式回應,但這樣子的回答非常方便後續的操作,因為沒有一些亂七八糟的東西混在裡面,簡單而直觀。

If Else 陳述句語法

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

注意!比較要用 == 而不是 =,用錯會出事!!!!
注意!比較要用 == 而不是 =,用錯會出事!!!!
注意!比較要用 == 而不是 =,用錯會出事!!!!

練習 4-1

請試著判斷看看下面的判斷式會回應 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
練習 4-2

請試著判斷以下的布林變數結果:

(true || false) and false
0 and 1
not(0)
!false && true
!true or not(1)

判斷應用,尋找親和數(Amicable Pair)

親和數我個人覺得是一種很浪漫的數組,指其中一個數的因數和會等於另一個數本身的數值,且兩個數字都有這樣的特性,我們就稱他們為親和數數組,畢達哥拉斯曾說:「朋友是你靈魂的倩影,要像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;
}

程式輸出
https://ithelp.ithome.com.tw/upload/images/20190921/20120282CN5901W6xJ.jpg

找親和數有甚麼用呢? 其實也沒有太大的意義啦XD 曾經我用這個方法找到了一組十位數的親和數組,等著給我未來的靈魂伴侶(? 她分解她的數加總就是我,而我分解我的數加總就是她,只是一直還沒有送出去哈哈哈。

好啦! 今天介紹的比較陳述句有沒有懂呢? 如果不懂可以再下面留言問我喔~ 我的目標是寫出一篇全年齡都能懂得程式語言教學,所以你看不懂不是你的問題,是我的錯!請和我提出讓我可以有改進的機會,謝謝各位讀者~ 最後給大家一個小練習,看看能不能做出來呢?

練習 4-3

閏年判斷,請寫出一個程式可以判斷特定西元年是否為閏年?

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")    #不是閏年

https://ithelp.ithome.com.tw/upload/images/20190920/20120282hEYs1vavMs.jpg

有發現程式碼中有一個 input(輸出字串) 嗎? 這是讓使用者可以從鍵盤輸入資料的內建函式,自己操作看看吧,相信你們可以了解怎麼用的!


上一篇
Day3-無趣的計算,給電腦做吧。
下一篇
Day5-上萬筆資料我該怎麼辦
系列文
原來電腦可以這樣用!? 果蠅也懂的程式語言教學30

尚未有邦友留言

立即登入留言