發表文章

程式初學者 - 你是要學程式語言還是程式設計

圖片
  許老師給程式設計初學者的建議   常常有同學問我:「老師,我想要學程式,你建議先學什麼語言?」。其實,大部份想跨足程式設計領域的初學者,都不清楚 學程式設計 與 學程式語言 是兩回事。     學程式就像學開車一樣。假設你的教練車是一台超級跑車,你是要 利用這一台車學會開任何車都有用到的基本技術 還是要學 如何開這一台跑車 。目標是學開車基本技術的人,學習的重點就是如何轉彎、停車等 各種開車的基本技術 。目標是學開這一台跑車的人,學習重點是換檔時機、加速方式、高速過彎等各種讓這一台車的 性能發揮到極致的理論 。   所以,你要先確認自己現在是要學任何語言都要用到的 程式設計的基本觀念與技巧 ,或是要學某一種 程式語言的細節 。如果你現在是要學程式設計的基本觀念與技巧,那麼用什麼語言就不是重點。就像上一段講的學開車,如果只是要學基本開車技術,用什麼車當教練車,其實都可以。    但是,我還是必須建議同學,不要用  Python 或 Java Script 等容易上手的語言學程式設計的基本觀念與技巧。因為那就像用自駕車學開車一樣,有很多基本的觀念及技巧學不到,這輩子就只能開自駕車,要開其它車,還是得從頭學起。Java Script 是語法格式上比較寬鬆的語言,也就是說你不按照語法寫也會對,容易養成不好的撰寫習慣。Python 是比較高階的語言,把一些語言中常用的基本動作省略掉,相對的那些基本觀念就學不到。   基本上建議用 Java 或 C/C++ 這種比較傳統的語言入門,能夠學到比較完整的基本觀念。不過一定要記得, 不是去專研語言的細節 ,只是 借用這語言來學程式設計的基本觀念與技巧 。等你程式設計的基本觀念與技巧學完了、練熟了,再回頭去研究語言的細節。例如 C / C++  的 指標、參考、物件導向 或是 Java 的 物件導向與 API 的應用 。若是你 Java 或 C / C++ 會了,再去學Python 或 Java Script 或是 C# 等其他語言,基本上就像己經會開車的人上了自駕車一樣,很快就會了。    講了半天,那到底什麼是程式設計的基本觀念與技巧呢?   程式的開發是針對要解決的問題,用程式語言依照正確的邏輯撰寫程式碼。真正重要的是 程式設計的能力 ,也就是 思考問題的解決方案,並把思考邏輯轉...

申請入學—大學資訊相關科系

圖片
 許老師給想進入大學資訊相關科系高中生的建議   APCS 為 Advanced Placement Computer Science 的英文縮寫,是指「大學程式設計先修檢測」,檢驗具備程式設計能力之高中職學生的學習成果,提供大學作為選才的參考依據。並藉由本檢測之推動,除了讓高中職重視資訊科學課程的學習外,亦讓大學酌訂抵免程式設計學分的相關措施。   透過參與 APCS 測驗,替有程式設計能力的人才,提供了另一個申請大學資訊相關科系的選項。從 111 學年度開始,大學入學管道有三個: 個人申請入學 、繁星推薦與分發入學(分科測驗)。在個人申請的部份,每位同學可以依照自己的學測成績與興趣選擇多個大學校系申請入學。而各大學的申請入學分成 一般校系 與  APCS 校系 兩種。APCS 校系除了有一般科目的標準,也會有 APCS 測驗成績的標準。 以 110學年度成功大學 (目前對APCS要求最高)為例 APCS 校系的資訊工程學系的科目要求是: 英文->均標;數學->前標;APCS 觀念題 5 級分;APCS 實作題 4 級分。 招生名額 2 人。 一般校系的資訊工程學系的科目要求是: 國文->均標;英文->均標;數學->前標;自然->前標;招生名額 56 人。   很多同學誤以為 APCS 測驗成績只能用在申請 APCS 校系,其實不儘然。若 APCS 測驗成績符合要申請學校的 APCS 校系標準,申請 APCS 校系當然是合理的。但若你一般科目的成績有符合要申請學校的一般校系,無論你 APCS 的成績是否符合該校系的 APCS 標準,你都可以申請一般校系(名額較多)並把  APCS 的成績作為申請一般校系 的 "課程學習成果"與 "多元表現"的採參資料 。相對於其他沒有參加 APCS 測驗的同學,你的上榜機會自然大大提升。   同理,若你 報名的科系與程式設計有搭上邊 的如電機、電子等,你有 APCS 的成績與其他沒有 APCS 成績的同學比較起來,自然也是大佔上風。   決定要考 APCS 了嗎?相信你有注意到,一般科目並不能放掉。大部份大學的招生標準除了 APCS 成績要達標之外,也會有其他科目的要求。    也就是說,身為高中生,在本身的課業就己經很繁重的狀況下,你還要另外擠時間...

