本文章摘自本人洛谷部落格,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/bian-cheng-ma-feng-hui-zong
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-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!!!
本文來自部落格園,作者:fyder黯然,轉載請註明原文連結:https://www.cnblogs.com/shaoziqi/p/16838960.html