數組定義: 首先提提數組的定義問題,由於同學們在定義數組的時候容易把資料開小了導致反正越界的問題。 數組開小樂通常是Runtime Error有的時候也會出現 Restricted Function的結果,而其他未知的錯誤也是有可能的。 有些同學也喜歡採用定義臨時變數的方式,如
int n; while(cin>>n){ int matrix[n+1]; }
這種方法可能會出現兩個問題: 1. 不注意,把範圍定小了。
2. 消耗記憶體過多,導致記憶體不足。(這在空間要求高的時候會出現,如開一個10^5的數組的時候,這涉及到了堆和棧的問題,有興趣的深挖)
那麼助教推薦的一個方法,在打ACM時常用的方式(但是對於工程開發的話另說,因為可能就不適合了): 方式1:
#include<cstdio>using namespace std;int value[1000];int matrix[1000];int name[1000];int main(){ }
我們在main函數的外部定義一個全域的數組。這樣做的好處是可以開一個很大的數組。10^6層級也是可以的。 但是不建議把單個的變數 如int n,m.這樣的變數定義成全域的,容易導致定義混亂,自己給忘記哪裡定義過,然後程式出現莫名其妙的問題。 大家可能注意到,我定義數組的時候用的英文把名字長度不長,同時也像一個單詞(就是),在codeblock中當變數名長度大於等於3時,通過雙擊該變數,可以高亮出所有該變數出現的位置,方便debug。同時定義一個有含義的變數,可以讓自己明白它的含義,在思路出現混亂的時候,可以快速理清自己要做什麼,在做什麼。 如下圖就是高亮的情況。
再細心思考的同學,可以注意我用了三個長度一樣數組。引出第二種定義方法,帶你們寫出更優美的代碼
using namespace std;#define maxn 1000int value[maxn];int matrix[maxn];int name[maxn];int main(){ }
我們採用宏定義 #define maxn 1000 這句語句可以簡單理解為,以後出現maxn,都會被編譯器用1000替換。(興趣深挖) 這樣寫的效果等價上一份代碼。好處是,我只需要修改maxn的值,就可以改變三個數組的長度,在探索資料範圍搞錯的情況下,只需修改一處即可。 但是,每個數組的長度都不一樣的是,最好不要採用多個宏定義的方式,可以選擇最大的一個定義即可,然後把其他數組都開大一些。(this is called trick)
這裡介紹一個ACM中常用的宏定義的方法
#define ll long longll a = 0;
這裡用ll代替 long long , 我們定義一個長整型的整數的時候就可以用ll代替了,方便省事。
優美的代碼格式 沒錯,這篇部落格的目的,相比第二篇,是要告訴你一些顯然的讓自己B格能能夠體現出來的方式,我們稱之為 ‘姿勢’,一個優美的代碼姿勢往往會給你帶來不可思議的優勢(等你們寫多了就能體會)。 姿勢優美的代碼能帶來好處, 第一,作為助教能更清楚看懂你們的邏輯結構,快速定位錯誤。 第二,展現你們代碼的成熟與優秀,區別出新手和專業人員。 talk is cheap, see the code 。
#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<cstdio>using namespace std;#define maxn 1000 //宏定義,能清晰地判斷出資料範圍是否考慮到了int value[maxn]; //良好的變數定義,能明白這個變數的作用,也能快速定位這個變數出現的位置int matrix[maxn];int name[maxn];int main(){ int n, m, u, v; // 用空格分開變數,讓結構顯的更加清晰 cin>>n; // 代碼對齊屬於同一層的代碼縮排量相同, for(int i = 0;i < n; i++){ //助教強烈推薦的括弧的使用方式,這種方式可以可以讓代碼 //顯得更加簡短,簡潔幹練本身就是一種優美 if(i == 0){ //第二層括弧 u = i; //代碼對齊 v = i; m = u * v + v; //這裡還是體現空格的作用 } if( i != 0){ //注意,代碼是緊湊的,請不要添加過多的無用的空白行 } } return 0;}
在實際寫代碼的過程中,發現有些同學會重複定義變數例如
int k=10; for(int i = 0;i < k; i++){ int k = 8; while(k--){ int k = 10 * 9; if(k > 9) break; } }
這種情況會導致不可預知的錯誤。請注意每個變數的範圍。不要重複定義。
例子先簡單的示範成這樣,能做到這樣,便離優秀的程式員越來越接近啦。 我不展示不太規範的代碼,因為你們只需要看到和學習優秀的東西即可(^_^)。