《C語(yǔ)言程序設(shè)計(jì)》課件第1章_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件第1章_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件第1章_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件第1章_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件第1章_第5頁(yè)
已閱讀5頁(yè),還剩72頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章程序設(shè)計(jì)基礎(chǔ)1.1C語(yǔ)言簡(jiǎn)介

1.2程序設(shè)計(jì)的基本概念

1.3程序設(shè)計(jì)方法

1.4程序設(shè)計(jì)風(fēng)格

1.5C語(yǔ)言程序的調(diào)試與運(yùn)行

1.1C語(yǔ)言簡(jiǎn)介

1.1.1C程序結(jié)構(gòu)

C程序是指用C語(yǔ)言編寫的源程序。C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,它支持當(dāng)前程序設(shè)計(jì)中廣泛采用的自頂向下的結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)。其完善的模塊程序結(jié)構(gòu)為軟件開(kāi)發(fā)中采用模塊化程序設(shè)計(jì)方法提供了有力的保障。C程序中每一個(gè)模塊都是一個(gè)函數(shù)。C程序一般由一個(gè)或若干個(gè)函數(shù)組成,其中必有一個(gè)名為main()的主函數(shù),程序的執(zhí)行就是從主函數(shù)開(kāi)始的。運(yùn)行結(jié)果如圖1.1所示。圖1.1例1.1的運(yùn)行結(jié)果圖1.2例1.2的運(yùn)行結(jié)果

2.函數(shù)的構(gòu)成

一個(gè)函數(shù)由函數(shù)首部和函數(shù)體兩部分組成。以例1.2中的函數(shù)min為例:函數(shù)的首部是定義一個(gè)函數(shù)的開(kāi)始,包括:函數(shù)的類型、函數(shù)名及函數(shù)參數(shù)表。函數(shù)體是函數(shù)功能的實(shí)現(xiàn),包括聲明部分和執(zhí)行部分。聲明部分用來(lái)聲明函數(shù)中需要的變量和調(diào)用的函數(shù)。執(zhí)行部分由C語(yǔ)句構(gòu)成,用來(lái)完成一定的操作任務(wù)。1.1.2C程序的結(jié)構(gòu)特點(diǎn)

(1)?C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,支持當(dāng)前程序設(shè)計(jì)中廣泛采用的自頂向下的程序設(shè)計(jì)技術(shù)。

(2)一個(gè)C語(yǔ)言源程序有一個(gè)且只能有一個(gè)main函數(shù)(又稱主函數(shù))。main函數(shù)可以安排在程序的任何地方,但是程序總是從main函數(shù)開(kāi)始執(zhí)行,在調(diào)用其他函數(shù)后,最后回到main函數(shù)中結(jié)束整個(gè)程序的執(zhí)行。

(3)?C程序書寫格式自由,既允許在一行內(nèi)寫多個(gè)語(yǔ)句,也允許將一個(gè)語(yǔ)句分寫在多行上,但每個(gè)語(yǔ)句必須以分號(hào)結(jié)束。為了提高程序的易讀性,最好一行寫一個(gè)語(yǔ)句。

(4)?C語(yǔ)言適合于多種操作系統(tǒng),如Windows、UNIX,也適用于多種機(jī)型。

(5)源程序中可以使用預(yù)處理命令(如include命令、define命令),預(yù)處理命令以“#”開(kāi)頭,一般放在源文件或源程序的最前面。預(yù)處理命令不是程序語(yǔ)句,所以不要加分號(hào)。

(6)“/*……*/”表示對(duì)函數(shù)或語(yǔ)句的功能作注釋,目的是提高程序的可讀性。在“/”和“*”之間不能有空格,且“/*”和“*/”必須配對(duì)使用。注釋是供人閱讀的,并不參與編譯和運(yùn)行。注釋可以出現(xiàn)在程序的任何地方。

(7)?C語(yǔ)言是一個(gè)鍛煉編程思想的語(yǔ)言,適合初學(xué)程序設(shè)計(jì)者學(xué)習(xí)。1.1.3C語(yǔ)言的歷史

C語(yǔ)言的前身是ALGOL60語(yǔ)言。ALGOL60描述算法很方便,但是它沒(méi)有硬件處理的功能,不適合用來(lái)編寫系統(tǒng)程序。

1963年,英國(guó)的劍橋大學(xué)在ALGOL60語(yǔ)言的基礎(chǔ)上添加了硬件處理功能,推出了CPL語(yǔ)言。但CPL語(yǔ)言規(guī)模比較大,難以實(shí)現(xiàn)。

1967年,英國(guó)劍橋大學(xué)的MatinRichards對(duì)CPL語(yǔ)言作了簡(jiǎn)化,推出了BCPL語(yǔ)言。

1970年,美國(guó)貝爾實(shí)驗(yàn)室以BCPL語(yǔ)言為基礎(chǔ),又作了進(jìn)一步簡(jiǎn)化,設(shè)計(jì)出更簡(jiǎn)單且更接近硬件的B語(yǔ)言,并用B語(yǔ)言編寫了第一個(gè)UNIX操作系統(tǒng)。但B語(yǔ)言過(guò)于簡(jiǎn)單,功能有限。1972年至1973年間,貝爾實(shí)驗(yàn)室在B語(yǔ)言的基礎(chǔ)上設(shè)計(jì)出了C語(yǔ)言。C語(yǔ)言既保持了BCPL和B語(yǔ)言的優(yōu)點(diǎn)(精練、接近硬件),又克服了它們的缺點(diǎn)(過(guò)于簡(jiǎn)單、數(shù)據(jù)無(wú)類型等)。

