C++[0]
基礎語法、陣列、迴圈
Claire
- 北資一六社長 x 網管
- 競程是舊愛 而且我很爛
- 新歡大概是資安
- 但我都只打水題
樹枝爆肝仔
Who am I

- 簡報英文很多因為 slides.com 中文很醜
- 有些東西講義上比較詳細
Before we start...
Index
1
Intro
3
Hello World!
5
Input & Output
Setup
2
Variables & Data Types
4
Operators
6
7
Arrays & Vectors
Conditionals
8
9
Loops
Practices
10
Intro
Programming Languages
Programming Languages
程式語言(英語:programming language)是用來表達電腦程式的電腦語言。它是一套標準化的交流技巧,一種能夠讓程式設計師準確地定義電腦所需資料的語言,以向電腦發出指令並精確地定義不同情況下應當採取的行動。 --維基百科
Programming Languages
- 程式語言就是人類用來命令電腦做事情所用的語言
- 機器語言:
- 以二進位直接對電腦下指令
- 組合語言:
- 二進位好難寫 → 以文字代替二進位來表達指令
- 對應到機器語言
- 無法在不同處理器共通
Programming Languages
- 高階語言:
- 讓同一個程式在不同處理器運行
- 易讀性up
- 翻譯成機器語言時可以
- 編譯(Compille):執行前透過編譯器一次翻譯所有程式碼
- ex. C、C++、Java...
- 直譯(Interpret):執行時一邊翻譯一邊執行
- ex. Python、JavaScript、PHP...
- 編譯(Compille):執行前透過編譯器一次翻譯所有程式碼

Programming Languages

What is C++?
C v.s. C++
-
C
- 1970 年左右 D. Ritchie 和 K. Thompson 在貝爾實驗室開發出來的程式語言
- 由 B 語言演變而來,屬於編譯語言
- 具有高階語言的特性,也有接近組合語言的速度。
-
C++
- 也是在貝爾實驗室開發出來的
- 目的:打造一種具有物件導向的 C 語言
- C 語言寫的程式大部份都可以在 C++ 執行。
OOP
物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料、特性、程式碼與方法。物件則指的是類別(class)的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以訪問及經常修改物件相關連的資料。在物件導向程式程式設計裡,電腦程式會被設計成彼此相關的物件。 --維基百科
具有「物件(Objects)」概念的
程式語言設計模式
C++ 的用途
- 相對複雜的語言
- 能夠寫出具有底層硬體控制功能的程式
- 加入了物件導向等許多現今語言的特性
- 處理更加貼近使用者的程式
- ex. Windows、iOS、Chrome、Firefox、英雄聯盟
What is an Algorithm?
ALGO
" 由有限步驟所構成的集合,可以用於解決某一個特定的問題。 "
- 把西瓜做成一杯西瓜汁?
- 把西瓜剖半
- 挖出剛剛剖半的西瓜中的果肉並去籽
- 將經過 2. 處理的西瓜果肉放入果汁機
- 按下果汁機的啟動按鈕
- 將果汁機裡榨好的西瓜汁倒入一個杯子
- 電腦科學中,演算法就是為了解決特定問題而設計的一組明確、有限的運算規則或步驟。
What are Online Judges?
About OJs
線上解題系統
- 題目測試:提供各種演算法相關的題目,讓使用者撰寫程式解答
- 自動評測:使用測試數據來檢查程式的正確性與效能,並給予回饋
- 即時反饋:提交程式後,OJ 會迅速回報結果
Online Judges
- ZeroJudge:台灣的 OJ,電腦老師很喜歡
- TIOJ:建中資訊社維護
- ISCOJ:建北電資 OJ
- CSES:有很多演算法題目可以練習
- Codeforces:全球最大的 OJ,常常有比賽,在俄羅斯所以時間很陰間
- Atcoder:第二大 OJ,在日本
- NEOJ:台大資芽的 OJ
- LeetCode:收集軟體工程師面試考古題的 OJ
OJ Results

Setup
Setup

Compiler
編譯器(Compiler)
- 將某種程式語言寫成的原始碼轉換成電腦能解讀的語言
- IDE 不需安裝編譯器
- 文字編輯器安裝的方法:VSCode 的 C++ 安裝教學
程式開發軟體們
- Dev-C++:免費好用,不過它是一個比較古老的 IDE,連編譯器也是好幾年前的(不過前陣子好像有別的公司接手)
- Code::Blocks:真的很醜,但學校們很喜歡
- onlinegdb:除了他是線上這點很方便外完全沒道理用
- 等等
Hello World!
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 1 行:導入 <iostream> 這個標準函式庫
-
#include:可將函式庫導入程式 -
<iostream>:函式庫名稱,專門處理程式的輸入輸出
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}
第 2 行:使用標準函式庫
-
std:C++ 標準函式庫的代號(standard library) -
告訴電腦,我們想在程式中使用 C++ 標準函式庫
-
啊這個等等細講
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 3 行:空行
-
會被電腦自動跳過
-
目的是為了讓程式碼可讀性更高
-
不用不會怎麼樣只是可能會被覺得很醜
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 4 & 8 行:主函式
-
main 函式是 C++ 定義一個程式的起點
-
大括號
{}內就是 main 函式的內容 -
電腦執行的程式就要寫在這個大括號內
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 5 行:註解
-
//單行註解 /*多行
註解*/
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 6 行:Hello World!
-
cout:輸出 -
<<:把右邊的資料傳給 cout -
\n:跳脫字元,換行 -
一行程式結束後記得要加
;
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!" << endl;
return 0;
}第 6 行:Hello World!
-
cout:輸出 -
<<:把右邊的資料傳給 cout -
\n:跳脫字元,換行 -
一行程式結束後記得要加
; -
<< endl:也可以換行
Hello World!
#include <iostream>
using namespace std;
int main() {
// print Hello World!
cout << "Hello World!\n";
return 0;
}第 7 行:回傳
- 告訴電腦這個函式成功執行了
- 可有可無,因為編譯器會自動在結尾補上
return 0; return 0:正常退出return 1:異常退出
函式庫
- 函式庫中會有預先定義好的函式、類別和工具,可直接使用
iostream:輸入輸出algorithm:常用演算法cmath:數學函式庫- 萬用標頭檔:
bits/stdc++.h- 包含絕大部分會用到的函式庫
- 引入一大包東西雖然你可能只有用到一點點
- macOS 要用有點蠻煩 顯然我怕麻煩
- 等等我還是會講他們分別屬於什麼函式庫
命名空間
- 命名空間(namespace)是 C++ 提供的一種機制,用來避免名稱衝突
兩個 name 沒有區分開來,導致編譯錯誤
#include <iostream>
#include <string>
using namespace std;
string name = "C++";
string name = "Python";
int main() {
cout << name;
}不太重要
看看就好
命名空間
-
使用命名空間即可避免錯誤
-
但其實在寫程式時應該避免重複命名
#include <iostream>
#include <string>
using namespace std;
namespace A {
string name = "C++";
}
namespace B {
string name = "Python";
}
int main() {
cout << A::name << '\n'; //C++
cout << B::name; //Python
}不太重要
看看就好
namespace std
- C++ 標準函式庫的所有函式、類別(如
cout,cin,vector,string等)都定義在std命名空間內
未使用 using namespace std;
需要在 cout, endl 前加上 std::
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
}using namespace std; 會導致 std 內的所有函式和類別
變成全域可用,可能會與其他函式名稱衝突,
因此在大型專案中建議避免使用
\n v.s endl

Variables &
Data Types
Variables
變數
數值會改動的數
程式用來存放資料的空間
占有電腦的記憶體
執行的過程中可以對變數進行處理和運算
宣告格式:
- 宣告一個命名為 a 的整數(int)變數,其資料型態為 int
資料型態 變數名稱;#include <iostream>
using namespace std;
int main() {
int a;
}
Data Types

Variables
變數命名
-
需與變數內容相關
-
只能用大小寫字母、數字、_、$
-
數字不可作為變數名開頭
-
大小寫意義不同(為不同變數)
-
不可使用保留字
Reserved Keywords
保留字
-
給編譯器做特殊判斷用

Input & Output
Input & Output
- C++的輸入和輸出是使用
cin和cout來進行 - 使用它們的時候需要引入
<iostream>函式庫
輸入
- 讀到空白或換行會結束讀取
- 輸入多個值:
輸出
- 可輸出變數或是輸出一個值
- 輸出多個值:
cin >> 變數(已宣告過的);cin >> 變數 >> 變數;cout << 要輸出的物件;cout << 變數 << 變數;Input & Output
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s; // Hello World
cout << s; // Hello
string a, b;
cin >> a >> b; // Hello World
cout << a << '\n'; // Hello
cout << b << '\n'; // World
}
Input & Output
#include <iostream>
using namespace std;
int main() {
string s;
getline(cin, s);
cout << s;
}getline
- 讀取整行
getline(cin, 變數)Operators
Operators
運算子
- 對變數或數值做運算
指定運算子 =
- 先對
=右邊進行運算 - 將運算結果存入左邊
- 左邊要可以存值 ex. 變數
#include <iostream>
using namespace std;
int main() {
int x;
x = 2 + 1;
cout << x << '\n'; // 3
x = x + 1;
cout << x << '\n'; // 4,先計算右邊再存入左邊
}Operators
算術運算子
- 數學的運算符號
- 先乘除後加減
- 括號優先
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 3, c = 2; // 逗號左右可以分別賦值
cout << a + b << '\n'; // 8,加
cout << a - b << '\n'; // 2,減
cout << a * b << '\n'; // 15,乘
cout << a / b << '\n'; // 1,除
cout << a % b << '\n'; // 2,模除(取餘數)
cout << c + a * b << '\n'; // 17,先乘除後加減
cout << (c + a) * b << '\n'; // 21,括號內優先
}
Operators
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 3, c = 2; // 逗號左右可以分別賦值
cout << a + b << '\n'; // 8,加
cout << a - b << '\n'; // 2,減
cout << a * b << '\n'; // 15,乘
cout << a / b << '\n'; // 1,除
cout << a % b << '\n'; // 2,模除(取餘數)
cout << c + a * b << '\n'; // 17,先乘除後加減
cout << (c + a) * b << '\n'; // 21,括號內優先
}
5 / 3 = 1.66666...
但因為 a 跟 b 都是整數,對兩個整數做除法 / 時自動向下取整
Operators
#include <iostream>
using namespace std;
int main() {
int a = 1;
a += 1; // a = a + 1
cout << a << '\n'; // 2
a -= 2; // a = a - 2
cout << a << '\n'; // 0
}
Operators
#include <iostream>
using namespace std;
int main() {
int a = 0;
cout << ++a << '\n'; // 1,先加再用
cout << a++ << '\n'; // 1,先用
cout << a << '\n'; // 2,再加
cout << --a << '\n'; // 1,先減再用
cout << a-- << '\n'; // 1,先用
cout << a << '\n'; // 0,再減
}
遞增遞減
- 前置遞增遞減
++x/--x:加減之後的值 - 後置遞增遞減
x++/x--:加減之前的值
Operators
#include <iostream>
using namespace std;
int main() {
int a = 4, b = 7, c = 4;
cout << (a == b) << '\n'; // 0
cout << (a == c) << '\n'; // 1
cout << (a != b) << '\n'; // 1
cout << (a > b) << '\n'; // 0
cout << (a > c) << '\n'; // 0
cout << (a >= b) << '\n'; // 0
cout << (a >= c) << '\n'; // 1
cout << (a < b) << '\n'; // 1
cout << (a <= b) << '\n'; // 1
}
比較運算子
-
回傳 true(1) 或 false(0) 兩種結果
Operators
邏輯運算子
-
邏輯運算也只有 true(1) 或 false(0) 兩種結果
-
邏輯 AND
&&A、B皆為true時,A && B為true- 否則
A && B為false

Operators
-
邏輯 OR
||A、B皆為false時,A || B為false- 否則
A || B為true

-
邏輯 NOT
!A為true時,!A為false-
A為false時,!A為true
型別轉換
-
隱含型別轉換
- C++ 會自動做的轉換
- 選擇運算式中所有型別中儲存空間較大的型別
#include <iostream>
using namespace std;
int main() {
cout << 3 / 2 << endl; // 1
cout << 3 / 2.0 << endl; // 1.5
}
使用指定運算子 = 就會以指定運算子左邊的資料型別為準
#include <iostream>
using namespace std;
int main() {
int x;
x = 3 / 2.0;
cout << x << endl; // 1
}型別轉換
-
強制型別轉換
-
程式運算過程中對型別做強制的轉換
-
轉換格式:
-
#include <iostream>
using namespace std;
int main() {
int x = 3;
cout << (double)x / 2 << endl; //輸出 1.5
cout << (char)97 << endl; //輸出「a」, 97是字元'a'在ASCII碼中的編號
}
(轉換型別) 變數;
(轉換型別) 數值;
Arrays & Vectors
Array
陣列
- 多個相同資料型別的變數所組成
- 每個元素都是一個變數
- 陣列索引值(index)是從 0 開始(0-based)

- 陣列宣告格式:
- 用中括號
[]加上索引值 表示陣列的某個變數
資料型態 陣列名稱[陣列大小];資料型態 陣列名稱[] = {初始值1, 初始值2...};陣列名稱[索引值]Array
#include <iostream>
using namespace std;
int main() {
int a[5]; // 可儲存 5 個整數變數
int b[] = {1, 3, 4}; // 陣列中有 1, 3, 4 三個整數,長度為 3
cout << b[0] << ' ' << b[2] << '\n'; // 1 4
cout << b[3] << '\n'; // 噴錯,陣列 b 長度只有 3
a[] = {1, 2, 3, 4, 5};
cout << a[0] << '\n'; // 1
a[0] = 9;
cout << a[0] << '\n'; // 9
char c[10], d[2]; // 也可儲存其他資料型態
}
二維陣列
-
n x m 的陣列
-
陣列宣告格式:
資料型態 陣列名稱[n][m];資料型態 陣列名稱[][] = {{初始值1-1, 初始值1-2...},
{初始值2-1, 初始值2-2...},...};- a[n][m]:

Vector
#include <vector>- 動態陣列
- 跟陣列很像,但長度可改變
- 動態陣列宣告:
vector<資料型態> 動態陣列名稱;
vector<資料型態> 動態陣列名稱(陣列長度);
vector<資料型態> 動態陣列名稱(陣列長度, 所有元素預設值);- 二維動態陣列宣告:
vector<vector<資料型態>> 動態陣列名稱
vector<vector<資料型態>> 動態陣列名稱(陣列高度m)
vector<vector<資料型態>> 動態陣列名稱(陣列高度m,
vector<資料型態>(陣列長度n))
vector<vector<資料型態>> 動態陣列名稱(陣列高度m,
vector<資料型態>(陣列長度n, 所有元素預設值))Vector
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v, t, k;
v.push_back(1);
v.push_back(3);
cout << v[0] << ' ' << v[1] << '\n'; // 1 3
cin >> v[0]; // 2
cin >> v[1]; // 4
cout << v[0] << ' ' << v[1] << '\n'; // 2 4
vector<int> a(5, 0);
cout << a[0] << ' ' << a[3] << '\n'; // 0 0
a.pop_back();
cout << a.size() << '\n'; // 4
a.clear(); // 移除所有元素
a.empty(); // 1,回傳是否為空
t.resize(5);
cin >> t[4] >> t[3]; // 1 3
cout << t[3] << ' ' << t[4] << '\n'; // 3 1
k.assign(5, 0);
cout << k[0] << ' ' << k[2] << '\n'; // 0 0
}Conditionals
if
- 使用格式:
- 小括號用於放判斷式
- 判斷式運算結果為 true 就執行大括號內的程式碼
if (判斷條件) {
判斷條件成立時執行的程式;
}#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
if (x > 100) {
cout << x << "大於100" << endl;
}
}
else if
- 使用格式:
- 前面的條件皆不成立且這個條件成立時執行
- else if 前面只能是 if(一定會有) 或 else if
if (條件1) {
要執行的東東1;
} else if (條件2) {
要執行的東東2;
}#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
if (x > 100) {
cout << x << "大於100" << endl;
} else if (x > 50) {
cout << x << "大於50且小於等於100" << endl;
}
}
else
- 使用格式:
if (條件1) {
要執行的東東1;
} else if (條件2) {
要執行的東東2;
} else {
要執行的東東3;
}#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
if (x > 100) {
cout << x << "大於100"
} else if (x > 50) {
cout << x << "大於50且小於等於100"
} else {
cout << x << "小於等於50";
}
}
- 若前面的條件皆不成立,才會執行
- else 前面只能是 if(一定會有) 或 else if
switch
- 使用格式:
switch(變數名稱或運算式) {
case 符合數字或字元:
陳述句1;
break;
case 符合數字或字元:
陳述句2;
break;
default 符合數字或字元:
陳述句3;
break;
}#include <iostream>
using namespace std;
int main() {
int score = 85;
switch(score/10) { //85/10=8
case 10:
cout << "Well done";
break; // 跳出去
case 9:
cout << "Almost...";
break;
default: //執行這裡
cout << "Bad Score!";
break;
}
}- 用來比較數值或字元
- 不斷執行直到 break
Loops
Loops
迴圈
-
在某一個條件下一直做事,直到條件為達成為
-
迴圈可以幫助做會一直重複的事情
for
- 使用格式:
-
通常會用來寫一個要執行特定次數的迴圈
#include <iostream>
using namespace std;
int main() {
int a[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++) {
cout << a[i] << ' ';
}
//1 2 3 4 5
}for(初始設定; 重複執行條件; 每次結束後更新) {
要重複執行的東東;
}while
- 使用格式:
-
通常會用來寫需要在特定條件下重複執行的迴圈
-
當條件為 true 時,if 只會執行一次,while 則會一直執行
#include <iostream>
using namespace std;
int main() {
int a = 1;
while(a < 6) {
cout << a << ' ';
a++;
}
//1 2 3 4 5
}while(每次執行前判斷) {
要重複執行的東東;
}endless loop
- 無窮迴圈會讓程式一直執行,不會停止
for(;;){
重複執行的東東;
}while(true){
重複執行的東東;
}break
- break 可以跳出迴圈,使迴圈不再執行
-
只要是迴圈都可以用 break
while(true) {
if(condition) {
break;
}
}break
- break 可以跳出迴圈,使迴圈不再執行
-
只要是迴圈都可以用 break
#include <iostream>
using namespace std;
int main() {
int a = 1;
while(a < 6) {
if(a % 3 == 0) {
break;
}
cout << a << ' ';
a++;
}
//1 2
}continue
- continue 會跳出這輪迴圈,執行下一輪
- 只要是迴圈都可以用 continue
while(true) {
if(condition) {
continue;
}
}continue
- continue 會跳出這輪迴圈,執行下一輪
- 只要是迴圈都可以用 continue
#include <iostream>
using namespace std;
int main() {
int a = 1;
while(a < 6) {
if(a % 3 == 0) {
a++;
continue;
}
cout << a << ' ';
a++;
}
//1 2 4 5
}Practice
// 待捕
Practice
Thank You!
C++[0]
By Claire Pan
C++[0]
- 20