CPP[0]

基礎語法

INDEX

Introduction

Setups

Hello World

Variables & Arrays

Conditionals

Loops

Introduction

1. 關於競賽程式

2. C++

3. Online Judge

Introduction

競賽程式(Competitive Programming)是一種以程式設計為核心的競賽活動,參賽者需要在有限的時間內解決一系列具挑戰性的算法和數學問題。

 

需要具備:

算法設計能力

問題解決技巧

編程能力

競賽程式中的每一道題目基本上都是一個需要通過某種演算法來解決的問題。這些題目通常涉及大量的數據處理、優化、搜索、排序等,需要運用合適的演算法來達到最佳解決方案。

Introduction

C++ 屬於編譯型語言,是最常被選用於競賽程式的編程語言

有許多優點如:

靈活的語法

豐富的標準庫(STL)

高效性

編譯型語言(Compiled Languages)

這類語言需要通過編譯器將源代碼轉換為機器碼或中間碼,生成可執行的二進制檔案,然後由電腦直接執行

  • 例子:C、C++、Rust、Go、Swift

定義:這類語言不需要事先編譯成機器碼,而是由直譯器逐行解釋和執行源代碼。程式在執行時即時被解釋並執行

  • 例子:Python、JavaScript、Ruby、PHP、Perl

直譯式語言(Interpreted Languages)

Introduction

Online Judge(線上判題系統),用於評測和判定程式設計問題的解答是否正確。

主要包括以下幾個功能:

結果判定:根據程式的輸出與預期結果進行比較,判定解答是否正確。

提交接口:參賽者或使用者通過該接口提交程式碼解答。

題目庫:包含各類程式設計題目,覆蓋不同難度和類型。

一個讓你練習程式設計與演算法的地方

會在後端有個伺服器執行你上傳的程式

對於特定的題目會有特定的輸入與輸出

如果你的程式輸入後的輸出與標準一樣

就會得到AC的結果la欸我字數都一樣欸

- by 一四學術 世宗

Introduction

提交到 Online Judge 之後,評分結果會有以下可能:

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

Introduction

常見的 OJ 如下:

Codeforces:全球最大的 OJ,常常有比賽,可以助眠

TIOJ:建中資訊校隊所維護,題目難度偏高

ISCOJ:本社自己的 Online Judge,題目有點參差不齊,個人不常用

CSES:題目敘述簡單,每一題都很值得寫-

NEOJ:台大資訊之芽社的 OJ,如果之後要參加可以先刷題

Introduction

Setups

1. 編輯器

2. 編譯器

3. 基本設定

Setups

IDE

Editor

VS Code / Vim

DevC++ / Code::Blocks

文字編輯器

速度快

需額外安裝編譯器

推薦

不推

內附編譯器

速度慢

整合式開發環境

編輯器

 

 簡單來說就是把你寫的東西翻譯成電腦看的懂的東西

(把你可能看不懂的東西轉換成你絕對看不懂的東西)

可以去查:Windows(或 MacOS) VS Code C++

裡面的安裝就有包含編譯器安裝了

有以下功能:

轉換程式碼:將高級語言轉換為計算機可執行的低級語言

優化:編譯過程中同時對代碼進行優化,提升執行效率

報錯:呃 不多說,但你不會想看到他報錯的

編譯器

Setups

Hello World

1. C++ 基本架構

2. 標題檔

3. 換行

Hello World

#include <iostream> // 引入函式庫
using namespace std; // 使用命名空間

int main() { // 主函式
	cout << "Hello World\n"; // 輸出 Hello World(換行)
}

注意事項:

前四行是必要的,請把它背下來

主函式的大括號要把所有東西包起來

記得後面要加分號(大括號和標題檔除外)

基本架構

函式庫

簡單來說就是把所需要用到的工具引入,讓你可以更方便的使用它

常見函式庫:

<iostream> 輸入輸出

<vector> 動態陣列

<algorithm> 常用算法

...... 還有一大堆,懶得打怎麼辦?

只需要引入:<bits/stdc++.h>

裡面就包含所有函式庫了

Hello World

換行

換行

速度快

競程用

推薦

不推

專案用

速度慢

換行並刷新緩衝區

Hello World

'\n'

endl

Variables & Arrays

1. 變數&陣列

2. 資料型態

3. 運算子

Variables & Arrays

變數

顧名思義,數值會改變的數(不是未知數)

怎麼使用

#include <iostream>
using namespace std;

int main() {
	int a; // 宣告一個名稱為 a 的整數(int)變數
}

(這個程式執行了不會有任何事發生)

資料型態

儲存的資料的型態

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

Variables & Arrays

賦值

將變數賦予一個值

#include <iostream>
using namespace std;

int main() {
	// 宣告一個名稱爲 a 的整數(int)
    // 並且將值設為 10
	int a = 10; 
    
    // 名稱為 s 的字串(string)
    // 並且將值設為 "cat"(字串用雙引號)
    string s = "cat"; 
    
    // 字元 c,值為 'w'(字元用單引號)
    char c = 'w';
}

Variables & Arrays

名稱不能跟系統預設的一些保留字重複

輸入輸出

從用戶那邊取得值 / 將值顯示出來

#include <iostream>
using namespace std;

int main() {
 	// 用逗號將兩個相同資料型態的變數隔開
	int a, b;
    
    // 從使用者讀入兩個數字
    cin >> a >> b; 
    
    // 將兩個數字相加的結果輸出並換行
    cout << a + b << '\n';
}

注意箭頭方向是丟進變數還是丟出去

Variables & Arrays

運算子

加減乘除等計算

#include <iostream>
using namespace std;

int main() {
	// 逗號左右可以分別賦值
	int a = 5, b = 3;
    cout << a + b << '\n'; // 加
    cout << a - b << '\n'; // 減
    cout << a * b << '\n'; // 乘
    cout << a / b << '\n'; // 除
    cout << a % b << '\n'; // 模(取餘數)
}

可以自己試其他的值

Variables & Arrays

改值

改變變數的值

#include <iostream>
using namespace std;

int main() {
	int a = 3, b = 3;
    a = 3 + 10;
    cout << a << '\n'; // 13
    b = b + 10;
    cout << b << '\n'; // 13
    
    int c = 0;
    c += 3;
    cout << c << '\n'; // 3
    c++; // 這是 += 1 的簡寫
    cout << c << '\n'; // 4
}

Variables & Arrays

同理可知 -- 是減一

陣列

一大堆數字,每一個都是獨立的資料

#include <iostream>
using namespace std;

int main() {
	int a[2]; // 有三個整數的陣列
    
  	// 有三個整數分別為 0, 3 和 1 的陣列
    int b[3] = {0, 3, 1};
    
    cout << b[0] << '\n'; // 輸出 b 陣列第一個數字
    cout << b[2] << '\n'; // 輸出 b 陣列第三個數字
}

Variables & Arrays

注意他是從零開始編號的(0-based)

很重要,別搞混

Conditionals

1. if else

2. 運算子

3. switch case

Conditionals

if

#include <iostream>
using namespace std;

int main() {
	int a = 5, b = 3;
    if (a > b) {
    	cout << "a is greater than b" << '\n';
    }
    
    if (a != b) {
    	cout << "they are not equal" << '\n';
    }
}

如果條件為真,執行大括號內的東西

Conditionals

關係 / 邏輯運算子

回傳 true / false 的判斷式

==:等於

!=:不等於(驚嘆號會將真假值翻轉)

&&:且

||:或

(計算順序按照括號由小到大)

Conditionals

else

若 if 不成立,執行 else

#include <iostream>
using namespace std;

int main() {
	int a;
    cin >> a;
    if (a % 2 == 1) {
    	cout << "a is odd";
    } else {
    	cout << "a is even";
    }
}

Conditionals

else if

否則,如果...

#include <iostream>
using namespace std;

int main() {
	int grade;
    cin >> grade;
    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 << 'E';
    }
}

Conditionals

switch case

另外一個判斷工具

#include <iostream>
using namespace std;

int main() {
	char grade;
    cin >> grade;
    
    switch (grade) {
    	case 'A': // if (grade == 'A')
        	cout << "Excellent";
            break;
        case 'B': // else if (grade == 'B')
        	cout << "Nice";
            break;
        case 'C': // else if (grade == 'C')
        	cout << "Come on";
            break;
        default: // else
        	cout << "Failure";
            break;
    }
}

Loops

1. while 迴圈

2. for 迴圈

3. break / continue

Loops

while

當條件成立,一直執行

#include <iostream>
using namespace std;

int main() {
	int i = 0;
    while (i < 10) { // 當 i < 10 時
    	cout << i << '\n'; // 輸出 i
        i++; // 把 i 加上 1
    }
}

上面程式碼會輸出 0 ~ 9

Loops

for

(初始設定; 條件; 每次結束更新)

#include <iostream>
using namespace std;

int main() {
	// reminder: 陣列是 0-based
	int a[5] = {4, 8, 7, 6, 3};
    
    // 設一個初始值 i 為 0
    // 當 i < 5 時執行大括號內程式
    // 每次執行完將 i 加上 1
    for (int i = 0; i < 5; i++) {
    	cout << a[i] << ' ';
    }
}

輸出 : 4 8 7 6 3

另外一種 for

遍歷陣列內所有內容

#include <iostream>
using namespace std;

int main() {
	int a[5] = {4, 8, 7, 6, 3};
    
    // 會自己偵測 a 的大小
    for (int i : a) {
    	// i 在每次迴圈的值分別為 4, 8, 7, 6, 3
    	cout << i << ' ';
    }
}

Loops

跟剛剛的執行結果一樣

continue

跳過本次迴圈

#include <iostream>
using namespace std;

int main() {
	int a[5] = {4, 8, 7, 6, 3};
    
    for (int i : a) {
    	// 只有一行時可以不用加大括號
    	if (i == 7) continue; // 跳過 7
        
    	cout << i << ' ';
    }
}

Loops

輸出:4, 8, 6, 3

break

終止迴圈

#include <iostream>
using namespace std;

int main() {
	int a[5] = {4, 8, 7, 6, 3};
    
    for (int i : a) {
    	// 只有一行時可以不用加大括號
    	if (i == 6) break; // 跳過 7
        
    	cout << i << ' ';
    }
}

Loops

輸出:4, 8, 7

沒了

世宗對不起

C++ 基礎語法

By keaucucal

C++ 基礎語法

  • 532