1131 NTOUCSE 程式設計1C
實習課程內容
(113/09-113/12)

實習座位

FB群組: NTOUCSE 1131 程式設計 1C


就像我們上課時提到的, 程式設計課程內容難易度在講到迴圈之前有一個很明顯的不連續點, 你應該很容易可以發現在講迴圈之前你自己看到或是我希望你寫的程式都不太大, 基本上好像只是在練習 C 語法, 寫出來的程式沒有辦法幫你做些什麼自動化的工作 , 甚至會覺得很直覺, 有點簡單, 不需要真的花什麼時間練習; 這個狀況在學到迴圈, 學到陣列的時候突然有了變化, 程式開始可以運用到計算機快速的運算能力以及大量的記憶體了, 寫的程式變大了, 程式可以精確地完成很多你不想

要手動去作的事, 程式開始變得有意思了, 可是實習和作業也開始變得不是那麼直覺了, 這時候學習的慣性會讓你捨不得多花一些時間去調整, 心裡頭期待著也許過一兩節課程式又會變簡單了, 事實上這個期待很快就會落空, 你看到的程式一開始能夠完成比較有用的事以後, 不會再變回到開學的時候那麼簡單了, 過去很多同學就在這個時候發現進度遠遠地落後, 突然發現都看不太懂了, 甚至就此放棄了, 然候抱怨說怎麼一下子作業難度變那麼高, 抱怨課程設計不好, 為什麼不繼續給簡單的例子就好? 這個過程有點像學騎腳踏車, 不會騎之前你用兩隻腳走路的速度差不多 3-4 公里/小時, 會騎車以後移動的速度突然變成 15-30 公里/小時! (為什麼不只騎 5 公里/小時慢慢增加就好了呢? 呵呵, 要騎得很慢當然可以, 但是困難度反而變高了, 有點像是把一個功能很複雜的程式寫得很簡單、很容易了解一樣的困難。)

在下面的實習裡, 你會發現在迴圈之前進度會比課程稍微快一些 (上圖中虛線), 有些在課程沒有講到的東西都直接叫你上機嘗試, 反正有電腦可以直接測試看看語法會有什麼效果, 錯了也可以直接看到, 直接尋找更正的方法, 直接和老師、助教以及同學討論, 目的是希望你能夠稍微走快一點, 自己稍微把學習的觸角伸展出去, 不要太小看這個課程的內容, 才能在開始談到迴圈時不會有那麼大的震撼; 另外一個目的是希望你調整一下學習方法, 也許以前的學習經驗裡, 你發現最省力的方法是讓老師把所有 "需要學" 的東西整理清楚, 講清楚, 然後你只需要練習題目就好了, 這個學習方法是 "應付考試" 用的, 慢慢的你會發現你需要培養自己由資料裡吸收知識的能力, 自己需要定義什麼是需要學的知識, 事實上在科技快速發展的領域中 「新的知識」, 「有用的知識」可能都沒有人能幫你整理, 整理好的知識應該都過時了, 常常也沒有價值了, 你需要從這個時候就慢慢建立起自覺性的學習方法...

另外你的程式寫得對或是不對? 要看機器執行出來的結果對或是不對而定, 不是書本或是我或是助教說對就對了, 你在這門課程裡學習的是如何深度地配合電腦, 運用電腦, 如果電腦不聽你使喚, 只是你和電腦間有一些誤會, 你不需要把電腦當成敵人, 整個過程裡它也就是一切聽你的 "話" 而已, 機器很死板, 不會去判斷你的命令是不是好的, 是不是能完成你的目標, 也不會修改你的命令, 很多時候會發生錯誤只是因為你以為機器執行某一命令的效果和機器實際執行的結果不一致而已, 不是電腦在為難你, 重點不在於「你心裡想要它怎樣做」, 而在於「你告訴他怎樣做」, 這兩者有差距的時候, 就要麻煩你多花一些時間練習, 仔細觀察, 仔細校正, 慢慢地你就能夠讓電腦一個指令一個動作地乖乖聽話。

學習C程式設計的過程中, 你需要逐步建立起計算機的運算模型, 很多時候也會需要應用你在計算機概論課程或是離散數學課程裡學習到的知識, 這是進入資訊工程領域中很辛苦但是非常重要的一個階段, 也許你會遇到一些本系或是外系的學長告訴你這些不要急, 你的工作生涯還有 40 年, 以後慢慢學就好了, 或是進到職場再學就好了, 學校學的都沒有用, 也告訴你大學生活只有四年, 不參加各種活動的話你的人生就浪費掉了..., 實際上呢, 各個系所的性質差異非常大, 甚至各個學校資訊系的差異也很大, 在我們系上你這個階段沒有學好, 系上大二以後的課程幾乎你都只能學裡面可以記憶的東西, 大概 30% 吧, 這 30% 大概也就是那些以後在職場裡不會用到的, 另外可能會有用的 70% 呢? 因為你在這個階段沒有掌握好, 所以只能聽聽就算了, 老師都有教過耶!! 只學到 30% 的話, 畢業以後在資訊業界中你就很容易成為那個取代性很高的人, 你自己也不好意思跟別人說你很基礎的東西都不會, 所以連補救的機會應該是都沒有的, 於是同事們不斷地隨著技術的進步成長, 你只能尋找其它更好的機會了...

因為機器的運算方法和你的運算方法差異很大, 學習程式設計需要蠻多練習的, 這學期裡我們除了上課和實習以外, 也會在課後或是晚上排課輔的時間, 課輔時你可以練習上課看到或是課本上看到的任何題目, 可以練習實習的題目, 也可以練習一些線上程式評測系統 (Zero Judge, 建中的 TIOJ, 台中女中的程式解題系統, NOIuVA online judge, Codeforce,  POJ, SPOJ, URAL, HDU, NCPC 程式競賽) 上的題目, 遇見問題可以共同討論來尋求合理的作法與解釋, 對於資訊工程系的同學來說, 這不僅僅是課程而已, 每天思考程式、每天和同學討論程式並不丟臉, 表示你能夠掌握開發自己潛能的機會, 你需要不斷練習才能夠把程序性的思考變成你的習慣, 不能只是這學期期中和期末需要考試的一科而已, 這樣子對你以後接受資訊專業領域的知識才會有實質的幫助。

  實習內容
第一週 113/09/11(三)

  1. Dev C++: 版本 4.9.9.2, 版本 5.11
  2. 如果你暫時還沒有自己的機器,除了可以來系上電腦教室 201/203/205/301 之外,也可以試看看計算機中心的電腦教室,或是線上的編譯環境 Rextester, codingground, ideone

  3. Visual C++ 2010 (WinXP, Win7/Win8/Win8.1 Compatibility mode, Win10 請執行 Setup/setup.exe) 是一個比較舊的微軟編譯環境,但是非常穩定且基本功能完整,請注意取得適當的版權。雖然大家都擔心說如果不用最新版本的話,會不會和現在的環境脫節了啊,這個你放心,在我們的課程裡,如果你使用最新版本的編譯環境時,幾乎可以保證你只用到裡面 1/20 以下的功能。還是請你先專注在思考問題的系統性解決方法以及轉換為程式的基本方法。

  4. Visual Studio Code: 使用教學 (使用 MingGW C/C++ 編譯器, 請注意其中文編碼預設為 utf8, 本學期線上繳交題目中文編碼都需要是 big5)

  5. 其他的選擇包括 Code::Blocks, Codelite 或是 NetBeans

  6. 「程式」是什麼? 「寫程式」在做些什麼? (bw, splitted)

  7. 繳交練習
    A. 線上繳交: week1 線上繳交練習 I
    B. 線上繳交: week1 線上繳交練習 II

    (請注意由系外網路連結線上評測主機,需要透過 海洋大學VPN 連接)
第二週 113/09/18(三)
  1. 英文打字練習 (download)

  2. 基本語法練習

  3. 常見的語法錯誤 Dev-C++5.11, Dev-C++4.9.2, Code::Blocks

  4. 鍵盤輸入與螢幕輸出 (線上繳交: week2 02-1: 直線與橢圓的交點) 詳細推導

  5. 資料串流模型 (bw)

  6. scanf 常見問題與語法剖析功能 (bw)

  7. C 語言的基本語法 (線上繳交: week2 02-2: 由檔案讀取資料的直線與橢圓交點程式)

  8. 線上程式題目的資料設計有一些常用的模式, 這個練習裡嘗試幾種常常看到的資料呈現方法, 請注意有編號 02-x 的題目才需要繳交, 其它沒有編號的是額外的練習題目
    A. 線上繳交:
    week2 02-3 迴圈與測試資料讀取 1 - 起手數,
    B. 迴圈與測試資料讀取 2 - 起手數,
    C. 線上繳交: week2 02-4 迴圈與測試資料讀取 3 - 零尾封,
    D. 線上繳交: week2 02-5迴圈與測試資料讀取 4 - 檔尾封,
    E. 迴圈與測試資料讀取 5 - 行尾封+檔尾封,
    F. 迴圈與測試資料讀取 6 - 井尾封+檔尾封

  9. 線上繳交: week2 : 粗心的小新 (練習程式: 可以不繳交, 詳細分析與設計方法)
第三週 113/09/25(三)
  1. 條件控制敘述與邏輯運算式 (線上繳交: week3 03-1: 中文數字列印, 投影片解說, 視訊: 1, 2)

  2. 迴圈語法練習及迴圈使用時機

  3. 線上繳交: week3 03-2: 歌詞列印 - The 12 days of Xmas (bw) (exe) (視訊) (這個程式的輸出文字比較多, 如果你擔心結果不太對, 或是你發現提交以後結果錯了, 有的時候會比對很久找不到在哪裡出錯, 這個時候不是比誰眼力好, 請你使用 notepad++ 來比對兩個文字檔案, 先把題目網頁裡的歌詞拷貝下來, 編輯一下存檔, 再把『使用者輸出結果』『以網頁方式顯示』的內容拷貝到另一個檔案, 然後讓 notepad++ 幫你比對, 比對方法;另外也可以把資料貼到比對文字的網站去比對)

  4. 練習 ZeroJudge c356. Justin 愛加密
第四週 113/10/02(三)
  1. 迴圈語法練習及迴圈使用時機

  2. 尋找 Perfect number (視訊: 1, 2)

  3. 線上繳交: week4 04-1: 螺旋狀排列數字 (Spiral Taps) (bw, all, all_bw, all_splitted), 範例執行程式

  4. 練習 ZeroJudge b351. 幻方(魔方陣)之一:奇N 階

  5. 線上繳交: week4 04-2: 二分勘根法, (pdf, 4up) 範例執行程式

第五週 113/10/09(三)

  1. 練習 ZeroJudge b836. kevin戀愛攻略系列題-2 說好的霸王花呢??

  2. 最大公因數 (Euclidean Algorithm), 反元素 (Extended Euclidean Algorithm) (bw)

  3. 線上繳交: week5 05-1: 函式練習 (視訊)

  4. 線上繳交: week5 練習程式: A1 金字塔列印

  5. 線上繳交: week5 05-2: 模擬擲骰子與次數統計 (bw), 範例執行程式 (視訊)

  6. 線上繳交: week5 05-3: 宿舍樓長, 範例執行程式 (視訊)
第六週 113/10/16(三)
  1. 練習 ZeroJudge a565. 2.p&q的邂逅

  2. 練習 ZeroJudge b838. 104北二2.括號問題

  3. 線上繳交: week6 06-1: 學生成績資料處理 (bw)

  4. 線上繳交: week6 06-2: 帕斯卡三角形計算組合數 (迴圈) (bw, splitted)

  5. 練習 ZeroJudge f145. 肯尼的階乘位數
第七週 113/10/23(三)
  1. 線上練習: 1051 Quiz. #0: (暖身) 判斷一個十進位整數是不是 11 的倍數

  2. qsort (bw)

  3. 線上繳交: week7 07-1: 任兩數和不重複的數列

  4. 線上繳交: week7 07-2: 判定可能的最小進位制

  5. 可以傳回資料的函式參數

  6. 線上練習: 1121 Quiz. #1 UVa11332 數字和
第八週 113/10/30(三)

期中上機考 13:10-16:00 (INS203/INS201)

HTML

第九週 113/11/06(三)
  1. Dev C++ 原始碼除錯器 (Source Code Debugger) 版本 4.9.9.2, 版本 5.11

  2. 如果你希望使用商用的開發環境的話, 可以參考 Visual C++ 2005 Source Code Debugger (2008, 2010, 2012, 2015, 2017, 2019 基本上界面相似)

  3. 線上繳交: week9 09-1: 氣泡排序法

  4. 線上繳交: week9 09-2: 計算踩地雷遊戲之提示

  5. 各種排序演算法效率實驗

  6. ZeroJudge b373 車廂重組

  7. 線上練習: 1110612 APCS #2 字串解碼
第十週 113/11/13(三)
  1. 函式指標

  2. 線上繳交: week10 10-1: 分數加減乘除

  3. 線上繳交: week10 10-2: 仲夏夜之夢

  4. 繪製正弦波形
第十一週 113/11/20(三)
  1. ZeroJudge b511. 換銅板: 說明 (bw)

  2. 線上繳交: week11 11-1: 運用旋轉法產生 n 個整數且有額外條件限制的排列

  3. 線上繳交: week11 11-2: 最爛的藉口

  4. ZeroJudge b515. 摩斯電碼
第十二週 113/11/27(三)
  1. 線上繳交: week12 12-1: 尋找整除數字

  2. 線上繳交: week12 12-2: 數獨遊戲

  3. 運算思維與 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大補帖
第十三週 113/12/04(三)

遞迴範例

遞迴設計方法與範例


遞迴計算整數次方, 網頁說明

  1. 線上繳交: week13 13-1: 快速排序法, 網頁說明

  2. 線上繳交: week13 13-2: 河內塔 (splitted)
第十四週 113/12/11(三)
  1. 線上繳交: week14 14-1: 計算組合數(遞迴+memoization)

  2. 線上繳交: week14 14-2: 符合要求的數字有幾種
第十五週 113/12/18(三)

遞迴撰寫二分搜尋

  1. 線上繳交: week15 15-1: 酪農生乳收集

  2. 線上繳交: week15 15-2: 判斷完全平方數
第十六週 113/12/25(三)

上機考 13:10-16:00 (INS203/INS201)

第十七週 114/01/01(三) 遞迴 DFS 撰寫迷宮搜尋 (本週實習不強制繳交)

遞迴設計方法與範例

  1. 線上繳交: week17 17-1: 最大乘積之整數劃分

  2. 線上繳交: week17 17-2: 馬的走法

  3. 線上繳交: week17 17-3: DFS 尋找狼、羊、菜一起安全渡河的方法
第十八週 114/01/08(三)

踩地雷 (bw) (exe1, exe2, exe3, exe4(msvc100d_dlls.zip), exe5, winmine_xp)

1131 教學評鑑: http://ais.ntou.edu.tw/(教學務系統/教務系統/課程評鑑/填寫問卷)

1131 工程認證課程評鑑: http://www.cs.ntou.edu.tw/questionnaire/login.php 填入學號以及密碼(密碼若未修改則為身分證字號,英文字母大寫)

一個學期很快就要結束了, 這個學期裡很多同學辛苦地調整過去所建立的學習方式, 過去的各種科目都有考試作為目標, 一方面也作為課程內容的界限, 超過考試範圍的都不需要花腦筋, 不會也就算了, 考試前來不及會的, 考試後當然也就算了, 從這個課程開始你需要發現不是這樣的了, 未來的各種課程都需要應用你在這個課程裡學到的基本方法, 你不能邊學邊就把它忘了, 更不能考完試就把它徹底忘了, 在這同時, 你也需要提升自己的學習能力, 這比起成績來說更有價值, 寒假裡其實老師是沒有放假的, 如果你覺得你想要在假期裡加強一些什麼, 歡迎你和我討論, 遇見問題當然也歡迎你來討論, 有的時候自己一個人進行很多事都會遇見莫名的阻力, 如果有人可以討論的話情況就完全不一樣了, 你可以拿這學期沒有做出來的繼續練習, 也可以去看 CPE 或是 UVa 的線上題目作為練習, 有一些參考書籍是為這些設計的, 需要的話告訴我, 如果幾個同學一起有興趣的話, 也可以幫你們講一些需要的資料結構和演算法, 如果你對於物件導向程式或是介面程式有興趣, 也可以來討論這些, 如果你對於物聯網以及一些網路裝置有興趣, 同樣歡迎你來討論, 如果你對於深度學習和機器學習有興趣, 也可以一同來學一些新的東西, 做一些有趣的應用, 最後, 如果你對於密碼學, 資訊安全有興趣, 更歡迎你加入我們的研究。

在接下來的資料結構, 組合語言, 演算法課程裡, 如果你覺得我可能對你會有幫助, 直接告訴我, 跟我約時間聊一聊, 試看看我們這個課程能不能變成一種保證班的概念, 也許你覺得這學期上課好像睡得挺好, 沒有學得很好, 擔心我會不太理你, 或是覺得實習或是課輔的時候很少幫你看程式, 不如說掰掰了吧! 其實你想多了, 我相信很多同學在這個學期裡, 因為學習環境的變化, 生活環境的變化, 還沒有投注太多的精力去學習, 或是覺得投入的力氣好像沒有相對的成果, 相信你慢慢熟悉以後, 決定到底自己要什麼以後, 自然能夠有自己能夠滿意的表現, 當老師其實最辛苦的就是要等候了....相信你想要會的時候, 你的學習一定會有突破的, 以往有很多學長在幾年的學習失敗以後, 仔細想想就會發現其實關鍵在於遇見問題都沒有人可以討論, 每一個課程的時間都很短, 還來不及進入狀況就結束了, 真的發現問題時課程已經結束了, 表現又不怎麼樣, 就不好意思去找上過課的老師問了. 最後常常以失敗收場, 不要再像國高中的時候以為自己唸就夠了, 你的目標不是在應付考試 - 應付那些數十年不變的知識上衍生出來莫名其妙的考題, 你以為資訊領域的東西都像國高中學的東西一樣不會進步了嗎? (就在你讀這些文字的時後, 也許又推出 100 種新產品了), 你覺得自己唸就能夠跟上時代的進步了? 那就太小看在這個領域上全世界的工程師所投注的心力了, 你在學校裡真的需要學到的是如何和別人互動, 如何基於別人幫你整理出來的東西快速地學到所有基礎, 才能夠把心力投注在科技尖端的挑戰, 才能夠扮演好承先啟後的角色, 希望你們在接下來的時間裡能夠建立成功的學習經驗......過去幾年一直有學長會持續和我討論, 這讓我對其他老師的課程和作業都有點熟悉了, 不過相信他們所花的時間也都有相當的收穫 (換個人談談, 常常就是容易讓自己的想法有突破的, 這種突破的價值比起找個人教你要大得多了 )。

  一些沒有來得及做的練習
  • 動態記憶體配置與二維陣列
  • 文字資料與二進位資料之檔案輸出入處理
  • 位元處理

程式設計課程 首頁

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