最初,C語(yǔ)言被用來(lái)編寫UNIX操作系統(tǒng),隨著C語(yǔ)言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們所認(rèn)識(shí),C語(yǔ)言開(kāi)始迅速傳播,并成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。多年來(lái)C語(yǔ)言在各種計(jì)算機(jī)上被迅速推廣,并出現(xiàn)了許多版本。為了明確定義與機(jī)器無(wú)關(guān)的C語(yǔ)言,1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)(ANSI)根據(jù)C語(yǔ)言問(wèn)世以來(lái)各種C語(yǔ)言的發(fā)展和擴(kuò)充版本制定了新的標(biāo)準(zhǔn),稱為ANSIC。1987年,ANSIC又公布了新標(biāo)準(zhǔn)87ANSIC。1990年,國(guó)際標(biāo)準(zhǔn)化組織ISO接受87ANSIC為ISOC的標(biāo)準(zhǔn)。1.1.4C語(yǔ)言的優(yōu)點(diǎn)

C語(yǔ)言由于功能強(qiáng)、使用靈活、可移植性好、目標(biāo)程序質(zhì)量高而受到廣泛的歡迎。具體而言,C語(yǔ)言有如下優(yōu)點(diǎn):

(1)語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。

(2)運(yùn)算符豐富,因此可以實(shí)現(xiàn)其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的運(yùn)算。

(3)數(shù)據(jù)結(jié)構(gòu)豐富,能夠?qū)崿F(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。

(4)具有結(jié)構(gòu)化的控制語(yǔ)句,用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。

(5)語(yǔ)法控制不嚴(yán)格,程序設(shè)計(jì)自由度大。

(6)允許訪問(wèn)物理地址,即能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,直接對(duì)硬件進(jìn)行操作。

(7)生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高,一般只比匯編語(yǔ)言生成的目標(biāo)代碼效率低10%~20%。

(8)程序的可移植性好。

(9)具有豐富的庫(kù)函數(shù),編譯效率高。

由于C語(yǔ)言具有許多突出的優(yōu)點(diǎn),所以在開(kāi)發(fā)軟件和操作系統(tǒng)時(shí),C語(yǔ)言是一個(gè)非常常用的計(jì)算機(jī)語(yǔ)言,它還在電子產(chǎn)品、嵌入式系統(tǒng)和單片機(jī)應(yīng)用系統(tǒng)的開(kāi)發(fā)中得到廣泛應(yīng)用,并且對(duì)許多現(xiàn)代的編程語(yǔ)言如C++、C#、Objective-C、Java、J#和JavaScript等影響巨大,所以,掌握了C語(yǔ)言,就掌握了程序設(shè)計(jì)的重要基礎(chǔ),經(jīng)過(guò)簡(jiǎn)單的學(xué)習(xí),就可以用這些新型語(yǔ)言去開(kāi)發(fā)各種軟件了。1.1.5C語(yǔ)言的不足

C語(yǔ)言有如下不足:

(1)運(yùn)算符多,難以掌握。

(2)對(duì)變量類型約束不嚴(yán)格,常常為了類型轉(zhuǎn)換上的方便而不要求類型檢查,導(dǎo)致有些情況下雖要求類型一致,但實(shí)際類型即使不一致也不出錯(cuò),最后產(chǎn)生莫名其妙的運(yùn)算結(jié)果,從而影響程序的安全性。

(3)?C語(yǔ)言對(duì)數(shù)組進(jìn)行處理時(shí)對(duì)數(shù)組元素的下標(biāo)不做越界檢查,若程序中引用數(shù)組元素時(shí)越界,容易造成數(shù)據(jù)的混亂,甚至產(chǎn)生更嚴(yán)重的錯(cuò)誤。

(4)?C語(yǔ)言比其他高級(jí)語(yǔ)言較難掌握。1.1.6C語(yǔ)言的發(fā)展

1.C與C++

用C語(yǔ)言編寫大型程序時(shí),程序員要考慮的東西很多,所以很容易出錯(cuò),降低了效率,于是產(chǎn)生了C++。C++?是C的升級(jí)版。C只有面向過(guò)程的程序設(shè)計(jì),而C++?中包括兩部分,一部分是面向過(guò)程程序設(shè)計(jì),另一部分是面向?qū)ο蟪绦蛟O(shè)計(jì)。C++?使用面向?qū)ο蟮姆椒ǎ瑥浹a(bǔ)了C面向過(guò)程的缺陷,從而在進(jìn)行大項(xiàng)目編程時(shí)效率倍增。

C的特點(diǎn)是語(yǔ)言體積小、效率高、語(yǔ)言靈活、給程序的限制小,而且可以方便地對(duì)底層進(jìn)行操作,所以它非常適合于開(kāi)發(fā)操作系統(tǒng)、驅(qū)動(dòng)程序、嵌入式等對(duì)速度要求較高的程序。C++?向下完全兼容C,C++?與C相比最顯著的變化就是增加了類的概念,也就是增加了面向?qū)ο蟮某煞郑梢员容^容易地描述人類的思維,使得軟件的開(kāi)發(fā)和維護(hù)變得相對(duì)簡(jiǎn)單,直接降低了軟件的成本。但因?yàn)镃++?是面向?qū)ο蟮恼Z(yǔ)言,這本身就制約了它的速度,所以C++?適合開(kāi)發(fā)大型項(xiàng)目。

