




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