摘要:老狗吠程式 - 計算安全期
如果說將來有一天我可以跟胡適、蘇格拉底一樣可以在歷史上留下足跡, 那我唯一擁有的條件就是我們三個人都是PTT的高級會員.
或許你可能會問那兩個偉人哪有可能加入現在的網站; 我這邊所說的PTT不是那個有名的BBS, 而是指我們都是 怕太太 啦!
事情是發生在我剛結婚不久的某個夜晚...
這一天不知道怎麼搞的, 女王突然溫柔起來; 我內心有點小小的恐懼, 靜靜地等候她的懿旨.
『你在幹嘛 ?!』
『我... 我在寫程式!』
其實, 這時候我的心情是愉快的...
因為自從跟她交往到現在, 她常常看著我加班. 對她而言, 程式碼宛如天書, 她一行也看不懂.
我想今天她決心放下女王所擁有的尊嚴, 想要一探究竟...
『寫程式很難嗎?!』
『妳看我這麼笨都可以寫了, 妳只是沒有上過課、受過訓, 不然妳一定是個大師』 (我完全遵守 PMPMP 法則: 拼命拍馬屁.)
『少狗腿了, 可不可以舉的例子來聽聽?!』 (她很誠懇的說著)
『首先, 妳要有個需求, 要有個題目... 妳想一個小一點的...』
『什麼題目都可以嗎?!』
我說: 『並不是所有的問題都適合電腦來解決, 電腦比較適合用來計算數值或記錄一些資料...』
『這樣子喔... 計算數值...』 (想了幾秒) 『ㄟ... 對了, 我那個剛結束, 你可不可以寫個程式, 來紀錄MC週期?!』
『我是沒看過類似的軟體啦, 不過我知道有程式可以計算安全期、危險期...』
『喔... 你怎麼知道那些?! 你要幫誰算?!』 (女王的警戒心起了作用)
『妳少無聊好不好?! 我初戀結婚耶!!! 我們一起來寫一個類似的啦...』
『嗯...』
『妳知道計算安全期的規則嗎?!』
『我不確定耶...』
『這時候妳就要請教 Google 老大』
『好, Google 是嗎?! "請 告 訴 我 要 怎 樣 計 算 安 全 期 好 不 好"』 (她慢慢地在鍵盤敲入)
『小姐, 不是這樣問的啦!!! 妳只要打入 "計算安全期" 就可以了』
『Google 怎麼那麼笨, 聽不懂人話, 真是的...』
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
通常月經週期中大約有三天時間比較容易受孕, 通常在排卵前三天及排卵後半天時間.
每次月經週期是指從本次月經來潮之第一日算起到下次月經來潮的第一天止為一週期,通常每個週期排卵的日子是在月經前的十二至十六天.
若在排卵前後不行房就不會懷孕.使用此法,月經一定要很有規律, 並找出最長月經週期及最短月經週期.
考慮精蟲的壽命一般可活兩三天和其他因素可以得到計算的方法是:
最短週期天數-18=危險期之最早一日
最長週期天數-11=危險期之最後一日
如果平均是28天, 最短25天, 最長33天, 則 危險期為MC開始之第7 天 至第 22 天...
如果平均是28天, 最短28天, 最長28天, 則 危險期為MC開始之第10天 至第 17 天...
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
『到底什麼是程式?!』
『說到"程式" 有個著名的公式是: Algorithms + Data Structure = Program (演算法+資料結構=程式)』
『什麼是演算法?!』
『舉個例子, 妳怎麼拿皮包裡的錢買東西?!』
『就打開皮包, 看需要多少錢, 拿出最接近的錢給店員讓他找...』
『很好, 這就是演算法, 只是妳少考慮一些例外狀況, 例如:如果皮包裡面沒錢怎麼辦?!』
『我可以刷卡呀...』
『這... #$%^&*』『在軟體科學上規定演算法必須具備 1.明確性, 每個敘述必須明確,不可模零稜兩可 2.有效性:每個敘述必須有效執行 3.有限性: 演算法必須執行有限步驟 4.能結束』
『前面幾點我都可以瞭解, 但為什麼一定要能結束?!』 (女王一臉疑惑的問)
『這是規定啦, 我舉個例子好了: [1.老婆總是對的 2.如果老婆不對請跳到1.] 像這就不符合可以結束的條件, 因為它會陷入無窮迴圈, 所以它不是一個有效的演算法』 (我很得意的說)
『恩, 我相信它不是演算法啦, 但是, 它是真理 !!!』
『... #$%^&* ... 正確的演算法必須符合上述四個特性, 但符合上述四個特性的演算法卻不一定正確.』
『那什麼是資料結構?!』
『資料結構主要是在研究如何把原始的data, 組織、安排、存放到電腦中的一門學問. 這個比較抽象, 我們跳過去不講.』(其實是女王會聽不懂啦)
我說:『一個程式通常包含:輸入、輸出跟 處理 三個部分. 通常我們會先關注輸入的部分, 也就是要先命名輸入的參數...』
『要怎樣命名?!』
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
DateTime m_lastCycleDate;
int m_averageCycle = 28;
int m_minCycle = 25;
int m_maxCycle = 33;
int m_ovulation = 14;
int m_menstruation = 5;
...
...
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
『為什麼前面要加 m 呀?!』
『那是命名規格, 代表它是一個成員變數... 妳知道中文名字的命名有天格,人格,地格,外格,總格等等的規矩... 我們寫程式通常也會遵循某些規則...』
『好麻煩喔... 』
『我們寫程式的, 最基本的工作就是要為所有的東西命名, 程式名稱要取名字, 函數也要命名, 變數要命名... 我有時在想, 等我那天不寫程式, 我就去幫人命名!!!』
『呵呵, 還真的勒...』
『
有三個基本結構可以表達出所有的邏輯: 循序(sequential)、選擇(selection)、重複(iteration).
循序敘述執行的順序與其出現的順序相同, 選擇敘述可執行單選、複選、多選, 重複敘述重複執行指定敘述段的敘述.
』
『怎麼這麼理論?!』 (女王不耐的說)
『我還沒開始寫主體處理的部分耶... 連if... else 都還沒告訴妳耶?!』
『我沒興趣了, 你自己慢慢寫吧...』
『什麼... 這... 妳怎麼十分鐘不到就放棄了, 我可是每天要寫十個小時耶...』
『計算安全期, 老娘閉著眼睛不用三秒就可以算得出來, 我幹嘛花三個小時陪你寫程式?!』
『妳講的也對啦!!!』
『呵呵, 這就是我可以當女王, 你只能當程式設計師的差別...』
『... 不行, 我要堅持下去, 直到寫出來為止...』
(十分鐘過後... )
『我不寫了, 我要去便利商店...』
『你要買什麼?!』
『我想到一個連計算安全期都不用計算的最佳演算法 !!!』
『是什麼?!』
『我去買保險套就好...』