版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、課程設(shè)計(jì)目的1、 使學(xué)生對所學(xué)理論知識進(jìn)行一次綜合性復(fù)習(xí);2、 培養(yǎng)學(xué)生對實(shí)際問題的分析能力; 3、 培養(yǎng)學(xué)生獨(dú)立編程、開發(fā)軟件的動手能力;4、 培養(yǎng)學(xué)生開放思維的創(chuàng)新能力;5、 培養(yǎng)學(xué)生熟練掌握VC+調(diào)試技能;6、 培養(yǎng)學(xué)生規(guī)范的編程習(xí)慣;7、 培養(yǎng)學(xué)生團(tuán)隊(duì)協(xié)作精神;8、 培養(yǎng)學(xué)生撰寫課程設(shè)計(jì)報告的能力;9、 認(rèn)識MFC開發(fā)環(huán)境。(附加)二、課程設(shè)計(jì)要求為了能更好地達(dá)到課程設(shè)計(jì)的目的,要求學(xué)生:1、每次上機(jī)前充分做好準(zhǔn)備工作,查閱資料,預(yù)習(xí)相關(guān)內(nèi)容,對課程設(shè)計(jì)內(nèi)容進(jìn)行方案的預(yù)設(shè)計(jì),編制出源程序代碼。2、充分利用上機(jī)時間完成源程序代碼的輸入、調(diào)試及優(yōu)化。3、程序代碼的編制應(yīng)按照C+編碼規(guī)范
2、的要求進(jìn)行,具體可參考指導(dǎo)書中【附件一】“C+編碼規(guī)范”。4、課程設(shè)計(jì)結(jié)束后,按照指導(dǎo)書中【附件二】“課程設(shè)計(jì)報告格式”的要求撰寫出課程設(shè)計(jì)中期設(shè)計(jì)報告(要求用A4紙打印)。5、按題目要求獨(dú)立完成課程設(shè)計(jì),不曠課、不遲到、不早退、遵守機(jī)房規(guī)定、愛護(hù)機(jī)房設(shè)備。三、課程設(shè)計(jì)內(nèi)容和時間分配1、課程設(shè)計(jì)內(nèi)容分為兩個部分:(1)課程設(shè)計(jì)基本練習(xí)題目:A組(完成一題)、B組(完成一題)、C組(完成兩題);(2)課程設(shè)計(jì)中期設(shè)計(jì)題目:共1題;2、實(shí)習(xí)中,建議每天完成一道題目。在課程設(shè)計(jì)中,同學(xué)們可以根據(jù)自己的實(shí)際情況,時間上酌情調(diào)整。3、課程設(shè)計(jì)的成績與題目完成的數(shù)量、質(zhì)量、創(chuàng)新程度、回答提問、課程設(shè)計(jì)報告
3、以及平時表現(xiàn)等有關(guān),具體請看指導(dǎo)書“成績評定及評分標(biāo)準(zhǔn)”。四、課程設(shè)計(jì)題目I、課程設(shè)計(jì)基本練習(xí)題目(18分4)【A組】請從以下1-3題中任意選做一題1、輸出1至100之間每位數(shù)的乘積大于每位數(shù)的和的數(shù),例如對于數(shù)字12,有1*22+7,故輸出該數(shù)。2、編寫一個程序,求出所有的“水仙花數(shù)”。所謂水仙花數(shù),是指一個三位數(shù),其各位數(shù)字的立方和恰好等于該數(shù)本身。例如153=1*1*1+5*5*5+3*3*3,所以153是水仙花數(shù)。3、求任意n個數(shù)中的最大數(shù)和最小數(shù):先輸入一個正整數(shù)n(個數(shù)),而后再輸入任意n個實(shí)數(shù),找出這n個數(shù)中的最大數(shù)及最小數(shù)并顯示出來?!綛組】請從以下4-6題中任意選做一題4、對
4、兩個有序數(shù)組進(jìn)行合并:設(shè)有如下數(shù)組A、B,并假設(shè)兩個數(shù)組的元素都已經(jīng)有序(從大到小降序排列)。編程序,合并A、B數(shù)組形成一個新的數(shù)組C,并使C的元素仍有序(從大到小降序排列)。int A10=123,88,86,86,33,15,7,0,-1,-3;int B10=86,69,51,50,27,19,15,12,5,2;5、統(tǒng)計(jì)若干行(字符串)中的關(guān)鍵字各出現(xiàn)了多少次:從鍵盤輸入n個字符串(每串為一行最多80個字符,且輸入時以回車結(jié)束每一行),先存放在一個二維字符數(shù)組中。而后統(tǒng)計(jì)全體行中如下10個C+關(guān)鍵字各自出現(xiàn)的次數(shù),并將結(jié)果顯示在屏幕上。要統(tǒng)計(jì)的關(guān)鍵字有:int,float,double
5、,if,else,for,while,do,case,break。6、計(jì)算兩個日期之間的間隔天數(shù):從鍵盤輸入兩個日期(如以year1,month1,day1以及year2,month2,day2的方式來輸入它們),而后計(jì)算出這兩個日期的間隔天數(shù)并在屏幕上顯示出結(jié)果。 要求編制具有如下原型的函數(shù)difs2Date: long difs2Date(int y1,int m1,int d1,int y2,int m2,int d2);它負(fù)責(zé)計(jì)算出兩個日期的間隔天數(shù)并返回,要求將該函數(shù)的代碼存放到一個叫做“difs2Date.h”的頭文件中,而在main函數(shù)的主文件中通過include編譯預(yù)處理命令將
6、該頭文件的內(nèi)容包含進(jìn)來,并在main主函數(shù)中通過調(diào)用difs2Date函數(shù)來實(shí)現(xiàn)所需的計(jì)算。【C組】請從以下7-10題中任意選做2題7、編寫一個程序計(jì)算兩個給定長方形的面積,其中在設(shè)計(jì)類成員函數(shù)addarea()(用于計(jì)算兩個長方形的總面積)時使用對象作為參數(shù)。8、以面向?qū)ο蟮母拍钤O(shè)計(jì)一個類,此類包含3個私有數(shù)據(jù):unlead(無鉛汽油)、lead(有鉛汽油)以及total(當(dāng)天總收入)。無鉛汽油的價格是17元/公升,有鉛汽油的價格是16元/公升。請以構(gòu)造函數(shù)方式建立此值。試輸入某天所加的汽油量,本程序?qū)⒘谐黾佑驼井?dāng)天的總收入。9、設(shè)計(jì)一個時間類Time,包括3個數(shù)據(jù)成員,時(h)、分(m)、
7、秒(s),另外包括存取各數(shù)據(jù)成員和設(shè)置時間的成員函數(shù),按上、下午各12小時或按24小時輸出時間的成員函數(shù),以及默認(rèn)構(gòu)造函數(shù),默認(rèn)時間值為0時0分0秒。10、編寫一個程序,輸入3個學(xué)生的英語和計(jì)算機(jī)成績,并按總分從高到低排序(要求設(shè)計(jì)一個學(xué)生類Student)。II、課程設(shè)計(jì)中期設(shè)計(jì)題目(28分1)11. 求解一元二次方程。一元二次方程的定義為: ax2+bx+c=0(1)如果b2 -4ac0,方程有兩個不同的實(shí)根,分別是: (2)如果b2 -4ac 0,方程沒有實(shí)根,但有虛根;(3)如果b2 -4ac= 0,方程有一個實(shí)根。請你編寫一個程序,使其能求出多個二次方程的根。該程序要詢問用戶是否想繼
8、續(xù)解下一個方程。用戶輸入1來繼續(xù),輸入其它數(shù)字,則終止程序。程序要求用戶輸入a,b和c,然后根據(jù)前面的條件計(jì)算,并輸出答案。要求:使用類實(shí)現(xiàn),(1) a,b,c為該類的私有成員變量;(2) 求根的實(shí)現(xiàn)為該類的成員函數(shù),形式為:/函數(shù)返回值:實(shí)根的個數(shù);/參數(shù):x- 用以返回實(shí)根值的數(shù)組;long CalResult(float x);(3) 該類還包含有參構(gòu)造函數(shù)、析構(gòu)函數(shù)。(4) 使用MFC工程實(shí)現(xiàn),可酌情加分。五、成績評定及評分標(biāo)準(zhǔn)由指導(dǎo)教師根據(jù)課程設(shè)計(jì)任務(wù)完成情況、現(xiàn)場提問、觀看運(yùn)行結(jié)果、評閱課程設(shè)計(jì)報告并參考學(xué)生平時表現(xiàn)等五方面給出課程設(shè)計(jì)成績。1、具體評分標(biāo)準(zhǔn)(見表5-1),成績等級
9、分為:A(100分)、B(80分)、C(70分)、D(60分)、E(60分)五檔或折合成百分制給出成績。表5-1 VC+課程設(shè)計(jì)評分暫行標(biāo)準(zhǔn)項(xiàng)目評定內(nèi)容評分標(biāo)準(zhǔn)(ABCDE)評分AD課堂檢查完成設(shè)計(jì)題目的數(shù)量與質(zhì)量(X1)超額完成設(shè)計(jì)題目,達(dá)到較高的程序設(shè)計(jì)水平,具有一定的創(chuàng)新性、實(shí)用性?;就瓿烧n程設(shè)計(jì)要求提問檢查基礎(chǔ)理論掌握情況(X2)回答問題準(zhǔn)確合理,概念表達(dá)清楚、有條理?;痉蠁栴}要求調(diào)試能力和軟件運(yùn)行檢查(X3)具有較強(qiáng)的調(diào)試程序的能力,操作熟練,程序運(yùn)行結(jié)果正確,界面友好,界面結(jié)構(gòu)合理。程序運(yùn)行結(jié)果基本符合要求課程設(shè)計(jì)報告課程設(shè)計(jì)報告情況檢查(X4)嚴(yán)格按照課程設(shè)計(jì)報告格式的要求
10、,設(shè)計(jì)文檔規(guī)范;書寫清晰有條理,圖文并貌,能夠總結(jié)算法或設(shè)計(jì)的優(yōu)缺點(diǎn),附有改進(jìn)意見、設(shè)計(jì)體會或心得?;具_(dá)到課程設(shè)計(jì)報告的要求平時表現(xiàn)出勤記載(X5)嚴(yán)格遵守機(jī)房規(guī)定,不遲到不早退,不做與課程設(shè)計(jì)無關(guān)的事情基本能按要求進(jìn)行課程設(shè)計(jì)總分總分(X1 +X2 +X3 +X4 +X5)/52、指導(dǎo)老師按優(yōu)秀、良好、中等、及格、不及格五檔提交成績,成績等級如下:優(yōu) 秀:90-100;良 好:80-89;中 等:70-79;及 格:60-69;不及格:60,成績不合格者需要重修。附件一、C+編碼規(guī)范1、文件組織(1) 文件結(jié)構(gòu)A、版權(quán)和版本的聲明版權(quán)和版本的聲明位于頭文件和定義文件的開頭(參見例1),主要
11、內(nèi)容有: 版權(quán)信息。 文件名稱,標(biāo)識符,摘要。 當(dāng)前版本號,作者/修改者,完成日期。 版本歷史信息。/Copyright (c) 2002-2005, 中國地質(zhì)大學(xué)/ All rights reserved./ / 文件名稱:輸入文件名,如filename.h/ 文件標(biāo)識:見配置管理計(jì)劃書/ 摘 要:簡要描述本文件的內(nèi)容/ / 當(dāng)前版本:1.1/ 作 者:輸入作者(或修改者)名字/ 完成日期:2002年7月20日/ 取代版本:1.0 / 原作者 :輸入原作者(或修改者)名字/ 完成日期:2002年5月10日例1 版權(quán)和版本的聲明B、頭文件的結(jié)構(gòu)頭文件由三部分內(nèi)容組成: 頭文件開頭處的版權(quán)和版本
12、聲明(參見例1)。 預(yù)處理塊。 函數(shù)和類結(jié)構(gòu)聲明等。假設(shè)定義文件的名稱為 box.h,定義文件的結(jié)構(gòu)參見例2。/ 版權(quán)和版本聲明見例1,此處省略。#include “graphics.h”/ 引用頭文件/ 全局函數(shù)的聲明void Function1();/ 類的聲明class CBox public: long GetSize(); private: long m_lWidth; .;例2 C+/C定義文件的結(jié)構(gòu)【規(guī)則2】引用信息順序標(biāo)準(zhǔn)的頭文件要放在前面,而且按照字母順序排列。標(biāo)準(zhǔn)頭文件和自己的頭文件之間應(yīng)該用空行分隔。【規(guī)則3】用 #include 格式來引用標(biāo)準(zhǔn)庫的頭文件(編譯器將從標(biāo)準(zhǔn)
13、庫目錄開始搜索)?!疽?guī)則4】用 #include “filename.h” 格式來引用非標(biāo)準(zhǔn)庫的頭文件(編譯器將從用戶的工作目錄開始搜索)?!窘ㄗh1】頭文件中只存放“聲明”而不存放“定義”在C+語法中,類的成員函數(shù)可以在聲明的同時被定義,并且自動成為內(nèi)聯(lián)函數(shù),如果從提高性能角度考慮是可取。除此之外的選擇,建議將成員函數(shù)的定義與聲明分開,不論該函數(shù)體有多么小?!窘ㄗh2】不提倡使用全局變量,盡量不要在頭文件中出現(xiàn)象extern int value 這類聲明。C、頭文件的作用 通過頭文件來調(diào)用庫功能。在很多場合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫即可。用戶只需要按照頭文
14、件中的接口聲明來調(diào)用庫功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的,編譯器會從庫中提取相應(yīng)的代碼。 頭文件能加強(qiáng)類型安全檢查。如果某個接口被實(shí)現(xiàn)或被使用時,其方式與頭文件中的聲明不一致,編譯器就會指出錯誤,這一簡單的規(guī)則能大大減輕程序員調(diào)試、改錯的負(fù)擔(dān)。2、命名規(guī)則比較著名的命名規(guī)則當(dāng)推Microsoft公司的“匈牙利”法,該命名規(guī)則的主要思想是“在變量和函數(shù)名中加入前綴以增進(jìn)人們對程序的理解”。例如所有的字符變量均以ch為前綴,若是指針變量則追加前綴p,如果一個變量由ppch開頭,則表明它是指向字符指針的指針。在程序體中應(yīng)基本遵循匈牙利命名規(guī)則。(1) 總則【規(guī)則6】標(biāo)識符應(yīng)當(dāng)直觀且可以拼讀,可望文知意,
15、不必進(jìn)行“解碼”。標(biāo)識符應(yīng)該采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名。【規(guī)則7】標(biāo)識符長度應(yīng)當(dāng)盡量符合“min-length & max-information”原則。單字符的名字也是有用的,常見如i,j,k,m,n,x,y,z等,它們通??捎米骱瘮?shù)內(nèi)的局部變量?!疽?guī)則8】程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識符。例如:int x, X;/ 變量x 與 X 容易混淆void foo(int x);/ 函數(shù)foo 與FOO容易混淆void FOO(float x);【規(guī)則9】命名規(guī)則盡量與所采用的操作系統(tǒng)或開發(fā)工具的風(fēng)格保持一致。例如Windows應(yīng)用程序的標(biāo)識符通常采用“
16、大小寫”混排的方式,如AddChild。而Unix應(yīng)用程序的標(biāo)識符通常采用“小寫加下劃線”的方式,如add_child。別把這兩類風(fēng)格混在一起用?!窘ㄗh3】盡量避免名字中出現(xiàn)數(shù)字編號,如Var1,Var2等,除非邏輯上的確需要編號?!窘ㄗh4】盡量使用公認(rèn)的無異義的縮寫,縮寫一般不超過4個字母。例如:HTML Hypertext Markup LanguageURL Uniform Resource Locatorcmd command init initialize【規(guī)則10】程序中不要出現(xiàn)標(biāo)識符完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發(fā)生語法錯誤,但會使人誤解?!疽?guī)則11】變
17、量的名字應(yīng)當(dāng)使用“名詞”或者“形容詞名詞”。例如: float value;float oldValue;float newValue;【規(guī)則12】函數(shù)的名字應(yīng)當(dāng)使用“動詞”或者“動詞名詞”(動賓詞組)。類的成員函數(shù)省掉表示對象本身的“名詞”。例如:DrawBox(); / 全局函數(shù) box-Draw();/ 類的成員函數(shù)【規(guī)則13】用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。例如:intminValue;intmaxValue;intSetValue();intGetValue();(2) 文件【規(guī)則14】通用文件命名規(guī)則 類的聲明文件(.h)和實(shí)現(xiàn)文件(.cpp):類名.h類
18、名.cpp 常量定義文件:項(xiàng)目名稱縮寫(大寫)+_Const.h例:DI_Const.h 全局變量、函數(shù)聲明文件:項(xiàng)目名稱縮寫(大寫)+_GlobalDef.h例:DI_GlobalDef.h 錯誤代碼定義文件:項(xiàng)目名稱縮寫(大寫)+_ErrorDef.h例:DI_ErrorDef.h(3) 變量【規(guī)則15】變量名由范圍前綴+類型前綴+限定詞組成。【規(guī)則16】變量和參數(shù)用小寫字母開頭的單詞組合而成。例如:BOOL flag;int drawMode;【規(guī)則17】變量的范圍前綴 全局變量加上g_(表示global)例如:int g_howManyPeople;/ 全局變量int g_howMuc
19、hMoney;/ 全局變量 靜態(tài)變量加上s_例如:void Init()static int s_initValue;/ 靜態(tài)變量 局部變量范圍前綴為空【規(guī)則18】變量的類型前綴類型名稱表示符號范例整型nm_nTotalNum長整型lg_lOpenDate無符號整型uuMsgID無符號長整型dwdwCardNo字符chchChar布爾量bm_bOK浮點(diǎn)數(shù)fm_fPrice雙精度浮dg_dRate字符數(shù)組szm_szPath指針ppProgress字節(jié)指針pbm_pbSendData無符號指針pvg_pvParam字符指針lpszlpszNameStr整型指針lpnlpnSysDoomType文
20、件指針fpm_fpFile結(jié)構(gòu)體ststMyStruct【規(guī)則19】方法參數(shù)名使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字。例如:void setTopic (String strTopic) this.strTopic = strTopic; .【建議5】循環(huán)變量可以用i,j,k做循環(huán)變量,用p,q做位移變量?!疽?guī)則20】常量名全用大寫,用下劃線分割單詞例如:const int MAX = 100;const int MAX_LENGTH = 100;(4) 自定義類型【規(guī)則21】類名必須由大寫字母開頭的單詞或縮寫組成,只用英文字母,禁用數(shù)字、下劃線等符號?!疽?guī)則22】t
21、ypedef定義的類型利用typedef創(chuàng)建類型名為以“S”加單詞或縮寫組成,只用英文字母。【規(guī)則23】枚舉類型枚舉類型名以“E”加單詞或縮寫組成,只用英文字母。枚舉類型的成員遵循常量命名約定,使用大寫字母和下劃線,名稱要有含義?!疽?guī)則24】結(jié)構(gòu)(struct)和聯(lián)合(union) 結(jié)構(gòu)(struct)和聯(lián)合(union)名同類名。(5) 函數(shù)【規(guī)則25】用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。【規(guī)則26】函數(shù)的名字應(yīng)當(dāng)使用“動詞”或者“動詞名詞”(動賓詞組)?!疽?guī)則27】類方法名必須用一個小寫字母的動詞開頭,后面的單詞用大寫字母。例如:getName(),setHTML()
22、【建議6】方法名前綴根據(jù)需要使用get/set存取屬性值,is/has/should存取布爾值。推薦使用下列方法前綴,按下列組合配對使用:add/remove,create/destroy,old/new,insert/delete,increment/decrement,start/stop,begin/end,first/last,up/down,next/previous,min/max,open/close,show/hide3、注釋(1) 總則【規(guī)則28】程序可以有兩種注釋:代碼注釋(implementation comments)和文檔注釋(documentation commen
23、ts)。代碼注釋主要刪除注釋(注釋掉目前不需要的代碼)和說明注釋(對代碼進(jìn)行說明),文檔注釋是指專門用來形成文檔用的注釋?!疽?guī)則29】注釋是Why而不是What。程序中的注釋不可喧賓奪主,注釋的花樣要少?!疽?guī)則30】邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。【規(guī)則31】注釋的位置應(yīng)與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在下方?!疽?guī)則32】當(dāng)代碼比較長,特別是有多重嵌套時,應(yīng)當(dāng)在一些段落的結(jié)束處加注釋,便于閱讀?!疽?guī)則33】修正bug之后,要加上描述修改狀況的注釋。(2) 文檔注釋【規(guī)則34】文檔注釋文檔注釋用/*/標(biāo)識,它對代碼的
24、使用說明進(jìn)行描述,每一個文檔注釋被放進(jìn)/*/分隔符,每一個類、接口、構(gòu)造函數(shù),方法和成員變量擁有一個注釋,這樣的注釋應(yīng)該出現(xiàn)在相應(yīng)的聲明前。 例如: /* * Example類提供如下的功能 . */ class Example 類和接口的文檔注釋(/*)的第一行不應(yīng)該縮進(jìn),以后的文檔注釋每行都應(yīng)有一個空格的縮進(jìn)(給垂直排列的星號)。成員函數(shù)(包括構(gòu)造函數(shù)),第一行文檔注釋前有一個Tab縮進(jìn),后續(xù)的行有一個Tab外加一個空格的縮進(jìn)。對于那些不適于文檔注釋的類、接口、變量、方法的信息,用代碼注釋進(jìn)行說明,而不應(yīng)該在類的文檔注釋中。 文檔注釋不應(yīng)該放在方法或構(gòu)造函數(shù)的定義體內(nèi)。(3) 源程序文件【
25、規(guī)則35】源程序文件文檔注釋每個源程序文件的開頭都需要文檔注釋(參見例1),主要內(nèi)容有: 版權(quán)聲明:版權(quán)聲明內(nèi)容為Copyright Beijing China Tech international Software, Inc. All Rights Reserved.。 文件名稱:本文件的名稱。 開發(fā)者姓名:填寫最初編寫此代碼的人。 創(chuàng)建日期:本文件的創(chuàng)建日期。 功能目的:簡要描述本文件中代碼的功能。 修改歷史(修改日期、修改人、修改編號、修改內(nèi)容)。其中修改歷史可以多次出現(xiàn),任何對本文件的修改必須增加一條修改歷史。(4)類【規(guī)則36】類注釋每個類的必須有文檔注釋,其中至少要包括:功能、版本
26、、最后修改時間、作者、修改歷史(修改日期、修改人、修改編號、修改內(nèi)容)等,其中修改歷史可以多次出現(xiàn),任何對本類的修改必須增加一條修改歷史,此外可以根據(jù)需要添加其它相關(guān)信息或鏈接。類注釋必須在類的聲明之前。 例 例如:/* 類 String 封裝了有關(guān)字符串的操作,這些操作包括* 單個字符定位、串比較、查找、提取子串、大寫/小寫轉(zhuǎn)換等* * author Lee Boynton * author Arthur van Hoff * version 1.130, 02/09/01 */class String(5) 函數(shù)【規(guī)則37】函數(shù)注釋所有函數(shù)(包括類自定義類型的成員函數(shù))必須有文檔注釋。注釋
27、在其定義之前,按如下方式書寫:/* * 判斷一字符串是否為數(shù)字 * * param sNum 字符串 * return true=是數(shù)字 false=不是數(shù)字 */boolean isNumber(String sNum) .【規(guī)則38】構(gòu)造函數(shù)注釋要標(biāo)明此函數(shù)為構(gòu)造函數(shù)。如果有多個構(gòu)造函數(shù),用遞增的方式書寫,參數(shù)多的寫在后面,如有多組構(gòu)造函數(shù),每組分別用遞增的方式寫,并且每一個都要有詳細(xì)的注釋。(6) 變量【規(guī)則39】變量的注釋變量注釋出現(xiàn)在變量聲明或自定義數(shù)據(jù)類型成員聲明的前一行,用以描述對應(yīng)變量的作用和含義,變量注釋一般占一行。下列變量必須有注釋: 自定義類型的成員 全局變量 其它重要的
28、局部變量注釋必須按如下方式書寫:/* 包計(jì)數(shù)器 */int iPackets;(7) 語句【建議7】代碼注釋風(fēng)格代碼注釋用/*.*/和/標(biāo)識。程序可以有四種風(fēng)格的代碼注釋:塊注釋、單行注釋、后緣注釋(trailing)、行尾注釋(end-of-line)。塊注釋。塊注釋常用來提供文件、方法、數(shù)據(jù)結(jié)構(gòu)、算法的說明。塊注釋可以被用在每個文件的開頭和每個方法的起始,它們也可以被用在其他地方,比如在方法內(nèi)部等。塊注釋在函數(shù)或方法的內(nèi)部應(yīng)該和它們描述的代碼具有同樣的縮進(jìn)格式。塊注釋之前應(yīng)該有一個空行。單行注釋。短的注釋可以出現(xiàn)在單行,和它后面的代碼使用同樣的縮進(jìn)。單行注釋前應(yīng)該有一個空行。后緣注釋(tr
29、ailing)和行尾注釋(end-of-line)。非常短的注釋可以出現(xiàn)在和它說明的代碼的同一行中,但應(yīng)該和被說明的代碼相隔足夠遠(yuǎn)。如果在一個代碼塊中出現(xiàn)了多于一個的短注釋,它們應(yīng)該有相同的縮進(jìn)?!疽?guī)則40】語句塊結(jié)束注釋 函數(shù)定義的結(jié)束必須加如下內(nèi)容的注釋: /end of 函數(shù)名。若程序文件中能夠明確指出函數(shù)結(jié)束的不需加此注釋。 對于包含代碼行較多的條件語句,每個條件處理語句塊的結(jié)束必須加如下內(nèi)容的注釋:/end of 此語句塊的條件。 對于包含代碼行較多的循環(huán)語句,循環(huán)語句塊的結(jié)束必須如下內(nèi)容的注釋:/end of 循環(huán)條件。4、程序的版式(1) 空白符A、空行【規(guī)則41】在每個類聲明之
30、后、每個函數(shù)定義結(jié)束之后都要加空行?!疽?guī)則42】在一個函數(shù)體內(nèi),邏輯上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。 B、空格【規(guī)則43】在if、for、while等關(guān)鍵字之后應(yīng)留一個空格再跟左括號(,以突出關(guān)鍵字。【規(guī)則44】函數(shù)名之后不要留空格,緊跟左括號(,以與關(guān)鍵字區(qū)別?!疽?guī)則45】,、;向前緊跟,緊跟處不留空格。【規(guī)則46】,之后要留空格,如Function(x, y, z)。如果;不是一行的結(jié)束符號,其后要留空格,如for (initialization; condition; update)?!疽?guī)則47】賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如“=”、“
31、+=”“=”、“=”、“+”、“*”、“%”、“&”、“|”、“”前后不加空格。C、對齊【規(guī)則50】相互匹配的和應(yīng)獨(dú)占一行并且位于同一列,同時與引用它們的語句左對齊?!疽?guī)則51】 之內(nèi)的代碼塊在新行右邊一個Tab處左對齊。(2)表達(dá)式A、運(yùn)算符的優(yōu)先級【建議8】建議對于除+,*等優(yōu)先級非常明顯的運(yùn)算符之外,全部使用括號確定表達(dá)式的操作順序。B、復(fù)合表達(dá)式【規(guī)則52】不要有多用途的復(fù)合表達(dá)式。C、邏輯表達(dá)式u 布爾變量與零值比較【規(guī)則53】布爾變量與零值比較不可將布爾變量直接與TRUE、FALSE或者1、0進(jìn)行比較。應(yīng)寫為:bool bFlag;if (bFlag) / 表示flag為真if (
32、!bFlag) / 表示flag為假其它的用法都屬于不良風(fēng)格,例如:if (flag = TRUE)if (flag = 1 )if (flag = FALSE) if (flag = 0)u 整型變量與零值比較【規(guī)則54】應(yīng)當(dāng)將整型變量用“=”或“!=”直接與0比較。假設(shè)整型變量的名字為value,它與零值比較的標(biāo)準(zhǔn)if語句如下:if (value = 0) if (value != 0)不可模仿布爾變量的風(fēng)格而寫成:if (value)/ 會讓人誤解 value是布爾變量if (!value) u 浮點(diǎn)變量與零值比較【規(guī)則55】不可將浮點(diǎn)變量用“=”或“!=”與任何數(shù)字比較。千萬要留意,無
33、論是float還是double類型的變量,都有精度限制。所以一定要避免將浮點(diǎn)變量用“=”或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“=”或“=-EPSINON) & (x=EPSINON)其中EPSINON是允許的誤差(即精度)。u 指針變量與零值比較【規(guī)則56】應(yīng)當(dāng)將指針變量用“=”或“!=”與NULL比較,而不應(yīng)采用if(p)或者if(!p)的形式。指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但是兩者意義不同。假設(shè)指針變量的名字為p,它與零值比較的標(biāo)準(zhǔn)if語句如下:if (p = NULL)/ p與NULL顯式比較,強(qiáng)調(diào)p是指針變量if (p != NULL)不要寫成if
34、(p = 0) / 容易讓人誤解p是整型變量if (p != 0) 或者if (p)/ 容易讓人誤解p是布爾變量if (!p)(3)基本語句A、代碼行【規(guī)則57】一行代碼只做一件事情,如只定義一個重要變量,或只寫一條語句。【規(guī)則58】if、for、while、do等語句自占一行,執(zhí)行語句不得在同一行上。不論執(zhí)行語句有多少都要加?!疽?guī)則59】盡可能在定義變量的同時初始化該變量(就近原則)。【建議9】在使用之前才定義變量。【建議10】不提倡使用全局變量不提倡使用全局變量,盡量不要在頭文件中出現(xiàn)象extern int value 這類聲明?!窘ㄗh11】調(diào)試信息不要用cout到處打印調(diào)試信息,統(tǒng)一使用
35、帶開關(guān)的調(diào)試類打印調(diào)試信息。B、長行拆分【規(guī)則60】代碼行最大長度為80個字符?!疽?guī)則61】超長的語句應(yīng)該在一個逗號后,或者一個操作符前折行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。C、修飾符的位置【規(guī)則62】應(yīng)當(dāng)將修飾符 * 和 緊靠變量名。(4)條件語句【建議12】程序中有時會遇到if/else/return的組合,建議將如下風(fēng)格的程序:if (condition) return x; return y; 改寫為 if (condition) return x;elsereturn y;或者改寫成更加簡練的 return (conditio
36、n ? x : y);【規(guī)則63】switch語句中必須有default分支。例如:switch (i) case 1:;break;case 2:;break;default :break; 【規(guī)則64】每個case語句的結(jié)尾不要忘了加break,否則將導(dǎo)致多個分支重疊(除非有意使多個分支重疊)。(5)循環(huán)語句【規(guī)則65】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。如:下面例4(b)的效率比例4(a)的高。for (row=0; row100; row+)for ( col=0; col5; col+ )sum = sum + a
37、rowcol;for (col=0; col5; col+ )for (row=0; row100; row+) sum = sum + arowcol;例4 (a) 低效率:長循環(huán)在最外層 例4 (b) 高效率: 長循環(huán)在最內(nèi)層【規(guī)則66】如果循環(huán)體內(nèi)存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。如:例5(a)的程序比例5(b)多執(zhí)行了N-1次邏輯判斷。并且由于前者老要進(jìn)行邏輯判斷,打斷了循環(huán)“流水線”作業(yè),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。如果N非常大,最好采用例5(b)的寫法,可以提高效率。如果N非常小,兩者效率差別并不明顯,采用例5(a)的寫法比較好,因?yàn)槌?/p>
38、序更加簡潔。for (i=0; iN; i+)if (condition) DoSomething();else DoOtherthing();if (condition)for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing(); 例5(a) 效率低但程序簡潔 例5(b) 效率高但程序不簡潔【規(guī)則67】不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止for 循環(huán)失去控制?!窘ㄗh13】建議for語句的循環(huán)控制變量的取值采用“半開半閉區(qū)間”寫法。如:例6(a)中x值屬于半開半閉區(qū)間“0 = x N”,起點(diǎn)到終點(diǎn)的間隔為N,循
39、環(huán)次數(shù)為N。例6(b)中的x值屬于閉區(qū)間“0 = x = N-1”,起點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。相比之下,例6(a)的寫法更加直觀,盡管兩者的功能是相同的。for (int x=0; xN; x+)for (int x=0; x=N-1; x+)例6(a) 循環(huán)變量屬于半開半閉區(qū)間 例6(b) 循環(huán)變量屬于閉區(qū)間(6)常量【規(guī)則68】靜態(tài)變量使用時使用類名:變量名的方法來調(diào)用?!疽?guī)則69】盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串?!疽?guī)則70】在C+程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量,const有類型的檢查而宏沒有?!疽?guī)則
40、71】常量定義的位置。需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為便于管理,可以把不同模塊的常量集中存放在一個公共的頭文件中?!疽?guī)則72】常量意義要明確。如果某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。例如:const float RADIUS = 100;const float DIAMETER = RADIUS * 2; / 不要寫成 DIAMETER = 200;(7)類中的常量有時我們希望某些常量只在類中有效。由于#define定義的宏常量是全局的,不能達(dá)到目的,于是想當(dāng)然地覺得應(yīng)該用const修飾數(shù)據(jù)成員來實(shí)現(xiàn)。const
41、數(shù)據(jù)成員的確是存在的,但其含義卻不是我們所期望的。const數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量,而對于整個類而言卻是可變的,因?yàn)轭惪梢詣?chuàng)建多個對象,不同的對象其const數(shù)據(jù)成員的值可以不同。不能在類聲明中初始化const數(shù)據(jù)成員。以下用法是錯誤的,因?yàn)轭惖膶ο笪幢粍?chuàng)建時,編譯器不知道SIZE的值是什么。class A onst int SIZE = 100; /錯誤,企圖在類聲明中初始化const數(shù)據(jù)成員 int arraySIZE;/ 錯誤,未知的SIZE;const數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進(jìn)行。例如:class A A(int size);/ 構(gòu)造函數(shù)const in
42、t SIZE ; ;A:A(int size) : SIZE(size)/ 構(gòu)造函數(shù)的初始化表 A a(100);/ 對象 a 的SIZE值為100A b(200);/ 對象 b 的SIZE值為200怎樣才能建立在整個類中都恒定的常量呢?別指望const數(shù)據(jù)成員了,應(yīng)該用類中的枚舉常量來實(shí)現(xiàn)。例如:class A enum SIZE1 = 100, SIZE2 = 200; / 枚舉常量int array1SIZE1; int array2SIZE2;枚舉常量不會占用對象的存儲空間,它們在編譯時被全部求值。枚舉常量的缺點(diǎn)是:它的隱含數(shù)據(jù)類型是整數(shù),其最大值有限,且不能表示浮點(diǎn)數(shù)(如PI=3.1
43、4159)。(8)函數(shù)A、參數(shù)【規(guī)則73】參數(shù)的書寫要完整,在函數(shù)定義的地方,不要只寫參數(shù)的類型而省略參數(shù)名字,如果函數(shù)沒有參數(shù),則用void填充。例如:void SetValue(int width, int height); / 良好的風(fēng)格void SetValue(int, int);/ 不良的風(fēng)格float GetValue(void);/ 良好的風(fēng)格float GetValue();/ 不良的風(fēng)格【規(guī)則74】參數(shù)命名要恰當(dāng),順序要合理,一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。例如編寫字符串拷貝函數(shù)StringCopy,它有兩個參數(shù)。如果把參數(shù)名字起為str1和str2,例如:v
44、oid StringCopy(char *str1, char *str2);那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來??梢园褏?shù)名字起得更有意義,如叫strSource和strDestination,這樣從名字上就可以看出應(yīng)該把strSource拷貝到strDestination。還有一個問題,這兩個參數(shù)哪一個該在前哪一個該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:void StringCopy(char *strSource, char *strDestination);別人在使用時可能會不假思索地寫成如下
45、形式:char str20;StringCopy(str, “Hello World”);/ 參數(shù)順序顛倒【規(guī)則75】指針入?yún)⑷鐓?shù)是指針,且僅作輸入用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如:void StringCopy(char *strDestination,const char *strSource);【規(guī)則76】值傳遞對象如果輸入?yún)?shù)以值傳遞的方式傳遞對象,則宜改用“const &”方式來傳遞,這樣可以省去臨時對象的構(gòu)造和析構(gòu)過程,從而提高效率。【規(guī)則77】輸入?yún)?shù)對于非基本數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效
46、率;對于基本數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const引用傳遞”?!窘ㄗh14】避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在5個以內(nèi)。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯。【建議15】盡量不要使用類型和數(shù)目不確定的參數(shù)。C標(biāo)準(zhǔn)庫函數(shù)printf是采用不確定參數(shù)的典型代表,其原型為:int printf(const chat *format, argument);這種風(fēng)格的函數(shù)在編譯時喪失了嚴(yán)格的類型安全檢查。B、返回值【規(guī)則78】不要省略返回值的類型。C語言中,凡不加類型說明的函數(shù),一律自動按整型處理,這樣做不會有什么好處,卻容易被誤解為void類型。C+語言有很嚴(yán)格的類型
47、安全檢查,不允許上述情況發(fā)生。由于C+程序可以調(diào)用C函數(shù),為了避免混亂,規(guī)定任何C+/C函數(shù)都必須有類型,如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型?!疽?guī)則79】函數(shù)名字與返回值類型在語義上不可沖突。違反這條規(guī)則的典型代表是C標(biāo)準(zhǔn)庫函數(shù)getchar。例如:char c;c = getchar();if (c = EOF)按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:int getchar(void);由于c是char類型,取值范圍是-128,127,如果宏EOF的值在char的取值范圍之外,
48、那么if語句將總是失敗,這種“危險”人們一般哪里料得到!導(dǎo)致本例錯誤的責(zé)任并不在用戶,是函數(shù)getchar誤導(dǎo)了使用者。【規(guī)則80】不要將正常值和錯誤標(biāo)志混在一起返回。正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回。回顧上例,C標(biāo)準(zhǔn)庫函數(shù)的設(shè)計(jì)者為什么要將getchar聲明為令人迷糊的int類型呢?他會那么傻嗎?在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結(jié)束標(biāo)志或發(fā)生讀錯誤,它必須返回一個標(biāo)志EOF。為了區(qū)別于正常的字符,只好將EOF定義為負(fù)數(shù)(通常為負(fù)1)。因此函數(shù)getchar就成了int類型。我們在實(shí)際工作中,經(jīng)常會碰到上述令人為難的問題。為了避免
49、出現(xiàn)誤解,我們應(yīng)該將正常值和錯誤標(biāo)志分開。即:正常值用輸出參數(shù)獲得,而錯誤標(biāo)志用return語句返回。函數(shù)getchar可以改寫成 BOOL GetChar(char *c);雖然gechar比GetChar靈活,例如 putchar(getchar(); 但是如果getchar用錯了,它的靈活性又有什么用呢?【建議16】有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。例如:字符串拷貝函數(shù)strcpy的原型:char *strcpy(char *strDest,const char *strSrc);strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時
50、函數(shù)的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:Cha char str20;int length = strlen( strcpy(str, “Hello World”) ); 【建議17】如果函數(shù)的返回值是一個對象,有些場合用“引用傳遞”替換“值傳遞”可以提高效率,而有些場合只能用“值傳遞”而不能用“引用傳遞”,否則會出錯。例如:class String/ 賦值函數(shù)String & operate=(const String &other);/ 相加函數(shù),如果沒有friend修飾則只許有一個右側(cè)參數(shù)friendString operate+( const Strin
51、g &s1, const String &s2); private:char *m_data; String的賦值函數(shù)operate = 的實(shí)現(xiàn)如下:String & String:operate=(const String &other)if (this = &other)return *this;delete m_data;m_data = new charstrlen(other.data)+1;strcpy(m_data, other.data);return *this;/ 返回的是 *this的引用,無需拷貝過程對于賦值函數(shù),應(yīng)當(dāng)用“引用傳遞”的方式返回String對象。如果用“值
52、傳遞”的方式,雖然功能仍然正確,但由于return語句要把 *this拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。例如:String a,b,c;a = b; / 如果用“值傳遞”,將產(chǎn)生一次 *this 拷貝a = b = c; / 如果用“值傳遞”,將產(chǎn)生兩次 *this 拷貝 StrString的相加函數(shù)operate + 的實(shí)現(xiàn)如下:String operate+(const String &s1, const String &s2) String temp;delete temp.data;/ temp.data是僅含0的字符串temp.data = new charstrlen(s1.data) + strlen(s2.data) +1;strcpy(temp.data, s1.data);strcat(temp.data, s2.data);re
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026寧夏銀川市中醫(yī)醫(yī)院招聘事業(yè)單位編制人員10名備考題庫有答案詳解
- 2026山東事業(yè)單位統(tǒng)考日照市五蓮縣縣屬招聘初級綜合類崗位人員44人備考題庫及一套參考答案詳解
- 2026山東事業(yè)單位統(tǒng)考青島膠州市招聘17人備考題庫及參考答案詳解一套
- 2026天津市口腔醫(yī)院專業(yè)技術(shù)崗位工作人員(人事代理制)招聘27人備考題庫及完整答案詳解一套
- 茶舍財務(wù)制度收銀流程
- 減免學(xué)費(fèi)財務(wù)制度
- 2026安徽亳州市蒙城縣就業(yè)見習(xí)人員招募備考題庫完整答案詳解
- 采購報銷財務(wù)制度及流程
- 廢舊物資安全生產(chǎn)管理制度
- 安全生產(chǎn)員崗位責(zé)任制度
- 08J02 彩色壓型鋼板外墻保溫隔熱建筑構(gòu)造
- 光伏發(fā)電安全管理制度匯編
- 國際發(fā)展合作署面試輔導(dǎo)
- 電力設(shè)備檢測方案
- 2020中國藥典無水乙醇輔料標(biāo)準(zhǔn)解讀
- 工程造價英語核心詞匯手冊
- 【語文】南昌市小學(xué)四年級上冊期末試題(含答案)
- 5噸鹵制品污水處理方案
- 橫向課題申報書示范
- 《安全經(jīng)濟(jì)學(xué)》課件(共十一章)
- 礦熱爐日常安全培訓(xùn)課件
評論
0/150
提交評論