# **程式初探**
by Q3goldlegeng吉吉 & 東東
---
## 程式可以做甚麼?
----
## 什麼是程式?
簡單來說,程式是一種與電腦溝通的方式,透過編寫指令來讓電腦執行我們想要的功能。
----
## 程式可以做到許多事情:
* 資料處理與分析:處理大量資料,進行統計分析
* 系統控制:控制硬體設備,如嵌入式系統、韌體開發
* 軟體開發:製作應用程式、遊戲、網站
* 自動化工作:讓重複性的工作自動完成
* 人工智慧應用:機器學習、圖像識別等
---
## 程式有幾種?
----
各種程式語言

----
熱門程度

----
原神: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年代為系統開發奠定基礎
俄羅斯方塊 超級瑪利歐最初都是用組合語言寫成

----
## C++之父
C++語言是由一位叫比雅尼·史特勞斯特魯普(Bjarne Stroustrup)的丹麥科學家在1979年開始發明,而他想要創造,創造一個既快速又好用的程式語言。
~~膜拜電神~~

----
## 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
....
```
除了這些還有好多好多
----
阿怎麼辦
難道我每用一個新的函式就要背一個標頭檔嗎?
----
這時候我們的救星出現了
----

----
萬用標頭檔
```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)
---
## 變數
----
### 甚麼是變數?
----
以名稱標識的一塊記憶體,用來保存資料;值可變、型態不可變
可以把他想成一個容器,每個盒子的形狀都不一樣,裝的東西也不同

----
基本語法:型態 名稱 = 初始值
**=** 是賦值符號,左邊放接受資料的變數,右邊放賦予的值
```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 字元編碼

----
想一想 輸出多少
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}]"}