演算法競賽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++函式