當前位置:首頁 » 編程軟體 » 編程技巧

編程技巧

發布時間: 2022-01-11 02:54:42

⑴ 程序員如何提高自己的編程技巧

可讀性:函數命名隨意,實現邏輯混亂,代碼格式不統一。。。
可靠性:程序運行很難穩定,bug百出。。。
維護性:代碼邏輯沒有層次,混成一團,很難維護改進
移植性、重用性:許多人寫的代碼,只能各自使用,很少有能共享的功能性代碼
高效性:很少從演算法、資源佔用、執行效率等角度去考慮,經常導致伺服器負載過重
那麼我們改進時,就可以從以上幾點出發。
總結了一下自己以前的經驗,主要有以下幾點:
提高自己的程序語言基礎。對於許多新手程序員來說,只是簡單的學會了該語言,知道一些簡單的用法。但是實際編程的時候,許多寫法、用法不標准。舉一個很常見的例子:許多人剛剛學c++,java等面向對象編程的語言時,雖然知道了類、知道了類一般都有「多態」的特性,但是他們還是經常會用「類型判斷」去判斷某個對象是屬於哪個類的實例、然後強制轉換、再調用方法。卻完全忽略可以用多態來避免這種醜陋的實現!
熟悉語言規范。如果不知道自己所學的語言還有規范,那麼建議你現在去查找。說個簡單的規范,Java的類名要取得有意義、首字母要大寫。再比如:一個函數只實現一個功能。再比如一個復雜的:連續的if else條件判斷最好不要超過10個。
培養自己嚴謹的邏輯思維能力。我們寫程序,至少都會在腦海里走一遍程序的流程。如果流程走通最後卻出現bug,那麼就是流程的某個細節我們沒有考慮到!有的時候,我們總是自認為自己已經考慮的非常全面了,其實不然。同樣舉一個例子:對一個集合,寫個for循環按照一定的條件刪除裡面的元素。其實這裡面隱藏了一個「集合在動態變化」的陷阱。比如說,將第一個元素刪除了,如果集合的數據結構是將第二個元素移動到第一個元素上,那麼,第二個元素就遍歷不到了。所以,有時候,我們看似很簡單,覺得邏輯非常正確的代碼,可能就潛伏著陷阱。
熟悉所用語言的API。學一門語言,其實不只是學語法,學語義。更重要的是學基本的API類庫。因為你實際編程的時候,自己所寫的代碼其實很少,大部分都是用的別人的API,將許多API的功能穿起來,才是自己實現的功能。用好的API,能增加代碼質量、提高代碼可讀性、減少代碼bug、減少工作量。就比如說堆棧這個數據結構,程序員基本都知道,但是大部分人可能都不能實現一個正確的堆棧API。
熟悉了解一些數據結構、演算法。平常寫程序時,或多或少都要接觸一些常用的數據結構,比如說鏈表、map等,了解它們的原理對於那些沒學過數據結構的人來說很重要。很多時候,一個簡單的功能被實現的超級復雜的原因就是沒有使用簡單清晰的數據結構。
掌握一些編程思想、設計模式,這會讓你的代碼更加具有結構性、條理更加清晰!比如說,面向介面的編程思想,能讓你的代碼易於修改、易於擴展。如果更進一步,站在架構的角度去考慮。
多看高手代碼,讀一些優秀的開源代碼,看一些經典的書籍。比如說《Effective C++》、《Effective Java》、lucene的源碼。這些會讓你提升巨大,只有了解到高手眼中的世界,才能有成為高手的可能!
代碼重構。多回顧之前寫的代碼,進行一個系統性的整理。因為我們起初開發,不是面面都能想到,許多新東西是不可避免的,這就意味著可能會導致一些邏輯混亂。在開發完成後,多回顧回顧,尋找能改進之處,這也是一種進步。
即時缺少高屋建瓴的能力,我們也應該多從全局的角度去考慮整個工程的代碼的層次、模塊、架構等問題點。可以嘗試著進行功能點拆分、介面交互設計等工作。
為自己的代碼添加測試用例。可能因為懶惰,許多程序員基本都不會為自己的代碼添加測試用例,這其實是一個不好的習慣。即時是有測試人員的團隊,添加測試用例對你的好處也是顯而易見的。
至於從團隊的角度,可以考慮建立以下幾點:完整的規范、執行流程、review機制和輔助工具。由於本篇文章主要針對的是個人,就不展開。工具方面,可以考慮開源的ReviewBoard。
個人的代碼質量提上來,團隊的水平才能提上來,公司的效率才能提升。其實最主要的是,個人的層次、境界才能提升!

