![第3章-簡單程序設(shè)計_第1頁](http://file4.renrendoc.com/view/df8f67671d53f52d5fb264fe2be38c7c/df8f67671d53f52d5fb264fe2be38c7c1.gif)
![第3章-簡單程序設(shè)計_第2頁](http://file4.renrendoc.com/view/df8f67671d53f52d5fb264fe2be38c7c/df8f67671d53f52d5fb264fe2be38c7c2.gif)
![第3章-簡單程序設(shè)計_第3頁](http://file4.renrendoc.com/view/df8f67671d53f52d5fb264fe2be38c7c/df8f67671d53f52d5fb264fe2be38c7c3.gif)
![第3章-簡單程序設(shè)計_第4頁](http://file4.renrendoc.com/view/df8f67671d53f52d5fb264fe2be38c7c/df8f67671d53f52d5fb264fe2be38c7c4.gif)
![第3章-簡單程序設(shè)計_第5頁](http://file4.renrendoc.com/view/df8f67671d53f52d5fb264fe2be38c7c/df8f67671d53f52d5fb264fe2be38c7c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
存儲相關(guān)的單位有哪些?程序中如何使用內(nèi)存空間進(jìn)行數(shù)據(jù)存儲的?C語言中都能處理哪些數(shù)據(jù)?每種數(shù)據(jù)具有哪些特點(diǎn)?程序中如何使用數(shù)據(jù)?(聲明,初始化,賦值)復(fù)習(xí)1第三章程序設(shè)計初步導(dǎo)入我們已經(jīng)接觸到了一些初級的C語言程序,能夠進(jìn)行簡單的賦值操作和算術(shù)運(yùn)算。這些小程序,問題描述簡單明了,解題步驟一目了然,程序設(shè)計使用的都是順序執(zhí)行的簡單語句。如果所有問題都這么簡單,計算機(jī)又有什么用武之地呢?計算機(jī)的一個最大優(yōu)勢就是能夠快速處理大量數(shù)據(jù)。實(shí)際應(yīng)用過程中,需要使用C語言來輔助解決的問題通常要比前面的示例復(fù)雜很多,面臨更大規(guī)模的問題。例如,對第一章中的示例程序Add.c進(jìn)行修改,使得其不是簡單的計算兩個數(shù)的和,而是計算10個、100個甚至1000個數(shù)的累加和。如果采用原有程序設(shè)計方案,對10個數(shù)來說或許還能正常工作,需要增加10個對應(yīng)的變量定義和輸入語句;一旦規(guī)模達(dá)到100甚至更大時,定義相應(yīng)數(shù)量的變量和輸入語句就會使程序變得過于冗長,導(dǎo)致方案被放棄。要想解決類似問題,需要我們提出更為優(yōu)化的解決方案,以及更為高級的程序設(shè)計結(jié)構(gòu)。3算法與程序設(shè)計人們使用計算機(jī),就是要利用計算機(jī)輔助解決問題,而要做到這一點(diǎn),人們就必須通過對各類問題進(jìn)行分析,確定解決問題(從初始狀態(tài)達(dá)到最終狀態(tài))的具體方法和步驟,并編制好一組計算機(jī)能夠執(zhí)行的指令(即程序),讓計算機(jī)按照指定的步驟有序的工作。算法就是使用具有可操作性的語言,按照一定規(guī)則,對問題分析階段獲得的計算過程和操作步驟的進(jìn)一步細(xì)化。根據(jù)算法,依據(jù)各種規(guī)則編寫計算機(jī)能夠執(zhí)行的命令序列,就是編制程序;編制程序時需要遵守的規(guī)則即為某種語言的語法。算法是整個程序設(shè)計過程的核心和靈魂,程序設(shè)計語言則是實(shí)現(xiàn)算法的工具,好的算法描述方式對編程實(shí)現(xiàn)有著很大的幫助。學(xué)習(xí)使用高級語言進(jìn)行程序設(shè)計的重點(diǎn)和難點(diǎn)之一就是掌握分析問題和解決問題的方法,并最終設(shè)計出算法。4算法的概念算法(Algorithm)是指完成一個任務(wù)所需要的具體步驟和方法。給定初始狀態(tài)或輸入數(shù)據(jù),依據(jù)算法能夠得出所要求或期望的終止?fàn)顟B(tài)或輸出數(shù)據(jù)?;蛘哒f依據(jù)算法能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時間內(nèi)獲得所要求的輸出。DonaldKnuth在他的著作TheArtofComputerProgramming里對算法下的定義:有限性(Finiteness)。算法必須能在執(zhí)行有限個步驟之后終止;明確性(Definiteness)。算法的描述必須無歧義,以保證算法的實(shí)際執(zhí)行結(jié)果精確地符合要求或期望,通常要求實(shí)際運(yùn)行結(jié)果是確定的;輸入項(Input)。一個算法需要有0個或多個輸入,以描述運(yùn)算對象的初始情況,所謂0個輸入是指算法本身已經(jīng)給定了初始條件;輸出項(Output)。一個算法有一個或多個輸出,以反映對輸入數(shù)據(jù)加工后的結(jié)果;可行性(Effectiveness)。算法中執(zhí)行的任何計算步驟都可以被分解為基本的可執(zhí)行的操作,即每個計算步驟都可以在有限時間內(nèi)完成。5算法的概念根據(jù)上面描述,對于給定的初始狀態(tài)或輸入數(shù)據(jù),依據(jù)算法能夠在有限時間內(nèi)得出所要求或期望的終止?fàn)顟B(tài)或輸出數(shù)據(jù)。需要說明的是,不是只有計算問題才有算法。例如,加工一張寫字臺,其加工順序是:桌腿桌面抽屜組裝,這就是加工這張寫字臺的算法。當(dāng)然,如果是按“抽屜桌面桌腿組裝”這樣的順序加工,那就是加工這張寫字臺有另一種算法,這其中沒有計算問題。如果一個算法有缺陷,或不適合于某個問題,執(zhí)行這個算法將不會解決這個問題。同一問題可用不同算法解決,而一個算法的質(zhì)量優(yōu)劣將影響到算法乃至程序的效率。算法的優(yōu)劣可以用空間復(fù)雜度與時間復(fù)雜度來衡量,時間復(fù)雜度用于描述算法的運(yùn)行時間,通常采用執(zhí)行算法所需要的主要計算工作量來衡量;而空間復(fù)雜度是對一個算法在運(yùn)行過程中臨時占用存儲空間大小的量度。同時,考慮到算法的程序?qū)崿F(xiàn),算法應(yīng)易于理解,易于編碼,易于調(diào)試等。6算法的分類通常計算機(jī)算法分為兩大類:數(shù)值運(yùn)算算法和非數(shù)值運(yùn)算算法。數(shù)值運(yùn)算是指對問題求數(shù)值解,例如對微分方程求解、對函數(shù)的定積分求解等,都屬于數(shù)值運(yùn)算范圍。非數(shù)值運(yùn)算包括非常廣泛的領(lǐng)域,例如資料檢索、事務(wù)管理、數(shù)據(jù)處理等。數(shù)值運(yùn)算有確定的數(shù)學(xué)模型,一般都有比較成熟的算法。許多常用算法通常還會被編寫成通用程序并匯編成各種程序庫的形式,用戶需要時可直接調(diào)用。例如數(shù)學(xué)程序庫、數(shù)學(xué)軟件包等。非數(shù)值運(yùn)算的種類繁多,要求不一,很難提供統(tǒng)一規(guī)范的算法,更多的非數(shù)值運(yùn)算是需要用戶設(shè)計的。一個占存儲空間小、運(yùn)行時間短、其它性能也好的算法是很難做到的。原因是上述要求有時相互抵觸:要節(jié)約算法的執(zhí)行時間往往要以犧牲更多的空間為代價;而為了節(jié)省空間可能要耗費(fèi)更多的計算時間。因此我們只能根據(jù)具體情況有所側(cè)重:若該程序使用次數(shù)較少,則力求算法簡明易懂;對于反復(fù)多次使用的程序,應(yīng)盡可能選用快速的算法;若待解決的問題數(shù)據(jù)量極大,機(jī)器的存儲空間較小,則相應(yīng)算法主要考慮如何節(jié)省空間。7算法的描述算法的基本特征是確定性,要求用一種精確的無歧義的描述語言對算法進(jìn)行描述。因此,一個好的算法表達(dá)工具無論對算法的設(shè)計、描述、實(shí)現(xiàn)、程序的維護(hù)都必不可少。算法是整個程序設(shè)計的靈魂,也是程序員相互交流最多的問題。算法不同于程序,只是解決問題核心步驟的描述,并不包括程序設(shè)計的細(xì)節(jié)部分,需要采用合理的,大家都能看懂的方式表達(dá)出來。三種常見的表示方式1、自然語言表示2、流程圖(傳統(tǒng)流程圖和N-S流程圖)3、偽代碼8自然語言自然語言方式是指用普通語言描述算法的方法。前面示例中我們對算法的描述多采用了這種方式,第一章中對簡單二元計算器設(shè)計的算法描述即屬于自然語言描述方式。 1.獲取需要計算的兩個操作數(shù)和運(yùn)算標(biāo)識符 2.對運(yùn)算標(biāo)識符進(jìn)行判斷,并使用兩個操作數(shù)進(jìn)行相應(yīng)的二元運(yùn)算 3.將二元運(yùn)算的結(jié)果保存到計算機(jī)中 4.顯示計算結(jié)果給用戶自然語言方式的優(yōu)點(diǎn)是簡單、方便,適合描述簡單的算法或算法的高層思想。但是,該方式的主要問題是冗長、語義容易模糊,很難準(zhǔn)確地描述復(fù)雜的、技術(shù)性強(qiáng)的算法。譬如有這樣一句話——“武松打死老虎”,我們既可以理解為“武松/打死老虎”,又可以理解為“武松/打/死老虎”。自然語言中的語氣和停頓不同,可能使他人對相同的一句話產(chǎn)生不同的理解。9傳統(tǒng)流程圖流程圖是一種用于表示算法或過程的圖形化語言。在流程圖描述方式中,使用各種符號表示算法或過程中的每一個步驟,使用箭頭符號將這些步驟按照執(zhí)行順序連接起來。使用流程圖表示算法可以避免自然語言語義模糊的缺陷,且依然獨(dú)立于任何一種具體的程序設(shè)計語言,具有較好的通用性。10傳統(tǒng)流程圖11傳統(tǒng)流程圖完成二元運(yùn)算開始輸出運(yùn)算結(jié)果輸入運(yùn)算符運(yùn)算符合法?輸入運(yùn)算符結(jié)束輸出錯誤信息是否12偽代碼
流程圖描述方式便于交流,語義清晰,而且簡單易用,常用于描述解決方案中某個具體的子問題。如果需要描述的問題過于龐大或復(fù)雜,使用單個流程圖進(jìn)行描述會受到制圖方式等限制,通常需要對問題進(jìn)行分解后逐個描述。
偽代碼是一種非正式的,類似于英語結(jié)構(gòu)的,用于描述程序結(jié)構(gòu)圖的語言。偽代碼結(jié)構(gòu)清晰、代碼簡單、可讀性好,并且類似自然語言。使用偽代碼,不用拘泥于具體實(shí)現(xiàn),沒有嚴(yán)格的語法和規(guī)范,可以將整個算法運(yùn)行過程的結(jié)構(gòu)用接近自然語言的形式(可以使用任何一種你熟悉的文字,關(guān)鍵是把程序的意思表達(dá)出來)描述出來。13偽代碼上述二元運(yùn)算的示例使用偽代碼描述如下:Begin(算法開始) 輸入兩個操作數(shù)num1,num2 輸入操作符op if(op==‘+’)result=num1+num2; 否則if(op==‘-’)result=num1-num2; 否則if(op==‘*’)result=num1*num2; 否則if(op==‘/’)result=num1/num2; 否則 輸出“操作符錯誤”
exit1; 輸出結(jié)果值result exit0;End(算法結(jié)束)14算法表示小結(jié)從上述實(shí)際例子可知流程圖簡單直觀,比較適合于初學(xué)者使用,適用于描述那些不是很復(fù)雜的問題或者是分解后的子問題;偽代碼則需要一定的程序設(shè)計語言的語法基礎(chǔ),適用于有了一定學(xué)習(xí)基礎(chǔ)后使用,描述范圍更廣,也更容易轉(zhuǎn)化為程序。兩個學(xué)生進(jìn)行猜數(shù)游戲,由一個學(xué)生來猜另一個學(xué)生所設(shè)定的在0-50之間的一個數(shù)字,猜中游戲結(jié)束,猜不中則要給出所猜數(shù)字相比于目標(biāo)數(shù)是“高了”或者“低了”的提示。針對上述問題給出流程圖形式的算法。15常見算法
–遞推和遞歸遞推算法的思想是把一個復(fù)雜的龐大的計算過程轉(zhuǎn)化為簡單過程的多次重復(fù),即通過構(gòu)造低階的規(guī)模(如規(guī)模為i,一般i=0)的問題,并求出解,推導(dǎo)出問題規(guī)模為i+1的問題以及解,依次推到規(guī)模為n的問題。遞歸算法的思想是將問題規(guī)模為n的問題,降解成若干個規(guī)模為n-1的問題,依次降解,直到問題規(guī)??汕?,求出低階規(guī)模的解,再反向代入高階問題中,直至求出規(guī)模為n的問題的解。16常見算法–遞推和遞歸實(shí)例:求出斐波那契數(shù)列的第n項。數(shù)列的前10項如下:11235813213455...... 可總結(jié)為:F(n)=F(n-1)+F(n-2);F(0)=F(1)=1;遞歸法:從F(n)=F(n)=F(n-1)+F(n-2)入手,逐漸將問題降解到F(1)和F(0),即可直接求解的規(guī)模,然后在利用F(1)和F(0)的解反向求F(n)的解。遞推法:直接從F(1)和F(0)入手,根據(jù)遞推公式,求出F(2),進(jìn)而求出F(3),依次類推到F(n)。同一問題如果既能夠用遞歸解決,也能夠用遞推解決,遞推的效率要比遞歸的效率高,遞歸算法設(shè)計相對簡單。設(shè)計解題方案時盡可能優(yōu)先使用遞推算法,除非那些不用遞歸做不出來的問題,或者遞推算法實(shí)現(xiàn)起來過于復(fù)雜的問題適合使用遞歸算法。實(shí)際推導(dǎo)時往往是先采用遞歸的形式,最后盡可能再轉(zhuǎn)化為遞推,以提高程序執(zhí)行效率。17常見算法–窮舉法窮舉法,也稱為暴力破解法。其基本思路是:對于要解決的問題,列舉出它的所有可能情況,逐個判斷其是否符合問題所要求的條件,全部情況都遍歷結(jié)束后就得到了問題的解。窮舉法常用于對于密碼的破譯,對所有可能的密碼組合進(jìn)行逐個檢驗,直到找出真正的密碼為止。例如一個已知是四位并且全部由數(shù)字組成的密碼,共有10000(104)種組合,因此最多嘗試10000次就能找到正確的密碼。理論上利用這種方法可以破解任何一種密碼,問題只在于如何縮小檢驗的范圍,縮短完成時間。18算法舉例–窮舉法中國古代數(shù)學(xué)家張丘建在他的《算經(jīng)》中曾提出著名的“百錢百雞問題”,其題目如下:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何?如果用x、y、z分別代表公雞、母雞、小雞的數(shù)量,根據(jù)題意列方程:據(jù)題意可知,x、y、z的范圍一定是0到100的正整數(shù),那么,最簡單的解題方法是:假設(shè)一組x、y、z的值,直接帶入方程組求解,即在各個變量的取值范圍內(nèi)不斷變化x、y、z的值,窮舉x、y、z全部可能的組合,若滿足方程組則是一組解。這樣即可得到問題的全部解。19常見算法–分治法分治法字面上的解釋是“分而治之”,就是把一個復(fù)雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最后子問題可以簡單的直接求解,原問題的解即為子問題的解的合并這個技巧是很多高效算法的基礎(chǔ),如排序算法(快速排序,歸并排序)。20算法舉例–分治法16枚硬幣,其中有15枚重量相等,1枚是假幣,較輕,你的任務(wù)是找出哪一枚是假幣。為了完成任務(wù),可以借助天平來進(jìn)行比較。方法1:拿一枚去與其他15枚比較,最多15次就能出結(jié)果。方法2:分8組,每組2枚,每組比較一次,最多8次即可得出結(jié)果。方法3:先分2組,每組8枚;對較輕的一組再分為2組,每組4枚;對較輕的一組再分為2組,每組2枚,對較輕的一組進(jìn)行比較,得出結(jié)果。分而治之的方法有時候也解釋為將大的問題分解為若干個相對獨(dú)立的小問題(小問題不一定與大問題同質(zhì)),然后分別求出小問題的解,最后組合為整個問題的解。21常見算法–迭代法迭代法也稱輾轉(zhuǎn)法,是一種不斷用變量的舊值遞推新值的過程,它利用計算機(jī)運(yùn)算速度快、適合做重復(fù)性操作的特點(diǎn),讓計算機(jī)對一組指令(或一定步驟)進(jìn)行重復(fù)執(zhí)行,在每次執(zhí)行這組指令(或這些步驟)時,都從變量的原值推出它的一個新值。例如猜數(shù)游戲中,為了在給定范圍內(nèi)盡快找到目標(biāo)數(shù)時所使用的“二分法”即屬于近似迭代法。22C語句概述語句是程序設(shè)計的基礎(chǔ),也是程序執(zhí)行的單位。C語言的語句用來完成一定操作任務(wù)的,每條語句編譯后產(chǎn)生若干條機(jī)器指令,用于向計算機(jī)系統(tǒng)發(fā)出操作指令。C語言中的語句主要分為兩種類型:簡單語句和控制語句。簡單語句用于執(zhí)行一些操作,控制語句的作用是控制其他語句的執(zhí)行順序。簡單語句時C語言中最常見的語句,它由一個表達(dá)式加一個分號構(gòu)成:expression;多數(shù)情況下,表達(dá)式為一個函數(shù)調(diào)用、一個賦值操作或一個遞增(遞減)的變量。若有變量定義“intcount=0,num1=4,num2=8;”,則如下面幾條語句均為簡單語句: count=num1+num2; printf(“Pleaseinputtwonumber:”); count++; count+=2;23C語句概述控制語句用于控制程序的流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式??刂普Z句具體可以細(xì)分為:條件判斷語句:根據(jù)一定的條件是否成立去控制某些語句的執(zhí)行;重復(fù)控制語句:控制一組語句在某些條件成立時得到多次重復(fù)執(zhí)行;轉(zhuǎn)向語句:控制程序中語句執(zhí)行順序的跳轉(zhuǎn);控制語句的具體使用將在后面章節(jié)中介紹。24函數(shù)調(diào)用語句為了更好地輔助程序員進(jìn)行程序設(shè)計,C語言的編譯器一般都會提供功能強(qiáng)大的標(biāo)準(zhǔn)庫供程序員使用,標(biāo)準(zhǔn)庫里的每個函數(shù)實(shí)現(xiàn)一項具體功能,如printf用于完成數(shù)據(jù)的格式化輸出,scanf用于接收終端輸入的數(shù)據(jù)。這兩個常用的輸入輸出函數(shù),我們已經(jīng)在第二章中詳細(xì)講解了其使用方法,但標(biāo)準(zhǔn)庫提供了非常多的功能強(qiáng)大的函數(shù),如果我們都逐一的詳細(xì)講解,就不是這樣一本教材能夠完成的事情了,而且也是完全沒有必要的。對于任何一個標(biāo)準(zhǔn)庫函數(shù),我們只要知道了它的名字、使用方法、功能描述和包含其說明的頭文件,就可以在程序中自由的使用它們了。我們在完全不必關(guān)心這些函數(shù)的功能是如何實(shí)現(xiàn)的,是誰實(shí)現(xiàn)的,用什么技術(shù)實(shí)現(xiàn)的,等等。25函數(shù)調(diào)用語句例如,頭文件math.h中給出了數(shù)學(xué)函數(shù)庫所提供的大量標(biāo)準(zhǔn)庫函數(shù)的說明,部分如下:函數(shù)名函數(shù)使用說明功能返回值fabsdoublefabs(doublex);求x的絕對值計算結(jié)果floordoublefloor(doublex);對實(shí)數(shù)x下取整該整數(shù)的雙精度形式fmoddoublefmod(doublex,doubley);求x/y所得的余數(shù)余數(shù)的雙精度形式log10doublelog10(doublex);求log10X的值計算結(jié)果powdoublepow(doublex,doubley);求xy的值計算結(jié)果sindoublesin(doublex);求sinx的值,x為弧度值計算結(jié)果sqrtdoublesqrt(doublex);計算x的平方根,x≥0計算結(jié)果26函數(shù)調(diào)用語句//pow函數(shù)的使用示例,注意事項參見教材#include<stdio.h>#include<math.h>intmain(){ doublex,y; printf(“Pleaseinputx:”); scanf(“%lf”,&x); printf(“Pleaseinputy:”);
scanf(“%lf”,&y); printf(“pow(%.0f,%.0f)=%.0f\n”,x,y,pow(x,y))
;}運(yùn)行結(jié)果:Pleaseinputx:2Pleaseinputy:10pow(2,10)=102427復(fù)合語句把多個語句用花括號({})括起來組成的一組語句稱復(fù)合語句,也稱語句塊或語句體。程序中把復(fù)合語句看成是單條語句,而不是多條語句。實(shí)際編程過程中,我們通常使用復(fù)合語句來表示一個控制語句所控制的語句范圍或一個函數(shù)的函數(shù)體。如下語句中,當(dāng)條件(x>y)成立時,括號里面的三條語句作為一個整體被執(zhí)行,完成x和y的交換。如果同樣是這樣一段語句,將花括號去掉,其表示的語義和執(zhí)行情況將會完全不同。if(x>y){ t=x; x=y; y=t;}28復(fù)合語句塊中的語句(花括號內(nèi)的語句)一般相對上下文縮進(jìn),如上示例。這種縮進(jìn)本身對編譯器是沒有影響的,但這種視覺效果對閱讀程序的人來說有很大的幫助,可以從頁面的格式清楚的了解程序的結(jié)構(gòu)。根據(jù)經(jīng)驗,每一級縮進(jìn)4個空格(或使用tab鍵)最能使程序的結(jié)構(gòu)得以顯現(xiàn)??s進(jìn)對于好的程序是十分重要的,應(yīng)該養(yǎng)成在程序中使用一致的縮進(jìn)風(fēng)格的習(xí)慣。C語言規(guī)定每條語句都要以分號結(jié)尾,但復(fù)合語句是一個例外,起始花括號的后面并沒有分號。復(fù)合語句強(qiáng)制編譯器將花括號中的語句看作一條語句來處理,每條內(nèi)部語句仍然是以分號結(jié)尾,但復(fù)合語句本身卻不是。C語言中還有一中特殊的語句,只包含一個分號,表示什么操作也不做,被稱為空語句。從語法上講,它的確是一條語句。在程序設(shè)計中,若某處從語法上需要一條語句,而實(shí)際上不需要執(zhí)行任何操作時就可以使用它。例如,在設(shè)計循環(huán)結(jié)構(gòu)時,有時用到空語句。29程序設(shè)計的三種基本結(jié)構(gòu)前面我們接觸到了一些使用簡單語句完成的C語言程序,所有語句按照書寫的次序順序執(zhí)行一次。然而,對于大多數(shù)應(yīng)用來說,只有自上而下的順序執(zhí)行方式是不夠的?,F(xiàn)實(shí)問題的解決方案中往往要求能夠反復(fù)執(zhí)行一系列步驟或在多個動作中選擇一個執(zhí)行,為了描述這些復(fù)雜操作的執(zhí)行過程,編程語言需要提供一套描述機(jī)制,這種機(jī)制就是控制結(jié)構(gòu)。C語言的控制結(jié)構(gòu)大體可以分為兩類:1)條件控制:在解決問題時,常常需要根據(jù)一些條件測試的結(jié)果,在兩個或多個執(zhí)行路徑中有選擇的執(zhí)行其中一條路徑。例如,有的程序會要求當(dāng)某個值為負(fù)時執(zhí)行一系列操作,否則執(zhí)行另一些操作。這里的“值為負(fù)”即為一個條件,根據(jù)這一條件判斷的結(jié)果選擇執(zhí)行其中的一組操作。2)重復(fù)控制:有時要處理的問題涉及很多數(shù)據(jù)項,程序通常需要將某一操作重復(fù)執(zhí)行若干次,或在某個條件成立的情況下反復(fù)執(zhí)行某個操作。例如,為了能夠在屏幕上輸出一條星號構(gòu)成的豎線,需要重復(fù)執(zhí)行多次“輸出1個星號并換行”的操作。30程序設(shè)計的三種基本結(jié)構(gòu)通過對編程實(shí)踐規(guī)律的總結(jié),結(jié)合順序執(zhí)行和控制執(zhí)行的特點(diǎn),人們提出了編寫程序時常用的三種基本語句結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)中,所有語句按照出現(xiàn)的先后順序依次執(zhí)行;選擇結(jié)構(gòu)則是根據(jù)某個條件是否成立,從若干組功能語句中選擇一組執(zhí)行,對應(yīng)于條件控制結(jié)構(gòu);循環(huán)結(jié)構(gòu)則是在某個條件成立的前提下重復(fù)執(zhí)行一組功能語句,對應(yīng)于重復(fù)控制結(jié)構(gòu)。語句1語句2條件語句1語句2成立不成立條件語句成立不成立1)順序結(jié)構(gòu)2)選擇結(jié)構(gòu)3)循環(huán)結(jié)構(gòu)31程序設(shè)計的三種基本結(jié)構(gòu)在C語言中,提供了兩種條件控制語句,即if語句和switch語句,將在第四章中具體介紹;提供了三種重復(fù)控制語句,即for語句、while語句和do-while語句,將在第五章中具體介紹。C語言中所有的控制語句都由兩部分組成:控制行和主體??刂菩兄饕菍刂茥l件的描述,主體是受控制條件影響的一組或多組語句。主體語句也稱控制結(jié)構(gòu)的語句體,在條件控制結(jié)構(gòu)中,主體可能分成幾個獨(dú)立的部分,在某種情況下執(zhí)行這一組語句,在另一種情況下執(zhí)行其他組語句。人們已經(jīng)嚴(yán)格證明,任何一個復(fù)雜的程序流程,都可以使用這三種基本結(jié)構(gòu)構(gòu)造出來,必要時可進(jìn)行嵌套。這里的嵌套是指每種結(jié)構(gòu)的主體語句中均可以出現(xiàn)其他基本結(jié)構(gòu),如程序的結(jié)構(gòu)總體上是順序執(zhí)行的,其中的某一步可以是選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu),循環(huán)結(jié)構(gòu)中的重復(fù)執(zhí)行的部分可以包含順序結(jié)構(gòu)和選擇結(jié)構(gòu)。32順序結(jié)構(gòu)假設(shè)int型變量a=3,b=5,編寫代碼實(shí)現(xiàn)交換a,b的值。這個問題類似有兩個杯子,一個杯子里裝的是茶,另一個杯子里裝的白水,要想把這兩個杯子里的茶和白水對換,需要用到第三個杯子。假如引入第三個int型變量c,那么正確的程序為: c=a;a=b;b=c;或者 c=b;b=a;a=c;若寫成:
a=b;c=a;b=c;則執(zhí)行結(jié)果就變成a=b=c=5,不能達(dá)到預(yù)期的交換目的??梢?,語句書寫順序與執(zhí)行過程是息息相關(guān)的,不能隨便顛倒。33選擇結(jié)構(gòu)從終端鍵盤輸入一個有符號整數(shù),輸出此整數(shù)的絕對值。當(dāng)輸入為正整數(shù)時,絕對值即為其自身,當(dāng)輸入時負(fù)整數(shù)時,則絕對值為其相反數(shù)。代碼如下:intx,absX;printf(“Pleaseinputoneinteger:”);scanf(“%d”,&x);if(x>=0) absX=x;else absX=-x;printf(“|x|=%d”,absX);34循環(huán)結(jié)構(gòu)統(tǒng)計從終端輸入的一段英文中包含多少個單詞。偽代碼如下:intwordsCount=0;//用于記錄單詞總數(shù),初始為0從文件頭開始掃描while(文件未掃描結(jié)束時){ 讀取一個單詞 wordsCount=wordsCount+1;//計數(shù)器加1 移動掃描位置到下一個單詞的開頭;}35“自頂向下、逐步求精”的分析方法C語言是一種面向過程的結(jié)構(gòu)化程序設(shè)計語言,以過程為中心,強(qiáng)調(diào)功能分解和模塊化設(shè)計。核心理念是采用“自頂向下逐步求精、分而治之”的方法進(jìn)行大型程序設(shè)計。自頂向下、逐步求精的思想是指在程序設(shè)計時,應(yīng)先考慮整體,后考慮細(xì)節(jié)。從主程序的觀點(diǎn)出發(fā),將問題作為一個整體考慮,然后試著去找出整個任務(wù)的主要構(gòu)成片段。確定了主程序的主要片段后,就可以沿著這條主線將整個問題繼續(xù)分解為獨(dú)立的子問題片段。由于這些子問題中的某一些本身也很復(fù)雜,通常還需要進(jìn)一步將它們分解為更小的片段。這一過程將一直持續(xù)到每個程序片段都足夠簡單,可以獨(dú)立解決為止。36結(jié)構(gòu)化分析問題實(shí)例問題:假設(shè)我們知道某一年的第一天對應(yīng)的星期,如2014年1月1號是星期三,要求按月顯示該年份的全年日歷,每月顯示格式如下圖。37結(jié)構(gòu)化分析問題實(shí)例分析:根據(jù)問題的描述,我們可以想象日歷程序的大體運(yùn)行方式如下:38結(jié)構(gòu)化分析問題實(shí)例問題輸入:需要顯示日歷的年份,以及當(dāng)年第一天(1月1日)對應(yīng)的星期問題輸出:按月份排列的全年日歷采用自頂向下、逐步細(xì)化的分析方式進(jìn)行分析可知:1年有12個月,一年的日歷由12個月份的日歷組成。具體到每個月份的日歷,根據(jù)格式要求可以細(xì)分為三部分:月份標(biāo)識、星期標(biāo)識和日期排列。月份標(biāo)識包含年份和當(dāng)前月份兩個信息;星期標(biāo)識為固定的排列,不隨月份變化而變化,固定從星期日到星期六;日期排列由1到這個月的天數(shù)之間的整數(shù)組成,以星期為單位分組連續(xù)排列,每個周六后換行顯示。39結(jié)構(gòu)化分析問題實(shí)例這三部分中,月份標(biāo)識和星期標(biāo)識都很簡單,可以直接設(shè)計解決方案。日期排列依然相對復(fù)雜,還需要進(jìn)一步分解。要想實(shí)現(xiàn)日期與星期的對應(yīng)排列,需要知道兩個條件:當(dāng)前月份的總天數(shù)和該月的第一天對應(yīng)一個星期中的哪一天。據(jù)此,單個月份里具體的日期排列再次細(xì)分為三個子問題確定某一年某一月份的總天數(shù)。確定某一月份的第一天對應(yīng)的是星期幾。根據(jù)前面兩個條件,輸出當(dāng)前月份的日期排列。40結(jié)構(gòu)化分析問題實(shí)例確定某一年某一月份的天數(shù)可以按照如下分類解決:2月份單獨(dú)一類,閏年為29天,平年為28天。1月、3月、5月、7月、8月、10月和12月為一類,固定為31天。4月、6月、9月和11月為一類,固定為30天。確定某個月份的1號對應(yīng)的是星期幾,可以通過已知的當(dāng)前年份的第一天對應(yīng)是星期幾來推算。計算出當(dāng)前月份的第一天和當(dāng)前年份的第一天之間相隔的天數(shù),對該天數(shù)進(jìn)行模除7(一個星期有7天)取余的操作,即可獲得當(dāng)前月份的第一天對應(yīng)于星期幾。已知當(dāng)前月份的總天數(shù)和當(dāng)月第一天對應(yīng)于星期幾,就可以完成具體日期的格式化輸出了。首先根據(jù)當(dāng)月第一天對應(yīng)的星期,在第一排留出足夠的空格,此后可通過循環(huán),連續(xù)格式化輸出即可,遇到星期六后換行。41結(jié)構(gòu)化分析問題實(shí)例通過上面的逐步求精,逐層分解,細(xì)化后的子問題已經(jīng)能夠直接求解,利用子問題的解就可以構(gòu)造出整個問題的解決方案了。這種逐層分解的過程沒有統(tǒng)一的標(biāo)準(zhǔn),當(dāng)程序員積累一定的編程經(jīng)驗后很容易把握。具體算法設(shè)計參考教材42結(jié)構(gòu)化程序設(shè)計實(shí)例問題:我們在很多地方都使用過橡膠的墊圈,用于減少摩擦和防止松脫。要求:根據(jù)輸入的橡膠圈的內(nèi)外直徑和厚度,以及橡膠的密度,計算出橡膠圈的質(zhì)量。分析:通過查詢相關(guān)數(shù)學(xué)公式可知,墊圈的質(zhì)量可用公式“質(zhì)量=面積*厚度*密度”表示。因此,想要計算墊圈的質(zhì)量,需要知道墊圈的面積,厚度和橡膠的密度。墊圈的厚度和密度屬于問題的輸入,所以此問題的關(guān)鍵就在于準(zhǔn)確計算出墊圈的面積。墊圈是一個圓環(huán),即一個大的外圓,從中間去掉一個小的同心內(nèi)圓形成。墊圈的面積可以通過外圓面積減去內(nèi)圓的面積獲得,而外圓和內(nèi)圓的面積可以通過公式“面積=π*半徑2”計算得出。至此,圓形墊圈的質(zhì)量已經(jīng)可以通過已知數(shù)據(jù)計算了。HR外R內(nèi)43結(jié)構(gòu)化程序設(shè)計實(shí)例問題輸入: 圓形墊圈的外圓直徑 圓形墊圈的內(nèi)圓直徑 圓形墊圈的厚度 用于制作墊圈的橡膠的密度問題輸出: 圓形墊圈的質(zhì)量相關(guān)公式: 圓面積=π*r2(π為常量,r為圓的半徑) 圓的半徑=直徑/2 圓環(huán)面積=外圓的面積–內(nèi)圓的面積 墊圈質(zhì)量=圓環(huán)的面積*墊圈厚度*橡膠密度44結(jié)構(gòu)化程序設(shè)計實(shí)例初始算法獲得圓形墊圈的內(nèi)外直徑、厚度和材料密度計算圓環(huán)的面積計算圓形墊圈的質(zhì)量顯示結(jié)果步驟2細(xì)化2.1計算圓形墊圈外圈的半徑和內(nèi)圈的半徑2.2利用公式S=π*r2,分別計算外圈面積和內(nèi)圈面積2.3計算圓環(huán)的面積(S外圓–S內(nèi)圓)45結(jié)構(gòu)化程序設(shè)計實(shí)例實(shí)現(xiàn),參加教材代碼測試:程序接收數(shù)據(jù)并能產(chǎn)生輸出結(jié)果,這并不意味著程序計算的結(jié)果就是正確的,還需要做進(jìn)一步的測試進(jìn)行驗證。這里我們用兩組簡單的,便于手動計算的數(shù)據(jù)進(jìn)行測試,以驗證程序計算的結(jié)果是否達(dá)到預(yù)期。測試數(shù)據(jù)如下: 第一組:outerRing_diameter=4,innerRing_diameter=2,thickness=2,density=1.3 第二組:outerRing_diameter=6,innerRing_diameter=4,thickness=4,density=1.3借助計算器,利用公式,分別手動計算兩組輸入數(shù)據(jù)所應(yīng)得出的結(jié)果。再讓程序
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有關(guān)抵押借款合同范文
- oem委托加工合同協(xié)議常用范本年
- 變電站安裝工程承包合同模板
- 2024年高考英語 (全國甲卷)真題詳細(xì)解讀及評析
- 個人商品購銷合同
- 2025年外研版九年級歷史下冊月考試卷含答案
- 貨物運(yùn)輸合同、法規(guī)與保險
- 2025年外研版九年級歷史下冊階段測試試卷
- 造紙機(jī)購買合同
- 民政局離婚的協(xié)議書范本
- 全過程造價咨詢服務(wù)的質(zhì)量、進(jìn)度、保密等保證措施
- 開工第一課安全培訓(xùn)內(nèi)容
- 湖北省石首楚源“源網(wǎng)荷儲”一體化項目可研報告
- 經(jīng)顱磁刺激增強(qiáng)定神狀態(tài)的研究
- Creo-7.0基礎(chǔ)教程-配套課件
- 六年級人教版上冊數(shù)學(xué)計算題練習(xí)題(及答案)100解析
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評價細(xì)則
- 初中物理滬粵版八年級下冊《第六章 力和機(jī)械》章節(jié)練習(xí)(含答案)
- 金礦管理制度
- 橋梁樁基礎(chǔ)施工概述及施工控制要點(diǎn)
- JB/T 20036-2016提取濃縮罐
評論
0/150
提交評論