[整理]_ajthreac_的屑码风(持续更新中)


注意:本文仅作为作者对于 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\) 空格。
ifelseforwhiledo-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];
        }
      }
    }
  }
}

大括号

ifelseforwhiledo-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-whiledo 后方的左大括号前。
  4. set<...>vector<...> 等容器类型与名称之间。
  5. 指针符号 * 和引用符号 & 与变量类型之间。
    除此之外的其他地方,可不加空格的不能加多余的空格(例如:运算符两侧、逗号或分号后方等)。

语句块内尽量少换行,每行长度不限,但要尽量可读(此处“可读”指一行代码不超过100字符)。
需要在一行内写下多个表达式时,必须使用逗号表达式(for 中的三个语句和变量声明语句除外)。

命名

对于题中给出的变量,应在不重复的情况下尽量保持原样。
函数名尽量使用帕斯卡命名法,数组名可以使用均为小写字母的单词缩写。
临时变量尽量使用单个小写字母(如 i,j,k,x,y,u,v 等)。
习惯用法(如矩阵名 AE,手写 minmax 等)可以保留。
当函数名出现全大写缩写紧跟开头大写时,为避免混淆可以在中间添加一个下划线。
例:

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\)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM