Course Content

C語言相較其他程式語言來說底層很多,故有許多功能都需要靠自己刻出來。也因為如此,以C語言來培養程式設計的邏輯能力,是一個很適合的程式語言。在進階C語言應用這門課程中,因為大部分學生是比較沒有程式設計基礎,所以課程內容會從基本的資料型態出發,一路涵蓋流程控制、函數、指標、字串、動態記憶體配置以及結構等內容。

相對於專業系所的程式設計課程,本課程更加強調實用以及應用層面,所以我們在課程中利用很多不同生活化的例子作為作業。不僅是為了讓學生可以透過作業更加了解我們的生活環境,同時也可以刺激學生對於生活事物的好奇心。

期末專案的部分以小組進行,主要的特點是我們強調的不僅程式設計的能力,更強調如何包裝起來,並且可以展演給其他同學看。期中考後,我們有一堂課專門在講解簡報製作技巧(Presentation Skill)以及說故事能力(Story Telling)。一個好的產品在資訊爆炸的時代中,單靠自己本身的實力是不足的;因此我們在期末報告前,有三次的進度報告,要求所有同學必須安排並達成每階段的目標。不僅如此,期末報告時除了要上台講述該專案的設計歷程、製作方式與成果展現,也要求以研討會交流的方式,每組設計一頁式投影片(One Slide Show)、宣傳海報(Flyer)以及實機操作,讓不同組的同學可以體驗不同組別的產品。所以從期末專案可培養學生的專案管理、時間安排、獨立思考、團隊合作、報告展演等五項核心能力。

課程介紹

W01 :: Introduct to AdvC&APP Course
主要分為三個部分: (1) 授課老師簡介以及一些資料科學相關研究成果 (2) 課程規劃 (3) 課程評量方式。

環境設定

W02-1 :: Environment Setting and Compilation
這堂課主要會講解三個部分: (1) 程式編輯器 & 環境設定 (2) 第一個程式 - Hello World (3) 甚麼是Compilation?

變數宣告與迴圈

W02-2 :: Variables & Loops
這堂課主要會講解六個部分: (1) 宣告變數 (2) 印變數 (3) 運算子 (4) 資料輸入 (5) For 迴圈 (6) While 迴圈

條件判斷與矩陣

W03 :: Conditions and Arrays
這堂課主要會講解六個部分: (1) 條件判斷式的概念 (2) if ... else ... (3) switch ... else ... (4) 流程控制 (break, continue, goto) (5) 1-D array (6) 2-D array

基礎函數宣告

W04 :: Function Part I
主要分為三個部分: (1) 如何宣告一個函數 (define a function) (2) 輸入引數 (input argument) 與 回傳 (return) (3) 宣告 inline function

進階函數應用

W05 :: Function Part II
主要分為三個部分: (1) 全域變數 (global variable) 與 區域變數 (local variable) (2) 遞迴函數 (recursive function) (3) 標準函數庫 (standard library)

宣告指標與取值

W06 :: Declare a Pointer and Dereference
主要分為五個部分: (1) 指標的概念 (the concept of pointer) (2) 宣告指標 (declare a pointer) (3) 取址 (address) (4) 去參照 (dereference) (5) 運算子在指標的應用 (operators in pointers)

矩陣與函數的指標

W07 :: Pointer with Array and Function
主要分為五個部分: (1) 複習指標的基本概念 (recall the concept of pointer) (2) 指標與函數 (pointer and function) (3) 矩陣與指標 (array and pointer) (4) 矩陣指標與函數 (array pointer in array) (5) 指標的指標 (pointer to pointer)

指標矩陣與二維函數指標

W08 :: Array of Pointers & Pointer to 2D array
主要分為六個部分: (1) 指標回顧 (recall) (2) 指標矩陣 (array of pointers) (3) 指標指向矩陣 (pointer to array) (4) 矩陣長度 (array length) (5) 指標與矩陣的關係 (pointer to array and array of pointers) (6) 函數讀取二維矩陣 (2D array to function)

期中考

W09 :: Midterm Exam
主要考試的涵蓋範圍有: (1) 流程控制 (flow control) (2) 函數的生活應用 (function applications in our life) (3) 指標的應用 (pointer, pointer to array, array of pointers, pointer and function, pointer to pointer)

期末專題與腦力激盪

W10 :: Final Project and Brainstorming
主要分為七個部分: (1) 期末專案 (final project) (2) 腦力激盪 (brainstorming) (3) 專案管理 (Project management) (4) 講故事能力 (story telling) (5) 投影片製作 (presentation) (6) 進度報告 (progress report) (7) 期末報告 (final presentation)

檔案讀寫

W11 :: File Processing
主要分為七個部分: (1) 檔案讀寫 (data I/O) (2) 開啟檔案 (fopen) (3) 寫入檔案 (fprintf & fwrite) (4) 寫入二維資料進入檔案 (array to binary/ text file) (5) 讀取檔案 (fread & fscan) (6) 讀取二維資料檔案 (read 2D data) (7) 讀取CSV檔案 (read csv file)

字元與基礎字串

W12 :: Character and String Basic
主要分為七個部分: (1) 字元 (char) (2) 特殊字元 (special char) (3) 字元比較 (char comparison) (4) 字元輸入與輸出 (putchar & getchar) (5) 字元轉成整數 (char to int) (6) 字串 (string) (7) 字串長度、複製與緩衝區溢位 (string size & copy)

進階字串

W13 :: String Advanced
主要分為五個部分: (1) 字元取代 (memset) (2) 字串合併 (concatenate) (3) 字串比較 (string comparison) (4) 字串輸入與輸出 (puts & fgets) (5) 字串搜尋 (string search)

基礎動態記憶體配置

W14-1 :: Dynamic Memory Allocation I
主要分為六個部分: (1) 動態記憶體配置概念 (concept) (2) 動態記憶體配置函數 (dynamic memory allocation) (3) malloc (4) free (5) calloc (6) 一維矩陣動態記憶體配置 (dynamic 1D Array - realloc)

進階動態記憶體配置

W14-2 :: Dynamic Memory Allocation II
主要分為三個部分: (1) 二維矩陣動態記憶體配置 (dynamic 2D Array - malloc & calloc) (2) 記憶體流失 (memory leak) (3) 常見問題 (common mistakes in dynamic memory allocation)

基礎結構

W15-1 :: Struct Part I
主要分為三個部分: (1) 宣告結構 (struct declaration) (2) typedef (3) 創造一個結構 (Create a struct)

進階結構

W15-2 :: Struct Part II
主要分為四個部分: (1) 結構與指標 (struct and pointer) (2) 結構與函數 (struct and function) (3) 結構陣列 (struct array) (4) 巢狀結構 (nested struct)

鏈結串列

W16-1 :: Linked List Part I
主要分為六個部分: (1) 鏈結的概念 (Concept) (2) 宣告鏈結 (Define a linked list) (3) 搜尋節點 (Search) (4) 插入節點 (Insert) (5) 刪除節點 (Delete) (6) 動態記憶體配置新增節點 (Add node by dynamic memory allocation)

鏈結串列-Stack

W16-2 :: Linked List Part II
主要分為六個部分: (1) 堆疊 (Stack) (2) 新增一個節點進入鏈結串列 (Push) (3) 刪除一個節點進入鏈結串列 (Pop) (4) 釋放整個鏈結串列 (Release) (5) 按照順序插入指定節點 (Insertion in Order) (6) 刪除指定節點 (Delete)