2.?C/C++?與Java

Java是跨平臺(tái)的語(yǔ)言,主要分JavaEE(企業(yè)級(jí)應(yīng)用開(kāi)發(fā))、JavaME(桌面應(yīng)用程序開(kāi)發(fā))和JavaSE(手機(jī)應(yīng)用開(kāi)發(fā))三個(gè)方向。前兩個(gè)應(yīng)用于網(wǎng)絡(luò)開(kāi)發(fā),例如網(wǎng)上銀行、網(wǎng)頁(yè)游戲及B/S(瀏覽器/服務(wù)器)架構(gòu)的企業(yè)管理軟件等;后一個(gè)應(yīng)用于手機(jī)開(kāi)發(fā),主要是游戲和應(yīng)用軟件。

Java去掉了C/C++?中可有可無(wú)的語(yǔ)言元素,如指針運(yùn)算、結(jié)構(gòu)、枚舉、聯(lián)合類型、typedef、#define、釋放內(nèi)存等,所以Java語(yǔ)言很精煉,出錯(cuò)率比C/C++?減少了50%;Java實(shí)現(xiàn)了C++?的面向?qū)ο蠹夹g(shù),不但對(duì)其進(jìn)行了適當(dāng)?shù)脑鰪?qiáng),而且增加了一些很有用的功能,如自動(dòng)收集碎片的功能。Java解釋器只需215?KB的RAM,因此,較C++?更輕便、更精簡(jiǎn)。從功能的角度看,Java提供了一個(gè)功能強(qiáng)大的語(yǔ)言,但幾乎沒(méi)有一點(diǎn)含糊特征。從形式上看,Java設(shè)計(jì)成C++?形式,讓大家很容易學(xué)習(xí)。

3.?C與C#

C#是微軟公司為了實(shí)現(xiàn)平臺(tái)統(tǒng)一和與Java爭(zhēng)奪市場(chǎng),為?.NETFramework量身定做的程序語(yǔ)言。C#?擁有C/C++的強(qiáng)大功能以及VisualBasic簡(jiǎn)易實(shí)用的特性,與C++和Java一樣是面向?qū)ο?Object-oriented)的程序語(yǔ)言,且是第一個(gè)面向組件(Component-oriented)的程序語(yǔ)言。C#與Java驚人地相似,但又有著明顯的不同,它借鑒了Delphi的一個(gè)特點(diǎn),即與COM(組件對(duì)象模型)是直接集成的,它是微軟公司?.NETWindows網(wǎng)絡(luò)框架的主角,非常適合用于開(kāi)發(fā)網(wǎng)絡(luò)方面的程序。現(xiàn)在的小型網(wǎng)站,大多是用?.NET編寫的。綜上所述,C語(yǔ)言不但歷史悠久、特點(diǎn)明顯、應(yīng)用廣泛,而且目前流行的C++、Java、C#?等語(yǔ)言都是在C語(yǔ)言的基礎(chǔ)上發(fā)展起來(lái)的,所以大多數(shù)高等學(xué)校至今仍然把C語(yǔ)言作為學(xué)生學(xué)習(xí)程序設(shè)計(jì)的入門語(yǔ)言。 1.2程序設(shè)計(jì)的基本概念

1.2.1算法

所謂算法,是指為了解決某個(gè)問(wèn)題(包括數(shù)學(xué)問(wèn)題和邏輯問(wèn)題)或?yàn)榱送瓿赡稠?xiàng)任務(wù)所要執(zhí)行的若干有限的操作步驟。解決任何問(wèn)題或完成任何任務(wù)都是根據(jù)一定的算法進(jìn)行的。對(duì)于比較復(fù)雜的問(wèn)題或工作任務(wù),如果不事先設(shè)計(jì)好操作步驟,并嚴(yán)格地按照操作步驟即算法進(jìn)行,就難以圓滿地解決問(wèn)題,因此算法的重要性是不言而喻的。例如,下面是用自然語(yǔ)言表示的對(duì)三個(gè)數(shù)進(jìn)行從小到大排序的算法。

(1)輸入三個(gè)數(shù)x、y、z;

(2)將x與y比較,若x?>?y,交換x與y的值;

(3)將x與z比較,若x?>?z,交換x與z的值;

(4)將y與z比較,若y?>?z,交換y與z的值;

(5)輸出此時(shí)的三個(gè)數(shù)x、y、z。1.2.2算法的特性和目標(biāo)

解決不同的問(wèn)題,需要不同的策略,因而相應(yīng)的算法必定各種各樣。一個(gè)算法必須具有以下五個(gè)特性:

(1)有輸入:有零個(gè)或多個(gè)輸入數(shù)據(jù);

(2)有輸出:有一個(gè)或多個(gè)輸出數(shù)據(jù);

(3)確定性:每一個(gè)步驟必須被確定地定義,不能模凌兩可;

(4)有窮性:一個(gè)算法必須在執(zhí)行有限步之后終止,而且每一步都能在有限時(shí)間內(nèi)完成;

(5)可行性:算法中有待完成的每一步運(yùn)算都是可執(zhí)行的,即可以在計(jì)算機(jī)的能力范圍內(nèi)用有限的時(shí)間完成。解決同一個(gè)問(wèn)題可以有若干個(gè)算法。如何評(píng)價(jià)一個(gè)算法的優(yōu)劣呢?一個(gè)算法首先應(yīng)該是正確的,否則就談不上優(yōu)劣。對(duì)于一個(gè)正確的算法,通常以下三個(gè)方面來(lái)判斷其優(yōu)劣。

