「C++語言及其應用」課程 [⏫上傳素材、指引] (Last update: 12/4/2024 1:44 PM) (講稿與程式碼將陸續更新)
|
||||
第0單元 |
🎯 Syllabus ⚠ 為何測驗過程中不得使用ChatGPT或其他生成式AI工具來回答問題?
拿掉ChatGPT,你我剩下甚麼?! 🎯 小專題製作要點 ⇜ 鼓勵大家跳脫制式框架、製作稍具規模的專案,成為將來佐證自己程式能力的最佳履歷🏆 ❔這門課適合我?我是誤入叢林的小白兔嗎?! ✓ FYI: TIOBE調查
(2024年九月調查顯示C++維持第二熱門) ✓ FYI: Top
Programming Languages of 2023 (以上文章調查的方式恐不夠嚴謹,不同視角所見結果不盡相同,請同學毋需過度嚴肅看待;僅讓同學瞭解不同的程式語言的發展動態以及業界關注的面向) ✓ FYI: 工程師幹過最缺德的事:叫初學程式的朋友去學C++ ✓ FYI: Why is C++ still being used? C++ is not
only difficult to understand, … ✓ FYI: Why did Google choose C++ over C for
most of its code? ✓ FYI: Why did you quit using C++? ✓ FYI: Why
is C++ so complicated and Java so simple? ✓ FYI: Why
do universities teach C and C++, though they are regarded as the most
difficult languages … ? ✓ FYI: How
does it feel writing a big project in C versus C++? ✓ FYI: After
a decade of working with C++ what annoys you the most? |
|||
第1單元 |
⛽ 補充 ✓ 製作視窗表單程式,主視窗有PictureBox、Label、Button等元件,當按「請按我」鈕,程式蹦出另一小視窗,新視窗內有招呼語以及<是>、<否>及<取消>鈕(畫面)(程式碼) ✓ 擴充上述程式,當使用者按「請按我」鈕、再按新蹦出的小視窗中的<是>鈕,程式立即關閉;若按<否>鈕,主視窗顯示一動畫;若按<取消>鈕,主視窗呈現另一動畫(畫面)(程式碼) |
🌠安裝並使用編譯環境 |
||
第2單元 |
⛽ 補充 ✓ main()非得回傳0不可嗎?當然不,可設為回傳其他值,以利作業系統得知使用者程式執行過程中是否遭遇狀況 (範例) |
|
||
第3單元 |
🎯 流程控制 🎯 其他應知:argc、argv[]、Sleep()、stringstream、輸出控制字元的使用
(程式碼) ⛽ 補充 ✓ 跑碼表(二版):擴充一版的跑碼表程式,改以陣列、kbhit()函數實作 ✓ 多彩文字:使用SetConsoleTextAttribute()重設外顯文字的顏色,讓畫面更活潑 ✓ 游標控制:gotoxy()應用例(螢幕座標系)、程式選單的實作 ✓ 路障地圖:按←↑↓→方向鍵控制游標移動;按Ctrl+方向鍵,控制游標,將於游標所在位置塗色;按Alt+方向鍵,除了控制游標行進之外,將清除塗色。按<Enter>鍵結束程式,程式紀錄螢幕哪些位置有障礙、哪些為可通行的區域 ✓ 播放音效:PlaySound()、mciSendString()、Beep()函式 ✓ 一閃一閃亮晶晶:程式啟動之初產生音效,取得主控台視窗大小之後,開始利用rand()產生可能的(x,y)座標,透過gotoxy()函式依座標位置於螢幕顯示‘*’,一段時間後消失,如此重複,直至使用者按<Esc>鍵結束 ✓ 貪吃蛇初探:擴充上述程式,由方向鍵控制產生‘*’的位置,使用者以方向鍵操控蛇頭移動方式;每前進一格即+1分,但若碰觸到蛇身任一部分則-10分並發出“嗶”聲(使用Beep(1700,25)指令實現)。一旦得分呈現負值,程式結束 ✓ 視窗組態:SMALL_RECT設置主控台視窗的大小,以SetConsoleTitle()設定標題列、以SetCursorVisible()改變游標大小甚或隱藏、設定文字顯示的前景與背景顏色,再以一個互動小遊戲作結尾 ✓ 判讀螢幕游標所在位置的字元內容:於螢幕(0,0)至(79,9)的矩形區域內任意產生字元,再以ReadConsoleOutput()函式讀取每個位置的內容,並將其顯示於螢幕底部的空間內 ✓ 滑鼠操控:ReadConsoleInput()函式判讀鍵盤或滑鼠產生何種事件;一版程式接受使用者按鍵盤任意鍵或移動滑鼠,顯示裝置所產生的事件次數,同時顯示滑鼠當下位置座標;二版擴充一版程式,讓使用者於主控台螢幕任一處以滑鼠點擊以顯示"Hello"招呼語,滑鼠點擊螢幕第一列的'X'字元可清除螢幕,按鍵盤<Esc>鍵則立即結束程式;三版程式為二版程式之擴充,若滑鼠點擊位置已存在文字串,則清除該段文字,否則新增"Hello"招呼語 ✓ 顯示大標題造型字:FIGlet、cowsay程式 (下載、使用方式、擴充字型) ✓ 打磚塊小遊戲(單執行緒版本、多執行緒版本I、多執行緒版本II) |
📖 複習sqrt()、pow()、log()、log10()、exp()、floor()、ceil()、rand()等函數的用法 |
||
第4單元 |
🎯 指標的應用 🎯 STL (Standard Template Library)處理資料結構:以stack為例、以vector為例、以list為例、以set為例(含lambda函數並利用pair型態實作類似Python
dictionary的功能)、以array為例 ⛽ 補充 ✓ 排序法的效能:隨機產生100000個亂數,檢視「氣泡排序」、「計數排序」與C++函式庫內建的排序法的執行時間差異(排序需數十秒,請耐心等候) ✓ 結構與檔案存取:自訂"學生"資料結構型態,以檔案存取的方式把資料讀入陣列,陣列大小由資料的實際筆數決定,再以「氣泡排序」法依平均成績進行排序,隨後把結果顯示於螢幕 ✓ 存取檔案使其同時作輸入與輸出用途:範例程式 ✓ 使用strncpy()展示「緩衝區溢位」攻擊(buffer
overflow attack):示意程式 ✓ 遊戲啟動之載入畫面:讀取圖案文字檔並控制顯示速度,達到動畫效果(範例、另例) ✓ 使用dirent.h、opendir()、readdir():讀取指定路徑的目錄結構並輸出該目錄內所有檔案之資訊 (一版、二版、三版);一版為陽春版,若目錄內含子目錄,僅標記子目錄但不處理;二版與三版的功能相同,均以遞迴的方式處理子目錄內的所有檔案,僅輸出的方式有別,加上適當內縮以利得知子目錄位於第幾層 ✓ 目錄+binary檔案模式處理:針對給定路徑的檔案夾內所有資料進行加密保護,加解密的金鑰由使用者指定 ✓ 指標+陣列+串列的統合運用:保留串列內原始資料順位的排序機制,待排序資料不需儲存在陣列空間 ✓ Command-line interpreter:「命令提示字元」程式製作、多執行緒版本 ✓ 打字練習程式:隨機挑選一句英諺格言顯示於螢幕,讓使用者在有限的時間內繕打文句內的字,打錯的位置將被標記,完成之後顯示打字的正確率(一版、二版改良一版的限制、改從檔案提取格言,延展性較佳) ✓ 快速更新網頁檔案內容:把.html檔案內嵌的特定網址視為字串更新為另一網址,以利移植至另一伺服器(更新原課程網頁內的所有超連結以確保在新伺服器能存取新網址之資源) (一版、二版改良一版,改以string型別實作,程式碼更加精簡) ✓ 指向整個陣列的指標:*(&arrayName+1)-arrayName可用於判讀陣列元素個數(範例程式);若是多維陣列,仍可依此方式得知元素個數嗎?(範例) |
|
||
第5單元 |
🎯 函式 🎯 函式進階 🎯 其他應知:讀取機器時間所用函式time()、localtime()、ctime()、_strtime()、_strdate()、strftime()等(一版、二版、三版,若時間有限,建議檢視標準語法的第三版即可) 👍顏少于學長自製小專題:黑白棋(Othello)遊戲,以網頁呈現,有網路連結即可親近,超越單機運作的限制,操作介面友善,內有多個巧思有趣的設計。可二人互玩、單獨與電腦對戰或旁觀電腦互下棋子的過程。電腦端以「蒙地卡羅樹搜尋」演算法實作(它為2016年擊敗世界棋王李世乭的AlphaGo所用的基礎核心算法),屬於人工智慧經典領域的技術。C++終端機版本完成後,作者認為仍有許多改善空間,於是繼續改良成網路版,改以網頁語言與JavaScript作為前端製作使用者操作介面,以C++程式負責後端運算並回傳下子建議,流露持續精進的個人特質,打造更完整的專案成果,使用者享有更全面的優質體驗 (另註) ⛽ 補充 ✓ 善用外部程式:讀取系統時間再以system()分別呼叫FIGlet與cowsay顯示當下時刻 ✓ 定時鬧鈴:程式自動讀取機器時間並讓使用者輸入鬧鈴時刻,輸入格式為hh:mm:ss包含冒號‘:’
(例如12:25:35),之後程式以FIGlet自動顯示當下時間,迨關鍵時刻一到即發出聲音作為提醒 ✓ 辭彙統計:定義成對的資料(pair)為資料結構元素,使用STL技巧紀錄整篇文章每一個英文辭彙內容與對應的出現次數,待分析的文檔名稱由鍵盤指定,程式將由高至低顯示統計結果(vector版、list版、set版、測試文字檔) ✓ 快速選擇法(Quickselect):隨機產生若干筆三位數,讓使用者指定顯示第k小的數字,程式即依需求呈現運算過程並輸出最後結果 ✓ Weekday換算:使用者輸入年月日數字(例如2024 9 16),即顯示該日期為星期幾 ✓ 月曆:擴充上述程式,只需從鍵盤輸入年份與月份數字,即顯示該月份月曆。程式碼定義findWeekday()函式,該函式接受日期作為輸入參數(參數的形式可自行設計)並回傳一個整數代表星期幾。另定義showCalendar()函式,輸入參數也可自行設計,該函式功能為於螢幕顯示月曆內容 ✓ 年曆:再擴充上述程式,只需輸入年份數字,隨即顯示該年年曆 ✓ 新版年曆:再擴充上述程式,偵測使用者若未輸入任何數字,亦即應輸入年份之際卻逕按<Enter>鍵,程式將自動顯示系統時間所在年份之整年年曆 ✓ 類“雷電”小遊戲:鍵盤控制+記憶體映射(memory-mapped)螢幕(快速)顯示,避免反覆的gotoxy()實作程式碼造成畫面頻繁閃爍的不便;按方向鍵控制太空船的運動,避免被隕石擊中,按Space鍵發射火炮擊碎前方來石 ✓ 接啤酒小遊戲:三個酒保分別把啤酒遞給吧檯盡頭的客人,啤酒滑動的速度不一。酒客利用鍵盤的上或下方向鍵控制該去迎接哪一個吧檯的酒。當接到第六杯酒,程式結束,並顯示漏接率 ✓ 擴充上述的「接啤酒小遊戲」,使之能應付至多6個吧檯的客人,按Space鍵暫停、按Esc鍵立即中止程式 ✓「傳址呼叫」(pass by
address)改為「傳參考呼叫」(pass by
reference)的方式傳遞陣列:範例程式 |
⛽ 本單元練習用程式碼 |
||
實務應用 |
補充:網路傳輸實驗—字串處理在網路與單晶片程式的應用 |
⛽ 本單元練習用程式碼 |
||
第6單元 |
🎯 視窗應用程式基礎 ⛽ 補充 ✓ Text-to-speech初探:使用System.Speech套件讓程式把RichTextBox物件中的文字唸出聲音,測試中文、數字、英文、德文、日文語句,檢視套件的能力(參考教學) ✓ 激動的小鬧鐘:程式讀取當下的機器時間,隨後開始以秒為單位自動計時,容許使用者隨時設定或解除鬧鈴,狀態於視窗的標題列顯示;當鬧鈴時刻來到,視窗畫面快速左右晃動十次以為提醒 ✓ 運動的雲寶寶:運用Button、PictureBox、Timer並搭配ProgressBar元件實作雲寶寶圖案在視窗內移動,迨ProgressBar進行到100%,程式自動關閉 ✓ 來回穿梭的彩色束:彩色束以Label物件實作,來回往返變化顏色,營造類似開機畫面的效果(一版、二版) ✓ 運動的小方磚:以Label物件實作二個小方磚於視窗內進行獨立線性運動,啟始速度不同,碰觸到邊界或相互碰撞時將依物理學的方式反彈 ✓ 選擇可愛囝仔的圖片尺寸:展示NumericUpDown物件的簡易用法,選擇0—300之間的數值、動態調整呈現的圖片尺寸,視窗將隨著圖片變大而自動變大 ✓ 滑鼠與鍵盤事件處理:視窗呈現依epitrochoid曲線軌跡飛行的飛碟,圖像本身為gif動畫,加入DoubleBuffered 指令讓動畫變換位置過程順暢而不殘影(一版暖身,二版加入射擊的功能,按鍵盤空白鍵可發射子彈,若擊中飛碟將使視窗快速晃動若干次) ✓ 雲科拉霸機:按鈕啟動水果盤轉動(Label+ImageList版、PictureBox+ImageList實作版暖身,二種版本均模擬轉動漸停的行為);二版捨棄按鈕,改以滑鼠單擊視窗啟動三個水果同時轉動的畫面,滑鼠雙擊即令畫面暫停,程式隨後判定槓龜或Bingo ✓ 二圓相交決定弧長程式:就大小兩個圓相交所決定的弧而言,小圓上的弧大於大圓上的弧長,為什麼?半徑r>=l的圓皆可在圓內找到長為2l的弦,此弦對應的弧長f(r)=2r*sin^{-1}(l/r)為遞減函數,以繪圖的形式呈現 (執行畫面、講義) ✓ RC濾波器的輸出波形:RC電路有許多應用,「脈波響應」(pulse response)關心不同的信號輸入形式與輸出電壓之間的關係。若輸入為電壓固定的方波,可以圖像的方式檢視方波脈寬與時間常數影響輸出電壓的行為,觀察電路充放電如何實現濾波器的特性 (執行畫面、講義) |
|
||
第7單元 |
🎯 類別與物件
🎯 C++內建複數類別
(內含傅立葉轉換之應用例) ⛽ 補充 ✓ 貪吃蛇(暖身):創建32列´120行的螢幕空間,讓使用者從鍵盤輸入蛇身長,隨後即在該空間內依使用者按←↑↓→方向鍵控制蛇的移動行為 ✓ 二隻貪吃蛇:擴充上述程式,一隻蛇由使用者操控移動,另一隻則由程式決定運動方向,但恆朝向第一隻蛇位置前進。當第二隻蛇頭部碰觸到第一隻蛇,程式隨即結束 ✓ 蛇與星星:以隨機的方式在螢幕任一位置顯示‘*’,使用者利用方向鍵控制蛇的移動、避免被星星擊中。一旦被擊中三次,程式顯示這隻可憐的小生物嗚呼哀哉,隨即結束執行 ✓ n隻貪吃蛇:改以類別與物件的機制實作 ✓ 指標與結構的整合運用:以貪吃蛇為例:從命令提示列執行該程式或由鍵盤指定蛇數量(至多20),程式隨即在螢幕上以隨機的方式產生蛇的位置之後,每支蛇開始獨立運動,直到有任何一隻蛇碰觸到螢幕中點才終止程式 ✓「鳥兒上飛」小遊戲:自訂類別定義屬性與飛行的行為並創建A、B二鳥物件。程式啟動之後,A、B二鳥開始受到重力的牽引,須努力拍打翅膀才能避免墜地。努力按鍵盤任意鍵為A鳥加油;按鍵愈快,A鳥將飛得愈來愈高。努力移動滑鼠為B鳥加油;滑鼠移動得愈快,B鳥將飛得愈來愈高;率先抵達天空之頂者為勝(一版、二版加入程式啟動畫面、讀取ASCII圖案檔) |
⛽ 本單元練習用程式碼 |
||
第8單元 |
🎯 繼承、多型、樣版 ✓ “Shuffle and Deal
Cards”程式碼、可比較手牌大小之擴充版 ✓ 動畫圖解「洗牌發牌」範例程式運行過程 (解壓縮後執行Poker\bin\Debug\Poker.exe啟動)(本圖解由老師另以Visual Basic.NET撰寫,希助益大家理解這個範例的運作精神,然專案並非以C++開發,在此仍提供完整程式碼供有志鑽研VB的同學可以Visual Studio 2022檢視完整內容) |
⛽ 本單元範例程式碼 |
||
第9單元 |
🎯補充:網路通訊應用 ✓ cURL的使用:可用於存取網路伺服器資料的好用套件 (下載) 👍 ✓ cURL應用例:system()+cURL發LINE訊息通知特定使用者 ✓ 字串內的關鍵詞剖析:strtok()
vs. strtok_r()的差異 ✓ 指標、檔案、網路與curl的整合運用:取得TED演講字幕檔、英中文並陳的方法 |
|
||
參考資源 ① C/C++ Reference (可查閱C/C++指令用法的技術論壇,有豐富範例) ② 常見程式演算筆記 ③ How to Learn C++
Programming ④ Why
CS students must learn C++ as their main programming language ⑥ C程式設計網頁
(紀老師建置的C語言教學網頁,內補充多個專案練習程式,同學可改以C++實作看看) ⑧ 為什麼成為一名工程師這麼難?
(by Jewel) ⑨ 搞笑談軟工:軟體開發與XX的關係
(by Teddy Chen) ⑩ 科技如何綁架你的心智
(與課程無關,但藉此文讓同學反思是否已過度使用智慧型手機而不自知) |
有任何意見或建議,請隨時與老師聯絡;辦公室EL303;分機4245