軟件研究室培訓(xùn)(編程規(guī)范)_第1頁(yè)
軟件研究室培訓(xùn)(編程規(guī)范)_第2頁(yè)
軟件研究室培訓(xùn)(編程規(guī)范)_第3頁(yè)
軟件研究室培訓(xùn)(編程規(guī)范)_第4頁(yè)
軟件研究室培訓(xùn)(編程規(guī)范)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2021/5/911、程序員花更多的時(shí)間在調(diào)試、維護(hù)和升級(jí)已有代碼上,而不是編寫(xiě)新的代碼;2、程序最重要的是正確性,其次是可維護(hù)性,最后才是效率;3、學(xué)習(xí)如何寫(xiě)優(yōu)美的程序與學(xué)習(xí)如何正確地編寫(xiě)代碼同樣重要;4、讓程序盡量簡(jiǎn)單易懂,即使違背了某些規(guī)則也無(wú)關(guān)緊要;5、一個(gè)運(yùn)行正常但沒(méi)有注釋的程序如同一個(gè)等待爆炸的定時(shí)炸彈,因?yàn)樵缤頃?huì)有人修改或升級(jí)這個(gè)程序;6、好風(fēng)格應(yīng)該成為一種習(xí)慣。如果你在開(kāi)始寫(xiě)代碼時(shí)就關(guān)心風(fēng)格問(wèn)題,如果你花時(shí)間去審視和改進(jìn)它,你將會(huì)逐漸養(yǎng)成一種好的編程習(xí)慣。一旦這種習(xí)慣變成自動(dòng)的東西,你的潛意識(shí)就會(huì)幫你照料許多細(xì)節(jié)問(wèn)題,甚至你在工作壓力下寫(xiě)出的代碼也會(huì)更好。關(guān)于編程規(guī)范的幾個(gè)原則2021/5/92floatb,c[10];voidabc(void){floatzongfen=0;intd;for(d=0;d<10;d++){if(c[d]>0)zongfen+=c[b];b=zongfen/10;}這段程序在做什么?這段程序是否有錯(cuò)誤?這程序中存在哪些不良的書(shū)寫(xiě)風(fēng)格?它們可能會(huì)引起什么后果?程序?qū)嵗?021/5/93floatb,c[10];voidabc(void){floatzongfen=0;intd;for(d=0;d<10;d++){if(c[d]>0)zongfen+=c[b];b=zongfen/10;}#defineSTUDENT_NUM10//學(xué)生總數(shù)floatfAvgScore;//平均分floatfScore[STUDENT_NUM];//分?jǐn)?shù)/*平均分計(jì)算函數(shù)*/voidAvgScore(void){inti;floattotal_score=0;//總分

for(i=0;i<STUDENT_NUM;i++){//累加計(jì)算總分

if(fScore[i]>0)//遇到負(fù)分,記為0分

total_score+=fScore[i];}//計(jì)算平均分

if(STUDENT_NUM>0)fAvgScore=total_score/STUDENT_NUM;}有了哪些改進(jìn)?你認(rèn)為還有什么地方需要改進(jìn)?2021/5/94一、標(biāo)識(shí)符

標(biāo)識(shí)符的命名要清晰、明了,有明確含義。使用完整的單詞或大家基本可以理解的縮寫(xiě),避免使人產(chǎn)生誤解。

標(biāo)識(shí)符應(yīng)當(dāng)采用英文單詞或其組合,切忌使用漢語(yǔ)拼音來(lái)命名。壞的命名:inta/Age1/XueshengAge;

好的命名:intStudentAge;

1.1變量名1.1.1不同作用域變量的命名局部變量以小寫(xiě)字母命名;全局變量以首字母大寫(xiě)方式命名(駱駝式);定義類(lèi)型和宏定義常數(shù)以大寫(xiě)字母命名;變量的作用域越大,它的名字所帶有的信息就應(yīng)該越多。

局部變量:intstudent_age;

全局變量:intStudentAge;

宏定義常數(shù):#defineSTUDENT_NUM10

類(lèi)型定義:typedefINT16Sint;2021/5/951.1.2不同類(lèi)型變量的命名(匈牙利命名法)匈牙利命名法是一種命名約定。匈牙利命名法把變量的類(lèi)型

(或者它的預(yù)期使用)

等信息編碼在變量名中。一些常用的匈牙利命名法前綴數(shù)據(jù)類(lèi)型前綴例子

charccInCharunsignedcharucucOutCharintiiReturnValueunsignedintuiuiControlWordlongllNumRecsfloatffLengthdoubleddArea一、標(biāo)識(shí)符2021/5/961.1.3指針變量的命名對(duì)于指針的定義,名稱(chēng)大小寫(xiě)根據(jù)指針為全局/局部變量來(lái)定,但指針名必須以小寫(xiě)的“p”開(kāi)頭。如:

int*pDay;//全局指針

int*pday;//局部指針

int**ppDay;//指針的指針1.1.4在某一模塊中使用的變量,變量名的開(kāi)始需有模塊名。如:模塊KEY.C中的變量:

intiKeyNum;intiKeyNumBuff[10];一、標(biāo)識(shí)符2021/5/97一、標(biāo)識(shí)符1.2函數(shù)名函數(shù)名的命名應(yīng)象全局變量一樣采用首字母大寫(xiě)方式(駱駝式)。函數(shù)名的開(kāi)始應(yīng)以“模塊名_”的格式注明函數(shù)所屬模塊。例如:(1)KEY.C模塊的函數(shù)

voidKEY_Init(void);voidKEY_StartScan(void);voidKEY_StopScan(void);

(2)TMR.C模塊的函數(shù)

voidTMR_Init(void);voidTMR_Start(TMR_IDtmr);voidTMR_Stop(TMR_IDtmr);2021/5/98二、排版

名字的合理選擇可以幫助理解程序。同樣,也應(yīng)該以盡可能一目了然的形式書(shū)寫(xiě)語(yǔ)句。這就像保持書(shū)桌整潔可以使你容易找到東西一樣。2.1用縮進(jìn)格式書(shū)寫(xiě)代碼函數(shù)或過(guò)程的開(kāi)始、結(jié)構(gòu)定義及循環(huán)、判斷等語(yǔ)句中的代碼都要采用縮進(jìn);縮進(jìn)的空格數(shù)為4個(gè);使用空格鍵,不使用TAB鍵;程序塊的分界符(‘{’和‘}’)應(yīng)各獨(dú)占一行。例:for(i=0;i<STUDENT_NUM;i++){//累加計(jì)算總分

if(fScore[i]>0){//遇到負(fù)分,記為0分

total_score+=fScore[i];}}2021/5/99二、排版2.2其他書(shū)寫(xiě)格式2.2.1長(zhǎng)語(yǔ)句較長(zhǎng)的語(yǔ)句(多于80字符)要分成多行書(shū)寫(xiě);

長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首;

劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀;不允許把多個(gè)短語(yǔ)句寫(xiě)在一行中,即一行只寫(xiě)一條語(yǔ)句。例:修改前:MeasData.TransT[dir]=TransT[dir]*SetData.Filter+TransT[dir]*(1-SetData.Filter);

修改后:MeasData.TransT[dir]=TransT[dir]*SetData.Filter+TransT[dir]*(1-SetData.Filter);

2021/5/910二、排版2.2.2空行和空格的使用相對(duì)獨(dú)立的程序塊之間、變量定義之后語(yǔ)句開(kāi)始以前必須加空行;逗號(hào)、分號(hào)只在后面加空格;比較操作符、賦值操作符、算術(shù)操作符、邏輯操作符、位域操作符等雙目操作符的前后加空格;“!”、“~”、“++”、“--”、“&”等單目操作符前后不加空格;

"->"、"."前后不加空格

。例:

voidFunc1(intx,inty,intz);//良好的風(fēng)格

voidFunc1(intx,inty,intz);//不良的風(fēng)格

x=a<b?a:b;//良好的風(fēng)格

x=a<b?a:b;//不好的風(fēng)格

int*x=&y;//良好的風(fēng)格

int*x=&y;//不良的風(fēng)格

2021/5/911三、表達(dá)式和基本語(yǔ)句3.1運(yùn)算表達(dá)式不要編寫(xiě)太復(fù)雜的復(fù)合表達(dá)式;例如:i=a>=b&&c<d&&c+f<=g+h;//復(fù)合表達(dá)式過(guò)于復(fù)雜不要有多用途的復(fù)合表達(dá)式;例如:d=(a=b+c)+r;//應(yīng)拆分為兩個(gè)語(yǔ)句:a=b+c;d=a+r;

如果代碼行中的運(yùn)算符比較多,用括號(hào)確定表達(dá)式的操作順序,避免使用默認(rèn)的優(yōu)先級(jí)。例如:

if(a|b&&a&c)//不良的風(fēng)格if((a|b)&&(a&c))//良好的風(fēng)格注意:

只需記住加減運(yùn)算的優(yōu)先級(jí)低于乘除運(yùn)算,其它地方一律加上括號(hào)。2021/5/912三、表達(dá)式和基本語(yǔ)句3.2if語(yǔ)句3.2.1布爾變量與零值比較不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。根據(jù)布爾類(lèi)型的語(yǔ)義,零值為“假”(記為FALSE),任何非零值都是“真”(記為T(mén)RUE)。TRUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。例如VisualC++將TRUE定義為1,而VisualBasic則將TRUE定義為-1。例:假設(shè)布爾變量名字為flag,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:if(flag)//表示flag為真時(shí)滿(mǎn)足條件if(!flag)//表示flag為假時(shí)滿(mǎn)足條件其它的用法都屬于不良風(fēng)格,例如:if(flag==TRUE)if(flag==1)if(flag==FALSE)if(flag==0)2021/5/9133.2.2整型變量與零值比較應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。例:假設(shè)整型變量為value,它與零值比較的標(biāo)準(zhǔn)if語(yǔ)句如下:if(value==0)if(value!=0)不可模仿布爾變量的風(fēng)格而寫(xiě)成if(value)//會(huì)讓人誤解value是布爾變量if(!value)3.2.3浮點(diǎn)變量與零值比較不可將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。千萬(wàn)要留意,無(wú)論float還是double類(lèi)型變量,都有精度限制。所以一定要避免將浮點(diǎn)變量用“==”或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>=”或“<=”形式。假設(shè)浮點(diǎn)變量的名字為x,應(yīng)當(dāng)將if(x==0.0)//隱含錯(cuò)誤的比較轉(zhuǎn)化為if((x>=-EPSINON)&&(x<=EPSINON))//EPSINON是精度三、表達(dá)式和基本語(yǔ)句2021/5/914三、表達(dá)式和基本語(yǔ)句3.2.3對(duì)if語(yǔ)句的補(bǔ)充說(shuō)明

有時(shí)候我們可能會(huì)看到這樣古怪的格式:

if(NULL=

=p)

不是程序?qū)戝e(cuò)了,是有經(jīng)驗(yàn)的程序員為了防止將if(p=

=NULL)

誤寫(xiě)成if(p=NULL),而有意把p和NULL顛倒。編譯器認(rèn)為if(p=NULL)

是合法的,但是會(huì)指出if(NULL=p)是錯(cuò)誤的,因?yàn)镹ULL不能被賦值。2021/5/915三、表達(dá)式和基本語(yǔ)句3.3switch語(yǔ)句

每個(gè)case語(yǔ)句的結(jié)尾不要忘了加break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)不要忘記最后那個(gè)default分支。即使程序真的不需要default處理,也應(yīng)該保留語(yǔ)句default:break;這樣做并非多此一舉,而是為了防止別人誤以為你忘了default處理。switch語(yǔ)句的標(biāo)準(zhǔn)格式是:switch(variable){casevalue1:…break;casevalue2:…break;…default:…break;}2021/5/916四、常量這是一個(gè)根據(jù)LCD的列來(lái)計(jì)算像素X坐標(biāo)的函數(shù):INT16ULCD_GetStX(INT8Ucol){INT16Ux;if(col>29)col=29;#ifLCD_MODE==_VGAx=150+(INT16U)col*8;#elifx=(INT16U)col*8;#endifreturn(x);}代碼中的數(shù)(29,8,150)都是什么意義?這些神秘的數(shù)給程序的閱讀和維護(hù)增加了很大的難度。2021/5/917#defineLCD_MAX_COL29//LCD最大列數(shù)#defineLCD_START_X150//LCD起始X坐標(biāo)#defineLCD_COL_WIDTH8//LCD列寬INT16ULCD_GetStX(INT8Ucol){INT16Ux;if(col>LCD_MAX_COL)col=LCD_MAX_COL;#ifLCD_MODE==_VGAx=LCD_START_X+(INT16U)col*LCD_COL_WIDTH;#elifx=(INT16U)col*LCD_COL_WIDTH;#endifreturn(x);}四、常量2021/5/918四、常量4.1為什么要用常量

如果不使用常量,直接在程序中填寫(xiě)數(shù)字或字符串,將會(huì)有什么麻煩?(1)程序的可讀性(可理解性)變差。程序員自己會(huì)忘記那些數(shù)字或字符串是什么意思,用戶(hù)則更加不知它們從何處來(lái)、表示什么。(2)在程序的很多地方輸入同樣的數(shù)字或字符串,難保不發(fā)生書(shū)寫(xiě)錯(cuò)誤。(3)如果要修改數(shù)字或字符串,則會(huì)在很多地方改動(dòng),既麻煩又容易出錯(cuò)。4.2定義常量的方法(1)#define宏定義(2)const常量(3)enum枚舉2021/5/9194.3#define宏定義使用最廣泛,如:

#defineMAX_TEACHER100缺點(diǎn):宏定義的常量沒(méi)有類(lèi)型,只進(jìn)行字符替換,沒(méi)有類(lèi)型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤。4.4const常量如:

constintMAX_STUDENT=100;優(yōu)點(diǎn):const常量有數(shù)據(jù)類(lèi)型,而宏常量沒(méi)有數(shù)據(jù)類(lèi)型。編譯器可以對(duì)前者進(jìn)行類(lèi)型安全檢查。缺點(diǎn):const常量無(wú)法在數(shù)組定義時(shí)作為數(shù)組長(zhǎng)度。如:

floatStudentHeight[MAX_STUDENT];//錯(cuò)誤四、常量2021/5/9204.5枚舉

enum{RED,BLUE,GREEN,YELLOW,WHITE,BLACK,COLOR_NUM};優(yōu)點(diǎn):(1)適合一次定義批量常數(shù),尤其是在數(shù)值連續(xù)時(shí)尤為方便;

(2)枚舉常量可以作為數(shù)組長(zhǎng)度,如:

floatBallSize[COLOR_NUM];缺點(diǎn):不能定義除整型外的其他類(lèi)型常量,如float和double。四、常量2021/5/921

一個(gè)運(yùn)行正常但沒(méi)有注釋的程序如同一個(gè)等待爆炸的定時(shí)炸彈;而在有注釋?zhuān)⑨尣徽_時(shí),炸彈的當(dāng)量更大。注釋?xiě)?yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性。錯(cuò)誤的注釋不但無(wú)益反而有害。5.1注釋的基本概念C語(yǔ)言的注釋符為“/*…*/”。C++語(yǔ)言中,程序塊的注釋常采用“/*…*/”,行注釋一般采用“//…”。注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說(shuō)明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過(guò)多地使用注釋。五、注釋2021/5/922五、注釋5.2注釋的準(zhǔn)確性邊寫(xiě)代碼邊注釋?zhuān)薷拇a同時(shí)修改相應(yīng)的注釋?zhuān)员WC注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。注釋?xiě)?yīng)當(dāng)準(zhǔn)確、易懂,防止注釋有二義性。錯(cuò)誤的注釋不但無(wú)益反而有害。盡量避免在注釋中使用縮寫(xiě),特別是不常用縮寫(xiě)。注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方。5.3變量、常量的注釋對(duì)于所有有物理含義的變量、常量,在定義和聲明時(shí)都必須加以注釋?zhuān)f(shuō)明其物理含義。變量、常量、宏的注釋?xiě)?yīng)放在其上方相鄰位置或右方。數(shù)據(jù)結(jié)構(gòu)定義和聲明(包括數(shù)組、結(jié)構(gòu)、類(lèi)、枚舉等),必須加以注釋。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋?xiě)?yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每個(gè)成員的注釋放在此成員的右方;同一結(jié)構(gòu)中不同成員的注釋要對(duì)齊。全局變量要有較詳細(xì)的注釋?zhuān)▽?duì)其功能、取值范圍、哪些函數(shù)或過(guò)程存取它以及存取時(shí)注意事項(xiàng)等的說(shuō)明。2021/5/923五、注釋如:#defineGUI_TXT_DISP_MOD0x0C//文本框內(nèi)文字顯示模式#defineGUI_TXT_RIGHT_DISP0x00//文本框內(nèi)文字左對(duì)齊顯示#defineGUI_TXT_LEFT_DISP0x04//文本框內(nèi)文字左對(duì)齊顯示#defineGUI_TXT_CENTRE_DISP0x08//文本框內(nèi)文字居中顯示typedefstruct{CTR_ASPECTAspect;//外觀

INT8U*pTxt;//文字

INT8UTxtFont;//字體

INT8USta;//文本框狀態(tài)模式

INT8UWorkMod;//工作模式}TXT_BOX;2021/5/924五、注釋5.4函數(shù)的注釋/**********************************************************************可編輯文本框選項(xiàng)左移****功能描述:按向左鍵時(shí),可編輯文本框的編輯位向左移一位。**輸入?yún)?shù):pbox指向可編輯文本框的指針**返回參數(shù):無(wú)**作者:Liy-tj

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論