1111 NTOUCSE 程式設計1C

課程內容摘要 (111/09-112/01)

download all pdf slides
過去年度課程與實習視訊:1061, 1071, 1081, 1091, 1101,
本學期 (1111) 課程與實習視訊
(課程/實習視訊也可在 tronclass/etutor 上看到連結)

  課程摘要
第一週 111/09/13(二)

    請注意 1.下面有一些投影片裡面是有動作的 (例如 練習寫程式的要求, 檔案名稱包含 splitted 字串的), 請不要在瀏覽器 chrome, IE 或是 edge, foxpro, safari 裡面直接看, 那樣子看不到投影片上的動作, 如果你要在 Chrome 瀏覽器裡閱讀,請在右上角處設定為「簡報」模式後閱讀;如果你在 Safari 裡閱讀,點下連結後,請以右鍵選單找到「以預覽程式打開」,然後在左上角「顯示方式」按鈕選擇「單頁」;或是下載檔案到自己機器上以 Acrobat Reader 閱讀,請到 https://get.adobe.com/tw/reader/ 下載並且安裝 Adobe Acrobat Reader DC, 把投影片下載到 PC上再用這個軟體看, 用 PgUpPgDn 按鍵瀏覽, 才能夠看到所有投影片裡的動作。如果是在Android 手機或是平板上可以用 Xodo PDF Reader (設置/點擊兩側翻頁: 開啟, 翻頁動畫效果: 關閉;請用 點擊畫面左側, 點擊畫面右側 換頁)。如果是在電子書上面,通常有客製化的 pdf 瀏覽器是比較合適的,2. bw 版本的投影片是黑白、4頁合在一起的版本,適合列印

  1. 課程簡介 (視訊: 1111, 1101, 1091), 練習寫程式的要求 (bw) (視訊: 1111, 1091), 課程大綱, 網頁內容導覽 (視訊: 1111)

  2. 認識 C 語言、程式設計概觀、第一個 C 程式 (bw) (視訊: 1111, 1091)

  3. squall 網站導覽 (視訊: 1111)

  4. Homeworks:

系上把這個課程分成四班,不是要你體驗霍格華茲四個學院 Gryffindor, Slytherin, Hufflepuff, Ravenclaw 魔法競賽的真人版,目的只是希望讓大家藉由這個課程提供的資源,能夠在一個學期裡確實掌握基本的程式設計方法,倒不是因為這個課程難度特別高,需要你每星期投資 n 個小時在上面,而是因為這個課程的學習的方法和你先前的學習方法有差異,第一個差別就是遇到不太能解釋的問題要直接詢問,不要想賭賭看,一直到你發現真的需要之前也許不會再遇到,如果你把問題就放著不管,有可能 n 大於 20 都還是學不會,你遇見問題可以在課堂中提出,也可以線上問 (趕快加入 FB 的群組 『NTOUCSE 1111 程式設計 1C』),一定盡量在最短的時間裡回答你,你不需要因為遇見困難沒有人可以詢問,就讓那個 n 的數值一直增加,沒有需要讓那個 n 的數值大到影響你其他科目的學習、影響你課外活動的參與,最後因為不想花數倍時間補回進度而讓自己覺得不適合唸資訊系。

有一件事情是令人難過的,有同學線上問了一個問題,我盡力猜測他有哪些背景然後努力地打了幾段文字回答他,他靜靜地看然後回說「需要一些時間吸收」,好多天以後,在另外一個群組裡看到他的評論,說我回答的東西他「都不懂」。這是什麼互動? 有不了解的為什麼不直接提出來討論,要在背後做這種評論,真的很容易讓人覺得氣餒,是不是和不太熟的同學討論時不要太熱心,不要想太多覺得這個不會會影響到什麼東西的學習,是不是就回答最精簡可以解決問題、貼上就沒事啦的東西就好了呢? 在回答每一位同學的問題時,需要把同學當成是一個朋友嗎? 和朋友講話的時候是要用心思考的,不能理解的話語是需要修改、需要澄清的,如果同學把所有在學習過程中接觸到的人與事都當成是預錄好的,覺得他自己只是默默地飄過,不帶來什麼,也帶不走什麼,那麼未來日子裡也許就不會留下痕跡,不會學到什麼、也不會有什麼貢獻了,有點無趣吧?

你很聰明、電腦很笨,堅持用你那國的思考方式很多時候是不容易知道為什麼電腦不接受你的命令的,花那個時間堅守自己的想像和它周旋就有一點點浪費,要適時透過和真正瞭解軟硬體機制的人互動來調整自己的想法,你以後學了所有的支援課程就可以自己回答所有的問題了;那麼為什麼要學著控制笨電腦呢? 它處理速度很快、記憶容量很大、24 小時待命、一旦用它可以接受的方式控制它、它不會因為疲勞而出錯,不會因為不爽而罷工...

All programmers are playwrights and all computers are lousy actors. (Anonymous Hack Actor)

這個課程絕對是為了沒有接觸過程式的同學開的,不要覺得好像課程和實習的份量很多,一直想等到自己看完以後再提出問題,有遇見問題但是沒有得到適當解釋的話,你的接受度就會快速地降低,一個問題會衍生其它的問題,進度就會慢上很多,「怎樣有效率地提出問題」本來也就是這個課程的目標之一,你不用管那些有基礎的同學,覺得提出問題會拖慢進度,不會的,厲害的同學在各種學習活動中都找到他需要的知識,你越早體會到每個同學都有差異,同一個課程不可能適合所有同學,有需要和老師、助教互動來得到適合你的課程,你就掌握到成功學習的關鍵,現在也可以用私訊提出問題,請你一定要盡量運用這些工具排除自己的學習障礙。

有學長把我們班上的課程評為四班裡最難的,這樣子聽起來好可怕,不過他沒有修過我們班的課,應該沒有聽過我們課堂裡的解說,也沒有看過我們在課程裡準備的動畫,「困難」或是「簡單」其實要看這些內容是怎樣呈現的,如果沒有適當、清楚的解說,那麼所有的東西都是困難的,納入我們課程裡的內容一定有一個特性,就是後續其他課程裡面是沒有的,我們沒有必要把其他課程裡面深入的內容拿來這裡困擾大家,我們課程的內容如果你在適當的解說下能夠了解,後續不論你在哪裡遇見時都不會再困擾你,可以快步地前進,所以我們才把這樣的內容放進來,並且運用各種方法來輔助你了解。

這個課程是教程式設計的,當然主要的內容是設計程式的各種方法,但是不太會超出「程序化的程式設計」,資訊系裡還有很多不同的程式設計模型與方法,等著你去學習與探討,同時我也必須提醒你,資訊系的同學如果只會寫各種模型的程式,但是對於自然界背後的運作模型完全不了解的話,就像是一個修車工人,會用各種電動與手動工具,但是不了解車子的發動、燃油、傳動、操控系統,其實只是一個很低階的工匠,這樣子是沒有太大前途的。或者像是一個會用手術刀解剖的技師,但是卻不了解解剖對象的生理構造,這樣子是沒有辦法有深入治療行為的。資訊系同學需要在後續的課程裡了解很多自然界運作的數學模型,例如 3D 空間裡面的物體如何投影呈現在畫面上,如何建構 3D 的列印模型,如何由多角度多個相機平面的成像重建 3D 的物體模型,如何以數學模型控制機器手臂的多個關節,如何在多感測器度量出來的高維空間中學習到事件,如何運用抽象的數學來適當地隱藏資訊、維護資料傳輸或是電子商務的安全性,一定要記得你的目標不能只是一個會寫程式的工匠,否則充其量只是一個高級一點的工具人而已,沒有辦法擔起大的責任。

海洋資工學長在 「大學程式能力檢定(CPE)」考試裡的表現

