# **程式初探** by Q3goldlegeng吉吉 & 東東 --- ## 程式可以做甚麼? ---- ## 什麼是程式? 簡單來說,程式是一種與電腦溝通的方式,透過編寫指令來讓電腦執行我們想要的功能。 ---- ## 程式可以做到許多事情: * 資料處理與分析:處理大量資料,進行統計分析 * 系統控制:控制硬體設備,如嵌入式系統、韌體開發 * 軟體開發:製作應用程式、遊戲、網站 * 自動化工作:讓重複性的工作自動完成 * 人工智慧應用:機器學習、圖像識別等 --- ## 程式有幾種? ---- 各種程式語言 ![image](https://hackmd.io/_uploads/ByMR9kvixl.png) ---- 熱門程度 ![HKPS-News-48-tiobe-2025-april-1536x1005](https://hackmd.io/_uploads/ryHl2yPixg.png) ---- 原神:Unity 引擎 + C#,搭配 C++(每秒要處理數百萬個浮點運算)、Lua 傳說對決:C++ 荒野亂鬥:C++ Minecraft:Java,C++ Chrome 瀏覽器:C++,JavaScript YouTube 推薦系統:Python,C++ Netflix 內容推薦:Python,Scala Unity 遊戲引擎:C#,底層 C++ ---- ## 💡 各程式語言擅長的任務 **C++**:遊戲引擎、瀏覽器、系統軟體、需要極致效能的地方 **C#**:Unity 遊戲開發、Windows 軟體、企業應用程式 **Java**:企業級系統、Android App、大型網站後端 **Python**:人工智慧、機器學習、資料分析、自動化腳本 特色:語法超簡單,學起來最輕鬆 **JavaScript**:網站前端、手機 App、伺服器 **Swift/Kotlin**:手機 App 專用 📱Swift 做 iPhone App,Kotlin 做 Android App --- 為甚麼要學C++?C++由來? ---- * 基礎:C++ 是最基本和熱門語言之一,掌握C++後學習其他語言會更容易 * 效能優越:執行效率高,接近硬體底層,用於系統開發 * 資工系必修:幾乎所有資工系都將C++程式設計列為必修課程 * 物件導向概念:C++具備完整的OOP(物件導向程式設計)觀念 ---- ## 程式進化史 電腦最早只能讀懂「**機器碼**」的0與1,後來人們發明「**組合語言**」用英文縮寫代表指令,再發明「**高階語言**」讓程式更好讀、好寫;其中C在1970年代為系統開發奠定基礎 俄羅斯方塊 超級瑪利歐最初都是用組合語言寫成 ![下載 (2)](https://hackmd.io/_uploads/rkFEbxDigx.png) ---- ## C++之父 C++語言是由一位叫比雅尼·史特勞斯特魯普(Bjarne Stroustrup)的丹麥科學家在1979年開始發明,而他想要創造,創造一個既快速又好用的程式語言。 ~~膜拜電神~~ ![BjarneStroustrup](https://hackmd.io/_uploads/H1r0bgwilg.jpg) ---- ## C++的發展過程 1979年:開始研發,最初叫做「C with Classes」(帶有類別的C語言) 1983年:正式改名為「C++」,其中「++」是C語言裡面代表「加1」的符號,象徵著比C語言更進步的意思 1998年:成為國際標準 ---- C++ 就像是C語言的「升級版」,讓程式設計師可以寫出更強大、更容易管理的程式,而且執行速度還是很快。現在C++已經發展了40多年,是世界上最重要的程式語言之一。 --- **要在哪裡寫程式?** ---- 基本上在哪裡寫程式都可以,~~例如記事本或word~~,不過專業程序員的都使用整合開發環境(IDE) [Code::Blocks](https://www.codeblocks.org/downloads/) [Dev-C++](https://www.bloodshed.net/) [Visual Studio Code](https://code.visualstudio.com/download) .... 偷懶線上編譯器 [online-compiler](https://www.programiz.com/cpp-programming/online-compiler/) ---- 用cmd執行c++ 蟀! [安裝g++(GNU C++ Compiler)](https://hackmd.io/@ckefgisc-28th/compiler_install) 編譯`g++ hello.cpp -o hello.exe` 執行`hello` --- ## Judge網站 ---- 就是大家~~刷題~~練習的地方,你可以上傳程式、由系統自動批改並回覆結果 ---- ## 常見練習judge [MDjudge](http://mdcpp.mingdao.edu.tw/):明道自己的judge,請多支持 ~~不過只能在校內使用hh~~ [zerojudge](https://zerojudge.tw/):有很多題目,題目難度浮動很大,你解到一定程度也可以出題,俗稱"水題庫" [TIOJ](https://tioj.ck.tp.edu.tw/):建中的judge,有很多很難的題目 [tcirc](https://judge.tcirc.tw/):一中的judge,上面有AP325的完整題庫 [codeforces](https://codeforces.com/):每週都有比賽,有積分制,題目只有俄文或是英文 [ATcoder](https://atcoder.jp/):每週都有比賽,不過是日本的網站,題目只有日文或是英文 [CSES](https://cses.fi/problemset/):芬蘭的網站,題目只有芬蘭文或是英文,可以順便練英文能力 [Leetcode](https://leetcode.com/):許多工程師面試前刷題的網站 ---- ## judge送出後結果 <font color="#05a625">AC(Accepted)</font>:通過 <font color="#ff0000">WA(Wrong Answer)</font>:答案錯誤 <font color="#002aff">CE(Compile Error)</font>:編譯錯誤(先編譯) <font color ="#ffea00">RE(Runtime Error)</font>:執行時錯誤(陣列越界、除以0…) <font color ="##6b6563">TLE(Time Limit Exceeded)</font>:執行超過時間限制 <font color ="#7d3511">MLE(Memory Limit Exceeded):</font>程序執行超過記憶體限制 --- ## Code::Blocks使用指南 ---- 前往 [Code::Blocks](https://www.codeblocks.org/downloads/binaries/) 官網 下載 codeblocks-25.03mingw-setup.exe 執行安裝程式,一直「下一步」即可 安裝完成後,打開 Code::Blocks 點選 File > New > Project 選擇 Console application → 點 Go 選擇 C++ → Next 專案名稱輸入 HelloWorld,選擇一個資料夾存放 → Next → Finish 左邊 Projects 視窗中,展開 Sources,找到 main.cpp --- ## 第一支程式! ---- [MDjudge](http://mdcpp.mingdao.edu.tw/) ---- ```cpp #include<iostream> using namespace std; // 命名空間 int main(){ cout << "Hello World!" << endl; return 0; } ``` --- ## 基本程式架構 ---- ```cpp #include <iostream> using namespace std; int main(){ cout << "Hello World!";// 輸出 return 0; } ``` ---- * 程式是由上往下執行 * 每打完一行程式必須用 <font color="#ff0000">;</font> 作結尾 * 記得縮排,按tab鍵就能縮排 * //是註記,給人看的,電腦不會執行 * 將程式碼放到{}中 * 學會排版才看得舒服 [學長的C++ 程式碼基本結構](https://github.com/banahaker/CPP-FROM-ZERO/tree/main/CH.3%20%E5%9F%BA%E7%A4%8E%E6%A6%82%E5%BF%B5) ---- ### 標頭檔 ---- 標頭檔是什麼? ~~能吃嗎?~~ ---- 標頭檔就是倉庫 裡面有各種設定好的函式可以取出來使用 而每個不同的倉庫有不同的名子 裡面裝的東西也不一樣 ---- ```cpp #include <iostream> //標準輸入輸出:cin、cout、cerr #include <fstream> //檔案 I/O:ifstreamofstream、fstream #include <cmath> //各種數學計算 #include <string> //各種文字的儲存 #include <vector> //動態陣列容器 #include <array> //固定長度陣列容器 #include <deque> //雙端佇列 #include <list> //雙向鏈結串列 #include <set> //排序集合:set、multiset(紅黑樹) #include <map> //排序映射:map、multimap(紅黑樹) #include <unordered_set> //雜湊集合(平均 O(1)) #include <unordered_map> //雜湊映射(平均 O(1)) #include <stack> //容器配接器:堆疊(LIFO) #include <queue> //容器配接器:佇列(FIFO)、priority_queue #include <algorithm> //通用演算法:sort、find、unique、partition .... ``` 除了這些還有好多好多 ---- 阿怎麼辦 難道我每用一個新的函式就要背一個標頭檔嗎? ---- 這時候我們的救星出現了 ---- ![609699a0c1653Mtf](https://hackmd.io/_uploads/BybGmWPjlg.gif) ---- 萬用標頭檔 ```cpp #include<bits/stdc++.h> ``` 幾乎包含了競程要用的所有含式庫 (請確保實際編譯器使用的是 g++) ---- ### 命名空間 ```cpp using namespace std; ``` ---- 正常來說 大部分的程式都有前綴 ```cpp std::cin >> a; std::cout << a; ``` 很麻煩對吧 ---- ```cpp using namespace std; ``` 這會拯救我們於水火之中 ~~至於為甚麼會陷入水火暫且不表~~ ---- ### 主函式 ```cpp int main(){ } ``` --- ## 基本輸入、輸出 ---- ```cpp #include<iostream> using namespace std; int main(){ int a; cin >> a; cout << a; return 0; } ``` cin念作"c in" << 為輸入運算子 cout念作"c out" << 為輸出運算子 ---- ### 換行 ```cpp #include <iostream> using namespace std; int main(){ cout << "Hello World!!\n"; cout << "Hello World!!" << "\n";//'\n'也可以 cout << "Hello World!!" << endl; // 不須用括號 return 0; } ``` ---- 練習時間 [zerojudge a006. 一元二次方程式](https://zerojudge.tw/ShowProblem?problemid=a006) --- ## 變數 ---- ### 甚麼是變數? ---- 以名稱標識的一塊記憶體,用來保存資料;值可變、型態不可變 可以把他想成一個容器,每個盒子的形狀都不一樣,裝的東西也不同 ![images (2)](https://hackmd.io/_uploads/B14lGrdixe.jpg)![image](https://hackmd.io/_uploads/HkkCGUdogl.png) ---- 基本語法:型態 名稱 = 初始值 **=** 是賦值符號,左邊放接受資料的變數,右邊放賦予的值 ```cpp #include <iostream> using namespace std; int main() { int a = 1; int b , c = 3; // b 未初始化;c=2(b c 皆為 int) b = 2; // 宣告後再給 b 初值 cout << a << " " << b << " " << c << endl; // 1 2 3 c = 487; //重新賦值 cout << c << endl;// 487 c = a;// cout << c << endl;// 1 return 0; } ``` ---- 練習一下 [zerojudge a001. 哈囉](https://zerojudge.tw/ShowProblem?problemid=a001) [a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) ---- ## 常見資料型態 整數int:-2³¹ 至2³¹-1 浮點數float(4bytes), double(8bytes):用於小數與科學記號 字元 char:使用單引號包住一個字元(如 'A') 布林 bool:值為 true/false isGrounded 字串 std::string: 存一行字 "discoverYourSelf" ---- 整數溢位(overflow) ```cpp #include <iostream> using namespace std; int main() { int x = 2147483647; // INT_MAX cout << x << endl; x += 1; // 溢位 cout << x << endl; // 變成負數! } ``` Minecraft Bedrock世界邊界 超過這個範圍(±2,147,483,647)就會出現各種問題,例如: 世界生成錯誤 生物無法生成 方塊方位出現奇怪行為 ---- ## 命名規則 * 不能以數字開頭 例如:1s, 2p * 不能與保留字(關鍵字)同名,因為他們都有既定意義 例如if, int, class, namespace * 只能使用英文字母、數字、底線 _;其他特殊符號如 @ # $ % - / ! ? 都不允許 * 大小寫有別 score不等於Score * 避免無意義名稱 a, b, c, x1, x2 ~~合法但沒病~~ ex.playerHealth ---- [zerojudge a001. 哈囉](https://zerojudge.tw/ShowProblem?problemid=a001) ---- ### char ---- char顧名思義是一個字元,需要用''包起來 宣告方法如下 ```cpp #include<iostream> using namespace std; int main() { // 基本字元 char c = 'X'; cout << "字元 c: " << c << endl; // 空白字元 char s1 = ' '; char s2 = ' '; cout << "半形空白: '" << s1 << "'" << endl; cout << "全形空白: '" << s << "'" << endl; // 直接使用 ASCII 數字轉換 char n1 = (char)65; char n2 = 65; cout << n1 << n2 << endl; // 換行符 char newline = '\n'; cout << "換行符: " << newline << "這是在新的一行" << endl; //跳脫字元 char a = '\''; // 存儲字元單引號 char b = '\\'; // 存儲反斜線 char c = '\n'; // 存儲換行符 return 0; } } ``` ---- ascii code 字元編碼 ![image](https://hackmd.io/_uploads/rJFRurFoel.png) ---- 想一想 輸出多少 cout << 'A'+'1' << endl << 'A'+1 << endl<< char(87); 寫一個可以把輸入的小寫字母變大寫的程式 進階題[a009. 解碼器](https://zerojudge.tw/ShowProblem?problemid=a009) ---- ### string ---- 是由許多char構成 宣告需要用 "" 要引入標頭檔 #include <string> ```cpp #include<iostream> using namespace std; int main(){ string str1="Hello"; cout<<st1; } ``` ---- ### 字串操作 可以使用 + 運算子將字串串接 ```cpp string first = "Hello"; string second = "World"; string result = first + " " + second; cout << result << endl; // Hello World ``` ---- ### 字串長度與是否為空 size() 或 length():回傳字串長度 empty():檢查字串是否為空 ``` string str = "Hello"; cout << "Length: " << str.size() << endl; cout << "Is empty? " << str.empty() << endl; ``` empty() 會回傳 true 或 false ---- ### 字串大約等於char陣列 把char陣列到string ``` string name = "Q3goldlegeng"; char str[] = "Daniel"; name = str; // 將 char 陣列指派給 string cout << name << endl; // 輸出 Daniel ``` 但不可以反過來,把string到char陣列 ``` string name = "Q3goldlegeng"; char str[] = "Daniel"; str = name; //error //正確作法 #include <cstring> string name = "Q3goldlegeng"; char str2[20];//足夠大 strcpy(str, name.c_str()); // 將 string 內容複製到 char 陣列 cout << str << endl; ``` (有關於陣列是甚麼 我們以後會專門做一個影片給大家講解的) ---- ## 讀取string 最簡單用 **cin** (遇到空白就停止) ```cpp string name; cin >> name; cout << "Hello " << name << endl; ``` ---- ### getline 讀整行,包括空白 ``` #include <iostream> #include <string> using namespace std; int main() { string name; cout << "Enter your full name: "; getline(cin, name); // 讀整行 cout << "Hello " << name << endl; return 0; } ``` ---- ## 變數README 區塊 {} 內宣告的變數只在該區塊有效;離開區塊自動釋放(也就是在區塊外就不再有效) 全域變數在整個程式存活並可在檔案範圍存取(需留意命名衝突與可讀性) 使用 const 型態 名稱 = 值; 定義不可被修改的常數,以保護不應變動的資料 超出型態可表示的範圍會發生溢位,導致不可預期的值(如 int 正溢位繞回負數) --- ## 算術運算子 ---- +、-、*、/、%(取餘數) 是不是跟數學一樣 ~~但這樣講好像不會比較有親近感~~ ---- ```cpp #include <iostream> using namespace std; int main(){ int a=5,b=3; cout<< a+b <<endl;//8 cout<< a-b <<endl;//2 cout<< a*b <<endl;//15 cout<< a/b <<endl;//1 cout<< a%b <<endl;//2 cout << (4 + 2) * 4 + 7<<endl;//括號優先,然後先乘*除/後加+減- 輸出 31 return 0; } ``` ---- 特別注意/是無條件捨去小數 ```cpp #include<iostream> using namespace std; int main(){ int a = 4/3; cout << a << endl;//1 double b = 4.0/3.0; cout << b << endl;//1.33333 return 0; } ``` ---- 練習時間 [d049. 中華民國萬歲](https://zerojudge.tw/ShowProblem?problemid=d049) [a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) 計算BMI的程式 ---- 計算BMI的程式 ```cpp #include <iostream> using namespace std; int main() { double weight, height, bmi; // 輸入體重(公斤)和身高(公尺) cout << "請輸入您的體重(公斤): "; cin >> weight; cout << "請輸入您的身高(公尺): "; cin >> height; // 計算BMI bmi = weight / (height * height); cout << "您的BMI是: " << bmi << endl; return 0; } ``` --- # 下課881
{"description":"程式初探","title":"1.程式初探","contributors":"[{\"id\":\"a8c05b3e-3d5f-46fb-979d-2545bb145f97\",\"add\":12322,\"del\":2489,\"latestUpdatedAt\":1759320940981},{\"id\":\"c5992744-4068-4fb1-9494-4eee3d2d74df\",\"add\":777,\"del\":35,\"latestUpdatedAt\":1758385805921},{\"id\":\"a2ea5a05-67ec-4ef6-b959-e2966fcc8d31\",\"add\":6,\"del\":22,\"latestUpdatedAt\":1769573449640}]"}
    429 views
   Owned this note