序
目前全世界各國都已認知到程式設計對發展本國科技的重要性,紛紛在其國民教育中納入基礎程式設計課程,從小扎根培養學童的程式邏輯思維。學習程式設計已經不再是選項,而是國民基本能力。雖然學習程式的人越來越多,但真正學好的人仍僅是少數。許多人花了不少時間學習程式設計,但也僅僅是在學習程式語法,跟著老師或書本做些簡單的題目,若隨便給個沒有見過的基礎程式題目,往往不知從何寫起。究其原因仍在於許多初學者將學程式當成學程式語法,而不是學習如何設計程式。學程式語法簡單,翻些書或參考一些教學網頁即可;但學程式設計困難,處處充滿挑戰,隨時需應用邏輯思考,沒有方法的學習,最終多以中途陣亡收場。
撰寫本書的目的是要教你如何學會寫程式,遇到程式問題時能不慌不忙,懂得如何思考、如何找出解法,然後轉為程式碼完成程式設計。為避免學習過多的程式語法以致無法靈活運用,本書僅教授整數、浮點數、字串等三種基本型別,加上初階串列語法,配合迴圈與邏輯式子,以少許的程式語法教你學會基礎程式設計。其實學會基礎程式設計並不需太多的學問,不需要複雜的資料結構,也不需特殊的演算法,只要利用一些基礎數學即可寫出很漂亮的程式,而所使用的數學層級也僅是國中的基本代數而已。本書特別在第二章介紹一些在基礎程式設計中常用到的數學,相比一般的國中數學內容,你將會發現用於基礎程式設計中的數學是很簡單的。
許多人總認為要學好程式設計通常靠天份,少了天份,一般人怎麼學都學不會。其實這個認知是有問題的,學會程式設計是有方法可循,只要依照本書的方法多加練習,對台灣學生來說學好程式設計一點都不難。本書特別介紹如何透過「數學思維」的協助來學習程式設計,這是筆者長期在數學系的程式教學現場中所發現到的一種學好程式的有效方法,可讓學生於短時間中學會基礎程式設計。
這裡所謂的「數學思維」是指在解題過程中,以間接或直接方式使用數學技巧、概念或知識來解決問題。在程式設計中,許多程式問題表面上看不到數學,但並不表示用不到數學。數學善於偽裝,經常隱身於問題之中,初學者若想要完成程式設計,就得將隱藏在問題中的數學抓出來。若在遇到程式問題時,能嘗試運用「數學思維」來分析題目,學會如何分解題目與簡化條件,往往能突然間找到解決程式問題的切入點,之後逐步加入略去的條件,即可完成原先的程式問題。如此學習成效得以大增,程式的學習過程充滿著成就感,此時程式設計就變得是一種享受,令人著迷且欲罷而不能。
台灣的學生從小學開始,唸書的過程充斥著數學,平時就要演算各式各樣的數學習作,上學時間有著大大小小的數學測驗,每日用了許多時間練習數學題目,目的只是為了於考試中取得高分。事實上,台灣的學生每日都在利用「數學思維」來解決考試卷上的數學題目,「數學思維」早已深深嵌入每個學生的腦袋中,否則無法應付一次又一次的測驗。對台灣學生來說在程式設計中運用「數學思維」應是最自然不過的,只要學會如何將「數學思維」由考試卷轉向程式問題,每個學生都能很快的適應程式設計。本書教你如何將從小積累的數學概念、技巧與知識應用到程式設計中,只憑藉著「數學思維」就可輕鬆解決許多基礎程式問題。
在筆者過去的教學經驗中發現一旦學生學會運用「數學思維」於程式設計中,其程式設計的學習成效會立即大幅提昇。筆者經常看見許多程式設計能力為零的學生,在短短的幾個月就能學得相當出色,進步的速度連學生本人都無法相信。其實只要受過正規的台灣數學教育,願意將數學用於程式設計中,相信數學可用於程式之中,沒有學不好的。台灣的學生由於從小所受到的數學訓練,每個人身上彷彿都配有一把「屠龍刀」,但這把刀卻僅被用在數學考卷上,離開了考試卷就束之高閣。對大多數學生而言,學數學的唯一目的彷彿就是為了考試,離開了考試卷,數學就不存在。筆者寫本書的目的是要教你如何將身上這把「屠龍刀」取出來用於程式設計上,只要你學會了,基礎的程式設計真的很簡單,學不會都不容易。
學好程式設計並不需要擁有高深的數學知識,但卻要有活用基礎數學的能力。本書教你如何善用國中小基礎數學來撰寫程式,學會了,你會發現將數學用在程式設計上會比用在寫數學考試卷更加有趣。對筆者來說,台灣學生學程式設計不用數學,卻只將數學用在考試卷上真是暴殄天物,著實可惜,有如將這把削鐵如泥的「屠龍刀」只用來切菜,平白蹧蹋了這把寶刀。若將數學用在程式設計上,你將會發現數學還真有用,找到數學的實用價值,同時未來學數學時會更加專心些。
本書所用的數學招數也僅是國中程度,如絕對值、餘數運算、等差數列與一些基本的代數運算,如此即足以寫出複雜的程式。台灣學生只要願意取出身上這把寶刀,再加上一些簡單招數就可很快的完成許多程式問題。想想看,當你能將李白的《夜宿山寺》詩句利用程式語法順手寫出程式印出以下詩句排列組合,還有人會懷疑你不會程式設計嗎?
本書每章都有許多習題,全書共有兩百四十多道習題,這些習題多與各章範例有關。讀者在利用本書學習程式設計時,務必熟悉各章範例的解法,並能在之後獨立撰寫出來。學程式最好的方法就是練習程式題目,本書各章習題都需要一些思考才能寫出來。初學者在學寫程式時,務必由紙筆推導入手,利用數學思維找出程式解法,再由之轉為程式碼,完成程式設計。若跳過此步驟,看到問題立即「打」程式,初始可能寫得很快,但一段時間後往往不曉得如何寫下去,將耗費更多的時間來回修改程式,且很多時候根本不知道如何寫出程式,徒然浪費時間。親自撰寫本書的程式作業是初學者學會程式設計的重要步驟,千萬不可忽略。筆者並沒有公佈習題解答,原因在於習題解答的存在很容易引起學習者無意間養成倚賴的習慣,也就是每當學習者於程式開發過程中遭遇到一些困難,可能需要進一步思考或是加以除錯,程式解答的存在很容易讓學習者提早放棄尋求程式問題的解法或是靜下心來仔細除錯。在學習程式設計過程中每遇到困難隨即訴諸解答是無法培養出獨立思考能力,以致於最終難以獨當一面。讀者在學習過程中若有所疑惑,歡迎來函(weihan@math.ncu.edu.tw)討論交流意見。
撰寫本書的目的主要是為了補充前年底出版的《簡明python 學習講義》一書於基礎程式設計介紹的不足,為了讓學習者能快速掌握重點,該書以條列方式介紹Python 語法,直接切入重點,減少冗長說明,但這種方式對初學者而言一開始就要面對較高的學習門檻,不利初始的學習。為提供初學者一套較為循序漸進的學習教材,特別將前四章內容以較詳細的方式改寫,切割成更細的學習單元,提供更多的程式範例用以展示如何運用「數學思維」來設計程式。
本書某些關鍵字的右上角有斜體數字上標,例如:數字點陣圖,此數字為關鍵字的參考頁碼,讀者若對此關鍵字有所疑惑,可先到參考頁碼參閱該字說明後再繼續。本書範例可由http://python.math.ncu.edu.tw/download 網址下載,雖然程式範例可很快由網站取得,但筆者強烈建議這些範例最好仍由讀者自行鍵入,藉以熟悉程式語法與程式的撰寫方式,少了這些步驟,雖然省了一些輸入時間,但在學習程式語言上並不是好事。
最後期勉程式語言的初學者,即使Python 的程式語法如何簡單,學好程式的關鍵仍在練習,任何程式語言都無法以純閱讀方式即能熟練,親自敲打程式,並加以大量演練才是學好程式設計的不二法門。
學好程式設計需要大量的操作練習,沒有其他竅門。
連同本書,筆者至今已出版三本程式設計相關書籍,書本編排一直採用本系陳弘毅教授為Linux 作業系統所開發的chitex(TEX),這是一種非常好用的中文LATEX 排版程式,在撰寫過程中,常常受到陳老師的熱心協助,謹此致上感謝之意。
國立中央大學數學系
吳維漢
109/11/02