Java 進階教學 : 類別成員(static member)

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 static 基本觀念與類別欄位(一) 影片2 類別欄位(二) - 讓相同類別的物件分享資訊 影片3 類別欄位(三) - 存取修飾詞與 final 影片4 類別方法 影片5 關於 main 影片6 物件成員與類別成員開發時機的區別 影片7 Math 影片8 System 影片9 Java 中用來協助陣列運算(排序, 搜尋)的工具類別 Arrays 影片10 Factory Method(工廠方法) 影片11 Singleton Pattern 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 static 類別中的成員(欄位,方法)可以用關鍵字 static 將該成員宣告為類別成員(靜態成員)。類別成員 屬於類別 不屬於物件。類別成員在環境第一次載入類別的時候便存在。它們的使用與物件無關,不管環境中是否有此類別的物件存在,使用者可以 用類別名稱隨時存取類別欄位或呼叫類別方法 。雖然也可以用透過物件使用類別成員,但為了提升程式碼的可讀性,應該避免。 類別欄位 宣告欄位時加上關鍵字 static 。 環境會在 載入類別 時配置記憶體。 每個 JVM 配置 一份 記憶體。 可以隨時 透過類別名稱 存取。 可以用於讓 相同類別 的物件 分享資訊 。 可以搭配存取修飾詞。 可以搭配 final 。 類別方法 宣告方法時在method type 前加上關鍵字 static 。 可以隨時 透過類別名稱 呼叫 。 只能存取或呼叫類別中其他的類別成員 ,不能存取或呼叫物件成員 (non - static) ,也 不能使用關鍵字 this 。 關於 main 物件成員與類別成員開發時機的區別   是否有資料儲存的需求? Java API 中常用的輔助類別 Math System Arrays Factory method   取代建構方法執行初始化物件的工作。 Singleton Pattern   Design Pattern (設計模式) 的一種。依此模型開發的類別,在每一個執行...

Java 進階教學 : 物件導向進階觀念(二) - 繼承(extends)

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 繼承的基本觀念與成員存取 影片2 欄位遮蔽(Field shadowing)與方法覆載(Method overriding) 影片3 super 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 繼承   繼承是物件導向中的重要特性之一。指的是在宣告新類別時, 可以指定上層類別(父類別),則 新類別會擁有上層類別中的所有成員 。主要優點是 避免程式碼的重複開發 與 方便 維護 管理 。   假設我們要開發一個大型遊戲軟體。遊戲中有 100 種角色,也就是有 100 種物件,也就是我們要寫 100 個類別。而這 100 種角色,都要有名稱、生命值、防禦力與攻擊力 4 個欄位,還要有攻擊與防禦 2 個方法。   如果沒有使用繼承機制,代表上述的 4 個欄位與 2 個方法必須在 100 個類別中一一撰寫;若使用繼承機制,則上述的 4 個欄位與 2 個方法便只需要撰寫在上層類別中,而要開發的那 100 個類別只要繼承此上層類別即可擁有宣告在上層類別中的 4 個欄位及 2 個方法。   這樣的機制,不但在開發時可以避免程式碼的重複撰寫;而且在後續維護時,更是大大的減少了修改的時間。例如:要修改攻擊或防禦的運算式時,只要修改上層類別中的方法就可以了。   在 Java 中,繼承與被繼承類別,我們用 上層類別(Super class) 與 下層類別(Sub class )稱呼。也就是其他語言的父類別(Parent class)與子類別(Child class)。   在 Java 中,子類別宣告時只能指定一個父類別,這個叫 單一繼承 。有別於其他語言的多重繼承。   以下層類別的角度來看,不必撰寫就可以擁有上層類別的所有成員,是一種福利。但其實也是一種限制。因為 下層類別並不能針對個別成員選擇是否繼承 ,必須繼承所有成員。   以上層類別的角度來看,寫在上層類別的成員,就是希望 所有下層類別都一定要有 的成員。   下層類別可以宣告與上層類別名稱一樣的成員,用以 遮蔽與覆載上層類別的成員 ,但不能不繼承。 ...

Java 進階教學 : 物件導向進階觀念(一) - Constructor And this

圖片
Java Road Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 認識建構方法與預設的建構方法 影片2 自訂建構方法 影片3 用this()串聯建構方法 影片4 使用this.存取物件成員 影片5 使用this當參數與建構區塊 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。   使用者用 new ClassName() 建立物件,ClassName()就是 建構方法(Constructor) 。Java 語法中的任何類別都 至少會有一個建構方法 。使用者可以用關鍵字 new 呼叫適當的建構方法,環境在依照類別中欄位的宣告配置記憶體空間之後,便會呼叫該建構方法並執行裏面的內容。   物件是環境依照類別中欄位的宣告配置的記憶體空間所儲存的資料。配置的記憶體空間是固定的,但儲存在記憶體中的資料可以由 類別開發者 指派,也可以開放給 使用者 指派。   開放給使用者指派又可以分為: 建立物件時指派 與建立物件後指派。要讓使用者在建立物件時指派,開發者會宣告 有參數的建構方法 ,讓使用者呼叫。使用者在呼叫建構方法時 指派在參數列中的值 ,開發者在必要的檢查與運算後指派給欄位。   使用者若希望物件建立完成時,物件就儲存指定的值,便呼叫有參數的建構方法;若沒有指定值的必要,便呼叫沒有參數的建構方法。   這個機制就像我們在買手搖飲料時,在菜單上指定冰塊或糖的量,工作人員便會依照指定的量製作飲料。若沒有指定,工作人員便會放入預設的量。 欄位預設值 環境在配置記憶體時,會依照該欄位的型別指派預設值: 0, 0.0, false, null 。 欄位初始化 若欄位的宣告敍述中有指派值,環境會在指派預設值之後,把 宣告敍述的值 指派給欄位。 預設的建構方法 若類別中 沒有宣告 任何建構方法,編譯器會置入一個 沒有參數 的建構方法,這個由編譯器置入的方法,稱之為 預設的建構方法 。但若類別中有宣告建構方法,無論數量與是否有參數,編譯器就不會置入預設的建構方法。 因為有這個機制,所以 Java 語法中的任何類別都 至少會有一個建構方法 。但不是:至少會有一個 沒有參數 的建構方法 ...