(1)可讀性:算法不僅僅是讓計(jì)算機(jī)來(lái)執(zhí)行的,更是讓人來(lái)閱讀的,可讀性好的算法有助于調(diào)試程序、并發(fā)現(xiàn)和修改錯(cuò)誤,使得日后對(duì)軟件功能的擴(kuò)展、維護(hù)易于實(shí)現(xiàn)。一個(gè)算法應(yīng)當(dāng)思路清晰、層次分明、簡(jiǎn)單明了。

(2)健壯性:指算法能夠?qū)Ψ欠ǖ妮斎胱龀龊侠淼奶幚?,而不產(chǎn)生莫名其妙的結(jié)果。

(3)高效率與低存儲(chǔ)空間需求:指解決特定問(wèn)題算法的執(zhí)行時(shí)間應(yīng)盡量短,算法執(zhí)行過(guò)程中需要的存儲(chǔ)空間應(yīng)盡量小。1.2.3算法的表示

算法可以使用各種不同的方法來(lái)描述。常見(jiàn)算法的表示方法有:自然語(yǔ)言、傳統(tǒng)流程圖、N-S結(jié)構(gòu)圖、偽碼等。

1.用自然語(yǔ)言表示算法

自然語(yǔ)言就是人們?nèi)粘J褂玫恼Z(yǔ)言,可以是中文、英文等。如前面對(duì)三個(gè)數(shù)進(jìn)行從小到大排序的算法就是用自然語(yǔ)言描述的。

用自然語(yǔ)言表示的算法簡(jiǎn)單、通俗易懂,但文字冗長(zhǎng),表達(dá)上準(zhǔn)確度不夠,易有二義性。所以,一般不用自然語(yǔ)言描述算法。

2.用傳統(tǒng)流程圖表示算法

傳統(tǒng)流程圖是用一組規(guī)定的圖形符號(hào)、流程線和文字說(shuō)明來(lái)表示各種操作算法的表示方法。傳統(tǒng)流程圖常用的符號(hào)如表1.1所示。表1.1傳統(tǒng)流程圖常用符號(hào)用傳統(tǒng)流程圖描述對(duì)三個(gè)數(shù)進(jìn)行從小到大排序的算法如圖1.3所示。圖1.3用傳統(tǒng)流程圖表示對(duì)三個(gè)數(shù)進(jìn)行排序用傳統(tǒng)流程圖表示算法直觀形象,算法的邏輯流程一目了然,便于理解,但畫起來(lái)比較麻煩,且由于允許使用流程線,畫圖者可以隨心所欲,使流程可以任意轉(zhuǎn)移,從而造成閱讀和修改上的困難。

結(jié)構(gòu)化程序設(shè)計(jì)方法彌補(bǔ)了傳統(tǒng)流程圖的缺陷。在結(jié)構(gòu)化的程序設(shè)計(jì)方法中,流程圖只包括三種基本程序結(jié)構(gòu)。

1)順序結(jié)構(gòu)

在順序結(jié)構(gòu)中,要求依次地執(zhí)行每一個(gè)基本的處理單位。順序結(jié)構(gòu)的流程圖如圖1.4所示,該圖表示先執(zhí)行處理過(guò)程A,然后再執(zhí)行處理過(guò)程B。圖1.4順序結(jié)構(gòu)

2)選擇結(jié)構(gòu)

在選擇結(jié)構(gòu)中,要根據(jù)判斷條件的成立與否而選擇執(zhí)行不同的處理過(guò)程。選擇結(jié)構(gòu)的流程圖如圖1.5所示,當(dāng)判斷條件成立時(shí),執(zhí)行處理過(guò)程A,否則執(zhí)行處理過(guò)程B。圖1.5選擇結(jié)構(gòu)

3)循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)是根據(jù)一定的條件,對(duì)某些語(yǔ)句重復(fù)執(zhí)行的結(jié)構(gòu)。被重復(fù)執(zhí)行的部分稱為循環(huán)體。

循環(huán)結(jié)構(gòu)一般分為當(dāng)型循環(huán)和直到型循環(huán)。

(1)當(dāng)型循環(huán)。在當(dāng)型循環(huán)結(jié)構(gòu)中,當(dāng)判斷條件成立時(shí),就反復(fù)執(zhí)行處理過(guò)程A(循環(huán)體),直到邏輯條件不成立時(shí)結(jié)束。當(dāng)型循環(huán)結(jié)構(gòu)的流程圖如圖1.6所示。圖1.6當(dāng)型循環(huán)結(jié)構(gòu)

(2)直到型循環(huán)。在直到型循環(huán)結(jié)構(gòu)中,反復(fù)執(zhí)行處理過(guò)程A,直到判斷條件成立時(shí)結(jié)束。直到型循環(huán)結(jié)構(gòu)的流程圖如圖1.7所示。圖1.7直到型循環(huán)結(jié)構(gòu)

3.用N-S流程圖表示算法

針對(duì)傳統(tǒng)流程圖存在的問(wèn)題,人們提出了一種新的結(jié)構(gòu)化流程圖形式,簡(jiǎn)稱為N-S流程圖。

N-S流程圖的主要特點(diǎn)是取消了流程線,不允許有隨意的控制流,整個(gè)算法的流程寫在一個(gè)矩形框內(nèi),該矩形框以以下三種基本結(jié)構(gòu)復(fù)合而成。

(1)順序結(jié)構(gòu)。順序結(jié)構(gòu)的N-S流程圖如圖1.8所示。圖1.8順序結(jié)構(gòu)

(2)選擇結(jié)構(gòu)。選擇結(jié)構(gòu)的N-S流程圖如圖1.9所示。圖1.9分支結(jié)構(gòu)

(3)循環(huán)結(jié)構(gòu)。當(dāng)型循環(huán)結(jié)構(gòu)的N-S流程圖如圖1.10所示。直到型循環(huán)結(jié)構(gòu)的N-S流程圖如圖1.11所示。圖1.10當(dāng)型循環(huán)結(jié)構(gòu)圖1.11直到型循環(huán)結(jié)構(gòu)例如,用N-S流程圖對(duì)三個(gè)數(shù)進(jìn)行從小到大排序的算法,如圖1.12所示。圖1.12用N-S流程圖對(duì)三個(gè)數(shù)進(jìn)行從小到大排序

4.用偽碼表示算法

偽碼是用一種介于自然語(yǔ)言和計(jì)算機(jī)語(yǔ)言之間的文字和符號(hào)來(lái)描述算法的。

例如,用偽碼描述上述算法:

inputx,y,z

x→max

ify>maxtheny→max

ifz>maxthenz→max

outputmax

偽碼不能在計(jì)算機(jī)上實(shí)際執(zhí)行,但是用偽碼表示算法方便友好,便于向計(jì)算機(jī)程序過(guò)渡。偽碼的表現(xiàn)形式靈活自由、格式緊湊,沒(méi)有嚴(yán)謹(jǐn)?shù)恼Z(yǔ)法格式。

1.3程序設(shè)計(jì)方法

1.3.1程序設(shè)計(jì)的步驟

簡(jiǎn)單的程序設(shè)計(jì)步驟一般包含以下幾部分。

(1)分析問(wèn)題,確定數(shù)據(jù)結(jié)構(gòu)。首先根據(jù)問(wèn)題的具體要求進(jìn)行分析,然后在此基礎(chǔ)上抽象地為相應(yīng)的數(shù)學(xué)模型確定存放數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。

(2)確定算法。根據(jù)選取的數(shù)據(jù)結(jié)構(gòu)和確定的解決方案,設(shè)計(jì)出具體的操作步驟,對(duì)于復(fù)雜的算法可以使用流程圖清晰、直觀地表示出來(lái)。

(3)編寫程序。選用合適的程序設(shè)計(jì)語(yǔ)言,以書面形式將算法描述出來(lái),即形成用程序設(shè)計(jì)語(yǔ)言編寫的源程序。

(4)調(diào)試并運(yùn)行程序。對(duì)編寫好的計(jì)算機(jī)程序進(jìn)行試運(yùn)行和檢驗(yàn),對(duì)程序中發(fā)現(xiàn)的問(wèn)題立即進(jìn)行修改,直至得出正確的結(jié)果。

(5)建立文檔資料。對(duì)程序進(jìn)行整理和分析,并建立相應(yīng)的文檔資料以便日后維護(hù)和修改。1.3.2結(jié)構(gòu)化程序設(shè)計(jì)方法

在20世紀(jì)60年代,隨著計(jì)算機(jī)技術(shù)的發(fā)展、軟件的規(guī)模和復(fù)雜性的不斷提高,在大型軟件開(kāi)發(fā)工作中出現(xiàn)了許多問(wèn)題,如軟件開(kāi)發(fā)的進(jìn)度推遲、成本超出預(yù)算等,人們開(kāi)始認(rèn)識(shí)到軟件開(kāi)發(fā)的復(fù)雜性,由此提出了“結(jié)構(gòu)化程序設(shè)計(jì)方法”,旨在提高程序的可讀性,保證軟件的質(zhì)量,降低軟件的成本,提高軟件開(kāi)發(fā)和維護(hù)的效率。迄今為止,結(jié)構(gòu)化程序設(shè)計(jì)方法仍然是一種廣為使用的計(jì)算機(jī)軟件開(kāi)發(fā)方法。

結(jié)構(gòu)化程序設(shè)計(jì)方法是一種用來(lái)編寫清晰、可讀性好、易修改的程序的嚴(yán)格的設(shè)計(jì)方法。結(jié)構(gòu)化程序設(shè)計(jì)方法要求程序僅由三種基本結(jié)構(gòu)——順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)經(jīng)組合、嵌套而成。而且,要求每個(gè)程序模塊是單入口單出口的,程序中沒(méi)有永遠(yuǎn)執(zhí)行不到的語(yǔ)句,沒(méi)有死循環(huán)即無(wú)終止的循環(huán)。

結(jié)構(gòu)化程序設(shè)計(jì)方法要求采用模塊化設(shè)計(jì)方法。模塊化的思想就是“分而治之”,即將一個(gè)復(fù)雜的任務(wù)分解成若干個(gè)功能單一、相對(duì)獨(dú)立的小任務(wù)來(lái)進(jìn)行設(shè)計(jì),每個(gè)小任務(wù)就是一個(gè)模塊,每個(gè)模塊由三種基本結(jié)構(gòu)組成。模塊的功能要獨(dú)立、簡(jiǎn)單,這樣才能使程序具有靈活性和可靠性。程序的設(shè)計(jì)過(guò)程采用“自頂向下,逐步求精”的策略。自頂向下是指模塊的劃分要從問(wèn)題的頂層向下逐層分解、逐步細(xì)化,直到最底層達(dá)到最簡(jiǎn)單的功能模塊;逐步求精是指在將抽象問(wèn)題分解為若干個(gè)相對(duì)獨(dú)立的小問(wèn)題時(shí),要逐級(jí)地由抽象到具體、由粗到細(xì)、由表及里進(jìn)行細(xì)化,直到將問(wèn)題細(xì)化到可以用程序的三種基本結(jié)構(gòu)來(lái)實(shí)施為止。

程序的設(shè)計(jì)要以良好的可讀性為目標(biāo),以使用程序的用戶為中心,結(jié)構(gòu)清晰、美觀、簡(jiǎn)潔、流暢。程序的書寫不能隨心所欲,要遵循一定的格式和規(guī)范。

軟件的開(kāi)發(fā)應(yīng)當(dāng)按照工程的生產(chǎn)方式來(lái)組織和管理,每個(gè)成員都必須按照統(tǒng)一的規(guī)劃和方法進(jìn)行工作,使生產(chǎn)的軟件有統(tǒng)一的標(biāo)準(zhǔn)和風(fēng)格,以便于生產(chǎn)、推廣和維護(hù)。

1.4程序設(shè)計(jì)風(fēng)格

1.4.1符號(hào)的命名

源程序中的變量名、數(shù)組名、文件名等各種符號(hào)的命名對(duì)于程序的閱讀和理解具有直接的影響。符號(hào)的命名首先要符合源程序的語(yǔ)法規(guī)定,如長(zhǎng)度不能超過(guò)規(guī)定,不能使用規(guī)定的字符及數(shù)字等,更重要的是要見(jiàn)名知意,容易理解。

一般不要使用單個(gè)字母作符號(hào)名,試想如果一本小說(shuō)里的人和物都是以單個(gè)英文字母命名的,這樣的小說(shuō)還能讀得下去嗎?有部分程序員喜歡用拼音給符號(hào)命名,其實(shí)許多中國(guó)人尚且不懂拼音字母,用拼音命名的符號(hào)名怎么能和世界接軌?怎么能走向世界?符號(hào)名應(yīng)盡量用英文名詞,這樣就能達(dá)到見(jiàn)名知意的目的。符號(hào)命名也要采用有經(jīng)驗(yàn)的程序員已經(jīng)形成的傳統(tǒng),比如宏定義用大寫字母表示,如PRICE;全局變量以大寫字母開(kāi)頭,如Student、School;有的程序員在變量名前加上變量類型的首字母,如?*pflag表示flag是指針變量、ilength表示length是整型變量,這些對(duì)增加程序的易讀性也很有幫助。1.4.2程序文檔

1.序言性注釋

序言性注釋是在程序或模塊的開(kāi)頭為本程序或程序段做的說(shuō)明。例如可以在每個(gè)函數(shù)的開(kāi)頭安排一個(gè)序,說(shuō)明下列內(nèi)容:

(1)標(biāo)志(程序名、日期、版本號(hào));

(2)函數(shù)的用途,采用的方法(算法)及數(shù)據(jù)結(jié)構(gòu);

(3)?(該函數(shù)的)使用方法;

(4)函數(shù)的開(kāi)發(fā)歷史和所做的改動(dòng);

(5)程序之外的參考文檔。

2.解釋性注釋

解釋性注釋又稱功能性注釋,一般插在程序正文中,經(jīng)常寫在程序語(yǔ)句之后,用“;”或“/*”與程序語(yǔ)句隔開(kāi),其目的是為閱讀和理解程序提供解釋說(shuō)明,以便說(shuō)明程序?yàn)槭裁匆@樣做以及做什么。解釋性注釋包括下列內(nèi)容:

(1)對(duì)所定義的每一個(gè)變量和常量都要說(shuō)明它們是什么以及如何使用;

(2)對(duì)程序的每一個(gè)段落(或代碼塊)都加以注釋,簡(jiǎn)要說(shuō)明其目的和作用;

(3)指明程序每一重要部分的結(jié)束位置(如果該位置不夠明顯的話);

(4)解釋程序中使用的某種技巧或意義不夠明確的語(yǔ)句(最好不要使用這種意義不明確的語(yǔ)句);

(5)無(wú)論何時(shí)程序作了改動(dòng),都要保證對(duì)文檔作相應(yīng)的修改。

1.4.3源程序的書寫格式

程序中的空格、空行以及縮格是文檔的重要形式,它們可以明顯地增加程序的易讀性,使用戶一眼就能判斷出程序的哪些部分相互有關(guān),何處會(huì)發(fā)生中斷,以及每個(gè)循環(huán)包含哪些語(yǔ)句,或一個(gè)條件語(yǔ)句的每種選擇包含哪些語(yǔ)句。當(dāng)然,手工縮格的確比較繁瑣,最好的辦法是使用代碼格式自動(dòng)生成程序,即利用計(jì)算機(jī)對(duì)源代碼進(jìn)行自動(dòng)縮排。1.4.4構(gòu)造語(yǔ)句

構(gòu)造語(yǔ)句是編寫程序的一個(gè)主要任務(wù)。構(gòu)造語(yǔ)句的基本原則是簡(jiǎn)單、直接,即做到以下幾點(diǎn):

(1)最好一行只寫一條語(yǔ)句;

(2)盡量避免使用復(fù)雜的條件測(cè)試;

(3)盡量排除對(duì)“非”條件的測(cè)試;

(4)避免使用多維數(shù)組,避免多重循環(huán)嵌套或條件嵌套;

(5)簡(jiǎn)化表達(dá)式,利用括號(hào)使表達(dá)式的運(yùn)算次序更加清晰。1.4.5輸入/輸出

輸入/輸出風(fēng)格與人機(jī)交互的方式有關(guān),一般應(yīng)遵循下列原則:

(1)保持簡(jiǎn)單的輸入格式,即應(yīng)保證輸入數(shù)據(jù)和規(guī)定數(shù)據(jù)格式的一致性;

(2)檢查所有輸入數(shù)據(jù)的有效性,并有完備的出錯(cuò)處理措施;

(3)用標(biāo)記標(biāo)明交互的輸入請(qǐng)求,規(guī)定可以使用的選擇值或邊界值;

(4)使用數(shù)據(jù)結(jié)束標(biāo)記,不要要求用戶指定數(shù)據(jù)的數(shù)目;

(5)對(duì)所有輸出加標(biāo)記,并設(shè)計(jì)出賞心悅目的輸出報(bào)告。

應(yīng)當(dāng)說(shuō)明,養(yǎng)成良好的編程風(fēng)格并不是輕而易舉的,但是千里之行,始于足下,如果從學(xué)習(xí)編程的第一天開(kāi)始就注意編程風(fēng)格的養(yǎng)成,持之以恒,日積月累,就一定會(huì)形成良好的編程習(xí)慣。

1.5C語(yǔ)言程序的調(diào)試與運(yùn)行

1.5.1C語(yǔ)言程序的調(diào)試與運(yùn)行過(guò)程

C語(yǔ)言程序的調(diào)試與運(yùn)行過(guò)程如圖1.13所示。

(1)編輯:將C語(yǔ)言程序輸入編輯器中;

(2)編譯:高級(jí)語(yǔ)言程序需要經(jīng)過(guò)編譯或解釋翻譯成二進(jìn)制目標(biāo)程序。編譯過(guò)程由編譯程序(Compiler)完成,在編譯過(guò)程中,編譯程序?qū)l(fā)現(xiàn)大多數(shù)語(yǔ)法錯(cuò)誤并且發(fā)出“出錯(cuò)信息”,用戶需要重新調(diào)用編輯程序改正這些錯(cuò)誤,然后再進(jìn)行編譯,直到編譯成功,產(chǎn)生目標(biāo)(.obj)文件;

(3)鏈接:將編譯產(chǎn)生的目標(biāo)程序、程序中使用到的庫(kù)函數(shù)及其他目標(biāo)程序鏈接成可執(zhí)行(.exe)程序;

(4)執(zhí)行:運(yùn)行(Run)可執(zhí)行程序,檢查輸出結(jié)果,如果結(jié)果不正確,則返回編輯窗口并對(duì)源程序進(jìn)行修改,然后重復(fù)上述過(guò)程直到結(jié)果正確無(wú)誤。圖1.13C語(yǔ)言程序的調(diào)試與運(yùn)行過(guò)程1.5.2C語(yǔ)言程序上機(jī)操作和調(diào)試

1.TurboC2.0C語(yǔ)言集成開(kāi)發(fā)環(huán)境

假設(shè)TurboC2.0C語(yǔ)言集成開(kāi)發(fā)環(huán)境已經(jīng)安裝在用戶所用計(jì)算機(jī)的C盤TC目錄下,鍵入TC后回車,即可進(jìn)入圖1.14所示的TurboC2.0C語(yǔ)言集成開(kāi)發(fā)環(huán)境。圖1.14TurboC2.0C語(yǔ)言集成開(kāi)發(fā)環(huán)境各菜單功能如下:

·File:裝入或保存文件、退出TC;

·?Edit:使用編輯程序編輯源程序,保存為?.c文件,也可用Word進(jìn)行編輯,保存為?.txt文件;

·Run:編譯、鏈接、運(yùn)行當(dāng)前程序;

·Compile:編譯當(dāng)前程序;

·Project:管理多文件工程;

·Option:設(shè)置編譯和鏈接程序的各個(gè)選項(xiàng);

·Debug:設(shè)置各調(diào)試選項(xiàng);

·Break/Watch:設(shè)置斷點(diǎn)和監(jiān)視表達(dá)式;

·Insert:使編輯程序處于插入狀態(tài);

·Indent:自動(dòng)縮進(jìn),換行時(shí)與上一行行首對(duì)齊;

·F1-Help:幫助信息;

·F5-Zoom:使光標(biāo)所在窗口放大到滿屏;

·F6-Switch:使光標(biāo)在編輯窗口和信息窗口之間切換;

·F7-Trace:逐行執(zhí)行程序并深入到各函數(shù);

·F8-Step:逐行執(zhí)行程序但跳過(guò)各函數(shù);

·F9-Make:編譯并鏈接程序;

·F10-Menu:使光標(biāo)跳到頂端主菜單。

2.上機(jī)操作過(guò)程

(1)進(jìn)入TC:在TC子目錄下,鍵入TC。

(2)建立源程序文件:在TurboC2.0C語(yǔ)言集成開(kāi)發(fā)環(huán)境的編輯窗口中編輯,保存為?.c文件?;蛴肳ord、寫字板等編輯器進(jìn)行編輯,保存為?.txt文件。

(3)裝入已有文件:F10→File→Load→鍵入文件名→回車。

(4)另存為其他文件:F10→File→Writeto→鍵入Newname→回車。

(5)編譯程序:Alt?+?C→Compile→回車,或Alt?+?F9。

注意,必須改正完所有Errors才能生成?.obj文件,但是警告信息(Warning)可不做修改。

(6)鏈接程序:Alt?+?C→Compile→LinkExeFile→回車。

如果鏈接過(guò)程給出錯(cuò)誤信息,也必須改正完所有Errors才能生成?.obj文件。

(7)運(yùn)行程序:Alt?+?R→Run→回車,或Alt?+?F9。

程序運(yùn)行后,用戶應(yīng)該根據(jù)程序要求按照程序規(guī)定的格式從鍵盤輸入相應(yīng)的數(shù)據(jù)。程序運(yùn)行過(guò)程中也可能出現(xiàn)出錯(cuò)信息,這時(shí),用戶必須再次進(jìn)入編輯階段,并改正程序中的錯(cuò)誤(一般為語(yǔ)義或算法錯(cuò)誤),經(jīng)再次編譯鏈接后,才能再運(yùn)行程序。程序運(yùn)行停止后,用戶可通過(guò)組合鍵Alt?+?F5進(jìn)入用戶屏幕檢查輸出結(jié)果,如果結(jié)果不正確,則返回編輯窗口對(duì)源程序進(jìn)行修改,然后重復(fù)上述過(guò)程直到結(jié)果正確無(wú)誤。只有結(jié)果正確,才能認(rèn)為程序正確。

TurboC有全屏和窗口兩種運(yùn)行方式,按組合鍵Alt+Enter就可以方便地實(shí)現(xiàn)兩種方式的切換。

3.掌握調(diào)試技巧,提高調(diào)試效率

任何人編寫的程序都不可避免地包含錯(cuò)誤,甚至錯(cuò)誤百出。所以程序編寫好后,必須進(jìn)行調(diào)試(Debug),只有“調(diào)通”了的程序,才能交付運(yùn)行。調(diào)試程序包括很多技巧,下面介紹其中最有用的兩種,即設(shè)置斷點(diǎn)和單步運(yùn)行。

1)設(shè)置/清除斷點(diǎn)

程序在執(zhí)行的中途被停止,稱為“中斷”。在中斷狀態(tài)下,用戶經(jīng)過(guò)查看各個(gè)變量及屬性的當(dāng)前值,可以了解到程序執(zhí)行是否正常,還可以修改發(fā)生錯(cuò)誤的程序代碼,觀察應(yīng)用界面的狀態(tài),修改變量及屬性值,修改程序的流程等。因此,為了了解程序的運(yùn)行情況,在程序調(diào)試過(guò)程中往往人為地在程序中設(shè)置一些“斷點(diǎn)”,使程序在“斷點(diǎn)”處發(fā)生中斷。“斷點(diǎn)”通常安排在程序代碼中能反映程序執(zhí)行狀況的部位。例如:為了了解循環(huán)的執(zhí)行情況,可以在循環(huán)體中設(shè)置一個(gè)斷點(diǎn)。這樣每執(zhí)行一次循環(huán),就會(huì)在斷點(diǎn)處引起一次中斷,用戶就可以從調(diào)試窗口中看到循環(huán)變量及其他變量的值,從而判斷循環(huán)正確與否。一個(gè)程序總是由若干過(guò)程或函數(shù)組成的。在某些過(guò)程或函數(shù)中設(shè)置若干個(gè)斷點(diǎn),就可以對(duì)整個(gè)程序的執(zhí)行情況實(shí)現(xiàn)跟蹤檢查,保證程序中各個(gè)過(guò)程或函數(shù)及其整個(gè)程序的正確性。

程序“調(diào)通”以后,“清除”掉設(shè)定的斷點(diǎn),程序就可以恢復(fù)為連續(xù)運(yùn)行了。設(shè)置/清除斷點(diǎn)的具體操作如下:

(1)?Alt?+?B→Break/Watch→Togglebreakpoint可以在光標(biāo)處設(shè)置/清除一個(gè)斷點(diǎn),程序運(yùn)行到該點(diǎn)將停下,利用單步繼續(xù)調(diào)試。

(2)?Alt?+?B→Break/Watch→Clearallbreakpoints可以清除所有斷點(diǎn)。

(3)?Alt?+?B→Break/Watch→Viewnextbreakpoint即光標(biāo)移到下一個(gè)斷點(diǎn)。

2)單步調(diào)試

所謂單步調(diào)試,一般是指逐個(gè)語(yǔ)句進(jìn)行調(diào)試。所有高級(jí)語(yǔ)言集成調(diào)試環(huán)境,都提供這種調(diào)試手段。欲進(jìn)行單步調(diào)試,一般只要采用單步調(diào)試快捷鍵。每按一次單步調(diào)試快捷鍵,程序就執(zhí)行一個(gè)語(yǔ)句,然后系統(tǒng)進(jìn)入中斷狀態(tài),可以從調(diào)試窗口中檢查語(yǔ)句中有關(guān)變量的當(dāng)前值、屬性值等有關(guān)信息??梢?jiàn)單步調(diào)試是“執(zhí)行一句,檢查一句”的調(diào)試方法,是一步一個(gè)腳印的極其仔細(xì)的調(diào)試方法,因此十分有用。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論