1091 (109/09-110/01) 課程內容摘要

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

  課程摘要
第一週 109/09/15(二)

    請注意 1.下面有一些投影片裡面是有動作的 (例如 練習寫程式的要求), 請不要在瀏覽器 chrome, IE 或是 edge 裡面直接看, 那樣子看不到投影片上的動作, 請到 https://get.adobe.com/tw/reader/
    下載並且安裝 Adobe Acrobat Reader DC, 把投影片下載到 PC上用這個軟體看, 用 PgUpPgDn 按鍵瀏覽, 才能夠看到所有投影片裡的動作。2. bw 版本的投影片是黑白、4頁合在一起的版本,適合列印

  1. 課程簡介 (視訊: 1091), 練習寫程式的要求 (視訊: 1091), 課程大綱

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

  3. Homeworks:

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

有一件事情我還蠻在意的,有同學線上問了我一個問題,我盡力猜測他有多少背景然後根據我所知道的打了幾段文字回答他,他靜靜地看然後回說需要一些時間吸收,好多天以後,在另外一個群組裡看到他的評論,說我回答的東西他「都不懂」。這是什麼互動? 為什麼有不能了解的不提出來討論,要在背後講,那麼為什麼我不隨便回答一些簡單不痛不癢、有點關係又沒什麼關係的東西就好了呢? 我在回答每一位同學的問題時,把同學當成是一個朋友,和朋友講話的時候是要用心思考的,不能理解的話語是需要修改、需要澄清的,如果你把所有你在學習過程中接觸到的人與事都當成是靜態的木頭,覺得自己只是默默地飄過,不帶來什麼,也帶不走什麼,那麼你在這裡的歲月裡已經註定不會留下痕跡,不會學到什麼更不會有什麼貢獻了,可是歲月是你自己的喔。

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

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

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

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

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

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

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

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

  4. 資料串流模型 (bw) (視訊: 1091)

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

  6. Homeworks:
第三週 109/09/29(二)
  1. 標準函數庫,格式化輸出 printf 與格式化輸入 scanf (bw) (視訊: 1091:1, 2, 1081)

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

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

  4. Homeworks:
第四週 109/10/06(二)
  1. 條件控制敘述 (bw) (視訊: 1091, 1081)


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

  3. 迴圈綜合應用
    1. ZJ c356 Justin Love Encryption (視訊)
    2. 最大公因數 (bw) (視訊)
    3. Spiral Tap (bw, splitted, all, all_splitted, all_bw) (視訊)
    4. b351: 幻方(魔方陣)之一:奇N 階 (視訊)
    5. 二分法勘根 (bw) (視訊)
    6. 其他 (bw) (視訊: 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
第五週 109/10/13(二)
  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
第六週 109/10/20(二)
  1. 設計程序式程式的基本方法 (bw) (視訊)

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

  3. 區塊、函數、參數傳遞 (bw) (視訊 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) (視訊)
    4. number guessing (bw) (exe1, exe2)
    5. blind chess shuffling (bw) (exe)

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

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

  3. Homeworks:
第八週 109/11/03(二)
  1. 陣列使用 (bw) (視訊 1, 2)

  2. 程式範例
    1. 隨機漫步 (bw) (exe)
    2. 撲克牌洗牌程式 (bw) (exe)
    3. 撲克牌型判斷 (bw) (exe, exe for utf-8)

  3. Homeworks:
第九週 109/11/10(二)

期中考 (13:20-16:00)

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

第十週 109/11/17(二)
  1. 期中考檢討:參考答案成績分佈視訊

  2. 程式範例
    1. 三角函式列表 (bw) (exe)
    2. 刪除多餘空格 (bw) (exe)
  3. Homeworks:
第十一週 109/11/24(二)
  1. 字串處理 (bw), strcpy vs strncpy (bw)

  2. 什麼是好程式? (bw)

  3. 暴力法列舉之外

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

  5. Homeworks:
第十二週 109/12/01(二)
  1. 排列的產生 (bw) (視訊 1, 2)

  2. 數獨應用 (bw) (視訊)

  3. 程式範例
    1. 數獨遊戲 (Sudoku) (bw) (exe, data4_12.txt, data4_10397.txt, data4_634211.txt) (demo, data4_6.txt) (GUI demo)

  4. Homeworks:
    • 請閱讀投影片
第十三週 109/12/08(二)  
  1. 質數表的建立 (bw) (視訊)

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

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


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

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

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

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

  5. 指標與陣列 (bw) (視訊: 1, 2)

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

  7. Homeworks:
第十五週 109/12/22(二)
  1. 結構 (bw) (視訊 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:
第十六週 109/12/29(二)
  1. 動態記憶體配置 (bw) (視訊: 1081: 1, 2; 1071)

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

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

  4. Homeworks:
第十七週 110/01/05(二)
  1. 文字資料與二進位資料之檔案輸出入處理 (bw) (視訊: 1081)

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

  3. Homeworks:
    • 閱讀課本第 12 章
    • 閱讀課本第 15 章
    • 期末考參考答案:1041, 1051, 1061, 1071, 1081
第十八週 110/01/12(二) 期末考 (13:15-15:45)

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

期末考參考答案

成績分佈

其它資源及練習
  1. 大學程式能力檢定 (Collegiate Programming Examination, CPE), 1star 選集, local advices

  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

  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 the Coding Interview

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

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

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

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

程式設計課程 首頁

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