Java 進階教學 : 方法的建立及呼叫

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 方法載入,執行與返迴的基本觀念以及 Method type is not a void 的使用者角度 影片2 Method type is not a void 的開發者角度與Method type is a void 的使用者及開發者角度 影片3 參數列的開發者及使用者角度 影片4 參數傳遞的記憶體變化(一) 影片5 參數傳遞的記憶體變化(二) 影片6 方法多載與變動參數 影片7 遞迴方法(一) 影片8 遞迴方法(二) 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 方法的建立及呼叫   方法的呼叫是 載入執行 再 返回 的觀念。執行環境載入一個方法執行(假設為 A 方法),若這個方法 (A)的執行過程中,呼叫另外一個方法(假設為 B 方法)。執行環境會暫停目前這個方法 (A) 的執行,進而載入指定的方法 (B) 執行。等指定的方法 (B) 執行完畢,再返回原方法 (A) 執行。 Syntax: methodType methodName(paramType paramName, .....){    method body; } 方法型別 (返迴型別) 與 return 敍述 method type (return type) and return statement not a void not a void 代表任何型別,包含 基本資料型別 及 參考型別 。 使用者角度 呼叫這個方法來取得 值 或 記憶體位址 ,例如:指定位置的值、指定運算的值、建立新物件....,總之這個方法會回饋一個值或 記憶體位址 。  換個角度,就是這個方法的 呼叫敍述 就代表它運算後的值或 記憶體位址 ,所以這個方法的呼叫敍述可以是 任何敍述的一部份 。 開發者角度 這個方法必須回饋給使用者一個指定型別的值或物件的記憶體位址。 return statement 方法中至少要有一個 return value; 的敍述,而 value 的型別必須是 method type 指定...

Java 進階教學 : 物件陣列

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 物件陣列的宣告, 指派與存取 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 物件陣列 宣告並建立陣列物件 ClassName[] arrayName = new ClassName[length]; 等號右邊的 new 是建立了 長度為 length 的陣列物件 ,而不是建立 length 個元素物件。 初始化元素物件 arrayName[index] = new ClassName(); 元素物件要另外指派 ,若沒有指派,預設為 null 。 宣告並初始化元素物件 ClassName[] arrayName = {new ClassName(), new ClassName(),.....}; 作者 : 許裕永 許老師的回答: 什麼是APCS ? 想用申請入學進入大學資訊相關科系是不是一定要考 APCS ? 第一次學程式設計,學什麼語言比較好? 用APCS成績申請大學的技巧

Java 進階教學 : 目錄

圖片
(回 Java Road ) 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 業界對Java 語法學習者的要求重點有二:1. 完整物件導向的觀念 2. 如何 使用Java API解決問題 。而針對這兩個重點,學校的教學礙於時間有限,無法深度討論。補習班的 Oracle 國際證照班的教學,當然有較深入的學習。然而因為教學的方向是偏重於如何考取 Oracle 的國際證照,自然比較沒有足夠實務運用的範例練習。造成很多同學即使考得證照,成功進入業界上班,卻因為程式碼寫不出來而上班上的很辛苦。原因就是上課時背住一堆物件導向的語法及規則來應付考試,但 不知道為什麼 ,自然沒有辦法活用那些觀念;上課時學到了一堆的 API, 但 缺乏實務範例的練習 ,自然沒有辦法運用 API 妥善解決問題。 曾經在學校或補習班學過 Java 的同學可以把本頻道當作輔助教材。如果是在補習班上過我 Oracle 國際證照班課程的同學,可以依照自己的需求尋找合適的影片。如果是沒有上過我課程的同學,建議你每個影片都看,我相信每個影片都會有讓你有收獲。 如果你是從 Java Road 入門教學一路看過來的同學,恭喜你來到這裡。從現在開始,才是真正要進入 Java 的世界。讓我們開始你的 Java 之旅吧! 回首前塵 : Java 入門 許老師的回答: 有專門協助取得 Java 國際認照 OCPJP 的課程嗎 ? 什麼是APCS ? 想用申請入學進入大學資訊相關科系是不是一定要考 APCS ? 第一次學程式設計,學什麼語言比較好? 用APCS成績申請大學的技巧 物件導向基本觀念介紹 - 物件, 類別, 參考 使用 String 及 StringBuilder 處理文字 一維陣列 多維陣列 物件陣列 方法的建立與呼叫 物件導向進階觀念(一) - Constructor And this 物件導向進階觀念(二) - 繼承(extends) 類別成員(static member) Wrapper classes And Auto Boxing / Auto UnBoxing ArrayList Basic File IO (基礎檔案存取) 想要徹底搞懂物件導向嗎?任何語言,都會用到物件。但是,...

