演算法競賽C++快速入門

aminuosi發表於2024-10-18

演算法競賽C++快速入門(施工中)

僅針對xcpc的cpp教學!
c++是 c語言的一個超集,也就是說c++包含了c語言的所有特性,但是c++又有很多c語言沒有的特性,比如物件導向程式設計。

對於演算法競賽來說,我們主要使用c++的c語言部分和STL(標準模板庫)部分,所以我們實際上學的是C+STL()

STL之後再開帖子詳細介紹喵~

目錄

  • 演算法競賽C++快速入門(施工中)
    • 基礎語法
    • 計算機基礎知識(也許你們需要)
    • 基本的常用資料型別
    • 變數作用域(feel it)
    • C++ 常量
    • c++ 運算子
    • c++條件語句
    • c++迴圈語句
    • c++函式

基礎語法

這個是一個簡單的C++程式。如果你目前看不懂是什麼意思,沒關係,只要feel it

#include <iostream>//標頭檔案,包含輸入輸出流
using namespace std;
//名稱空間,使用std名稱空間才能用cout和cin

int main(){//主函式,必須有
    //cout 包含在iostream中
    cout<<"Hello World!"<<endl;//輸出流,輸出Hello World!
    return 0;
}

一個典型的c++程式要包含標頭檔案,有一個主函式

What is 標頭檔案?

標頭檔案是一種特殊的檔案,它包含了一些函式的宣告,變數的宣告,宏定義等。標頭檔案的檔名通常以.h結尾,標頭檔案的內容通常包含在#ifndef、#define、#endif的條件編譯指令中,以防止標頭檔案被重複包含。標頭檔案的作用是將程式中經常使用的函式的宣告、變數的宣告等放在一個檔案中,以便在需要的時候包含到程式中,以簡化程式的編寫和維護。

What is 名稱空間?

名稱空間是C++中的一種重要的機制,它可以用來避免命名衝突。在C++中,每個名稱空間都是一個作用域,名稱空間中的名字只在該名稱空間中有效。名稱空間可以巢狀,一個名稱空間可以包含另一個名稱空間

剛剛的程式如果不使用using namespace std;名稱空間,那麼就要這樣寫

#include <iostream>

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

    return 0;
}

我們打演算法競賽的時候,一般都會使用using namespace std;
但是顯然,在工程專案裡這不是一個好習慣!(\(×1\)

計算機基礎知識(也許你們需要)

基本的常用資料型別

不同於python的動態型別,C++是靜態型別語言,變數在宣告時必須指定型別。並且C++的資料型別是有範圍的,所以在使用時要注意資料型別的選擇。
實際上python的整數的底層原理是用陣列儲存每一位數字再模擬加減乘除,而C++的整數是直接儲存的二進位制數,所以C++的整數範圍是有限的。

!!!不同平臺的資料型別的範圍可能有所不同,這裡只是通常情況

  • int

    32位整型,範圍是 \(-2^{31} 至 2^ {31} -1\)
    ¥2^ {31} -1$ = 2147483647
    如果 此時+1 會變成-2147483648(溢位了)

  • long long

    64位整型,範圍是 \(-2^{63} 至 2^ {63} -1\)

  • unsigned int

    32位無符號整型,與int不同的是二進位制中最高位不是符號位,也用來表示值。
    範圍是 \(0 至 2^ {32} -1\)

  • unsigned long long

  • float

  • double

  • char

  • string

  • bool

變數作用域(feel it)

你們應該已經在其它語言裡學過了變數的作用域,這裡再複習一下


#include <iostream> 
using namespace std;
int otto=114514;

void func(){
    int otto=666666;
    cout<<otto<<endl;
    cout<<::otto<<endl;
}

int main(){
    int otto=1919810;
    cout<<otto<<endl;// 優先使用區域性變數,輸出1919810
    cout<<::otto<<endl;// ::是作用域解析運算子,表示全域性變數,輸出114514

    func();
    return 0;
}

作用域是程式的一個區域,變數的作用域可以分為以下幾種:

區域性作用域:在函式內部宣告的變數具有區域性作用域,它們只能在函式內部訪問。區域性變數在函式每次被呼叫時被建立,在函式執行完後被銷燬。

全域性作用域:在所有函式和程式碼塊之外宣告的變數具有全域性作用域,它們可以被程式中的任何函式訪問。全域性變數在程式開始時被建立,在程式結束時被銷燬。

塊作用域:在程式碼塊內部宣告的變數具有塊作用域,它們只能在程式碼塊內部訪問。塊作用域變數在程式碼塊每次被執行時被建立,在程式碼塊執行完後被銷燬。

類作用域:在類內部宣告的變數具有類作用域,它們可以被類的所有成員函式訪問。類作用域變數的生命週期與類的生命週期相同。

!!ATTENTION!!:如果在內部作用域中宣告的變數與外部作用域中的變數同名,則內部作用域中的變數將覆蓋外部作用域中的變數。


正確地初始化變數是一個良好的程式設計習慣!,否則有時候程式可能會產生意想不到的結果。

C++ 常量

暫時不展開喵

c++ 運算子

算術運算子

+	把兩個運算元相加	A + B 將得到 30  

-	從第一個運算元中減去第二個運算元	A - B 將得到 -10  

*	把兩個運算元相乘	A * B 將得到 200  

/	分子除以分母	B / A 將得到 2  !!這個是整除,向下取整!! 

%	取模運算子,整除後的餘數	B % A 將得到 0  

++	自增運算子,整數值增加 1	A++ 將得到 11  

--	自減運算子,整數值減少 1	A-- 將得到 9  



注意!C++中的自增自減運算子有前置和後置兩種形式,區別在於前置形式是先運算再賦值,後置形式是先賦值再運算。
比如

int a=1;
int b=++a;//b=2,a=2 前置自增先 加   再 賦值
a=1;
int c=a++;//c=1,a=2 後置自增先 賦值 再 加

關係運算子,沒什麼好說的

==	檢查兩個運算元的值是否相等,如果相等則條件為真。	(A == B) 為假。

!=	檢查兩個運算元的值是否相等,如果值不相等則條件為真。	(A != B) 為真。

>	檢查左運算元的值是否大於右運算元的值,如果是則條件為真。	(A > B) 為假。

<    檢查左運算元的值是否小於右運算元的值,如果是則條件為真。	(A < B) 為真。

>=	檢查左運算元的值是否大於或等於右運算元的值,如果是則條件為真。	(A >= B) 為假。

<=	檢查左運算元的值是否小於或等於右運算元的值,如果是則條件為真。	(A <= B) 為真。

**
邏輯運算子**

&&	稱為邏輯與運算子。如果兩個運算元都非零,則條件為真。	(A && B) 為假。

||  稱為邏輯或運算子。如果兩個運算元中有任意一個非零,則條件為真。	(A || B) 為真。

!	稱為邏輯非運算子。用來逆轉運算元的邏輯狀態。如果條件為真,則邏輯非運算子將使其為假。	!(A && B) 為真。

但是你用 and or not 也是可以的

致敬傳奇奇技淫巧:位運算子

為了方便演示

設:
A=60=0011 1100
B=13=0000 1101

&	
按位與操作,按二進位制位進行"與"運算。運算規則:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) 將得到 12,即為 0000 1100

|	
按位或運算子,按二進位制位進行"或"運算。運算規則:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) 將得到 61,即為 0011 1101

^	
異或運算子,按二進位制位進行"異或"運算。運算規則:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;
(A ^ B) 將得到 49,即為 0011 0001
(你可以把"異或"理解成不進位加法)
~	
取反運算子,按二進位制位進行"取反"運算。運算規則:

~1=-2;   
~0=-1;
( ~A ) 將得到 -61,即為 1100 0011,一個有符號二進位制數的補碼形式。

<<	二進位制左移運算子。將一個運算物件的各二進位制位全部左移若干位(左邊的二進位制位丟棄,右邊補0)。	A << 2 將得到 240,即為 1111 0000

>>	二進位制右移運算子。將一個數的各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。

雜項運算子 (瞭解即可)

sizeof	

sizeof 運算子返回變數的大小。例如,sizeof(a) 將返回 4,其中 a 是int。

Condition ? X : Y	

條件運算子。如果 Condition 為 True ? 則值為 X : 否則值為 Y。

,
逗號運算子會順序執行一系列運算。整個逗號表示式的值是以逗號分隔的列表中的最後一個表示式的值。
.(點)和 ->(箭頭)	成員運算子用於引用類、結構和共用體的成員。

Cast	
強制轉換運算子把一種資料型別轉換為另一種資料型別。例如,int(2.2000) 將返回 2。

&	
指標運算子 & 返回變數的地址。例如 &a; 將給出變數的實際地址。

*	
指標運算子 * 指向一個變數。例如,*var; 將指向變數 var。

c++條件語句

c++迴圈語句

c++函式

相關文章