C++

2024 建北電資聯合暑訓

Index

簡介

Introductions

What is C++ ?

一個程式語言

不然呢

效率高

C++ 具有控制底層硬體的能力,這導致他的執行效率很高

例子

Windows

macOS

Chrome

  • 遊戲開發

  • 系統開發

  • 開源專案

  • 競賽程式

WHY C++ ?

What we do

支線任務 團體賽讚
看看學長願不願意帶
YTP 好吃
NPSC 獎品讚
ISSC 很傻逼
成大賽 絕對別報

校內能力競賽 9月

11 人

北市賽 11月

10 人

全國賽 12月

4 人

IOI 7月

金銀牌保送任意科系

APCS

1, 6, 10月

TOI 初選

3月

20 人

競程打怪路線圖

12 人

選訓二階 4月

前半保送資工

10 人

選訓一階 3月

Online judge

cses

題目敘述簡單,主要為算法題目,題目質量好。

codeforces

全球最大 Online Judge,時常有辦線上賽(類似排位賽)。但大多都在台灣的午夜時間。

iscoj

由建北電資所架,然而教課這幾天因為北一伺服器停機所以我們鬼轉 codeforces去寫題目。

解題的地方

Result Meaning Why
AC Accepted 你對了
WA Wrong Answer 你錯了
MLE Memory limit exceed 你花太多記憶體
TLE Time limit exceed 執行時間太長
RE Runtime error 你可能戳出去了

After submission

英文網站,這我常用

自學資源

可以找模板

就一本書,網路上找得到

CONTACT ME

反正歡迎各位來找我聊天、問問題

或者要打LOL也可以(我很菜)

設置

Setups

FUNC

編輯程式碼

輕量快速

自帶編譯器

安裝簡單

code editor

文字編輯器

IDE

整合式開發環境

編輯程式碼

文字編輯器

VS Code

Visual Studio Code

目前最多人使用的編輯器

擴充功能多 但安裝麻煩

VIM

Vi IMproved

上手成本超高

熟悉之後超好用

早學早上手

NOTEpad

Windows 記事本

不要懷疑 這就是文字編輯器

至於什麼時候會用到

我也不知道

IDE

Code::blocks

學校電腦上有

字體很醜

有時候 Windows Defender 會搞

Visual Studio

很眼熟

VS Code 少了 Code

其實我沒用過這個

Replit

線上版 IDE

手機平板都可用

速度較慢

What we use

不想用的去用線上的

想來訂一些小規範

Before we start...

看顏色區分

  • 這是完整可以直接執行的程式

#include <iostream>
using namespace std;

int main() {
	cout << "Hello World!" << endl;
}
int arr[3] = {8, 0, 7};

arr[0] = 4;
arr[2] = 4;
for (int i = 0, i < 3; i++) {
	cout << arr[i];
}
  • 這是程式片段,缺乏上下文,示例用

來講一下 Coding Style

Before we start...

就是一種寫 Code 的習慣&風格

#include <iostream>
using namespace std;

int main() {
	int n = 5;
    
    for (int i = 0; i < n; i++) {
    	cout << "Hello World" << endl;
  	}
}

字間空格

變數名稱

大括號不換行

ChatGPT 的 Coding Style 挺讚

同場加映:

There are two types of people in this world:

Those who don't put curly braces on a new line,

and those who are hated by the world.

– Bill Gates

沒有說過

不要寫出這種東西就好

我尊重各種 Coding Style 應該

我尊重各種 Coding Style 應該

旁邊那隻貓是來幫忙抓bug的可以忽略他

Hello World!

第一個程式

Hello World!

#include <iostream>
using namespace std;

int main() {
	cout << "Hello World!" << endl;
}

引入函式庫(功能庫)

使用命名空間

主函式

記得分號

實作時間

#include <iostream>
using namespace std;

int main() {
	cout << ... << endl;
}

/*-----------------------*/

// 這個是註解,不會被執行到

/* 這個是更大的註解

檢查:
.cpp 檔名
字沒拼錯
<< 方向正確
"字串要用雙引號"
分號;
大括號不要換行

*/

必要三件套:

  1. 標題檔
  2. 命名空間
  3. 主函式

變數&陣列

Variables & Arrays

什麼是變數

數值會改變的數

- 這是一個箱子,我們叫它Box

Box

- 這是一隻貓,我相信大家有目共睹

Cat

Variable

變數

一個具有名稱的儲存空間

一個可以改變的值

Cat

- 你可以把這隻貓放進箱子裡

Box

一隻不知道是死是活的貓

什麼是變數

我們可以在變數裡面放各式各樣的東西

Data type

資料型態

名稱 型態(Type) 大小
int 整數
long long 整數
bool 布林值 真假值 (true / false)
char 字元 一個字
string 字串 多個字
float 浮點數 小數點
-2^{31} ~ 2^{31} - 1
-2^{63} ~ 2^{63} - 1

怎麼寫

DeclarE

宣告

1

Data Type

資料型態

2

Variable Name

變數名稱

3

Value

=
string box = "cat";

這是還沒組裝的紙箱

使用變數之前,我們需要創造它

Cat

放心,本課堂沒有任何貓咪受到傷害

這是剛剛那隻貓,他還活著

TIPS

  • 可以不用初始值
int a;
string box;
int a, b, c = 10;
// 注意只有c被設為10
  • 多個變數可以用逗點隔開宣告

a

grandma.rar

b

Milk

c

Protein

  • 變數名稱請至少讓自己看得懂

這裡有三個罐子,有奶粉 / 蛋白粉 / 阿罵的骨灰

  • 保留字不可作為變數名稱

輸入輸出

cin & cout

  • 這是我們剛才的賦值方式
int a = 0;
a = 3; // 不用重新宣告
  • 如果我們想要在程式執行後再輸入值
int a;
cin >> a;
  • 加上最初的輸出
int a;
cin >> a;
cout << a + 10 << endl;

運算子

加減乘除

+ - * / %

int a = 5, b = 3;
cout << a + b << endl;
cout << a - b << endl;
cout << a * b << endl;
cout << a / b << endl;
cout << a % b << endl;
int a = 0;
a = a + 1;
cout << a << endl;
a += 1;
cout << a << endl;
a++;
cout << a << endl;

跟 = 結合

陣列

一堆變數們

我們叫它 arr

從零開始編號

0-based

1

2

3

0

int arr[4] = {3, 3, 5, 2};

cout << arr[2] << endl;
cout << arr[0] << endl;

arr[2] = 7;
cout << arr[2] << endl;
cout << arr[0] << endl;

於是我們寫出

3

3

5

2

好多箱子,裡面有一些數字

實作時間

條件判斷

Coditionals

If...

 

如果我們想要讓程式在不同條件做不同事情?

所以說晚餐要吃什麼

– cjtsai

建中電研一四學術

Source: Codedex

不知道有沒有說過

刀削小廚

麥當勞

If

  • 這是一個簡單的示例
if (條件) {
	// do something
}
  • 這不是我
if (grade > 60) {
	cout << "You passed!" << endl;
}

跳過大括號裡面

如果條件為 true

就做下面敘述的事

如果條件為 true

就做下面敘述的事

Else

  • 你可以把他加到 if 後面
if (條件) {
	// do something
} else {
	// do something else
}
  • 我是小丑
if (grade >= 60) {
	cout << "You passed!" << endl;
} else {
	cout << "You failed." << endl;
}

如果條件為 true

就做下面敘述的事

如果條件為 true

就做下面敘述的事

否則做 else 裡的

Else if

  • 你可以把 else if 加到 if 和 else 中間
if (條件A) {
	// do this
} else if (條件B) {
	// do this, instead
} else {
	// do this if none of the above are true
}

不只兩種情況怎麼辦

if (grade > 90) {
	cout << 'A';
} else if (grade > 80) {
	cout << 'B';
} else if (grade > 70) {
	cout << 'C';
} else if (grade >= 60) {
	cout << 'D';
} else {
	cout << 'F';
}

邏輯運算子

Logical Operators

要怎麼判斷兩個東西是否相等?

判斷不等於呢?

if (a == b) {
	cout << "they are the same";
} else {
	cout << "they are different";
}
if (!(a == b)) {
	cout << "they are different";
} else {
	cout << "they are the same";
}

只需要在前面加個 !

OR

if (a != b) {
	cout << "they are different";
} else {
	cout << "they are the same";
}

邏輯運算子

如果想將多種條件結合判斷?

if (hunger > 4 && anger > 1) {
	cout << "Hangry" << endl;
}

使用 && 和 ||

if (coffee > 0 || bubble_tea > 0) {
	cout << ":)" << endl;
}
A B A && B A || B
false false false false
false true false true
true false false true
true true true true

只要一個錯就算錯

(兩個都要對)

只要一個對就算對

(任一個對就好)

迴圈

Loops

Loops

如果我想要輸出Hello World 3次

cout << "Hello World!" << endl;
cout << "Hello World!" << endl;
cout << "Hello World!" << endl;

如果是20次,甚至100次呢?

While

while (條件) {
	// Code here
}

當條件為 true 時會一直執行

int luckyNumber = 7;
int guess;
cin >> guess;

while (guess != luckyNumber) {
	cout << "Nope, it isn't " << guess << endl;
    cin >> guess;
}

cout << "Lucky Number is " << luckyNumber;

可以來做個小遊戲

For

for (int i = 1; i <= 10; i++) {
	cout << i << endl;
}
for (宣告變數; 條件; 更新變數) {
	// Code here
}

稍微有點不太一樣

for (int i = 1; i <= 20; i++) {
	cout << "Hello World!" << endl;
}

可以完成剛剛的心願了

For

也可以用一些酷方法去遍歷陣列

for (int i = 0; i < 5; i++) {
	if (i == 3) {
    	continue;
    }
    cout << i << endl;
}

Continue

終止當前迴圈進入下個迴圈

for (int i = 0; i < 5; i++) {
	if (i == 3) {
    	break;
    }
    cout << i << endl;
}

Break

直接離開迴圈

實作時間

實作時間

小小賽

C++ 暑訓

By keaucucal

C++ 暑訓

  • 325