第二週 111/09/20(二)
  1. 語言的基本語法、關鍵字 vs. 識別字、程式碼錯誤 (bw) (視訊: 1111, 1091)

  2. 程式是什麼? 開始撰寫 C 程式 (bw, splitted) (視訊: 1111:1, 2, 1091:1, 2, 3, 4, 1081: 1, 2)

  3. 變數概念、變數型態、資料表示法、與資料的轉換 (bw) (視訊: 1111, 1101, 1091:1, 2, 1081: 1, 2)

  4. 程式範例
    1. miles2kms (bw) (exe)
    2. for loop and division test (bw) (exe)
    3. ASCII graph (bw) (exe1, exe2 graph.txt 資料和程式要下載在同一個資料匣裡才能正確執行)

  5. Homeworks:
第三週 111/09/27(二)
  1. 資料串流模型 (bw, splitted) (視訊: 1091)

  2. 標準函數庫,格式化輸出 printf 與格式化輸入 scanf (bw) (視訊: 1101:1, 2, 1091:1, 2, 1081)

  3. 運算式與運算子、運算子的優先順序、強制的資料型態轉換 (bw) (視訊: 1101, 1091, 1081: 1, 2)

  4. 程式範例
    1. Arabic to Chinese (bw) (exe1, exe2)
    2. Zodiac Determination (bw) (exe)
    3. The 12 days of Xmas (bw) (exe)

  5. Homeworks:
第四週 111/10/04(二)
  1. 條件控制敘述 (bw) (視訊: 1101, 1091, 1081)


  2. 結構化程式設計、迴圈控制 (bw) (視訊: 1091, 1081: 1, 2)

  3. 迴圈綜合應用
    1. ZJ c356 Justin Love Encryption (視訊: 1081)
    2. 最大公因數 (bw) (視訊: 1081)
    3. Spiral Tap (bw, splitted, all, all_splitted, all_bw) (視訊: 1081)
    4. b351: 幻方(魔方陣)之一:奇N 階 (視訊: 1081)
    5. 二分法勘根 (bw) (視訊: 1071)
    6. 其他 (bw) (視訊: 1071: 1, 2, 3)

  4. 程式範例
    1. while loop and if test (bw) (exe)
    2. series approximation (bw) (exe)
    3. calendar printing (bw) (exe)

  5. Homeworks:
    • 閱讀課本第 7
第五週 111/10/11(二)
  1. 撰寫 C 程式用到 的核心語法 (bw)

  2. Spiral Tap (bw, 迴圈的使用時機, 12 Day on Xmas, Spiral Tap) (視訊: 1091, 1081)

  3. 使用迴圈尋找 n 個整數的最大值, 加總 n 個整數 (視訊: 1091, 1081)

  4. 程式範例
    1. 羅馬數字 (bw) (exe)
    2. 粗心的小新 (視訊: 1091)

  5. Homeworks:
    • 閱讀課本第 7
第六週 111/10/18(二)
  1. 設計程序式程式的基本方法 (bw) (視訊: 1081)

  2. 模擬 (Simulation) (bw) (視訊: 1091, 1081: 1, 2)

  3. 區塊、函數、參數傳遞 (bw) (視訊 1091, 1081: 1, 2)

  4. Quiz#0 Reverse a decimal number (Sol)

  5. 程式範例
    1. 時間長度加法器 (bw) (exe)
    2. dice rolling (bw) (exe)
    3. multi-dimensional array (bw) (exe) (視訊: 1061)
    4. number guessing (bw) (exe1, exe2)
    5. blind chess shuffling (bw) (exe)

  6. Homeworks:
    • 閱讀課本第 8, 9
第七週 111/10/25(二)
  1. 陣列使用 (bw) (視訊 1091, 1081: 1, 2)
    1. 為何需要陣列 (bw) (視訊: 1071)
    2. 陣列應用 (bw) (視訊: 1091, 1081)
    3. 組合數計算 (bw) (視訊: 1081)

  2. qsort (bw) (視訊 1091: 1, 2, 1081: 1, 2, 1071: 1, 2)

  3. Homeworks:
第八週 111/11/01(二) 期中考 (13:20-16:00)