Java 進階教學 : 多維陣列

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 多維陣列基本觀念解說 影片2 二維陣列的宣告,指派,存取與記憶體配置 影片3 二維陣列的特殊存取方式 影片4 三維陣列的宣告,指派,存取 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 多維陣列是 陣列的陣列 :二維陣列物件管理一維陣列物件;三維陣列物件管理二維陣列物件;四維陣列物件管理三維陣列物件...。也就是說二維陣列物件儲存 一維陣列物件 的 記憶體位址 ;三維陣列物件儲存 二維陣列物件 的 記憶體位址 ;四維陣列物件儲存 三維陣列物件 的 記憶體位址 ...。 二維陣列 宣告 中括號的數量代表維度 。 宣告參考變數 type[][] name; type name[][]; //合法, 不建議 type[] name[]; //合法, 不建議 宣告參考變數並建構指定長度的陣列物件 type[][] name = new type[ 一維陣列的數量 ][每個一維陣列的長度]; type[][] name = new type[ 一維陣列的數量 ][]; 宣告參考變數並 建構 陣列物件並 初始化 陣列物件 type name[][] = {{value, value, .....},{value, value, .....},{value, value, .....}....}; 建構陣列物件 new type[ 一維陣列的數量 ][每個一維陣列的長度] 第一組中括號指定 本二維陣列的長度 ,也就是 要管理的一維陣列的數量 。第二組中括號指定每一個一維陣列的長度,也就是每一個一維陣列要管理的 值或物件 的數量 new type[一維陣列的數量][] 建構指定長度的 二維陣列物件 ,先不建構一維陣列物件。 存取 指派 name[ index ][index] = value; name[index] = 一維陣列; 可以是 新建構 的陣列,也可以是 己存 在 的陣列, 長度可以不一樣 。 取值 name[ index ][index] name[index] 記憶體配罝 ...

Java 進階教學 : 一維陣列

圖片
Java Road 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 影片1 一維陣列的宣告,指派,建構,存取與記憶體配置 影片2 一維陣列的長度,用迴圈控制陣列與匿名陣列 影片3 一維陣列範例: 接收輸入五科成績, 求最高分,最低分,平均分與排序 範例 好的頻道需要你的支持 ,謝謝你使用Youtube影片的 超級感謝 功能給我們鼓勵。 Java 中的陣列,是一個 物件 。用來管理任意個 單一型別 的 值 或 物件 。它是 一群記憶體 的群組,而這一群記憶體中會儲存相同 基本資料型別 的 值 ,或相同 參考型別的物件 的 記憶體位址 。 宣告 中括號是型別的一部份,裏面不可以有值 。 宣告參考變數 type[] name; //建議 type name[]; //合法, 但不建議 宣告參考變數並建構指定長度的陣列物件 type[] name = new type[length]; 宣告參考變數並建構陣列物件並初始化陣列物件 type name[] = {value, value, .....}; 以 value 的個數 為陣列長度。 建構陣列物件 new type[ length ] 要求配置 指定長度 的記憶體空間 => 該型別的值所需的空間 * length。 陣列物件的內容預設為 : 0, 0.0, false, null。 存取 指派 name[ index ] = value; 取值 name[ index ] index 0 ~ 陣列長度 -1 記憶體配罝 陣列長度 參考變數 .length 。 陣列長度 不可以改變 。 陣列與迴圈 for for each 匿名陣列 new int[]{value, value, .....} 作者 : 許裕永 許老師的回答: 什麼是APCS ? 想用申請入學進入大學資訊相關科系是不是一定要考 APCS ? 第一次學程式設計,學什麼語言比較好? 用APCS成績申請大學的技巧