編程碼風匯總

  • 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!!!