5

编程码风汇总 - fyder黯然

 1 year ago
source link: https://www.cnblogs.com/shaoziqi/p/16838960.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文章摘自本人洛谷博客,原文章地址:https://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. 后记


众所周知,每个人都有自己的码风,无论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 好用,但是不能滥用

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK