c程序設(shè)計(jì)新視角 周幸妮編第1章_第1頁(yè)
c程序設(shè)計(jì)新視角 周幸妮編第1章_第2頁(yè)
c程序設(shè)計(jì)新視角 周幸妮編第1章_第3頁(yè)
c程序設(shè)計(jì)新視角 周幸妮編第1章_第4頁(yè)
c程序設(shè)計(jì)新視角 周幸妮編第1章_第5頁(yè)
已閱讀5頁(yè),還剩135頁(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、1 1第1章 走馬觀花看編程1.1 程序的概念程序的概念1.2 計(jì)算機(jī)解題過程計(jì)算機(jī)解題過程1.3 編制程序的全過程編制程序的全過程1.4 程序的構(gòu)成程序的構(gòu)成1.5 算法是如何設(shè)計(jì)出來(lái)的算法是如何設(shè)計(jì)出來(lái)的1.6 簡(jiǎn)單的簡(jiǎn)單的C程序介紹程序介紹1.7 本章小結(jié)本章小結(jié)2 2【主要內(nèi)容】 程序的概念; 算法設(shè)計(jì)方法; 程序設(shè)計(jì)方法; 簡(jiǎn)單的C程序介紹。3 3【學(xué)習(xí)目標(biāo)】 理解程序設(shè)計(jì)的基本步驟; 能夠用自頂向下、逐步求精的方法確定算法。4 4為了使計(jì)算機(jī)能夠按人的意圖工作,人類就必須要將需要解決問題的思路、方法和手段,通過計(jì)算機(jī)能夠理解的形式告訴它,使得計(jì)算機(jī)能夠根據(jù)人的指令一步一步去工作,完

2、成特定的任務(wù)。1.1 程程序序的的概概念念5 5編程就是讓計(jì)算機(jī)為解決某個(gè)問題而使用某種程序設(shè)計(jì)語(yǔ)言編寫程序代碼,并最終得到結(jié)果的過程。 程序:為了讓計(jì)算機(jī)解決特定問題而專門設(shè)計(jì)的一系列計(jì)算機(jī)可執(zhí)行的指令集合。 程序設(shè)計(jì)語(yǔ)言:即Programming Language,是用于書寫計(jì)算機(jī)程序的語(yǔ)言。 C語(yǔ)言:Combined Language(組合語(yǔ)言)的中英文混合簡(jiǎn)稱,是一種計(jì)算機(jī)高級(jí)語(yǔ)言。6 6 計(jì)算機(jī)語(yǔ)言計(jì)算機(jī)語(yǔ)言的種類非常多,總的來(lái)說(shuō)可以分成機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言三大類。目前通用的編程語(yǔ)言有兩種:匯編語(yǔ)言和高級(jí)語(yǔ)言。7 71. 機(jī)器語(yǔ)言由于計(jì)算機(jī)內(nèi)部只能處理二進(jìn)制代碼,因此,用二進(jìn)

3、制代碼0和1描述的指令稱為機(jī)器指令。全部機(jī)器指令的集合構(gòu)成計(jì)算機(jī)的機(jī)器語(yǔ)言。用機(jī)器語(yǔ)言編寫的程序稱為目標(biāo)程序。只有目標(biāo)程序才能被計(jì)算機(jī)直接識(shí)別和執(zhí)行。但是用機(jī)器語(yǔ)言編寫的程序無(wú)明顯特征,難以記憶,不便閱讀和書寫,且依賴于具體機(jī)種,局限性很大。機(jī)器語(yǔ)言屬于低級(jí)語(yǔ)言。8 82. 匯編語(yǔ)言匯編語(yǔ)言的實(shí)質(zhì)和機(jī)器語(yǔ)言是相同的,都是直接對(duì)硬件操作,只不過其指令采用了英文縮寫的標(biāo)識(shí)符,更容易識(shí)別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來(lái)。匯編源程序一般比較冗長(zhǎng)、復(fù)雜、容易出錯(cuò),而且使用匯編語(yǔ)言編程需要有更多的計(jì)算機(jī)專業(yè)知識(shí)。但匯編語(yǔ)言的優(yōu)點(diǎn)也是顯而易見的,用匯編語(yǔ)言所能完成的操作不是一般高

4、級(jí)語(yǔ)言所能實(shí)現(xiàn)的,而且源程序經(jīng)匯編生成的可執(zhí)行文件不僅比較小,而且執(zhí)行速度很快。9 93. 高級(jí)語(yǔ)言高級(jí)語(yǔ)言是目前絕大多數(shù)編程者的選擇。和匯編語(yǔ)言相比,它不但將許多相關(guān)的機(jī)器指令合成為單條指令,并且去掉了與具體操作有關(guān)但與完成工作無(wú)關(guān)的細(xì)節(jié),這樣就大大簡(jiǎn)化了程序中的指令,編程者也就不需要有太多的計(jì)算機(jī)硬件知識(shí)。高級(jí)語(yǔ)言主要是相對(duì)于匯編語(yǔ)言而言的,它并不是特指某一種具體的語(yǔ)言,而是包括了很多編程語(yǔ)言,如目前流行的VB、C+、Delphi等,這些語(yǔ)言的語(yǔ)法、命令格式都各不相同。 10 10用高級(jí)語(yǔ)言所編制的程序不能直接被計(jì)算機(jī)識(shí)別,必須經(jīng)過轉(zhuǎn)換才能被執(zhí)行。按轉(zhuǎn)換方式可將它們分為兩類:(1) 解釋類

5、:執(zhí)行方式類似于我們?nèi)粘I钪械摹巴暦g”。應(yīng)用程序源代碼一邊由相應(yīng)語(yǔ)言的解釋器“翻譯”成目標(biāo)代碼(機(jī)器語(yǔ)言),一邊執(zhí)行,因此效率比較低,而且不能生成可獨(dú)立執(zhí)行的可執(zhí)行文件,應(yīng)用程序不能脫離其解釋器。但這種方式比較靈活,可以動(dòng)態(tài)地調(diào)整、修改應(yīng)用程序。(2) 編譯類:編譯是指在應(yīng)用源程序執(zhí)行之前,就將程序源代碼“翻譯”成目標(biāo)代碼(機(jī)器語(yǔ)言),11 11因此其目標(biāo)程序可以脫離其語(yǔ)言環(huán)境獨(dú)立執(zhí)行,使用比較方便,效率較高。但應(yīng)用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標(biāo)文件(*.OBJ)才能執(zhí)行,如果只有目標(biāo)文件而沒有源代碼,則修改很不方便。現(xiàn)在大多數(shù)的編程語(yǔ)言都是編譯型的,例如C/

6、C+、Delphi等。12 12 軟件與程序的關(guān)系常常聽到這樣的說(shuō)法,編程(Programming)就是編寫軟件。但程序與軟件在概念上是有區(qū)別的。軟件應(yīng)該包含以下三個(gè)方面的含義:13 13(1) 運(yùn)行時(shí),能夠提供所要求功能和性能的指令或計(jì)算機(jī)程序集合。(2) 程序能夠滿意地處理信息的數(shù)據(jù)結(jié)構(gòu)。(3) 描述程序功能需求以及程序如何操作和使用所要求的文檔。所以可以認(rèn)為:軟件=程序+數(shù)據(jù)+文檔14 14從“加工”的角度看,計(jì)算機(jī)解題的過程可以分成三個(gè)步驟,如圖1.1所示。先由系統(tǒng)分析員根據(jù)實(shí)際問題建立數(shù)學(xué)模型,當(dāng)這個(gè)模型不完全適合計(jì)算機(jī)時(shí),還要將它轉(zhuǎn)換成計(jì)算機(jī)能夠“接受”的模型,做這個(gè)轉(zhuǎn)換的工作需要

7、有數(shù)據(jù)結(jié)構(gòu)的知識(shí)。解題模型建立后,程序員根據(jù)它編制程序,再交由計(jì)算機(jī)執(zhí)行,得到最終的結(jié)果。1.2 計(jì)算機(jī)解題過程計(jì)算機(jī)解題過程15 15圖1.1 計(jì)算機(jī)解題過程16 16編制程序有三個(gè)基本的步驟:定算法、編程序、調(diào)試通。(1) 定算法確定算法:先要明確實(shí)際問題要求完成的功能是什么,它要處理的信息有哪些(這些信息是要輸入到計(jì)算機(jī)中的);計(jì)算機(jī)對(duì)上述信息處理完畢,實(shí)現(xiàn)了指定的功能后,結(jié)果是什么,即輸出的信息有哪些;計(jì)算機(jī)完成指定功能的具體步驟是什么。1.3 編制程序的全過程編制程序的全過程17 17(2) 編程序代碼實(shí)現(xiàn):根據(jù)前面確定的算法,編寫相應(yīng)的程序代碼。(3) 調(diào)試通調(diào)試通過:在IDE中,

8、將編好的程序通過編譯器翻譯成機(jī)器碼,這個(gè)過程叫做“編譯”。(注:IDE(Integrated Development Environment)即集成開發(fā)環(huán)境軟件,是用于程序開發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。該程序可以獨(dú)立運(yùn)行,也可以和其他程序并用。)18 18在編譯過程中,編譯器可以查找程序中的語(yǔ)法錯(cuò)誤,當(dāng)沒有語(yǔ)法錯(cuò)誤后,生成后綴為OBJ的目標(biāo)文件;若程序是由多個(gè)OBJ組合而成的,則還要把這多個(gè)OBJ文件進(jìn)行鏈接,最后形成一個(gè)后綴為EXE的可執(zhí)行文件,這時(shí),就算是編寫好了一個(gè)可以在計(jì)算機(jī)上運(yùn)行(Run)的程序了。試著運(yùn)行一下這個(gè)程序,計(jì)算機(jī)會(huì)嚴(yán)格按照用戶

9、編寫的指令一步步執(zhí)行下去。此時(shí)可以去看運(yùn)行的結(jié)果,若結(jié)果和預(yù)設(shè)的一致,那就完成了任務(wù)。19 19但事情往往沒那么簡(jiǎn)單,除非是很簡(jiǎn)單的程序,一個(gè)很有經(jīng)驗(yàn)的程序員也不能保證程序首次運(yùn)行就得到正確的結(jié)果。為什么會(huì)這樣呢,編譯完成,程序不是已經(jīng)沒有語(yǔ)法錯(cuò)誤了嗎?沒有語(yǔ)法錯(cuò)是程序可以運(yùn)行的前提,但程序中還會(huì)有一種叫做“邏輯錯(cuò)”的錯(cuò)誤,它會(huì)造成運(yùn)行結(jié)果的不正確。邏輯錯(cuò)是需要程序員自己去查找的。找邏輯錯(cuò)的工作叫做程序調(diào)試,這是一個(gè)很需要耐心和專注力的工作,難度往往比編程還要大。調(diào)試的基本方法將在第10章“程序調(diào)試及測(cè)試”中專門介紹。2020 程序的邏輯錯(cuò)程序的邏輯錯(cuò)主要表現(xiàn)在程序運(yùn)行后,得到的結(jié)果與預(yù)期設(shè)想

10、的不一致,這就有可能是出現(xiàn)了邏輯錯(cuò)。比如運(yùn)算應(yīng)該是先加后乘的處理,如果忘了加括號(hào),運(yùn)算結(jié)果就會(huì)出現(xiàn)錯(cuò)誤。通常出現(xiàn)邏輯錯(cuò)的程序都能正常運(yùn)行,系統(tǒng)不會(huì)給出錯(cuò)誤在哪里的提示信息。21 21如果把數(shù)據(jù)和程序語(yǔ)句看成是原料,程序結(jié)構(gòu)和算法是制作方法和工藝要求,則程序就是最后加工出來(lái)的產(chǎn)品,如圖1.2所示。1.4 程程序序的的構(gòu)構(gòu)成成2222圖1.2 程序加工處理示意圖2323程序由程序語(yǔ)句(有一定的語(yǔ)法規(guī)則)和數(shù)據(jù)(要處理的信息)組成,是在符合程序結(jié)構(gòu)的構(gòu)造框架(有一定之規(guī))下,按照事先設(shè)計(jì)的完成特定功能要求的執(zhí)行步驟(算法)最終完成的指令序列,將其寫成一般的形式如圖1.3所示。圖1.3 程序組成242

11、4算法是程序的靈魂,用于解決“做什么”、“怎么做”的問題;數(shù)據(jù)是加工的對(duì)象;程序結(jié)構(gòu)是設(shè)計(jì)方法;語(yǔ)言是工具。25251.4.1 程序的構(gòu)成成分之一數(shù)據(jù)數(shù)據(jù):計(jì)算機(jī)可“表現(xiàn)”、“存儲(chǔ)”、“運(yùn)算”的信息。數(shù)據(jù)的表現(xiàn)形式:常量和變量;數(shù)據(jù)的存儲(chǔ)尺寸:由類型決定;數(shù)據(jù)的運(yùn)算方式:通過運(yùn)算符實(shí)施。1程序中的數(shù)據(jù) 程序中的數(shù)據(jù)是指計(jì)算機(jī)可接收,即可存儲(chǔ)到計(jì)算機(jī)中,并可對(duì)其進(jìn)行加工處理的信息。2626 計(jì)算機(jī)中的數(shù)據(jù)在計(jì)算機(jī)中,各種信息如數(shù)字、字符、聲音、圖像等都是以二進(jìn)制編碼方式存儲(chǔ)的。下面介紹編程中相關(guān)的數(shù)據(jù)知識(shí)。27271. 數(shù)據(jù)的存儲(chǔ)單位數(shù)據(jù)的存儲(chǔ)單位見表1.1。表1.1 數(shù)據(jù)的存儲(chǔ)單位一個(gè)位(bi

12、t)有多大?位是內(nèi)存的最小單位。二進(jìn)制數(shù)系統(tǒng)中,每個(gè)0或1就是一個(gè)位。28282. ASCII碼ASCII碼(American Standard Code for Information Interchange,美國(guó)標(biāo)準(zhǔn)信息交換碼)是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。ASCII 碼使用指定的7 位或8 位二進(jìn)制數(shù)組合來(lái)表示128 或256 種可能的字符。標(biāo)準(zhǔn)ASCII 碼也叫基礎(chǔ)ASCII碼,使用7 位二進(jìn)制數(shù)來(lái)表示所有的大寫和小寫字母、數(shù)字09、標(biāo)點(diǎn)符號(hào)以及在美式英語(yǔ)中使用的特殊控制字符。2929256種字符中的后128個(gè)字

13、符稱為擴(kuò)展ASCII碼,目前許多基于x86的系統(tǒng)都支持使用擴(kuò)展(或“高”)ASCII碼。擴(kuò)展ASCII 碼允許將每個(gè)字符的第8 位用于確定附加的128 個(gè)特殊符號(hào)字符、外來(lái)語(yǔ)字母和圖形符號(hào)。30303. 漢字編碼為漢字設(shè)計(jì)的一種便于輸入計(jì)算機(jī)的代碼。計(jì)算機(jī)中漢字的表示也是用二進(jìn)制編碼,同樣是人為編碼的。根據(jù)應(yīng)用目的的不同,漢字編碼分為外碼、交換碼、機(jī)內(nèi)碼和字形碼。 1981年,國(guó)家標(biāo)準(zhǔn)局公布了信息交換用漢字編碼字符集基本集(簡(jiǎn)稱漢字標(biāo)準(zhǔn)交換碼),其中共收錄了6763個(gè)漢字。這種漢字標(biāo)準(zhǔn)交換碼是計(jì)算機(jī)的內(nèi)部碼,可以為各種輸入/輸出設(shè)備的設(shè)計(jì)提供統(tǒng)一的標(biāo)準(zhǔn),使各種系統(tǒng)之間的信息交換有共同一致性,從

14、而使信息資源的共享得以保證。31 312數(shù)據(jù)的表現(xiàn)形式常量和變量在許多問題中,都會(huì)有有些量固定不變,有些量不斷變化的情形。如物體運(yùn)動(dòng)中的速度、時(shí)間和距離,圓的半徑、周長(zhǎng)和圓周率,購(gòu)買商品的數(shù)量、單價(jià)和總價(jià)等。數(shù)據(jù)在程序中的表現(xiàn)形式有兩種:常量和變量。常量是在程序運(yùn)行過程中,值不能被改變的量;變量是在程序運(yùn)行過程中,值能被改變的量。C語(yǔ)言中會(huì)給變量起一個(gè)名字,在內(nèi)存中給它分配一個(gè)存儲(chǔ)單元,用來(lái)存儲(chǔ)它的值。3232變量的起名和分配存儲(chǔ)單元都是在一個(gè)稱做“變量定義”的語(yǔ)句中完成的,存儲(chǔ)變量的值如果在定義時(shí)指定,則稱做是對(duì)變量進(jìn)行初始化。初始化:在變量定義時(shí)對(duì)變量進(jìn)行賦值的操作。變量沒有初始化,那么它

15、的存儲(chǔ)單元里會(huì)是什么數(shù)?答案會(huì)在第2章中給出。3333為什么要用變量?答:程序要解決的問題往往是通解。比如,計(jì)算n!的程序,n=5時(shí),能給出正確結(jié)果;n=10時(shí),也應(yīng)該能給出正確結(jié)果,即只要輸入的n為一定范圍的正整數(shù),那么程序都應(yīng)該能計(jì)算出結(jié)果,這樣的程序才有實(shí)際的意義。34343數(shù)據(jù)的存儲(chǔ)尺寸由類型決定數(shù)據(jù)在機(jī)器中存放,需要一定的內(nèi)存空間,變量在內(nèi)存中給它分有存儲(chǔ)單元,那么這個(gè)存儲(chǔ)單元的大小是多少呢?實(shí)際的情形應(yīng)該是,程序員根據(jù)數(shù)據(jù)實(shí)際需要占多少位(bit),來(lái)向計(jì)算機(jī)系統(tǒng)申請(qǐng)分配相應(yīng)大小的存儲(chǔ)單元。C語(yǔ)言根據(jù)數(shù)據(jù)的各種情形,把它們分成不同的類型,如表1.2所示。3535表1.2 數(shù) 據(jù) 類

16、 型3636不同類型的數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)單元的大小是不同的,計(jì)算機(jī)系統(tǒng)提供了不同“規(guī)格尺寸”的空間大小基本數(shù)據(jù)類型,構(gòu)造類型是由基本類型組合而成的。變量存儲(chǔ)單元的大小是由其數(shù)據(jù)類型決定的,程序員可以根據(jù)需要選用。為什么要有各種數(shù)據(jù)類型?答: 可解決數(shù)據(jù)的有效存儲(chǔ)空間問題; 不同類型的數(shù)據(jù)其處理規(guī)則、方式不相同。37374數(shù)據(jù)的運(yùn)算方式通過運(yùn)算符實(shí)施對(duì)數(shù)據(jù)的加工處理是通過各種運(yùn)算符來(lái)實(shí)施的。C語(yǔ)言中的各種運(yùn)算符見表1.3,具體使用方法會(huì)在第2章中介紹。3838表1.3 C語(yǔ)言中的運(yùn)算符39391.4.2 程序的構(gòu)成成分之二程序語(yǔ)句程序語(yǔ)句:向機(jī)器發(fā)出的操作指令。語(yǔ)句由語(yǔ)句命令字、數(shù)據(jù)、運(yùn)算符等構(gòu)成。

17、語(yǔ)句命令字有三類,見表1.4。選擇及循環(huán)語(yǔ)句的功能及用法將在第3章中介紹,函數(shù)return語(yǔ)句將在第5章中介紹。4040表1.4 語(yǔ)句命令字41 41圖1.4 順序結(jié)構(gòu)42421.4.3 程序的構(gòu)造框架程序結(jié)構(gòu)任何程序都可由順序、選擇、循環(huán)三種基本控制結(jié)構(gòu)構(gòu)造而成。1順序結(jié)構(gòu)順序結(jié)構(gòu)是最簡(jiǎn)單的程序結(jié)構(gòu),語(yǔ)句按照事前排好的順序,順次執(zhí)行。如圖1.4中,A語(yǔ)句和B語(yǔ)句是依次執(zhí)行的,只有在執(zhí)行完A語(yǔ)句后,才能接著執(zhí)行B語(yǔ)句。A語(yǔ)句和B語(yǔ)句可以是一條語(yǔ)句或一組語(yǔ)句。43432選擇結(jié)構(gòu)在處理實(shí)際問題時(shí),只有順序結(jié)構(gòu)是不夠的,經(jīng)常會(huì)遇到一些條件的判斷,流程根據(jù)條件是否成立有不同的流向。如圖1.5所示,程序

18、根據(jù)給定的條件Q是否成立而選擇執(zhí)行A操作或B操作。先進(jìn)行條件Q的判斷,成立,轉(zhuǎn)向Y(Yes)分支;否則,轉(zhuǎn)向N(No)分支。4444圖1.5 選擇結(jié)構(gòu)4545C語(yǔ)言從機(jī)制上提供了三類選擇語(yǔ)句,來(lái)實(shí)現(xiàn)選擇結(jié)構(gòu)的功能。(1) 單路選擇:If(表達(dá)式) 語(yǔ)句 A;(2) 雙路選擇:If(表達(dá)式)語(yǔ)句 A;else 語(yǔ)句 B;(3) 多路選擇:4646Switch(表達(dá)式)case 常量1:語(yǔ)句 A;case 常量2:語(yǔ)句 B;default:語(yǔ)句 C;47473循環(huán)結(jié)構(gòu)需要重復(fù)執(zhí)行同一操作的結(jié)構(gòu)稱為循環(huán)結(jié)構(gòu),即從某處開始,按照一定條件反復(fù)執(zhí)行某一處理步驟。在解決一些問題時(shí),經(jīng)常需要重復(fù)執(zhí)行一些操作,

19、我們可以利用循環(huán)結(jié)構(gòu)控制程序按照一定的條件或者次數(shù)重復(fù)執(zhí)行。循環(huán)結(jié)構(gòu)有當(dāng)型循環(huán)和直到型循環(huán)兩類形式,如圖1.6所示。4848圖1.6 循環(huán)結(jié)構(gòu)4949 循環(huán)體:反復(fù)執(zhí)行的處理步驟稱為循環(huán)體。 當(dāng)型循環(huán):當(dāng)條件Q成立時(shí),執(zhí)行語(yǔ)句A,然后再判斷條件Q是否成立,如此循環(huán),直到Q不滿足,退出循環(huán)。 直到型循環(huán):先執(zhí)行語(yǔ)句A,然后再判斷條件Q是否成立,如此循環(huán),直到Q不滿足,退出循環(huán)。C語(yǔ)言從機(jī)制上提供了四類循環(huán)語(yǔ)句,來(lái)實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的功能。5050(1) 形式一:while (表達(dá)式) 語(yǔ)句;(2) 形式二:do 語(yǔ)句 ; while (表達(dá)式);(3) 形式三:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

20、語(yǔ)句;(4) 形式四:if (表達(dá)式) goto51 511.4.4 程序的構(gòu)造方法算法有兩種思想,像放在天鵝絨上的寶石一樣熠熠生輝,一個(gè)是微積分,另一個(gè)就是算法。微積分以及在微積分基礎(chǔ)上建立起來(lái)的數(shù)學(xué)分析體系造就了現(xiàn)代科學(xué),而算法造就了現(xiàn)代世界。 David Berlinski(算法的出現(xiàn)的作者)52521.算法的概念 算法(algorithm):為解決一個(gè)問題而采取的方法和步驟。 計(jì)算機(jī)算法:計(jì)算機(jī)能夠執(zhí)行的算法。算法可以理解為由基本運(yùn)算及規(guī)定的運(yùn)算順序所構(gòu)成的完整的解題步驟,或者看成按照要求設(shè)計(jì)好的有限的確切的計(jì)算序列,并且這樣的步驟和序列可以解決一類問題。5353計(jì)算機(jī)算法解題的方法和

21、步驟要符合計(jì)算機(jī)的特點(diǎn),即每一步都很簡(jiǎn)單,可以不厭其煩地執(zhí)行簡(jiǎn)單的步驟。計(jì)算機(jī)解題也具有一定的局限性,有時(shí)日??尚械姆桨?,在計(jì)算機(jī)中卻無(wú)法實(shí)現(xiàn)。54542算法的表示方法1) 算法的表示方法1流程圖流程圖是用一些圖框表示各種操作。用圖形表示算法直觀形象,易于理解。美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI(American National Standard Institute)規(guī)定了一些常用的流程圖符號(hào),如圖1.7所示。5555圖1.7 流程圖符號(hào)56562) 算法的表示方法2N-S圖N-S圖是無(wú)線的流程圖,又稱盒圖,1973年由美國(guó)學(xué)者I.Nassi和B.Shneiderman提出。N-S圖對(duì)三種基本程序結(jié)

22、構(gòu)的描述方法如圖1.8所示。5757圖1.8 N-S圖表示法58583) 算法的表示方法3偽代碼偽代碼(Pseudocode):用代碼的格式表示程序執(zhí)行過程和算法,但不能在編譯器上通過編譯的代碼。其目的是用易于理解和表述的方式展示程序的執(zhí)行過程。偽代碼是不依賴于具體程序語(yǔ)言的,它只是用程序語(yǔ)言的結(jié)構(gòu)形式來(lái)表示程序執(zhí)行過程。用偽代碼描述算法,可以使用任何一種用戶熟悉的文字,關(guān)鍵是把程序的執(zhí)行意圖表達(dá)出來(lái)。5959 偽代碼偽代碼又稱虛擬代碼,是高層次描述算法的一種方法。它不是一種現(xiàn)實(shí)存在的編程語(yǔ)言,它可能綜合使用多種編程語(yǔ)言的語(yǔ)法、保留字,甚至?xí)玫阶匀徽Z(yǔ)言。偽代碼以編程語(yǔ)言的書寫形式指明算法的職

23、能。相比于程序語(yǔ)言(如Java、C+、C、Delphi 等)它更類似自然語(yǔ)言。我們可以將整個(gè)算法運(yùn)行過程的結(jié)構(gòu)用接近自然語(yǔ)言的形式描述出來(lái)。6060這里用戶可以使用任何一種熟悉的文字,如中文或英文等,關(guān)鍵是把程序的意思表達(dá)出來(lái)。使用偽代碼,可以幫助我們更好地表述算法,不用拘泥于具體的實(shí)現(xiàn)。人們?cè)谟貌煌木幊陶Z(yǔ)言實(shí)現(xiàn)同一個(gè)算法時(shí)意識(shí)到,他們的實(shí)現(xiàn)(注意:是實(shí)現(xiàn),不是功能)往往是不同的,尤其是對(duì)于那些熟練于某種編程語(yǔ)言的程序員來(lái)說(shuō),要理解一個(gè)用其他編程語(yǔ)言編寫的程序的功能可能很困難,因?yàn)槌绦蛘Z(yǔ)言的形式限制了程序員對(duì)程序關(guān)鍵部分的理解。偽代碼就這樣應(yīng)運(yùn)而生了。61 61當(dāng)考慮算法功能(而不是其語(yǔ)言實(shí)

24、現(xiàn))時(shí),常常應(yīng)用偽代碼。計(jì)算機(jī)科學(xué)在教學(xué)中通常使用偽代碼,以使得所有的程序員都能理解。6262【例1-1】 偽代碼的例子。下面是“清晨上課準(zhǔn)備”的兩種算法:由上面的例子可以看出,第二種算法明顯不合理,所以,算法不僅要確定正確的執(zhí)行動(dòng)作,還要確定正確的動(dòng)作執(zhí)行的順序。63633算法的闡述方法(1) 程序的質(zhì)量首先取決于它的結(jié)構(gòu)。(2) 程序設(shè)計(jì)的基本方法是自頂向下地逐步求精和模塊化。 64641. 結(jié)構(gòu)化程序設(shè)計(jì) 結(jié)構(gòu)化程序設(shè)計(jì)(Structured Programming)是以模塊功能和處理過程設(shè)計(jì)為主的詳細(xì)設(shè)計(jì)的基本原則。其概念最早是由E.W.Dijikstra在1965年提出的,是軟件發(fā)展

25、的一個(gè)重要的里程碑。它的主要觀點(diǎn)是:采用自頂向下、逐步求精的程序設(shè)計(jì)方法;使用三種基本控制結(jié)構(gòu)構(gòu)造程序,即任何程序都可由順序、選擇、循環(huán)三種基本控制結(jié)構(gòu)構(gòu)造。結(jié)構(gòu)化程序設(shè)計(jì)主要強(qiáng)調(diào)的是程序的易讀性。65652. 自頂向下逐步細(xì)化程序設(shè)計(jì)時(shí),應(yīng)先考慮總體,后考慮細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。不要一開始就過多追求眾多的細(xì)節(jié),先從最上層總目標(biāo)開始設(shè)計(jì),逐步使問題具體化。對(duì)復(fù)雜問題,應(yīng)設(shè)計(jì)一些子目標(biāo)作為過渡,逐步細(xì)化。 用這種方法設(shè)計(jì)程序,似乎復(fù)雜,實(shí)際上優(yōu)點(diǎn)很多,可使程序易讀、易寫、易調(diào)試、易維護(hù)、易保證其正確性及驗(yàn)證其正確性,在程序設(shè)計(jì)領(lǐng)域引發(fā)了一場(chǎng)革命,成為程序開發(fā)的一個(gè)標(biāo)準(zhǔn)方法,尤其是

26、在后來(lái)發(fā)展起來(lái)的軟件工程中獲得了廣泛應(yīng)用。66663. 模塊化設(shè)計(jì) 一個(gè)復(fù)雜問題,一般是由若干稍簡(jiǎn)單的問題構(gòu)成的。模塊化是把程序要解決的總目標(biāo)分解為子目標(biāo),再進(jìn)一步分解為具體的容易實(shí)現(xiàn)的小目標(biāo),每一個(gè)小目標(biāo)被稱為一個(gè)模塊。67674算法的特性算法應(yīng)具有以下五個(gè)重要特性:(1) 輸入性:一個(gè)算法有零個(gè)或多個(gè)輸入。(2) 輸出性:一個(gè)算法有一個(gè)或多個(gè)輸出,且輸出是與輸入有著某些特定關(guān)系的量。(3) 有窮性:一個(gè)算法必須在執(zhí)行有窮步之后結(jié)束,且每條指令的執(zhí)行次數(shù)有限。(4) 確定性:算法中每條指令必須確切定義且含義明確,不可有二義性;對(duì)于相同的輸入只能得出特定的結(jié)果。6868(5) 可行性:算法中描

27、述的操作都是可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次來(lái)實(shí)現(xiàn)的,即每條指令都應(yīng)在有限的時(shí)間內(nèi)完成。69691.5.1 算法與計(jì)算機(jī)算法我們?cè)谌粘I钪薪鉀Q問題的方式方法,有時(shí)卻不能直接用到計(jì)算機(jī)中?!纠?-2】 算法的例子1。將兩個(gè)存儲(chǔ)單元的數(shù)據(jù)A、B互換,且互換后的數(shù)據(jù)不損失?!窘狻?(1) 通用法:借助第三個(gè)存儲(chǔ)單元,分別按圖1.9中、的順序移動(dòng)即可。1.5 算法是如何設(shè)計(jì)出來(lái)的算法是如何設(shè)計(jì)出來(lái)的7070圖1.9 數(shù)據(jù)交換71 71(2) 另類法:具體可采用以下幾種方法。高空拋物法:把A、B想象成物體,像雜耍一般,將A、B“拋向空中”,然后交換位置。 管子運(yùn)輸法:把兩個(gè)存儲(chǔ)單元用兩個(gè)“管道”連

28、接起來(lái),分別輸送A、B至對(duì)方單元。原地挪空法:假設(shè)A、B所在的單元空間足夠大,這樣可以把B先放到A所在的單元,然后把A移動(dòng)到B原先所在的單元。7272對(duì)于通用法和另類法,在現(xiàn)實(shí)世界里,一定條件下都是可行的,但在計(jì)算機(jī)世界里,通用法是可以的,另類法中的“原地挪空”在一定條件下也是可行的,其他的方法就是強(qiáng)計(jì)算機(jī)所難了?!舅惴ńY(jié)論1】 有時(shí)在日常能行得通的方法,在計(jì)算機(jī)中是無(wú)法實(shí)現(xiàn)的。73731.5.2 算法的通用性現(xiàn)代計(jì)算機(jī)(20世紀(jì)40年代開始)在誕生之初常被冠以“通用”字樣,以突出其通用性。什么是適合計(jì)算機(jī)實(shí)現(xiàn)的方法呢?那就是規(guī)則要簡(jiǎn)單,并對(duì)所有的數(shù)據(jù)處理,其操作規(guī)則要“通用”。軟件調(diào)試張銀奎

29、 【例1-3】 算法的例子2。小學(xué)生的除法問題:只考慮兩位數(shù)除以一位數(shù),且商為一位數(shù)的情形。如:234=53 376=617474對(duì)于人腦來(lái)說(shuō),小學(xué)老師教的試商方法巧妙快捷;但對(duì)于計(jì)算機(jī)來(lái)說(shuō),小學(xué)老師教的試商方法實(shí)現(xiàn)起來(lái)還是很復(fù)雜。7575其中:A(被除數(shù))為兩位數(shù),B(除數(shù))、T(商)、R(余數(shù))均為一位數(shù)。【方案一】 一律從9開始試商法。我們先用偽代碼的方式來(lái)表述處理問題的思路。表1.5給出了方案一的頂部偽代碼描述。7676表1.5 例1-3方案一偽代碼17777圖1.10 頂部偽代碼流程7878寫頂部偽代碼,是把問題及你想要對(duì)它進(jìn)行處理的方法簡(jiǎn)要地描述一下,后面的細(xì)化可以逐步進(jìn)行,直至可

30、以方便地寫成程序的形式為止。頂部偽代碼對(duì)應(yīng)的流程圖如圖1.10所示。由頂部的偽代碼還無(wú)法直接寫出寫出程序,可以再把其中的步驟更進(jìn)一步地細(xì)化描述。表1.6和表1.7給出了方案逐步細(xì)化的過程,相應(yīng)的流程圖如圖1.11、圖1.12所示。7979表1.6 例1-3方案一偽代碼28080圖1.11 第一步細(xì)化對(duì)應(yīng)流程81 81表1.7 例1-3方案一偽代碼28282圖1.12 第二步細(xì)化對(duì)應(yīng)流程8383處理問題一般分為下面三個(gè)階段:(1) 開始的工作:先從9開始試商,然后再細(xì)化,要考慮9放在哪里,而且應(yīng)該在程序一開始就得到這個(gè)值。(2) 中間處理過程:試商找到合適的結(jié)果;第一步細(xì)化為商T與除數(shù)B的乘積,

31、再與被除數(shù)A相比,若商T大,則減1再試,直到滿足B*TA)成立,則循環(huán)執(zhí)行商T的值減1的操作,直到上述條件不滿足,循環(huán)操作停止。(3) 得到結(jié)果:確定最后得到的結(jié)果是哪些項(xiàng)。表1.8中給出了圖1.12 第二步細(xì)化對(duì)應(yīng)流程圖的逐步執(zhí)行分析步驟。8484表1.8 結(jié)果分析表8585表1.8中的第一列,商T的初始值為9,B為常量4,A為常量23,對(duì)條件B*TA是否成立進(jìn)行判斷。首次B*T為36,故B*TA成立,流程執(zhí)行“yes”分支,T的值減1,變成8(到表格第二列),再回到條件B*TA的判斷,這樣循環(huán)下去,直到B*TA不成立,流程執(zhí)行“no”分支,輸出結(jié)果后,流程結(jié)束。繪制圖表是調(diào)試過程中任何時(shí)候

32、都能使用的啟發(fā)方式。 軟件調(diào)試思想Robert Charles Metzger 8686下面,再給出問題的第二種解法被除數(shù)連續(xù)減除數(shù),這樣便于比較。同一問題,解題方法可以不同,而表述方式卻是類似的?!痉桨付?被除數(shù)連續(xù)減除數(shù)。本方案的偽代碼細(xì)化過程見表1.9表1.11。機(jī)器解決問題的特點(diǎn)之一是按部就班,本次計(jì)算往往要用到上一次的結(jié)果。8787表1.9 例1-3方案二偽代碼18888表1.10 例1-3方案二偽代碼28989表1.11 例1-3方案二偽代碼39090圖1.13 被除數(shù)連續(xù)減91 91表1.12中列出了處理流程中,每一步執(zhí)行時(shí)變量R、T的值的變化和條件R B的判斷結(jié)果。表1.12

33、 運(yùn)行結(jié)果分析9292【算法結(jié)論2】 日常看似“巧”的方法,對(duì)機(jī)器而言,不一定是好方法。1.5.3 算法的全面性【例1-4】 算法的例子3。求n!?!窘狻?為分析問題方便,此處設(shè)n=5。人工計(jì)算5!=1*2*3*4*5的通用方法的步驟見表1.13。這里即使是人來(lái)計(jì)算階乘,也強(qiáng)調(diào)了“通用”的方法,而不是用“巧”的速算的方法,這樣就是用“程序的思維”來(lái)看問題了。9393表1.13 n!的計(jì)算步驟分析下面再來(lái)分析機(jī)器計(jì)算5!的通用方法。計(jì)算機(jī)需要知道的信息:(1) 運(yùn)算方法:乘法。(2) 運(yùn)算數(shù)據(jù):1、2、3、4、5。9494如何讓計(jì)算機(jī)得到上面的運(yùn)算數(shù)據(jù)呢?答:其實(shí)計(jì)算機(jī)是“很笨”的,你要讓它處理

34、的所有數(shù)據(jù)、所用方法,一點(diǎn)一滴都要你“手把手”地交給它,不然它什么都不會(huì)做。方法一:每個(gè)數(shù)都可以通過鍵盤輸入到計(jì)算機(jī)中。方法二:除了1之外,每個(gè)數(shù)都是前一個(gè)數(shù)加1而來(lái),或者說(shuō)迭代而來(lái)的。9595對(duì)于方法一,當(dāng)數(shù)據(jù)較少時(shí)可以采用,數(shù)據(jù)多了就顯得很麻煩。方法二則是一個(gè)比較好的辦法。 遞推(迭代)法遞推法是指根據(jù)問題的遞推關(guān)系,由已知項(xiàng),經(jīng)過有限次的遞推迭代,得到待求的未知項(xiàng)。凡是具有遞推公式的一類數(shù)值問題,都可以用迭代法來(lái)求解。9696迭代步驟:(1) 列出問題的已知項(xiàng); (2) 根據(jù)問題的關(guān)系,寫出遞推公式; (3) 對(duì)遞推公式進(jìn)行有限次的遞推迭代,直到待求的未知項(xiàng),即為所解。根據(jù)n!的計(jì)算步驟

35、特點(diǎn)、運(yùn)算的方法、運(yùn)算數(shù)據(jù)的獲得方式等,可以寫出計(jì)算n!的偽代碼,參見表1.14表1.16。9797表1.14 例1-4偽代碼19898表1.15 例1-4偽代碼2圖1.14所示為求5!的流程,執(zhí)行循環(huán)后變量S和T的變化見表1.17。9999表1.16 例1-4偽代碼3100100圖1.14 求5!的流程101101表1.17 執(zhí)行流程數(shù)據(jù)分析在對(duì)5!處理完畢后,從程序的通用性方面還需要考慮一些問題。102102(1) 要計(jì)算10!,怎么辦呢?(2) 計(jì)算1!時(shí),結(jié)果對(duì)嗎?(3) 若要分別計(jì)算許多整數(shù)的階乘怎么辦呢?答:?jiǎn)栴}(1):可以把圖1.14中的判斷T5改為T10。問題(2):圖1.14

36、中,計(jì)算1!結(jié)果為2,顯然是錯(cuò)誤的。103103問題(3):可以把圖1.14中的判斷T5改為Tn,n設(shè)為整數(shù),可以通過輸入得到n的具體值。在考慮了上述所有問題之后,可以對(duì)圖1.14所示的流程進(jìn)行改進(jìn),得到如圖1.15所示的處理流程。討論到此,是不是此問題的解決方案就完善了呢?104104圖1.15 求n!改進(jìn)的處理流程105105若用戶輸入 n=-1,怎么辦呢?答:當(dāng)用戶有意或無(wú)意當(dāng)中輸入了“非法”的數(shù)據(jù)時(shí),程序應(yīng)該有合適的應(yīng)對(duì)方法,而不能對(duì)此“束手無(wú)策”。程序應(yīng)該驗(yàn)證所有輸入的合法性,以防錯(cuò)誤信息影響程序的計(jì)算。改進(jìn)后的最終流程如圖1.16所示。106106圖1.16 求n!最終改進(jìn)流程10

37、7107 【算法結(jié)論3】 算法設(shè)計(jì)的一般步驟:(1) 按問題的普遍規(guī)律給出處理的流程。(2) 設(shè)定初始值。(3) 確定程序結(jié)束的條件。(4) 考慮臨界點(diǎn)或特殊點(diǎn)的處理。(5) 考慮異常情況。108108說(shuō)明:(1) 先按問題的普遍規(guī)律給出處理的流程。對(duì)n!而言,根據(jù)它的數(shù)學(xué)定義,可以先找一個(gè)一般情形且規(guī)模不太大的值比如5,來(lái)考慮算法的實(shí)現(xiàn)。(2) 設(shè)定初始值。計(jì)算5!,它的起始條件是從1*1開始計(jì)算。(3) 確定程序結(jié)束的條件。計(jì)算5!,乘數(shù)為5時(shí)結(jié)束。109109(4) 考慮臨界點(diǎn)或特殊點(diǎn)的處理。0和1是n!的特例情形,對(duì)這些特別“點(diǎn)”的處理,是先把它們作為輸入的數(shù)據(jù),去測(cè)試前面已經(jīng)構(gòu)建好的

38、算法。若測(cè)試通過,則程序合格;若沒有通過,再做局部的修改,直至達(dá)到預(yù)定的功能。(5) 考慮異常情況。對(duì)n!,應(yīng)該對(duì)輸入為n0的“非法”情形做限定性處理,以防錯(cuò)誤信息影響程序的計(jì)算。1101101.5.4 算法的驗(yàn)證從前面做算法的一般性步驟中可以看到,對(duì)于做好的算法,它是否完善及能否達(dá)到預(yù)期的目標(biāo),是要經(jīng)過驗(yàn)證的。對(duì)于算法的驗(yàn)證,要設(shè)計(jì)出合適的測(cè)試用例,我們可以借鑒軟件測(cè)試的一般性方法。測(cè)試用例的設(shè)計(jì),應(yīng)該在進(jìn)行算法設(shè)計(jì)時(shí)就盡量考慮全面,而不是在程序編完之后隨便找些數(shù)據(jù)來(lái)測(cè)試它。 軟件測(cè)試:在規(guī)定的條件下對(duì)程序進(jìn)行操作,以發(fā)現(xiàn)程序錯(cuò)誤,衡量軟件品質(zhì),并對(duì)其是否能滿足設(shè)計(jì)要求進(jìn)行評(píng)估的過程。這是軟

39、件測(cè)試的經(jīng)典定義。111111軟件測(cè)試是一種實(shí)際輸出與預(yù)期輸出間的稽核或者比較過程。 測(cè)試用例:為某個(gè)特殊目標(biāo)而編制的一組測(cè)試輸入、執(zhí)行條件以及預(yù)期結(jié)果,以便測(cè)試某個(gè)程序路徑或核實(shí)是否滿足某個(gè)特定需求。關(guān)于測(cè)試的更進(jìn)一步的介紹,參見第10章。112112【例1-5】 C程序的樣例1。在屏幕上輸出“Welcome to C!”,程序及語(yǔ)句含義解釋見表1.18。1.6 簡(jiǎn)單的簡(jiǎn)單的C程序介紹程序介紹113113表1.18 C程序樣例1114114程序結(jié)果:Welcome to C!表1.18中,“程序”一列給出的是一個(gè)完整的C語(yǔ)言程序,“行號(hào)”和“含義”兩列是為方便說(shuō)明程序而加的,并不是程序的內(nèi)容

40、。表1.18程序完成的功能是在屏幕上輸出“Welcome to C!”這樣一串字符。其中主要幾行的說(shuō)明如下:第1行:注釋。115115程序注釋:用一組/* */(或 /)括起來(lái)的字符串,用于程序語(yǔ)句等含義的說(shuō)明。在C語(yǔ)言中,所有的注釋由字符/*開始,以*/結(jié)束。在星號(hào)及斜杠之間不允許有空格。編譯程序編譯時(shí)將忽略注釋的內(nèi)容,即不會(huì)把它們翻譯成機(jī)器碼。一般情況下,源程序有效注釋量應(yīng)在20以上。注釋的原則是有助于對(duì)程序的閱讀理解。注釋語(yǔ)言必須準(zhǔn)確、易懂、簡(jiǎn)潔。116116第2行:文件包含。include是c語(yǔ)言的預(yù)編譯命令,表示文件包含的意思;stdio.h 是英文Standard input ou

41、tput head(標(biāo)準(zhǔn)輸入輸出頭文件)的縮寫。第5行:主函數(shù)main。一個(gè)C程序總是有一個(gè)稱為main的主函數(shù),主函數(shù)中間的所有語(yǔ)句都被一對(duì)大括號(hào)包括在內(nèi)。本例的左右大括號(hào)分別出現(xiàn)在第6行和第11行。117117函數(shù):C語(yǔ)言中,把功能相對(duì)獨(dú)立的程序段稱做“函數(shù)”。第7行:庫(kù)函數(shù)printf()。printf是系統(tǒng)提供的庫(kù)函數(shù),它的說(shuō)明是放在stdio.h這個(gè)頭文件中的,功能是把括號(hào)內(nèi)雙引號(hào)中的內(nèi)容輸出到屏幕上。printf輸出的內(nèi)容可以由程序員根據(jù)需要來(lái)填寫。118118庫(kù)函數(shù):庫(kù)函數(shù)并不是C語(yǔ)言的一部分,它是由編譯系統(tǒng)把實(shí)現(xiàn)常用功能的一組程序放在系統(tǒng)程序庫(kù)中,用戶可以通過引用程序庫(kù)相應(yīng)的程

42、序說(shuō)明文件(頭文件)來(lái)使用這些程序,即庫(kù)函數(shù)。C語(yǔ)言中常見的庫(kù)函數(shù)參看附錄C。119119 為什么要建立函數(shù)庫(kù)?建立函數(shù)庫(kù)是為了把可重復(fù)使用的函數(shù)放在一起,供其他程序員和程序共享。例如,幾個(gè)程序可能都會(huì)用到一些通用的功能函數(shù),那就不必在每個(gè)程序中都復(fù)制這些源代碼,而只需把這些函數(shù)集中到一個(gè)函數(shù)庫(kù)中,然后用連接程序把它們連接到程序中。這種方法有利于程序的編寫和維護(hù)。120120文件包含:其功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個(gè)源文件。形式:#include (或者:#include 文件名)121121說(shuō)明:(1) 被包含的文件可以由系統(tǒng)提供,

43、也可以由程序員自己編寫。(2) 一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。(3) 如果文件名以尖括號(hào)括起,在編譯時(shí)將會(huì)在指定的目錄下查找此頭文件;如果文件名以雙引號(hào)括起,在編譯時(shí)會(huì)首先在當(dāng)前的源文件目錄中查找該頭文件,若找不到才會(huì)到系統(tǒng)的指定目錄下去查找。(4) 更多的內(nèi)容參見第9章。122122頭文件:頭文件的目的是把多個(gè)C程序文件公用的內(nèi)容單獨(dú)放在一個(gè)文件里,以減少整體代碼尺寸。頭文件的擴(kuò)展名為.h。凡是在程序中要用到庫(kù)函數(shù)時(shí),都必須包含該函數(shù)原型所在的頭文件。 C語(yǔ)言的頭文件中包括了各個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)的說(shuō)明形式。123123 注釋每個(gè)函數(shù)

44、之前都應(yīng)該有一段描述該函數(shù)目的的注釋。每個(gè)函數(shù)開始、結(jié)束時(shí)應(yīng)該加一注釋,標(biāo)明該函數(shù)開始或結(jié)束。 輸出格式輸出的最后一個(gè)字符應(yīng)該是換行符(n)。這種約定有助于軟件的可重用性。 縮進(jìn)應(yīng)該把函數(shù)體縮進(jìn)一個(gè)級(jí)別。這強(qiáng)調(diào)了程序的函數(shù)化結(jié)構(gòu),使程序更易閱讀。用戶可設(shè)置自己喜歡的縮進(jìn)大小約定,然后在程序設(shè)計(jì)時(shí)統(tǒng)一使用這個(gè)約定??捎肨ab鍵來(lái)縮進(jìn)。124124【例1-6】 C程序的樣例2。求兩個(gè)數(shù)之和。程序及語(yǔ)句含義解釋見表1.19。125125表1.19 C程序樣例2126126程序結(jié)果:sum is 579【例1-7】 C程序的樣例3。通過鍵盤輸入兩個(gè)整數(shù),計(jì)算這兩個(gè)整數(shù)的和,并將結(jié)果顯示到屏幕上,程序見表1.20。127127表1.20 C程序樣例3128128程序結(jié)果:Enter first integer6Enter second integer23Sum is 29【例1-8】 C程序的樣例4。含有多個(gè)函數(shù)的程序,見表1.21。129129表1.21 C程序樣例4130130表1.21中的這段程序除了有主函數(shù)main外,還有一個(gè)子函數(shù)max,它的形式和ma

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論