請提早 10 分鐘到 INS101 找你的座位, 考試請按照教室門口公佈的座位表坐
第九週 111/11/08(二)
  1. 期中考檢討:參考答案成績分佈,視訊

  2. 陣列與字串 (bw) (視訊 1091: 1, 2, 1081: 1, 2)

  3. 程式範例
    1. 隨機漫步 (bw) (exe)
    2. 撲克牌洗牌程式 (bw) (exe)
    3. 撲克牌型判斷 (bw) (exe, exe for utf-8)
    4. 三角函式列表 (bw) (exe)
    5. 刪除多餘空格 (bw) (exe)

  4. Homeworks:
第十週 111/11/15(二)
  1. 字串處理 (bw), strcpy vs strncpy (bw) (視訊: 1091)

  2. 什麼是好程式? (bw) (視訊: 1091)

  3. 暴力法列舉之外

  4. 程式範例
    1. 大樂透投資報酬率模擬計算 (bw) (exe1, exe2, exe3)

  5. Homeworks:
第十一週 111/11/22(二)
  1. 排列的產生 (bw) (視訊 1091: 1, 2, 3, 1081: 1, 2)

  2. 數獨應用 (bw) (視訊: 1081, 1061)

  3. 程式範例
    1. 數獨遊戲 (Sudoku) (bw) (exe, data4_12.txt, data4_10397.txt, data4_634211.txt) (demo, data4_6.txt) (GUI demo)
    2. 運算思維與 APCS 檢測範例解析
      1. 視訊: 01, 02, 03, 04, 05, 06, 07, 08
      2. 投影片(請下載檔案在Acrobat readerDC中以PgUp,PgDn瀏覽): 01, 02, 03, 02-03app, 04, 05, 06, 07, 07a, 08
      3. ewant MOOC: 臺北聯大APCS大補帖

  4. Homeworks:
    • 請閱讀投影片
第十二週 111/11/29(二)
  1. 質數表的建立 (bw) (視訊: 1081)

  2. 遞迴 (bw) (視訊: 1091, 1081, 1071:1 2)

  3. 程式範例
    1. xn (bw)
    2. Ackermann function (bw) (exe)
    3. 河內塔及其進階


  4. Homeworks:
    • 請閱讀投影片
第十三週 111/12/06(二)
  1. 遞迴: Counting (數獨遊戲, 動畫程式解釋, msvc100d_dlls.zip), Permutation, Combination, 數獨, 迷宮(動畫), 馬, 八后, 一筆畫 (Hamiltonian Path) --- Backtracking 回溯法 (視訊: 1061)

  2. 遞迴設計方法與範例 (bw) (視訊: 1091; 1081: 1, 2; 1071: 1, 2, 3; 1061 1, 2, 3, 4)

  3. 二分搜尋法與遞迴 (bw) (視訊: 1081, 1071)

  4. 指標 (bw) (視訊: 1091, 1081: 1, 2, 3; 1071: 1, 2, 3)

  5. 指標與陣列 (bw) (視訊: 1091)

  6. 程式範例
    1. Quiz: 遞迴版本的 Permutation from Counting (視訊: 1071)
    2. Iterative Hanoi (bw) (exe) (視訊: 1061)

  7. Homeworks:
第十四週 111/12/13(二)
  1. 結構 (bw) (視訊: 1091;1081: 1071)

  2. 程式範例
    1. 踩地雷 (bw) (exe1, exe2, exe3, exe4(msvc100d_dlls.zip), exe5, winmine_xp , utilwin32.zip, vc2010使用簡介, dbwin32 工具, 971013win32mine_C_FacadeOnly.rar)

  3. Homeworks:
第十五週 111/12/20(二)
  1. 動態記憶體配置 (bw) (視訊: 1091; 1081: 1, 2; 1071)

  2. 二維陣列 (bw) (視訊: 1091; 1071; 1061)

  3. Dev-C++ 和 GCC/G++ 的問題 (bw) (視訊: 1071)

  4. Homeworks:
第十六週 111/12/27(二)
    期末考 (13:15-15:45)

    請提早 10 分鐘到 INS101 找你的座位, 考試請按照教室公佈的座位表坐

    期末考參考答案

    成績分佈

第十七週 112/01/03(二)
  1. 期末考檢討:參考答案,成績分佈,視訊

  2. 文字資料與二進位資料之檔案輸出入處理 (bw) (視訊: 1091; 1081)


  3. Homeworks:
    • 請更正考卷錯誤
第十八週 112/01/10(二)
  1. 進階資料型態 (bw) (視訊: 1091)

  2. 位元處理 (bw) (視訊: 1091; 1081; 1071)

  3. Homeworks:
    • 閱讀課本第 12 章
    • 閱讀課本第 15 章
其它資源及練習
  1. 大學程式能力檢定 (Collegiate Programming Examination, CPE), 1star 選集, local advices,本系學長的表現 109/12/22, 110/03/22, 110/10/19, 110/12/21, 111/03/22, 111/05/24

  2. 瘋狂程設

  3. 你所不知道的 C 語言

  4. CS Academy

  5. UVa 線上測試, Lucky貓的 UVa(ACM)園地(mirror), Ruby兔的ACM園地

  6. UVa problem test data: uDebug

  7. Algorithmist - method to solve -- UVa解題方法提示

  8. 演算法筆記

  9. Codeforces Online Judge
    分類題庫: Brute Force, Greedy, Binary Search, Ternary Search, Sortings, Strings, String Suffix Structures, DFS, CRT, Number Theory, Math, Probabilities, Combinatorics, Geometry, Matrices, Graphs, Divide and Conquer, DP, Data Structure, Disjoint Set Union, Bitmasks, Hashing, Shortest Paths, Graph Matchings, Trees, Two Pointers, Implementation, Constructive Algorithms, Meet-in-the-Middle

  10. Topcoder

  11. Timus Online Judge

  12. POJ, HDOJ, 題目分類 1, 2, 3

  13. CodeVS

  14. TIOJ

  15. ZeroJudge 高中生程式解題系統

  16. Project Euler (這裡的問題不是考題,是比較值得進一步探討的問題,比較少參考答案,可以幾個同學一起討論,訓練解決問題能力和思考能力)

  17. Kaggle: data science

  18. LeetCode, Codility, LintCode, HackerRank: 公司面試題目,一般來說時間比較短,比較強調運算思維的建立與思考角度的轉換,還可以參考 Cracking C Programming Interview, Cracking the Coding InterviewTop LeetCode Patterns for FAANG Coding InterviewsAlgorithms for Coding Interviews (12 books)Day before Coding Interview (11 books)7 days of Algorithms (3 books)

  19. Code Submission Evaluation System (CSES) - Central Europe,
    collected problem set

  20. Algorithms for Competitive Programming

一個學期很快結束了, 這個學期裡很多同學辛苦地調整過去所建立的學習方式, 過去的各種科目都有考試作為目標, 一方面也作為課程內容的界限, 超過考試範圍的都不需要傷腦筋, 不會也就算了, 考試前來不及會的, 考試後當然也就算了, 從這個課程開始你需要發現不是這樣的了, 未來的各種課程裡, 你需要在這個課程裡學到的基本方法, 你不能邊學邊在考試後就把它忘了, 不可以很客氣地把這學期裡看到的東西還給我, 你需要把「提升自己的學習能力」作為目標, 學到了的東西就佔為己有吧! 這比起成績來說更有價值, 寒假裡我是沒有放假的, 如果你覺得你想要在假期裡加強一些什麼, 歡迎你和我討論, 遇見問題當然也歡迎你來討論, 有的時候自己一個人在做很多事都會遇見很大的阻力, 有人可以討論的話情況就完全不一樣了, 你可以拿這學期做過的練習, 也可以去看 CPE / UVa 或是 POJ / HDOJ 的線上題目作為練習, 有一些參考書籍是為這些設計的, 需要的話告訴我, 我也做過很多投影片解說相關題目的作法, 如果幾個同學一起有興趣的話, 也可以幫你們預習一些需要的資料結構和演算法, 如果你對於物件導向程式 (配合下學期程式設計二的進度也可以參考我過去的教學網頁和影音) 或是視窗介面程式有興趣, 也可以來討論這些, 如果你對於物聯網以及一些網路裝置有興趣, 同樣歡迎你來討論, 最後, 如果你對於機器學習和深度學習, 密碼學, 資訊安全有興趣, 更歡迎你加入我們的研究。

