注意:本文僅作為作者對於 OI 題的碼風留檔,不符合當今主流代碼規范也不夠易讀,您不需要也不應該學習此種碼風。
感覺自己的碼風還是比較獨特的,特此記錄一下。 ——\(2020.4.4\)
Update \(2021.7.26\): 微調了一些地方。
Update \(2021.4.18\): 微調了一些地方。
Update \(2021.3.8\): 大調了一些地方,學習某神仙更改了定義區。
Update \(2021.1.19\): 更改了縮進的長度。
Update \(2020.12.3\): 微調了一些地方。
Update \(2020.10.21\): 加入了命名模塊,微調了一些地方。
Update \(2020.8.10\): 微調了一些地方。
Update \(2020.6.30\): 微調了一些地方。
排版參照 Menci's Code Style for OI。
約定
以下關鍵詞是按照必要性從高到低排序的:
必須 \(>\) 應該 \(>\) 盡量 \(>\) 可以 \(>\) 不建議 \(>\) 不應 \(>\) 不能
整體
開頭為頭文件區、定義區、IO 優化區(輸出優化不建議加入),以下是一段缺省源。必要時可在時空限制允許時 #define int LL
。
#include<bits/stdc++.h>
#define LL long long
#define dv double
#define il inline
#define us unsigned
#define eps 1e-6
#define INF 0x3f3f3f3f
#define ls k<<1
#define rs k<<1|1
#define tmid ((tr[k].l+tr[k].r)>>1)
#define nmid ((l+r)>>1)
#define pub push_back
#define pii pair<int,int>
#define mkp make_pair
#define x first
#define y second
#define KafuuChino return
#define HotoKokoa 0;
using namespace std;
il void Read(int &x){
int f=1;x=0;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0',c=getchar();
}
x*=f;
}
接下來是常量區,用 const
聲明的常量必須置於其他全局變量之前。
對於數組大小,應該使用 const int N=...;
,不應使用 #define N ...
。
常量區下方為聲明區,題目所用的全局變量、結構體、函數等應在此聲明並按照意義分隔。
函數聲明時必須實現。(即不出現 void f(...); ... void f(...){...}
的情況)
main
函數一定要在最后,整篇代碼不應有空行。
縮進
必須使用 \(2\) 空格縮進,不能使用制表符代替,縮進長度如下:
缺省源和定義區不能縮進。
函數、結構體等的定義、結尾大括號不能縮進。
函數、結構體等內部多縮進 \(2\) 空格。
if
、else
、for
、while
、do-while
等引領的語句塊多縮進 \(2\) 空格。
例:
il void Floyd(){
for(rg int k=1;k<=n;k++){
for(rg int i=1;i<=n;i++){
for(rg int j=1;j<=n;j++){
if(f[i][j]>f[i][k]+f[j][k]){
f[i][j]=f[i][k]+f[j][k];
}
}
}
}
}
大括號
if
、else
、for
、while
、do-while
等引領的語句塊如果只有一行較短代碼(具體長度參照下文行部分)則可以不加大括號直接寫。
其他情況必須加大括號,左大括號不能換行,右大括號應與對應左大括號所在行的縮進一致。
例:
for(rg int i=1;i<=n;i++)Read(a[i]);
for(rg int i=1;i<=m;i++){
int u,v,t;
Read(u),Read(v),Read(t);
if(t==1)ade(u,v);
else ade(u,v),ade(v,u);
}
空格
以下這些地方必須只加一個空格:
- 結構體名后方的左大括號前。
else
后方的左大括號前。do-while
中do
后方的左大括號前。set<...>
、vector<...>
等容器類型與名稱之間。- 指針符號
*
和引用符號&
與變量類型之間。
除此之外的其他地方,可不加空格的不能加多余的空格(例如:運算符兩側、逗號或分號后方等)。
行
語句塊內盡量少換行,每行長度不限,但要盡量可讀(此處“可讀”指一行代碼不超過100字符)。
需要在一行內寫下多個表達式時,必須使用逗號表達式(for
中的三個語句和變量聲明語句除外)。
命名
對於題中給出的變量,應在不重復的情況下盡量保持原樣。
函數名盡量使用帕斯卡命名法,數組名可以使用均為小寫字母的單詞縮寫。
臨時變量盡量使用單個小寫字母(如 i,j,k,x,y,u,v
等)。
習慣用法(如矩陣名 A
、E
,手寫 min
、max
等)可以保留。
當函數名出現全大寫縮寫緊跟開頭大寫時,為避免混淆可以在中間添加一個下划線。
例:
void GetMin(...){
...
}
int AVeryVeryVeryVeryVeryVeryLongFunction(...){
for(rg int i=1;i<=n;i++){
int u,v;Read(u),Read(v);
ade(u,v),ade(v,u);
}
}
void DFS_First(int u){
...
}
附
將作者寫 Markdown 和 \(\LaTeX\) 的碼風一並羅列至此。
規范大致同洛谷題解審核及反饋要求和格式手冊,僅在一些細節上進行了微調。
對於 \(\LaTeX\) 公式中的轉義符號,有多種寫法的應該采取最短形式。
例:
應該使用 \ge
,不應使用 \geq
表示 \(\ge\);
應該使用 \|
,不應使用 \parallel
表示 \(\|\)。
對於大型符號,盡量使用 \limits
。
例:盡量使用 \sum\limits_{i=0}^n
\(\sum\limits_{i=0}^n\),不建議使用 \sum_{i=0}^n
\(\sum_{i=0}^n\)。