注意:本文仅作为作者对于 OI 题的码风留档,不符合当今主流代码规范也不够易读,您不需要也不应该学习此种码风。
感觉自己的码风还是比较独特的,特此记录一下。 ——2020.4.4
(Update 2020.6.30:)微调了一些地方。
(Update 2020.8.10:)微调了一些地方。
(Update 2020.10.21:)加入了命名模块,微调了一些地方。
(Update 2020.12.3:)微调了一些地方。
(Update 2021.1.19:)更改了缩进的长度。
排版参照Menci's Code Style for OI。
整体
在代码中提前插入这一段,必要时可视情况#define int LL
(正式考试中不建议)。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<stack>
#include<queue>
#include<vector>
#include<bitset>
#include<set>
#include<map>
#define LL long long
#define rg register
#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 Thispoint tr[k].l==tr[k].r
#define pushup tr[k].wei=tr[ls].wei+tr[rs].wei
#define pub push_back
#define lth length
#define pii pair<int,int>
#define mkp make_pair
using namespace std;
inline void Read(int &x){
int f=1;
char c=getchar();
x=0;
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;
}
一般会在下面加一句#define N 数据范围
,其中N
可改为M
等其他名称,但一定要为单个大写字母。
数据范围视情况而定,一般是题中最大数据+10。
接下来是定义区,题目中用到的大部分变量都将在此定义为全局变量。
紧接着是结构体区,题目中所用到的结构体将在此定义,格式为:
struct 结构体名 {
结构体内变量
}数组名;
与之相关的部分变量(如链式前向星的head、cnt等)
与之相关的函数或重载符号(如链式前向星的Ade、排序用的Cmp等)
再往下是函数区,用于定义题中用到的所有函数。
函数实现必须跟在函数声明后方。
main函数一定要在最后。
整篇代码尽量无空行(代码过长时用于区分意义相关的语句块)。
缩进
一律使用2空格的tab缩进,tab个数如下:
缺省源和定义区绝对不能缩进。
函数、结构体等的定义、结尾大括号绝对不能缩进。
函数、结构体等内部多缩进4空格/一个tab。
if
,else
,for
,while
,do-while
等引领的语句块多缩进2空格/一个tab。
例:
inline 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);
}
空格
以下这些地方必须且只能加一个空格:
1.结构体名后方的左大括号前。
2.else
后方的左大括号前。
3.do-while
中do
后方的左大括号前。
除此之外的其他地方,可不加空格的绝对不能加多余的空格(例如:运算符两边、逗号或分号后方等)。
行
原则:语句块内尽量少换行,每行长度不限,但要尽量可读(此处“可读”指一行代码不超过100字符)。
命名
对于题中给出的变量,应在不重复的情况下尽量保持原样。
函数名尽量使用帕斯卡命名法,数组名可以使用均为小写字母的单词缩写。
临时变量应为单个小写字母(如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){
...
}