在接下來的資料結構, 組合語言, 演算法, 物件導向程式設計課程, 甚至線性代數, 機率課程裡, 如果你覺得和我談可能對你會有幫助, 直接告訴我, 跟我約時間聊一聊, 試看看我們建立的合作學習關係能不能延續下去, 也許你覺得這學期上課好像睡得挺好, 沒有學得很好, 甚至沒有想要開始學, 擔心我會不太理你, 覺得實習或是課輔的時候很少幫你看程式, 不如說掰掰了吧! 其實你想多了, 我相信很多同學在這個學期裡, 因為學習環境的變化, 生活環境的變化, 還沒有調適好, 還沒有放下太多的精力去學習, 或是覺得投入的力氣好像沒有相對的成果, 相信你開始熟悉資訊系的課程和環境以後, 決定到底自己要什麼以後, 自然會得到自己能夠滿意的表現, 當老師其實最習慣的就是要等候了....相信你想要會的時候, 你的學習一定會有突破的, 以往有很多學長在幾年的學習失敗以後, 仔細想想就會發現其實關鍵在於遇見問題沒有人可以討論, 每一個課程的時間都很短, 對於老師的上課方法與課程的內容還來不及進入狀況就過了一大半, 真的發現問題時課程已經結束了, 表現又不怎麼樣, 就不好意思去找老師問了. 最後四年以失敗收場, 只能藉由考上前面學校來安慰自己, 可是如果你的學習方法一直維持下去, 換個更競爭的環境不見得有太大好處, 希望你們在接下來的時間裡都不會遇到這樣的狀況......過去幾年一直有學長會持續和我討論, 所以我對其他老師的課程和作業都有點熟悉了, 不過相信他們所花的時間也都有相當的收穫 (換個人談談, 常常就是會讓自己有突破的), 台灣的教育過度強調學生要給出答案、最好還是標準答案, 逐步思考、有互動、會問問題的學生反而容易被歸類為愛找碴的人, 因此真的誤了好多人材, 其實在往後的學習裡, 重點不會在於考試的成績, 而會在於如何互動式地發掘問題, 分析問題, 和解決問題, 問題都提不出來當然也就看不到解決的方法。

這學期和大家討論的東西, 由最基本的程式語法到很多軟體公司在徵才時候的面試考題, 也許大家覺得何必這麼快? 才剛進大學耶, 以後畢業時遲早要接觸的何必提早, 為什麼不讓你愉快地混一下、享受一下大學生活? 其實你還是可以自己決定自己的步伐的啦! 只是提醒你一下畢業以後競爭還蠻激烈的, 職場上有的時候真的是生存的競爭, 不要怪別人為什麼不留情面, 你也不見得會犧牲自己照亮別人啊, 職場上不只是本科系的同學, 還有很多大學畢業以後才轉入資訊業的人, 他們通常就是在五六個星期的時間裡面會看到我們這一個學期上的東西, 你和他們最大的差別不是在年紀或是經驗, 而是在於他們真心想學, 他們還有其他領域的基礎, 只是沒有足夠的時間琢磨軟硬體相關的知識, 現在的你也許還沒有確定自己的方向, 但是你最大的優勢就在於你可以在未來這三年裡逐步地鍛鍊自己, 慢慢建立起扎實的理論能力與實作基礎, 如果你早點看到方向, 也許就會發現自己該要求自己到什麼程度, 應該就不難在殘酷的競爭中取得先機。

程式設計課程 首頁

製作日期: 09/12/2022 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon