编程码风汇总

  • 2022 年 10 月 29 日
  • 笔记

本文章摘自本人洛谷博客,原文章地址://www.luogu.com.cn/blog/cjtb666anran/bian-cheng-ma-feng-hui-zong

此文章方便您了解 shaoziqi这个蒟蒻和 OIer的码风


目录:

1. 前言

2. 码风说明

2-1. 注释代码

2-2. 代码人身攻击

2-3. 打空格

2-4. 自定义函数

2-5. 万能头

2-6. 大括号

2-7. 快读

2-8. STL

3. 后记


1. 前言

众所周知,每个人都有自己的码风,无论AFOer现役OIer,各自的码风也是千奇百怪。

在这里引用一个我所看到的最奇怪的代码

airport.inputln<<("%d%d%d",n,m,s).split();
System.out.airport.writeln>>("%d\n",&k)>>endl;

我看不懂,但是我大受震撼

我也不知道这里面包含了几种编程语言

Upd: 后来才知道是OIer用的三种语言大杂烩

所以,我必须要做一期编程码风的汇总。

2. 码风说明

2-1. 注释代码

一般的大犇都喜欢给代码上注释(当然指有意义的注释),以方便自己在打代码时可以了解自己之前的解题思路

这里举一个例子:

if(j>=a[i]){
	d[j]-max(d[j-1],d[j-a[i]]); //这里用来完成一维数组的 dp
} //如果是10^6的数据规模应该会有80分

但是如果你没有注释,很难让自己或者他人理解你代码的思路

比如说:

scanf("%d",&n);
for(int i=1;i<=n;i++)
{
	qaq(i);
	kkk();
}
orz();

尤其是这种使用一大堆自定义函数的程序,解题思路就很难懂。

Upd: 这是我代码

2-2. 代码人身攻击

在此提醒各位:辱骂有风险,整活需谨慎

鉴于 €€£ 的一系列 save money 的行为,因此万千 OIer 在考场上有辱骂 CCF 的行为。

甚至以至于禁三年

举个例子:

return 0; //CCFrnm退钱

鲜活的禁三人

ccf[i][j]=dp(i-1,min(j-ccf[i-1][j],114514));

Upd以上代码均有出处,为避免人身攻击不将其公布

2-3. 打空格

有一些大佬,喜欢在代码拥挤时打空格以方便找错和调试

还有一些人为了节省码代码的时间,不打空格。

总之,这个习惯因人而异,而不是 OIer 强求的习惯

还是举个例子

for (int i = 1;i <= n;i ++) {
	int k = a [i];
	if (k <= a[i - 1]) ans ++;
}

以及另一个例子

for(int i=1;i<=n;i++) {
	int k=a[i];
	if(k<=a[i-1]) ans++;
}

upd: 我似乎不怎么打空格??

2-4. 自定义函数

自定义函数可以让主程序更简洁,有时候也可以让代码思路更清晰(当然有时候可能会增加复杂度)。

在代码中一些自定义函数是很有用的,比如 dfs,bfs,dp,cmp 等,还有一些函数如果不在根本上改变性质毫无用处的,比如 max,min,sqrt 等。

大部分时候,自定义函数是能帮助到您解决很多实际性问题的

一个大佬的主程序:

#include <bits/stdc++.h>
#define ......
......
using namespace std;
......
void imp(int k,int t)
{
  ......
}
void ......
......
int main()
{
	int n,m;
	ios::sync_with_stdio(false);
	cin>>n>>m;
	imp(n,m,1);
	cos(a[1],d[1][1]);
	dfs(n,1);
	outans(d[1][1]);
	return 0;
}

这个代码长约 200 行我就不放了 %%%Orz 大佬

另一部分人的主程序:

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ......
  return 0;
}
  

同样 150 多行的代码很明显就烦琐了。

Upd: 感觉身边 dalao 真多啊。

2-5. 万能头

根据可靠消息得:万能头会占用 2MB 的空间

#include <bits/stdc++.h>

这个万能头包含了 C++ 所有的头文件,解决了无数人苦记头文件的痛苦

Upd: 想当初我在小六时为了记头文件差点 JC ……

但是,真正的巨佬是不会用头文件的!他们宁可记头文件也不要多余的内存消耗

为伟大的 OIer 们致敬!!!

至于 C++ 有多少头文件,懂的都懂。

Upd: 我没有考虑 P 党的想法十分抱歉

2-6. 大括号

一些人喜欢在代码循环和判断语句外打大括号。

这其实是很好的习惯,这可以让更多人看出代码的运行方便调试

代码比对如下:

for(int i=1;i<=n;i++){
   int k=a[i];
   for(int j=1;j<=n;j++)
   if(k<=a[j])
   k=a[j];
   cout<<k<<endl;
}

还有一份:

for(int i=1;i<=n;i++){
   int k=a[i];
   for(int j=1;j<=n;j++){
      if(k<=a[j]){
    	    k=a[j];
        }
   }
   cout<<k<<endl;
}

通过比对,很明显看出来代码二更有条理性,虽然它们的运行都是一样的

2-7. 快读

一般来说,快读可以减少运行时间

常见的快读有以下几种:

(1) 函数

ios::sync_with_stdio(false);

(2) 模板

inline int read()
{
	char ch=getchar();
	long long f=1,res=0;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+ch-48,ch=getchar();
	}
   return res*f;
}

类似的还有快写模板:

inline void write(long long x)
{
	char buf[100];
	int len=-1;
	if(x>=0) while(x) buf[++len]=x%10+48,x/=10;
	else
	{
		putchar('-');
		while(x) buf[++len]=-(x%10)+48,x/=10;
	}
	while(len>=0){
		putchar(buf[len--]);
	}
}

如果考场上模板不会,那就用函数吧!

2-8. STL

C++ 有个好东西,叫 STL,经常能帮助大佬们完成一大半的操作

(1)栈

vector<int> v;

vector 是个好东西,可以自动模拟实现栈

(2)快排

sort(a+1,a+n+1);

这么一个快排函数,完成了手动模拟几十行的程序。

(3)映射

map<string,int> mp;

这个函数,不用 dfs 用一重循环完成了两重循环完成的事。

(4)其他函数

对于函数而言,使用者是操作者本人,这个习惯也是因人而异。但是谨记一点:STL 好用,但是不能滥用

3. 后记

无数人,无数码风,为的是心中不变的信仰!

谨以此文致敬所有 OIer!!!