⑵ 剛開始學編程需要掌握哪些知識和技巧

1 許多人都說要養成良好的編程習慣,那請問什麼才算是良好的編程習慣? 1. 遵循命名規則 一個應用程序的命名規劃必須保持一致性和可讀性。任何一個實體的主要功能或用途必須能夠根據命名明顯的看出來。因為ActionScript是一個動態類型的語言,命名最好是包含有代表對象類型的後綴。一般而言,名詞_動詞和形容詞_名詞之類的語法是最常用的命名方式,如: 影片名字:my_movie.swf URL實體:course_list_output 組件或對象名稱:chat_mc 變數或屬性:userName 方法和變數的名稱應該以小寫字母開頭,對象和對象的構造方法應該大寫。命名變數的時候使用大小寫混和的方式,並且使用字母打頭,還可以包含數字和下劃線。 下面的一些命名是非法的: _count =5 ;//首字元不能使用下劃線 5count = 0;//首字元不能使用數字 foo/bar = true;//包含非法字元 另外,ActionScript使用的保留字不能用來命名變數。 ActionScript是基於ECMAScript,所以我們可以根據ECMAScript的規范來命名。如, course_list_output = "foo"; //全部小寫,使用下劃線分割字串 courseListOutput = "foo"; // 大小寫混和的方式 BASEURL = http://www.foo.com; // 常量使用全部大寫 MAXCOUNTLIMIT = 10; MyObject = function(){ }; // 構造函數 f = new MyObject(); // 對象 注意;良好的命名規范還可以使用Flash的代碼提示功能。 2. 給你的代碼添加註釋 使用代碼注釋能夠使得程序更清晰,也便於我們閱讀。Flash支持的代碼注釋方法有兩種: 單行注釋,通常用於變數的說明 var clicks = 0; // variable for number of button clicks 多行注釋,通常用於功能說明和大段文字的注釋: /* Initialize the clicks variable that keeps track of the number of times the button has been clicked. */ 一些具有特定意思的注釋方法: // :TODO: topic 表明一個主題的開始 // :BUG: [bugid] topic 顯示了一個BUG所在 // :KLUDGE: 表明下面的代碼並不完善,可能存在問題 // :TRICKY: 告訴開發人員下面的代碼具有相互作用,修改之前請謹慎 3. 保持代碼的整體性 無論什麼情況,應該盡可能保證所有代碼在同一個位置,這樣使得代碼更容易搜索和調試。我們在調試程序的時候很大的困難就是定位代碼,如果大部分代碼都集中在同一幀,問題就比較好解決了。通常,我們把代碼都放在第一幀中,並且單獨放在最頂層。如果在第一幀中集中了大量的代碼,記得用注釋標記區分,並在開頭加上代碼說明。 //=========================================== // 視頻語音聊天系統 // FCAVPresence組件 // Copyright ◎2002 Macromedia, Inc. All rights reserved. // 完 善: Liu21st, [email protected] //--------------------------------------------------------- 在獨立的功能模塊前面加上類似的標註: //=========================================== // 參數初始化 //--------------------------------------------------------- 4. 初始化應用程序 記得一定要初始化你的應用程序,init函數應該是你的應用程序類的第一個函數,如果使用面向對象的編程方式則應該在構造函數中進線初始化工作。該函數只是對應用程序中的變數和對象初始化,其它的調用可以通過事件驅動。 下面的例子可以說明如何進線初始化 function FCAVPresenceClass() { this.init(); } FCAVPresenceClass.prototype.init = function() { this.name = (this._name == null ? "_DEFAULT_" : this._name); this.prefix = "FCAVPresence." + this.name + "."; }; 5.使用局部變數 所有的局部變數使用關鍵字var來申明,這樣可以避免被全局變數訪問,更重要的是,可以保證變數不被覆蓋和混淆程序邏輯。例如,下面的代碼沒有使用var來申明,覆蓋了其它變數。 counter = 7; function loopTest() { trace(counter); for(counter = 0; counter < 5; counter++) { trace(counter); } } trace(counter); loopTest(); trace(counter); 輸出結果為: 7 7 0 1 2 3 4 5 6. 創建對象時使用原型添加方法和屬性 當我們創建一個對象的時候,應當使用原型方式來添加對象的方法或屬性,使得該方法或屬性能夠被所有該對象或子對象的實體所訪問。這種能夠確保內存中每個函數只有一份拷貝。作為一般的規則,不要在構造函數中定義方法。下面是一個正確的例子: // Best practice for creating an object MyObject = function() { } MyObject.prototype.name = ""; MyObject.prototype.setName = function(name) { this.name = name; } MyObject.prototype.getName = function() { return this.name; } 下面這段代碼是不可取的: // Less desirable practice for creating an object MyObject = function() { this.name = ""; this.setName = function(name) { this.name = name; } this.getName = function() { return this.name; } } 使用上面的方式在每個對象的實體被創建的時候都會實體重新復制每一個屬性和方法,會加重系統的內存開銷。 7. 規范命名方式獲取代碼提示功能 在平時學習理論知識的時候要主意些什麼?實踐的時候又應該主意什麼? 理論學需要注意1 .聯系實際應用 比如: 你學了一種演算法,就要想那裡會用到。 2.避免前人的犯過的錯誤 比如:指針初始化 實踐的時候: 1.不斷總結自己犯下的錯誤 ,哪怕是非常小的,這樣天長日久才能養成良好的編程風格。 2.讀別人的代碼。從中吸取你需要的,因為不是每個編程項目,都是要從零開始的。只有站在前人的肩膀上才能走的更遠。 3 許多人都說編程思想是編程裡面非常重要的一點,請問對於初學者該怎麼樣從一開始就慢慢領悟這種思想? 答:思想來源與不斷的實踐 ,不斷總結前人和自己的錯誤,不斷地與人分享自己的觀點(比如我現在回答你的問題),不斷地討論(其中可能有意想不到的靈感) 只有勤奮,與執著的追求才能讓你成為一位優秀的編程人員 4 曾經有人跟我說過學編程搞軟體開發還需要學習微機原理,請問是不是如此?如果是,請順便指點一下此課程的學習方法 答:學習微機原理? 初學者不需要學它。那是做開發用的。你現在是要把基礎打好,等你打好基礎,在慢慢就能看到其中的奧秘 謝謝! 歡迎交流

⑶ 求編程方法

求編程方法?C語言是面向過程的,而C++是面向對象的
C和C++的區別:
C是一個結構化語言,它的重點在於演算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。
C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「 設計這個概念已經被融入到C++之中 」。

C與C++的最大區別:在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「 設計這個概念已經被融入到C++之中 」,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程序設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,「C加上好的設計」也能寫出非常好的東西。

原題
解題
思路
初始化i=100。
①取i的各位數,百位a,十位b,個位c。
②判斷i==a∧3+b∧3+c∧3 是否成立
③如果成立則輸出,否則不輸出。
④i=i+1,當i小於1000重復①,否則結束。
關鍵演算法:取任意三位數的各位數
小編推薦一個學C語言/C++的學習裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
演算法一:除減法
①將數除以100,由整型數據特點,小數點後被忽略,取得百位a。
②該數減去a * 100,除以10,得到十位b。
③該數減去a * 100和b * 10即得個位c。
代碼實現
a = i / 100;b = (i - 100 * a) / 10;c = i - 100 * a - 10 * b;
完整代碼:
void NarcissusNumber(int m) { int a; //三位數的百位 int b; //三位數的十位 int c; //三位數的個位 int d; //各位數字立方和與數的差值 a = m / 100; b = (m - 100 * a) / 10; c = m - 100 * a - 10 * b; d = a*a*a + b*b*b + c*c*c - m; if (d==0) //各位數字立方和與數相等,輸出 { printf("%d ", m); }}
好處:易理解,菜鳥基本都會這演算法。
不足:當數字位數較大時,減法操作需要進行多次,比較代碼比較冗長。

⑷ 學習編程有什麼技巧

還是需要動手操作聯系,看視頻,或者看書,感覺都是理所當然,但自己實際操作起來,就又不會了,所以還是要真正動手,編程,不能眼高手低

⑸ 幾個C#編程的小技巧

主要方法
參數地址傳遞
有點時候需要對兩個參數操作,這樣用返回值實現其來就復雜了。要明白引用傳遞,對於值類型來說:修飾符ref修飾。
參數個數方法
在寫方法時,有時常為參數個數發愁。例如有的參數希望如果調用傳值了就用所串的值,如果沒有傳值就不處理它。這里有道一個修飾符 params。如果個數不確定就用數組
params int[]number
循環比較思想
想找出一個集合中的之最,就用循環比較法,例如找一個數組中的最大值。這種編程思想可以應用的很多,要發散思維。
?private static int GetMax(int[] arr)

{

int max = arr[0];

for (int i = 0; i< arr.Length; i++)

{

if (max < arr[i])

{

max = arr[i];

}

}

return max;

}
保留小數位問題
有客戶需求要保留兩位小數,可是有的恰好就一位小數怎麼辦。這里用到format方法。string numStr = string.Format("{0:0.00}",2.3);
字元串處理
查找字元串中的字元
IndexOf(keyWord,index)返回值是字元所在索引,index 開始查詢位置,keyWord是要查找的字元。
字元串切割與拼接方法

?

1、Split(new char[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries);
這是按照空格切成字元串數組,要注意後面的參數表示去掉空字元串。
2、string.Join(" ", text);拼接字元串 以空格連接字元串數組中元素
3、將字元串轉化成字元數組 ToCharArray()
索引器的編寫
有的一些對象可以像調用數組那樣調用,例如person[0]。其實這是應為有「索引器」
public string this[int index]

{

get { returnNames[index]; }

set { Names[index] = value;}

}
反向排序
反向拍序思想,以簡單的數組為例。
1總結
這節沒有將太多新知識,都是寫小知識點。關於一些思想也是特簡單的,但是要明白它們不止可以用於數組。也可以用於集合,比較對象的某個欄位。

⑹ C語言編程的一些技巧

也沒啥技巧,就是要注意,一般情況下,開頭的main函數,以及「;」符號,還有「{}」

⑺ 數控編程技巧

循環鑽孔指令沒有深度Z,X是半徑Y是起始夾角。G90格式:後面依次寫每個孔與起始軸的夾角(用Y)就可以了,適用於非均勻分布的孔。用G91格式鑽均勻分布孔更方便,格式
……(相同,省略)
G91 Y(每孔之間夾角) K(孔數量);
G80 G15;

⑻ C語言中有哪些實用的編程技巧

這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數學方法解決問題以及使用位操作等編輯技巧,並給出若干方法和代碼實例,需要的朋友可以參考下

引言:

編寫高效簡潔的C語言代碼,是許多軟體工程師追求的目標。本文就工作中的一些體會和經驗做相關的闡述,不對的地方請各位指教。

第1招:以空間換時間

計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招——以空間換時間。

例如:字元串的賦值。

方法A,通常的辦法:

代碼如下:

#define LEN 32

char string1 [LEN];

memset (string1,0,LEN);

strcpy (string1,「This is a example!!」);

方法B:

代碼如下:

const char string2[LEN] =「This is a example!」;

char * cp;

cp = string2 ;

(使用的時候可以直接用指針來操作。)

從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調用兩個字元函數才能完成。B的缺點在於靈 活性沒有A好。在需要頻繁更改一個字元串內容的時候,A具有更好的靈活性;如果採用方法B,則需要預存許多字元串,雖然佔用了大量的內存,但是獲得了程序 執行的高效率。

如果系統的實時性要求很高,內存還有一些,那我推薦你使用該招數。

該招數的變招——使用宏函數而不是函數。舉例如下:

方法C:

代碼如下:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

int BIT_MASK(int __bf)

{

return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);

}

void SET_BITS(int __dst, int __bf, int __val)

{

__dst = ((__dst) & ~(BIT_MASK(__bf))) | /

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

}

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

方法D:

代碼如下:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)

#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))

#define SET_BITS(__dst, __bf, __val) /

((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | /

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

函數和宏函數的區別就在於,宏函數佔用了大量的空間,而函數佔用了時間。大家要知道的是,函數調用是要使用系統的棧來保存數據的,如果編譯器里有棧檢查 選項,一般在函數的頭會嵌入一些匯編語句對當前棧進行檢查;同時,CPU也要在函數調用時保存和恢復當前的現場,進行壓棧和彈棧操作,所以,函數調用需要 一些CPU時間。而宏函數不存在這個問題。宏函數僅僅作為預先寫好的代碼嵌入到當前程序,不會產生函數調用,所以僅僅是佔用了空間,在頻繁調用同一個宏函 數的時候,該現象尤其突出。

D方法是我看到的最好的置位操作函數,是ARM公司源碼的一部分,在短短的三行內實現了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細體會。

第2招:數學方法解決問題

現在我們演繹高效C語言編寫的第二招——採用數學方法來解決問題。

數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。

舉例如下,求 1~100的和。

方法E

代碼如下:

int I , j;

for (I = 1 ;I<=100; I ++){

j += I;

}

方法F

代碼如下:

int I;

I = (100 * (1+100)) / 2

這個例子是我印象最深的一個數學用例,是我的計算機啟蒙老師考我的。當時我只有小學三年級,可惜我當時不知道用公式 N×(N+1)/ 2 來解決這個問題。方法E循環了100次才解決問題,也就是說最少用了100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了1個加法,1 次乘法,1次除法。效果自然不言而喻。所以,現在我在編程序的時候,更多的是動腦筋找規律,最大限度地發揮數學的威力來提高程序運行的效率。

第3招:使用位操作

實現高效的C語言編寫的第三招——使用位操作,減少除法和取模的運算。

在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效地提高程序運行的效率。舉例如下:

方法G

代碼如下:

int I,J;

I = 257 /8;

J = 456 % 32;

方法H

int I,J;

I = 257 >>3;

J = 456 - (456 >> 4 << 4);

在字面上好像H比G麻煩了好多,但是,仔細查看產生的匯編代碼就會明白,方法G調用了基本的取模函數和除法函數,既有函數調用,還有很多匯編代碼和寄存 器參與運算;而方法H則僅僅是幾句相關的匯編,代碼更簡潔,效率更高。當然,由於編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來看,效率的差距還是不小。相關匯編代碼就不在這里列舉了。

運用這招需要注意的是,因為CPU的不同而產生的問題。比如說,在PC上用這招編寫的程序,並在PC上調試通過,在移植到一個16位機平台上的時候,可能會產生代碼隱患。所以只有在一定技術進階的基礎下才可以使用這招。

第4招:匯編嵌入

高效C語言編程的必殺技,第四招——嵌入匯編。

「在熟悉匯編語言的人眼裡,C語言編寫的程序都是垃圾」。這種說法雖然偏激了一些,但是卻有它的道理。匯編語言是效率最高的計算機語言,但是,不可能靠著它來寫一個操作系統吧?所以,為了獲得程序的高效率,我們只好採用變通的方法 ——嵌入匯編,混合編程。

舉例如下,將數組一賦值給數組二,要求每一位元組都相符。

代碼如下:

char string1[1024],string2[1024];

方法I

代碼如下:

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I)

方法J

代碼如下:

#ifdef _PC_

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I);

#else

#ifdef _ARM_

__asm

{

MOV R0,string1

MOV R1,string2

MOV R2,#0

loop:

LDMIA R0!, [R3-R11]

STMIA R1!, [R3-R11]

ADD R2,R2,#8

CMP R2, #400

BNE loop

}

#endif

方法I是最常見的方法,使用了1024次循環;方法J則根據平台不同做了區分,在ARM平台下,用嵌入匯編僅用128次循環就完成了同樣的操作。這里有 朋友會說,為什麼不用標準的內存拷貝函數呢?這是因為在源數據里可能含有數據為0的位元組,這樣的話,標准庫函數會提前結束而不會完成我們要求的操作。這個 常式典型應用於LCD數據的拷貝過程。根據不同的CPU,熟練使用相應的嵌入匯編,可以大大提高程序執行的效率。

雖然是必殺技,但是如果輕易使用會付出慘重的代價。這是因為,使用了嵌入匯編,便限制了程序的可移植性,使程序在不同平台移植的過程中,卧虎藏龍,險象環生!同時該招數也與現代軟體工程的思想相違背,只有在迫不得已的情況下才可以採用。切記,切記。

熱點內容
smsforandroid 發布:2024-11-13 09:20:22 瀏覽:675
如何查找公司郵件伺服器與埠 發布:2024-11-13 08:55:12 瀏覽:530
pythonrequests文件 發布:2024-11-13 08:52:27 瀏覽:222
速騰安卓大屏什麼牌子好 發布:2024-11-13 08:49:59 瀏覽:664
黑岩上傳 發布:2024-11-13 08:49:18 瀏覽:33
Python高清 發布:2024-11-13 08:41:20 瀏覽:737
阿里雲伺服器很慢 發布:2024-11-13 08:29:27 瀏覽:720
老年公寓項目醫療怎麼配置 發布:2024-11-13 07:58:24 瀏覽:948
破解加密視頻的工具 發布:2024-11-13 07:40:37 瀏覽:94
java對日 發布:2024-11-13 07:26:44 瀏覽:191