各種語(yǔ)言方面初級(jí)不能再程序設(shè)計(jì)_第1頁(yè)
各種語(yǔ)言方面初級(jí)不能再程序設(shè)計(jì)_第2頁(yè)
各種語(yǔ)言方面初級(jí)不能再程序設(shè)計(jì)_第3頁(yè)
各種語(yǔ)言方面初級(jí)不能再程序設(shè)計(jì)_第4頁(yè)
各種語(yǔ)言方面初級(jí)不能再程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩543頁(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)介

《 《研富有經(jīng)驗(yàn)的教師。編寫大綱統(tǒng)一由系列教材編輯審定,對(duì)保證質(zhì)量起到良好的作且C語(yǔ)言的應(yīng)用范圍越來(lái)越大,所涉及的知識(shí)也在不斷地增加?;诖?,我們重新編寫了C既可作為C語(yǔ)言的,也可作為工具書以備編程時(shí)參考。言的基礎(chǔ)知識(shí);第3、4章介紹了C語(yǔ)言的基本程序設(shè)計(jì)技術(shù)、C語(yǔ)言函數(shù)的特點(diǎn)、函數(shù)的相用TurboC環(huán)境下調(diào)試通過(guò)。本的第1、3章由易濤編寫,第2、4、5、9章由編寫,第6、7、8章由編寫,助此進(jìn)一步完善。 前第1 程序設(shè)計(jì)與算法程序設(shè)計(jì)語(yǔ)言的發(fā)展 函數(shù)庫(kù)和 算 用N-S圖描述算 第2 數(shù)據(jù)類型、運(yùn)算符和表達(dá) cast 第3 程序控制語(yǔ) printf() ifswitch do...while語(yǔ) for語(yǔ) 第4 函 動(dòng)態(tài)變 靜態(tài)變 賦值調(diào)用與調(diào) 遞 #define#error# #undef #pragma 第5 數(shù) 第6 指 指針變量的定義與 指針變量的 第7 結(jié)構(gòu)體與共用體結(jié)構(gòu)體數(shù)組的定義和結(jié)構(gòu)體指針的定義和 單鏈表單鏈表的插入與刪除共用體 共用體變量的第8 輸入、輸出和文件系 文件的讀寫 非緩沖文件系統(tǒng) 9實(shí)用編程技 屏幕圖像的存取技 屏幕顯示格式的控制方 拷貝屏幕圖形的方 用putimage函數(shù)實(shí)現(xiàn)動(dòng)畫的技 實(shí)現(xiàn)陰影窗口的技 第10 C++ 類的定義與對(duì)象的 216 附錄 常用字符與ASCII代碼對(duì)照表附錄 習(xí) 第1 程序設(shè)計(jì)與算自1946年世界上第一臺(tái)電子計(jì)算機(jī)問(wèn)世以來(lái),計(jì)算機(jī)科學(xué)及其應(yīng)用的發(fā)展十分迅猛,計(jì)算機(jī)被廣泛地應(yīng)用于人類生產(chǎn)、生活的各個(gè)領(lǐng)域,推動(dòng)了社會(huì)的進(jìn)步與發(fā)展。特別是隨著國(guó)際互聯(lián)網(wǎng)(Internet)日益深入千家萬(wàn)戶,傳統(tǒng)的信息收集、傳輸及交換方式正性地改變,我們已經(jīng)難以擺脫對(duì)計(jì)算機(jī)的依賴,計(jì)算機(jī)已將人類帶入了一個(gè)新的時(shí)代—新的時(shí)代對(duì)于我們的基本要求之一是:自覺(jué)地、主動(dòng)地學(xué)習(xí)和掌握計(jì)算機(jī)的基本知識(shí)和基本技能,并把它作為自己應(yīng)該具備的基本素質(zhì)。要充分認(rèn)識(shí)到,缺乏計(jì)算機(jī)知識(shí),就是信對(duì)于理工科的大學(xué)生而言,掌握一門高級(jí)語(yǔ)言及其基本的編程技能是必需的。大學(xué)學(xué)習(xí),除了掌握本專業(yè)系統(tǒng)的基礎(chǔ)知識(shí)外,科學(xué)精神的培養(yǎng)、思維方法的鍛煉、嚴(yán)謹(jǐn)踏實(shí)的科研作風(fēng)養(yǎng)成,以及分析問(wèn)題、解決問(wèn)題的能力的訓(xùn)練,都是日后工作的基礎(chǔ)。學(xué)習(xí)計(jì)算機(jī)語(yǔ)言,正是一種十分有益的訓(xùn)練方式,而語(yǔ)言本身又是與計(jì)算機(jī)進(jìn)行交互的有力的工具。一臺(tái)計(jì)算機(jī)是由硬件系統(tǒng)和軟件系統(tǒng)兩大部分構(gòu)成的,硬件是物質(zhì)基礎(chǔ),而軟件可以說(shuō)是計(jì)算機(jī)的,沒(méi)有軟件,計(jì)算機(jī)是一臺(tái)“機(jī)”,是什么也不能干的,有了軟件,才能靈0”和“1”組成的二進(jìn)制數(shù),二進(jìn)制是計(jì)算機(jī)的語(yǔ)言的基礎(chǔ)。計(jì)算機(jī)發(fā)明之初,人們只能降貴紆尊,用計(jì)算機(jī)的語(yǔ)言去命令計(jì)算機(jī)干這干那,一句話,就01”組成的指令序列交由計(jì)算機(jī)執(zhí)行,這種語(yǔ)言,就是機(jī)器語(yǔ)言。使用機(jī)器語(yǔ)言是十分痛苦的,特別是在程序有錯(cuò)需要修改時(shí),更是如此。而且,由于每臺(tái)計(jì)算機(jī)的指令系統(tǒng)往往各不相同,所以,在一臺(tái)計(jì)算機(jī)上執(zhí)行的程序,要想在另一臺(tái)計(jì)算機(jī)上執(zhí)行,必須另編程序,造成了重復(fù)工作。但由于使用的是針對(duì)特定型號(hào)計(jì)算機(jī)的語(yǔ)言,故而運(yùn)算效率是所有語(yǔ)言中最高的。機(jī)器語(yǔ)言,是第一代計(jì)算機(jī)語(yǔ)言。為了減輕使用機(jī)器語(yǔ)言編程的痛苦,人們進(jìn)行了一種有益的改進(jìn):用一些簡(jiǎn)潔的英文字母、符號(hào)串來(lái)替代一個(gè)特定的指令的二進(jìn)制串,比如,用“ADDMOV數(shù)據(jù)傳遞等等,這樣一來(lái),人們很容易讀懂并理解程序在干什么,糾錯(cuò)及都變得方便了,這種程序設(shè)計(jì)語(yǔ)言就稱為匯編語(yǔ)言,即第二代計(jì)算機(jī)語(yǔ)言。然而計(jì)算機(jī)是不認(rèn)識(shí)這些符號(hào)的,這就需要一個(gè)專門的程序,專門負(fù)責(zé)將這些符號(hào)翻譯成二進(jìn)制數(shù)的機(jī)器語(yǔ)言,這種翻譯程序被稱為匯編程序。匯編語(yǔ)言同樣十分依賴于機(jī)器硬件,移植性不好,但效率仍十分高,針對(duì)計(jì)算機(jī)特定硬件而編制的匯編語(yǔ)言程序,能準(zhǔn)確發(fā)揮計(jì)算機(jī)硬件的功能和特長(zhǎng),程序精煉而質(zhì)量高,所以2從最初與計(jì)算機(jī)交流的痛苦經(jīng)歷中,人們,應(yīng)該設(shè)計(jì)一種這樣的語(yǔ)言,這種語(yǔ)言接近于數(shù)學(xué)語(yǔ)言或人的自然語(yǔ)言,同時(shí)又不依賴于計(jì)算機(jī)硬件,編出的程序能在所有機(jī)器上1954年,第一個(gè)完全脫離機(jī)器硬件的高級(jí)語(yǔ)言—FOTRAN40多年來(lái),共有幾百種高級(jí)語(yǔ)言出現(xiàn),有重要意義的有幾十種,影響較大、使用較普遍的有FOTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA高級(jí)語(yǔ)言的發(fā)展也經(jīng)歷了從早期語(yǔ)言到結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,從面向過(guò)程到非過(guò)程化程序語(yǔ)言的過(guò)程。相應(yīng)地,軟件的開發(fā)也由最初的手工作坊式的封閉式生產(chǎn),發(fā)展為產(chǎn)業(yè)化、流水線式的工業(yè)化生產(chǎn)。60年代中后期,軟件越來(lái)越多,規(guī)模越來(lái)越大,而軟件的生產(chǎn)基本上是人自為戰(zhàn),缺乏科學(xué)規(guī)范的系統(tǒng)規(guī)劃與測(cè)試、評(píng)估標(biāo)準(zhǔn),其惡果是大批耗費(fèi)巨資建立起來(lái)的軟件系統(tǒng),由于含有錯(cuò)誤而無(wú)法使用,甚至帶來(lái)巨大損失,軟件給人的感覺(jué)是越來(lái)越不可靠,以致幾乎沒(méi)有不出錯(cuò)的軟件。這一切,極動(dòng)了計(jì)算機(jī)界,“軟件”。人們認(rèn)識(shí)到:大型程序的編制不同于寫小程序,它應(yīng)該是一項(xiàng)新的技術(shù),應(yīng)該像處理工程一樣處理軟件研制的全過(guò)程。程序的設(shè)計(jì)應(yīng)易于保證正確性,也便于驗(yàn)證正確性。1969年,提出了結(jié)構(gòu)化程序設(shè)計(jì)方法,1970年,第一個(gè)結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言—Pascal語(yǔ)言出現(xiàn),標(biāo)志著結(jié)構(gòu)化程序設(shè)計(jì)時(shí)期的開始。80年代初開始,在軟件設(shè)計(jì)思想上,又產(chǎn)生了一次,其成果就是面向?qū)ο蟮某绦蛟O(shè)計(jì)。在此之前的高級(jí)語(yǔ)言,幾乎都是面向過(guò)程的,程序的執(zhí)行是流水線似的,在一個(gè)模塊被執(zhí)行完成前,人們不能干別的事,也無(wú)法動(dòng)態(tài)地改變程序的執(zhí)行方向。這和人們?nèi)粘L幚硎挛锏姆绞绞遣灰恢碌?,?duì)人而言是希望發(fā)生一件事就處理一件事,也就是說(shuō),不能面向過(guò)程,而應(yīng)是面向具體的應(yīng)用功能,也就是對(duì)象(object。其方法就是軟件的集成化,如同硬件的集成電路一樣,生產(chǎn)一些通用的、封裝緊密的功能模塊,稱之為軟件集成塊,它與具體應(yīng)用無(wú)關(guān),但能相互組合,完成具體的應(yīng)用功能,同時(shí)又能重復(fù)使用。對(duì)使用者來(lái)說(shuō),只關(guān)心它的接口(輸入量、輸出量)及能實(shí)現(xiàn)的功能,至于如何實(shí)現(xiàn)的,那是它內(nèi)部的事,使用者完C++、VB、Delphi就是典型代表。高級(jí)語(yǔ)言的下一個(gè)發(fā)展目標(biāo)是面向應(yīng)用,也就是說(shuō):只需要告訴程序你要干什么,程序就能自動(dòng)生成算法,自動(dòng)進(jìn)行處理,這就是非過(guò)程化的程序語(yǔ)言。CC語(yǔ)言是中級(jí)語(yǔ)C語(yǔ)言通常稱為中級(jí)計(jì)算機(jī)語(yǔ)言。中級(jí)語(yǔ)言并沒(méi)有貶義,不意味著它功能差、難以使用、或者比BASI、Pascal那樣的高級(jí)語(yǔ)言原始,也不意味著它與匯編語(yǔ)言相似,會(huì)給使用者帶來(lái)類似的麻煩。C語(yǔ)言之所以被稱為中級(jí)語(yǔ)言,是因?yàn)樗迅呒?jí)語(yǔ)言的成分同匯編語(yǔ)言的功能結(jié)合起來(lái)了。表1-1表明了C第1章程序設(shè)計(jì)與算 表1- C語(yǔ)言在計(jì)算機(jī)語(yǔ)言中的地高 Ada、Modula-2、Pascal、COBOL、FORTRAN、中 C、FORTH、Macro-低 C允許對(duì)位、字節(jié)和地址這些計(jì)算機(jī)功能中的基本成分進(jìn)行操作。C語(yǔ)言程序非常容易移植??梢浦残员硎緸槟撤N計(jì)算機(jī)寫的軟件可以用到另一種機(jī)器上去。舉例來(lái)IBMPC上運(yùn)行的程序,則稱為是可移植的。所有的高級(jí)語(yǔ)言都支持?jǐn)?shù)據(jù)類型的概念。一個(gè)數(shù)據(jù)類型定義了一個(gè)變量的取值范圍和可在其上操作的一組運(yùn)算。常見(jiàn)的數(shù)據(jù)類型是整型、字符型和實(shí)數(shù)型。雖然C語(yǔ)言有五種基本數(shù)據(jù)類型,但與Pascal或Ad相比,它卻不是強(qiáng)類型語(yǔ)言。C程序允許幾乎所有的類型轉(zhuǎn)換。例如,字符型和整型數(shù)據(jù)能夠自由地混合在大多數(shù)表達(dá)式中進(jìn)行運(yùn)算。這在強(qiáng)類型高級(jí)語(yǔ)言中是不允許的。C語(yǔ)言的另一個(gè)重要特點(diǎn)是它僅有32個(gè)關(guān)鍵字,這些關(guān)鍵字就是構(gòu)成C語(yǔ)言令。 PC的BASIC相比,后者包含的關(guān)鍵字達(dá)159個(gè)之多C語(yǔ)言是結(jié)構(gòu)化語(yǔ)C語(yǔ)言是塊結(jié)構(gòu)(block-structured)語(yǔ)言,但是它還是常被稱為結(jié)構(gòu)化語(yǔ)言。這是因?yàn)樗诮Y(jié)構(gòu)上類似于ALGOL、Pascal和Modula-2(從技術(shù)上講,塊結(jié)構(gòu)語(yǔ)言允許在過(guò)程和函數(shù)中定義過(guò)程或函數(shù)。用這種方法,全局和局部的概念可以通過(guò)C語(yǔ)言不允許在函數(shù)中定義函數(shù),所以不能稱之為通常意義上的塊結(jié)構(gòu)語(yǔ)言。結(jié)構(gòu)化語(yǔ)言的顯著特征是代碼和數(shù)據(jù)的分離。這種語(yǔ)言能夠把執(zhí)行某個(gè)特殊任務(wù)的指令和數(shù)據(jù)從程序的其余部分分離出去、隱。獲得的一個(gè)方法是調(diào)用使用局部(臨時(shí))變量的子程序。通過(guò)使用局部變量,我們能夠?qū)懗鰧?duì)程序其它部分沒(méi)有副作用的子程序。這使得編寫共享代碼段的程序變得十分簡(jiǎn)單。如果開發(fā)了一些分離很好的函數(shù),在時(shí)我們僅需要知道函數(shù)做什么,不必知道它如何做。切記:過(guò)度使用全局變量(可以被全部程序訪問(wèn)的變量)會(huì)由于意外的副作用而在程序中引入錯(cuò)誤。結(jié)構(gòu)化語(yǔ)言比非結(jié)構(gòu)化語(yǔ)言更易于程序設(shè)計(jì),用結(jié)構(gòu)化語(yǔ)言編寫的程序的清晰性使得它于。C語(yǔ)言的主要結(jié)構(gòu)成分是函數(shù)的獨(dú)立子程序。在C語(yǔ)言中,函數(shù)是一種構(gòu)件(程序塊,是完成程序功能的基本構(gòu)件。函數(shù)允許一個(gè)程序的諸任務(wù)被分別定義和編碼,使程序模塊化??梢源_信,一個(gè)好的函數(shù)不僅能正確工作且不會(huì)對(duì)程序的其它部分產(chǎn)生副作用。C語(yǔ)言是程序員的語(yǔ)也許你會(huì)問(wèn)“所有的計(jì)算機(jī)語(yǔ)言不都是程序員使用的嗎?”,回答是斷然的“否”。我們考慮典型的非程序員的語(yǔ)言COBOL和BASIC。COBOL的設(shè)計(jì)使程序員難以改變所編寫代碼然而COBOL設(shè)計(jì)者的本意卻是打算使非程序員能讀程序(這是不大可能的事。注意4這并不是COBOL優(yōu)想。BASIC的主要目的是允許非專業(yè)程序員在計(jì)算機(jī)上編程解決比較簡(jiǎn)單的問(wèn)題。與其形成鮮明對(duì)照的是C語(yǔ)言,由于程序生成、修改和現(xiàn)場(chǎng)測(cè)試自始至終均由真正的程序員進(jìn)行,因而它實(shí)現(xiàn)了程序C程序員可以獲得高效機(jī)器代碼,其效率幾乎接近匯編語(yǔ)言代碼。C語(yǔ)言被程序員廣泛使用的另一個(gè)原因是可以用它代替匯編語(yǔ)言。匯編語(yǔ)言使用的匯編指令,是能夠在計(jì)算機(jī)上直接執(zhí)行的二進(jìn)制機(jī)器碼的符號(hào)表示。匯編語(yǔ)言的每個(gè)操作都對(duì)應(yīng)為計(jì)算機(jī)執(zhí)行的單一指令。雖然匯編語(yǔ)言給予程序員達(dá)到最大靈活性和最高效率的潛力,但開發(fā)和調(diào)試匯編語(yǔ)言程序的是難以忍受的。非結(jié)構(gòu)性使得匯編語(yǔ)言程序難于閱讀、改進(jìn)和CPU的機(jī)器間移植。最初,C語(yǔ)言被用于系統(tǒng)程序設(shè)計(jì)。一個(gè)“系統(tǒng)程序”是一大類程序的一部分,這一大類構(gòu)成了計(jì)算機(jī)操作系統(tǒng)及實(shí)用程序。通常被稱為系統(tǒng)程序的有:隨著C語(yǔ)言的普及,加之其可移植性和高效率,許多程序員用它設(shè)計(jì)各類程序。幾乎所有的計(jì)算機(jī)上都有C語(yǔ)言編譯程序,這使我們可以很少改動(dòng)甚至不加改動(dòng)地將為一種機(jī)器寫的C語(yǔ)言源程序在另一種機(jī)器上編譯執(zhí)行??梢浦残怨?jié)省了時(shí)間和財(cái)力。C語(yǔ)言不僅在速度和結(jié)構(gòu)上有它的優(yōu)勢(shì),而且每個(gè)C語(yǔ)言系統(tǒng)都提供了專門的函數(shù)庫(kù),程序員可以根據(jù)不同需要對(duì)其進(jìn)行剪裁,以適應(yīng)各種程序的設(shè)計(jì)。由于它允許(更準(zhǔn)確地說(shuō)是鼓勵(lì))分別編譯,所以C語(yǔ)言可使程序員方便地管理大型項(xiàng)目,最大限度地減少重復(fù)勞動(dòng)。C基本程序結(jié)任何一種程序設(shè)計(jì)語(yǔ)言都具有特定的語(yǔ)則和規(guī)定的表達(dá)方法。一個(gè)程序只有嚴(yán)格按照語(yǔ)言規(guī)定的語(yǔ)法和表達(dá)方式編寫,才能保證編寫的程序在計(jì)算機(jī)中能正確地執(zhí)行,同時(shí)也便于閱讀和理解。為了了解C語(yǔ)言的基本程序結(jié)構(gòu),我們先介紹幾個(gè)簡(jiǎn)單的C程序。#include<stdio.h> {printf("Thisisasampleofcprogram. /*標(biāo)準(zhǔn)函顯示引號(hào)中的內(nèi)容第1章程序設(shè)計(jì)與算 Thisisasampleofc[例1- /*主函數(shù){void /*函數(shù)int /*指定a為整數(shù),初始值為 /*調(diào)用函數(shù)proc,無(wú)返回*/ /*調(diào)用函數(shù)func,結(jié)果返回給a*/printf("Thisisasampleofcprogram.\n");}void { o.}int { /*返回整數(shù)}執(zhí)行程序(函數(shù) proc();屏幕上顯 o,\n為轉(zhuǎn)義字符,代表?yè)Q行的意思,此時(shí),Thisisasampleofcprogram.”。Thisisasampleofc程序中 [例1-{intx,y,z,v; /*定義整型變量*/ v=volume(x,y,z); /*調(diào)用volume函數(shù),計(jì)算體積*/prinf("v=}6int /*定義volume函數(shù)int /*對(duì)形參a,b,c作類型定義{int /*定義函數(shù)的變量p /*計(jì)算體積p的值 /*將p值返回調(diào)用處}本程序的功能是對(duì)從鍵盤輸入的長(zhǎng)方體的長(zhǎng)、寬、高三個(gè)整型量求其體積的值。程序運(yùn)行的情況如下:v=main函數(shù)在調(diào)用volum函數(shù)時(shí),將實(shí)際參數(shù)x、y、z的值分別傳送給volum函數(shù)中的形式參數(shù)a、b、c。經(jīng)過(guò)執(zhí)行volume函數(shù)得到一個(gè)結(jié)果(即volume函數(shù)中變量p的值)并把這個(gè)值賦給變量v。CC程序都是由一個(gè)或多個(gè)函數(shù)構(gòu)成,其中必須只能有一個(gè)主函數(shù)main()。程序從主函數(shù)開始執(zhí)行,當(dāng)執(zhí)行到調(diào)用函數(shù)的語(yǔ)句時(shí),程序?qū)⒖刂妻D(zhuǎn)移到調(diào)用C程序的函數(shù)是由編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)(如printf、scanf等)和由用戶自己定義的函數(shù)(如proc、func、volumeC語(yǔ)言的一個(gè)成分,但它仍被看做是其中的一部分,main”不能用作變量名。 {}(intvolume(a,b,c)用無(wú)參數(shù)傳遞,圓括號(hào)中形式參數(shù)為空(如voidproc()函數(shù)。形式參數(shù)說(shuō)明指定函數(shù)調(diào)用傳遞參數(shù)的數(shù)據(jù)類型(1.3中語(yǔ)句inta,b,c;{和}表示函數(shù)體的函數(shù)庫(kù)和從技術(shù)上講,純粹由程序員自己編寫的語(yǔ)句構(gòu)成C因?yàn)樗械腃編譯程序都提供能完成各種常用任務(wù)的函數(shù)—函數(shù)庫(kù)(如printf、scanf等。 第1章程序設(shè)計(jì)與算 保存在函數(shù)庫(kù)中的函數(shù)是可重定位的。這意味著其中機(jī)器碼指令的內(nèi)存地址并未絕對(duì)地確定,只有偏移量是確定的。當(dāng)把程序與標(biāo)準(zhǔn)函數(shù)庫(kù)中的函數(shù)相時(shí),內(nèi)存偏移量被用來(lái)產(chǎn)生實(shí)際地址。有關(guān)重定位的詳細(xì)內(nèi)容,請(qǐng)查閱其他技術(shù)書籍。編寫程序時(shí)用到的函數(shù),許多都可以在標(biāo)準(zhǔn)函數(shù)庫(kù)中找到。它們是可以簡(jiǎn)單地組合起來(lái)的程序構(gòu)件。編寫了一個(gè)經(jīng)常要用的函數(shù)之后,可將其放入庫(kù)中備用。開發(fā)一個(gè)C程序設(shè)計(jì)程序設(shè)計(jì)亦稱程序編輯。程序員用任一編輯軟件(編輯器)將編寫好的C程序輸入計(jì)算機(jī),并以文本文件的形式保存在計(jì)算機(jī)的磁盤上。編輯的結(jié)果是建立C源程序文件。C程序習(xí)慣上使用小寫英文字母,常量和其他用途的符號(hào)可用大寫字母。C語(yǔ)言對(duì)大、小寫字C語(yǔ)言提供的編譯程序(編譯器)完成的。不同操作系統(tǒng)下的各種編譯器的使用命令不完全相同,使用時(shí)應(yīng)注意計(jì)算機(jī)環(huán)境。編譯時(shí),編譯器首先要對(duì)源程序中的每一個(gè)語(yǔ)句檢查語(yǔ)法錯(cuò)誤,當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí),就在屏幕上顯示錯(cuò)誤的位置和錯(cuò)誤類型的信息。此時(shí),要再次調(diào)用編輯器進(jìn)行查錯(cuò)修改。然后,再進(jìn)行編譯,直至排除所有語(yǔ)法和語(yǔ)義錯(cuò)誤。正確的源程序文件經(jīng)過(guò)編譯后在磁盤上生成目標(biāo)文件。程序編譯后產(chǎn)生的目標(biāo)文件是可重定位的程序模塊,不能直接運(yùn)行。就是把目標(biāo)文件和其他分別進(jìn)行編譯生成的目標(biāo)程序模塊(如果有的話)及系統(tǒng)提供的標(biāo)準(zhǔn)庫(kù)函數(shù)鏈接在一起,生成可以運(yùn)行的可執(zhí)行文件的過(guò)程。過(guò)程使用C語(yǔ)言提供的程序(器)程序運(yùn)行生成可執(zhí)行文件后,就可以在操作系統(tǒng)控制下運(yùn)行。若執(zhí)行程序后達(dá)到預(yù)期目的,則C程序的開發(fā)工作到此完成。否則,要進(jìn)一步檢查修改源程序,重復(fù)編輯—編譯——運(yùn)行的過(guò)程,直到取得預(yù)期結(jié)果為止大部分C語(yǔ)言都提供一個(gè)獨(dú)立的開發(fā)集成環(huán)境,它可將上述四步連貫在一個(gè)程序之中。本書所涉及的程序全部在TurboC環(huán)境中進(jìn)行。C語(yǔ)言的關(guān)表1-2列舉了32個(gè)關(guān)鍵字,它們與標(biāo)準(zhǔn)C句法結(jié)合,形成了程序設(shè)計(jì)語(yǔ)言C表1-2關(guān)鍵字 8C語(yǔ)言的關(guān)鍵字都用小寫字母。Celse是關(guān)鍵字,“ELSE”則不+對(duì)于面向?qū)ο蟪绦蛟O(shè)計(jì),強(qiáng)調(diào)的是數(shù)據(jù)結(jié)構(gòu),而對(duì)于面向過(guò)程的程序設(shè)計(jì)語(yǔ)言如 CPascal、FOTRAN等語(yǔ)言,主要關(guān)注的是算法。掌握算法,也是為面向?qū)ο蟪绦蛟O(shè)計(jì)打下一個(gè)扎實(shí)的基礎(chǔ)。那么,什么是算法呢?人們使用計(jì)算機(jī),就是要利用計(jì)算機(jī)處理各種不同的問(wèn)題,而要做到這一點(diǎn),人們就必須事先對(duì)各類問(wèn)題進(jìn)行分析,確定解決問(wèn)題的具體方法和步驟,再編制好一組讓計(jì)算機(jī)執(zhí)行的指令即程序,交給計(jì)算機(jī),讓計(jì)算機(jī)按人們指定的步驟有效地工作。這些具體的方法和步驟,其實(shí)就是解決一個(gè)問(wèn)題的算法。根據(jù)算法,依據(jù)某種規(guī)則編寫計(jì)算機(jī)執(zhí)行令序列,就是編制程序,而書寫時(shí)所應(yīng)遵守的規(guī)則,即為某種語(yǔ)言的語(yǔ)法。由此可見(jiàn),程序設(shè)計(jì)的關(guān)鍵之一,是解題的方法與步驟,是算法。學(xué)習(xí)高級(jí)語(yǔ)言的重點(diǎn),就是掌握分析問(wèn)題、解決問(wèn)題的方法,就是鍛煉分析、分解,最終歸納整理出算法的能力。與之相對(duì)應(yīng),具體語(yǔ)言,如C語(yǔ)言的語(yǔ)法是工具,是算法的一個(gè)具體實(shí)現(xiàn)。所以在高級(jí)語(yǔ)言的學(xué)習(xí)中,一方面應(yīng)熟練掌握該語(yǔ)言的語(yǔ)法,因?yàn)樗撬惴▽?shí)現(xiàn)的基礎(chǔ),另一方面必須認(rèn)識(shí)到算法的重要性,加強(qiáng)思維訓(xùn)練,以寫出高質(zhì)量的程序。 B、C中,另外,再準(zhǔn)備一個(gè)MAX裝最大數(shù)。由于計(jì)算機(jī)一次只能比較兩個(gè)數(shù),我們首先把A與B比,大的數(shù)放入MAX中,再把與C比,又把大的數(shù)放入MAX最后,把MAX輸出,此時(shí)MAXC三數(shù)中最大的一個(gè)數(shù)。算法可以表輸入A、B、CA與B中大的一個(gè)放入MAX把C與MAX中大的一個(gè)放入MAX輸出MAX,MAX即為最大把A與B中大的一個(gè)放入MAX中,若A>B,則MAX←A;否則MAX←B輸入A,B,C若A>B,則MAX否則MAX←B若C>MAX,則MAX←C輸出MAX,MAX即為最大第1章程序設(shè)計(jì)與算 [例1-5] 猴子吃桃問(wèn)題:有一堆桃子不知數(shù)目,猴子第一天一半,覺(jué)得不過(guò)癮,又多吃了一只,第二天照此辦理,剩下桃子的一半另加一個(gè),天天如此,到第十天早上,猴子發(fā)現(xiàn)只剩一只桃子了,問(wèn)這堆桃子原來(lái)有多少個(gè)?此題粗看起來(lái)有些無(wú)從著手的感覺(jué),那么怎樣開始呢?假設(shè)第一天開始時(shí)有a1只桃子,第二天有a2只,...,第9天有a9只,第10天是a10只,在a1,a2,...,a10中,只有a10=1是知道的,現(xiàn)要求a1,而我們可以看出,a1,a2,..,a10之間存在一個(gè)簡(jiǎn)單的關(guān)系:┇也就是: 再上面從a9,a8直至a1的計(jì)算過(guò)程,這其實(shí)是一個(gè)遞推過(guò)程,這種遞推的方法在計(jì)算機(jī)解題中經(jīng)常用到。另一方面,這九步運(yùn)算從形式上完全一樣,不同的只是ai的下標(biāo)而已。由此,我們引入循環(huán)的處理方法,并統(tǒng)一用a0a1表示后一天的桃子數(shù),將算法改寫如下:a1=1;{第10a1的初值}i=9。{計(jì)數(shù)器初值為9}a0=2*(a1+1) a1=a0。{將當(dāng)天的桃子數(shù)作為下一次計(jì)算的初值i=i-1若i>=1,轉(zhuǎn)2)輸出a0的值弄清如果由人來(lái)做,應(yīng)該采取哪些步對(duì)這些步驟進(jìn)行歸納整理,抽象出數(shù)學(xué)模對(duì)其中的重復(fù)步驟,通過(guò)使用相同變量等方式求得形式的統(tǒng)一,然后簡(jiǎn)練地用循算法的描述方法有自然語(yǔ)言描述、偽代碼、流程圖 N-S圖、PAD圖等流程圖與算法的結(jié)構(gòu)化描流程圖是一種傳統(tǒng)的算法表示法,它利用幾何圖形的框來(lái)代表各種不同性質(zhì)的操作,用流程線來(lái)指示算法的執(zhí)行方向。由于它簡(jiǎn)單直觀,所以應(yīng)用廣泛,特別是在早期語(yǔ)言階段,只有通過(guò)流程圖才能簡(jiǎn)明地表述算法,流程圖成為程序員們交流的重要 ,直到結(jié)構(gòu)化的本章例1-1的算法的流程圖如圖1-2所示。本章例1-2的算法的流程圖如圖1-3起止 判斷 輸入、輸出 注釋執(zhí)行 連接 流程圖1-1開輸入開 i=i- i=i-

輸出輸出結(jié) 結(jié)圖1-2例1-1的算法流程 圖1-3例1-2的算法流程另外還規(guī)定,流程線是從下往上或從右向左時(shí),必須帶箭頭,除此以外,都不畫箭頭,早期的非結(jié)構(gòu)化語(yǔ)言中都有g(shù)oto第1章程序設(shè)計(jì)與算 一大堆跳轉(zhuǎn)語(yǔ)句使得程序的流程十分復(fù)雜紊亂,難以看懂也難以驗(yàn)證程序的正確性,如果有錯(cuò),排起錯(cuò)來(lái)更是十分。這種轉(zhuǎn)來(lái)轉(zhuǎn)去的流程圖所表達(dá)的與復(fù)雜,正是軟件中程序人員處境的一個(gè)生動(dòng)寫照。而結(jié)構(gòu)化程序設(shè)計(jì),就是要把這團(tuán)亂麻理清。經(jīng)過(guò)研究,人們發(fā)現(xiàn),任何復(fù)雜的算法,都可以由順序結(jié)構(gòu)、選擇(分支)結(jié)構(gòu)和循環(huán)結(jié)構(gòu)這三種基本結(jié)構(gòu)組成,因此,我們構(gòu)造一個(gè)算法的時(shí)候,也僅以這三種基本結(jié)構(gòu)作為不允許從一個(gè)結(jié)構(gòu)直接轉(zhuǎn)到另一個(gè)結(jié)構(gòu)的內(nèi)部去。正因?yàn)檎麄€(gè)算法都是由三種基本結(jié)構(gòu)組成的,就像用模塊構(gòu)建的一樣,所以結(jié)構(gòu)清晰,易于正確性驗(yàn)證,易于糾錯(cuò),這種方法,就是結(jié)構(gòu)化方法。遵循這種方法的程序設(shè)計(jì),就是結(jié)構(gòu)化程序設(shè)計(jì)。順序結(jié)1-4所示,語(yǔ)句的執(zhí)行順序?yàn)椋篈→B→C。選擇(分支)結(jié)這種結(jié)構(gòu)是對(duì)某個(gè)給定條件進(jìn)行判斷,條件為真或假時(shí)分別執(zhí)行不同的框的內(nèi)容。其基1-5a、b)所示。圖1-5a)A執(zhí)行B;圖1-5)的執(zhí)行序列為:當(dāng)條件為真時(shí)執(zhí)行A,否則什么也不做。A 條 條 ABABABABACC圖1-4順序結(jié)構(gòu)的流程 圖1-5選擇(分支)結(jié)構(gòu)的流程循環(huán)結(jié)循環(huán)結(jié)構(gòu)有兩種基本形態(tài):while型循環(huán)和do-whileAAAAAAA 條 條 條T 圖1-6while型循環(huán)流程 圖1-7do-while型循環(huán)流程 圖1-8do-while型循環(huán)轉(zhuǎn)換whileAA,一旦條件為假,在圖1-6、圖1-7中,A被稱為循環(huán)體,條件被稱為循環(huán)控制條件。要注意的在循環(huán)體中,必然對(duì)條件要判斷的值進(jìn)行修改,使得經(jīng)過(guò)有限次循環(huán)后,循環(huán)一定能結(jié)束,如圖1-3中的i=i-1。當(dāng)型循環(huán)中循環(huán)體可能一次都不執(zhí)行,而直到型循環(huán)則至少執(zhí)行一次循環(huán)直到型循環(huán)可以很方便地轉(zhuǎn)化為當(dāng)型循環(huán),而當(dāng)型循環(huán)不一定能轉(zhuǎn)化為直到型循環(huán)。例如,圖可以轉(zhuǎn)化為圖18。用N-S圖描述算N-S圖是另一種算法表示法,是由人I.Nassi和B.Shneiderman共同,其根據(jù)是:既然任何算法都是由前面介紹的三種結(jié)構(gòu)組成,所以各基本結(jié)構(gòu)之間的流程線就是多余的,N-S圖中,一個(gè)算法就是一個(gè)大矩形框,框內(nèi)又包含若干基本的框,三種基本結(jié)構(gòu)的N-如圖1-9所示,執(zhí)行順序先A后B對(duì)應(yīng)于圖1-5的N-S圖為圖1-10。圖1-10a)條件為真時(shí)執(zhí)行A,條件為假時(shí)執(zhí)行B。圖1-條件為真時(shí)執(zhí)行A,為假時(shí)什么都不做BA BA圖1-9順序結(jié)構(gòu)的N-S 圖1-10選擇結(jié)構(gòu)的N-S當(dāng)<條當(dāng)<條件>為Awhile型循環(huán)的N-S圖如圖1-11所示,條件為真時(shí)一直環(huán)執(zhí)行循環(huán)體A,直到條件為假時(shí)才跳出循環(huán)do-while型循環(huán)的N-S圖如圖1-12,一直循環(huán)執(zhí)行循環(huán)體本章例1-1的N-S圖如圖1-13,例1-2的N-S圖如圖1-14。應(yīng)

圖1-11while型循環(huán)的N-SA當(dāng)<條件>為圖1-12do-while型循環(huán)的N-ST輸入T輸入FTF當(dāng)i>=1i=i-輸出圖1-13例1-1的N-S 圖1-14例1-2的N-S第1章程序設(shè)計(jì)與算 用PAD圖描述算PAD(ProblemysisDiagram,是近年來(lái)在軟件開發(fā)中被廣泛使用的一種算法的圖形N-SN-SPAD圖除了自上而下以外,還有自左向右的展開,所以,如果說(shuō)流程圖、N-S圖是一維的算法描述的下面是PAD圖的幾種基本形態(tài)單分支選擇,條件為真執(zhí)行A,如圖1-16a兩分支選擇,如圖1- b),條件為真執(zhí)行A,為假執(zhí)行BI=DCBAB多分支選擇,如圖1- c),當(dāng)I=I1時(shí)執(zhí)行A,I=I2時(shí)執(zhí)行B,I=I3時(shí)執(zhí)I=DCBABA條A條A條BACC圖1-15順序結(jié)構(gòu)的 圖1-16選擇結(jié)構(gòu)的如圖1-17所示。圖1-17a)為while型循環(huán),圖1-17b)為do-whileAUNTIL<條件AUNTIL<條件WHILE<條件 圖1-17循環(huán)結(jié)構(gòu)的本章例1.1的PAD圖如圖1-18,例1-2的PAD圖如圖1-19輸入輸入輸出whilei=i-輸出圖1-18例1-1的 圖1-19例1-2的第2 數(shù)據(jù)類型、運(yùn)算符和表達(dá)CC語(yǔ)言有五種基本數(shù)據(jù)類型:字符、整型、單精度實(shí)型、雙精度實(shí)型和空類型。盡管這幾種類型數(shù)據(jù)的長(zhǎng)度和范圍隨處理器的類型和C語(yǔ)言編譯程序的實(shí)現(xiàn)而異,但以bit為例,整數(shù)與CPU字長(zhǎng)相等,一個(gè)字符通常為一個(gè)字節(jié),浮點(diǎn)值的確切格式則根據(jù)實(shí)現(xiàn)而定。對(duì)于多數(shù)微機(jī),表2-1給出了五種數(shù)據(jù)的長(zhǎng)度和范圍。表2-1 度 char(字符型8int(整型-float(單精度型約精確到6位double(雙精度型約精確到12位void(空值型0無(wú)表中的長(zhǎng)度和范圍的取值是假定CPU的字長(zhǎng)為16bittypes除void類型外,基本類型的前面可以有各種修飾符。修飾符用來(lái)改變基本類型的意義,修飾符signed、short、long和unsigned適用于字符和整數(shù)兩種基本類型,而long還可用于double(注意,由于longfloat與double意思相同,所以ANSI標(biāo)準(zhǔn)刪除了多余的longfloat。表2-2給出所有根據(jù)ANSI16位shortint與signedchar可能不等。表2-2ANSI 度 char(字符型8ASCIIunsignedchar(無(wú)符號(hào)字符型8signedchar(有符號(hào)字符型8-int(整型unsignedint(無(wú)符號(hào)整型signedint(有符號(hào)整型同 第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) (續(xù) 度 shortint(短整型8unsignedshortint(無(wú)符號(hào)短整型8signedshortint(有符號(hào)短整型8同longint(長(zhǎng)整型~signedlongint(有符號(hào)長(zhǎng)整型~unsignedlongint(無(wú)符號(hào)長(zhǎng)整型float(單精度型約精確到6位double(雙精度型約精確到12位*表中的長(zhǎng)度和范圍的取值是假定CPU的字長(zhǎng)為16bit某些實(shí)現(xiàn)允許將unsigned用于浮點(diǎn)型,如unsigneddouble。但這一用法降低了程序的可移植性,故建議一般不要采用。short 簡(jiǎn)寫為shortlong 簡(jiǎn)寫為longunsignedshort 簡(jiǎn)寫為unsignedshortunsigned 簡(jiǎn)寫為unsignedunsignedlongint 簡(jiǎn)寫為unsignedlong。標(biāo)識(shí)符命在C語(yǔ)言中,標(biāo)識(shí)符是對(duì)變量、函數(shù)標(biāo)號(hào)和其它各種用戶定義對(duì)象名。標(biāo)識(shí)符的長(zhǎng)度可以是一個(gè)或多個(gè)字符。絕大多數(shù)情況下,標(biāo)識(shí)符的第一個(gè)字符必須是字母或下劃線,隨后的字符必須是字母、數(shù)字或下劃線(C語(yǔ)言編譯器可能不允許下劃線作為標(biāo)識(shí)符的起始字符。下面是一些正確或錯(cuò)誤標(biāo)識(shí)符命名的實(shí)例。 hi! ANSI標(biāo)準(zhǔn)規(guī)定,標(biāo)識(shí)符可以為任意長(zhǎng)度,但外部名必須至少能由前8個(gè)字符唯一地區(qū)分這里外部名指的是在過(guò)程中所涉及的標(biāo)識(shí)符,其中包括文件間共享的函數(shù)名和全局變量8個(gè)字符的編譯程序而言,下面的外部名將被當(dāng)作同一個(gè)標(biāo)識(shí)符處理。 ANSI標(biāo)準(zhǔn)還規(guī)定內(nèi)部名必須至少能由 31個(gè)字符唯一地區(qū)分。內(nèi)部名指的是僅出現(xiàn)C語(yǔ)言中的字母是有大小寫區(qū)別的,因此countCountCOUNT是三個(gè)不同的標(biāo)識(shí)符。標(biāo)識(shí)符不能和CC語(yǔ)言庫(kù)函數(shù)同名。常C語(yǔ)言中的常量是不接受程序修改的固定值,常量可為任意數(shù)據(jù)類型,如下例所示 'a'、'\n'、 21123、2100、-long 35000short 10、-12、unsigned 10000987 123.23、4.34e- 、-C語(yǔ)言還支持另一種預(yù)定義數(shù)據(jù)類型的常量,這就是串。所有串常量括在雙撇號(hào)之間,例如"Thisisatest"。切記,字和相單字符常是單撇號(hào)起的,如'a'。變(標(biāo)識(shí)符),在內(nèi)存中占據(jù)一定的存type這里的type必須是有效的C數(shù)據(jù)類型,variable_list(變量表)可以由一個(gè)或多個(gè)由逗號(hào)分inti,j,l;shortintsi;unsignedintui;doublebalance,注意C整型常整型常量及整常數(shù)。它可以是十進(jìn)制、八進(jìn)制、十六進(jìn)制數(shù)字表示的整數(shù)值。十進(jìn)制常數(shù)的形式是: 第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 在此,digits可以是一個(gè)或多個(gè)八進(jìn)制數(shù)(0~7之間),起始0是必須的引導(dǎo)符。這里hdigits可以是一個(gè)或多個(gè)十六進(jìn)制數(shù)(0~9的數(shù)字,并從“a”~“f”的字母。引導(dǎo)符0是必須有的,X即字母可用大寫或小寫。2-3表2- 十進(jìn) 八進(jìn) 十六進(jìn)0Xa或0X7db3或整常數(shù)在不加特別說(shuō)明時(shí)總是正值。如果需要的是負(fù)值,則負(fù)號(hào)“-”必須放置于常數(shù)表每個(gè)常數(shù)依其值要給出一種類型。當(dāng)整常數(shù)應(yīng)用于一表達(dá)式時(shí),或出現(xiàn)有負(fù)號(hào)時(shí),常數(shù)類型自動(dòng)執(zhí)行相應(yīng)的轉(zhuǎn)換,十進(jìn)制常數(shù)可等價(jià)于帶符號(hào)的整型或長(zhǎng)整型,這取決于所需的常數(shù)的尺寸。八進(jìn)制和十六進(jìn)制常數(shù)可對(duì)應(yīng)整型、無(wú)符號(hào)整型、長(zhǎng)整型或無(wú)符號(hào)長(zhǎng)整型,具體類型也取決于常數(shù)的大小。如果常數(shù)可用整型表示,則使用整型。如果常數(shù)值大于一個(gè)整型所能表示的最大值,但又小于整型位數(shù)所能表示的最大數(shù),則使用無(wú)符號(hào)整型。同理,如果一個(gè)常數(shù)比無(wú)符號(hào)整型所表示的值還大,則它為長(zhǎng)整型。如果需要,當(dāng)然也可用無(wú)符號(hào)長(zhǎng)整型。在一個(gè)常數(shù)后面加一個(gè)字母l或L,則認(rèn)為是長(zhǎng)整型。如10L、79L、012L、0115L、0XAL整型變前面已提到,C規(guī)定在程序中所有用到的變量都必須在程序中指定其類型,即“定義”。[例2-{int /*指定a,b,c,d為整型變量unsignedu; a=12;b=-24;u=10;c=a+u;printf("a+u=%d,}運(yùn)行結(jié)果為a+u=22,int型數(shù)據(jù)與unsingnedint型實(shí)型常實(shí)型常量又稱浮點(diǎn)常量,是一個(gè)十進(jìn)制表示的符號(hào)實(shí)數(shù)。符號(hào)實(shí)數(shù)的值包括整數(shù)部分、在此digits是一位或多位十進(jìn)制數(shù)字(0~9。E(也可用e)是指數(shù)符號(hào)。小數(shù)點(diǎn)之前指數(shù)部分 E或e開頭,冪指數(shù)可以為負(fù),當(dāng)沒(méi)有符號(hào)時(shí)視為正指數(shù)的基數(shù)為10,1.575E10表示為:1.575×1010在不加說(shuō)明的情況下,實(shí)型常量為正值。如果表示負(fù)值,需要在常量前使用負(fù)號(hào)。下面是一些實(shí)型常量的示例:15.75,1.575E10,1575e-2,-0.0025,-2.5e-3,25E-.57,.0075e2,-.125,-.175E-注意字母E或e之前必須有數(shù)字,且E或e后面指數(shù)必須為整數(shù),如e3、2.1e3.5、.e3、e實(shí)型變實(shí)型變量分為單精度(float型)和雙精度(double型。對(duì)每一個(gè)實(shí)型變量都應(yīng)再使用前float /*指定x,y為單精度實(shí)數(shù)double /*指定z為雙精度實(shí)數(shù)float4個(gè)字節(jié)(32位)一個(gè)double型數(shù)據(jù)占8節(jié)(64位。單精度實(shí)數(shù)提供7位有效數(shù)字,雙精度提供15~16位有效數(shù)字,數(shù)值的范圍隨機(jī)器系統(tǒng)而異。值得注意的是,實(shí)型常量是double型,當(dāng)把一個(gè)實(shí)型常量賦給一個(gè)flot型變量時(shí),系統(tǒng)會(huì)floata;由于float型變量只能接收7位有效數(shù)字,因此最后兩位小數(shù)不起作用。如果將a改為型,則能全部接收上述9位數(shù)字并在變量a中 第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 字符常a’,‘9’,‘!’。字符常量中的單引號(hào)只起定界作用并不表示字符本身。單引號(hào)中的字符不能是單引號(hào)(’)和反斜杠(\),它們?cè)贑語(yǔ)言中,字符是按其所對(duì)應(yīng)的ASCII碼值來(lái)的,一個(gè)字符占一個(gè)字節(jié)。例如ASCII碼值(十進(jìn)制!019ABab注意字符'9'和數(shù)字9的區(qū)別,前者是字符常量,后者是整型常量,它們的含義和在計(jì)由于C語(yǔ)言中字符常量是按整數(shù)(short型)的,所以字符常量可以像整數(shù)一樣在程序/*執(zhí)行結(jié)果97-32='A'+/*執(zhí)行結(jié)果65+32=/*執(zhí)行結(jié)果57-9=字符串常字符串常量是指用一對(duì)雙引號(hào)括起來(lái)的一串字符。雙引號(hào)只起定界作用,雙引號(hào)括起的字符串中不能是雙引號(hào)(")和反斜杠(\,它們特有的表示法在轉(zhuǎn)義字符中介紹。例如:C語(yǔ)言中,字符串常量在內(nèi)存中時(shí),系統(tǒng)自動(dòng)在字符串的末尾加一個(gè)“串結(jié)束標(biāo)志”,即ASCII碼值為0的字符NULL,常用\0表示。因此在程序中,長(zhǎng)度為n個(gè)字符的字符串常量,在內(nèi)存中占有n+1個(gè)字節(jié)的空間。例如,字符串有5個(gè)字符,作為字符串常量""于內(nèi)存中時(shí),共占6個(gè)字節(jié),系統(tǒng)自動(dòng)在后面加上NULL字符,其形式為:China要特別注意字符串與字符串常量的區(qū)別,除了表示形式不同外,其性質(zhì)也不相同,字符'A'只占1個(gè)字節(jié),而字符串常量"A"占2轉(zhuǎn)義字轉(zhuǎn)義字符是C語(yǔ)言中表示字符的一種特殊形式。通常使用轉(zhuǎn)義字符表示ASCII碼字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的單撇號(hào)('),用于表示字符串常量的雙撇號(hào)(")和反斜杠(\)等。轉(zhuǎn)義字符用反斜杠\后面跟一個(gè)字符或一個(gè)八進(jìn)制或十六進(jìn)制數(shù)表示。表2-4給出了C語(yǔ)言中常用的轉(zhuǎn)義字符。表2-4轉(zhuǎn)義字 ASCII碼值(十進(jìn)制響鈴?fù)烁駬Q頁(yè)換行回車水平制表垂直制表反斜單引號(hào)雙引號(hào)空字符三位八二位十字符常量中使用單引號(hào)和反斜杠以及字符常量中使用雙引號(hào)和反斜杠時(shí),都必須使用轉(zhuǎn)義字符表示,即在這些字符前加上反斜杠。在C程序中使用轉(zhuǎn)義字符\ddd或者\(yùn)xhh\ddd為斜杠后面跟ASCII\x后面跟兩位十六進(jìn)制數(shù),ASCII轉(zhuǎn)義字符中只能使用小寫字母,每個(gè)轉(zhuǎn)義字符只能看作一個(gè)字\v垂直制表和\f換頁(yè)符對(duì)屏幕沒(méi)有任何影響,但會(huì)影響執(zhí)行響應(yīng)操作在C程序中,使用不可打印字符時(shí),通常用轉(zhuǎn)義字符表符號(hào)常C語(yǔ)言允許將程序中的常量定義為一個(gè)標(biāo)識(shí)符,稱為符號(hào)常量。符號(hào)常量一般使用大寫英文字母表示,以區(qū)別于一般用小寫字母表示的變量。符號(hào)常量在使用前必須先定義,定義的形式是:#define #defineTRUE#definrFALSE#defineSTAR這里定義PI、TRUE、FLASE、STAR為符號(hào)常量,其值分別 ,1,0,'*'第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 號(hào)常量名時(shí),應(yīng)使其盡可能地表達(dá)它所代表的常量的含義,例如前面所定義的符號(hào)常量名PI(),表示圓周率3. 。此外,若要對(duì)一個(gè)程序中多次使用的符號(hào)常量的值進(jìn)行修改,只須對(duì)預(yù)處理命令中定義的常量值進(jìn)行修改即可。字符變字符變量用來(lái)存放字符常量,注意只能存放一個(gè)字符,不要以為在一個(gè)字符變量中可以放字符串。charc1,它表示c1和c2為字符變量,各放一個(gè)字符。因此可以用下面語(yǔ)句對(duì)c1、c2c1= c2=[例2-{charc1,c2;printf("%c}c1、c23行中,將整數(shù)97和98分別賦給c1和c2,它的作用相當(dāng)c1='a';因?yàn)?a'和'b'的ASCII碼為97和98。第4行將輸出兩個(gè)字符。"%c"是輸出字符的格式。程序輸出: [例2- charc1,c2;c1=c1-32;c2=c2-printf("%c} 'B'為66。從ASCII代碼表中可以看到每一個(gè)小寫字母比大寫字母的ASCII碼大32。即'a'='A'+C語(yǔ)言的內(nèi)部運(yùn)算符很豐富,運(yùn)算符是告訴編譯程序執(zhí)行特定算術(shù)或邏輯操作的符號(hào)。C語(yǔ)言有算符:算術(shù)、關(guān)系與邏輯、位操作。另外,C還有一些特殊的運(yùn)算符,用于完成算術(shù)運(yùn)算的用法與大多數(shù)計(jì)算機(jī)語(yǔ)言的相同,幾乎可用于所有C語(yǔ)言內(nèi)定義的數(shù)據(jù)類型。當(dāng)“/”被用于整數(shù)或字符時(shí),結(jié)果取整。例如,在整數(shù)除法中,10/3=3。-1乘單個(gè)操作數(shù),即任何數(shù)值前放置減號(hào)將改變其符號(hào)。模運(yùn)算符“%”在C語(yǔ)言中也同它在其它語(yǔ)言中的用法相同。切記,模運(yùn)算取整數(shù)除法的余數(shù),所以“%”不能用于float和double類型。表2-5運(yùn)算 運(yùn)算符 %模運(yùn) 加-自減(減 乘自增(增 除下面是說(shuō)明% /*顯示3 /*顯示1,整數(shù)除法的余數(shù) /*顯示0,1最后一行打印一個(gè)0和一個(gè)1,因?yàn)?/2整除時(shí)為0,余數(shù)為1,故1%2取余數(shù)1自增和自C語(yǔ)言中有兩個(gè)很有用的運(yùn)算符,通常在其它計(jì)算機(jī)語(yǔ)言中是找不到它們的—自增和自++和--++”是操作數(shù)加1,而“--”是操作數(shù)減1,換句話說(shuō):自增和自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如:x=x+1;可寫成++x;或x++;但在表達(dá)式中這兩種用法是有區(qū)別的。自增或自減運(yùn)算符在操作數(shù)之前,C語(yǔ)言在第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 操作數(shù)之前就先執(zhí)行加1或減1操作;運(yùn)算符在操作數(shù)之后,C語(yǔ)言就先操作數(shù)的值,而后在大多數(shù)C編譯程序中,為自增和自減操作生成的程序代碼比等價(jià)的賦值語(yǔ)句生成的代碼1或減1運(yùn)算符是一種好的選擇。最高++、(一元減最低+C語(yǔ)言關(guān)系和邏輯運(yùn)算關(guān)系運(yùn)算符中的“關(guān)系”二字指的是一個(gè)值與另一個(gè)值之間的關(guān)系,邏輯運(yùn)算符中的“邏輯”二字指的是連接關(guān)系的方式。因?yàn)殛P(guān)系和邏輯運(yùn)算符常在一起使用,所以將它們放在一起討論。關(guān)系和邏輯運(yùn)算符概念中的關(guān)鍵是True(真)和Flase(假。C語(yǔ)言中,非0為True,0為表2-6關(guān)系運(yùn)算 關(guān)系運(yùn)算 大 小于或等 大于等 等 小 不等邏輯運(yùn)算 表2-61和010>1+12的計(jì)算可以假定是對(duì)表pq00001010111111010010這一表達(dá)式的結(jié)果為True最高!>===最低切記,所有關(guān)系和邏輯表達(dá)式產(chǎn)生的結(jié)果不是0就是1,所以下面的程序段不僅正確而且將intx;位操作C語(yǔ)言支持全部的位操作符(BitwiseOperators。因?yàn)镃語(yǔ)言的設(shè)計(jì)目的是取代匯編語(yǔ)言,所以它必須支持匯編語(yǔ)言所具有的運(yùn)算能力。位操作是對(duì)字節(jié)或字中的位(bit)進(jìn)試、置位或移位處理,這里字節(jié)或字是針對(duì)C標(biāo)準(zhǔn)中的char和int數(shù)據(jù)類型而言的。位操作不能用于float、double、longdouble、void2-7給出了位操作的操作符。位操作中的AND、OR和NOT(1的補(bǔ)碼)的真值表與邏輯運(yùn)算等價(jià),唯一不同的是位操作是逐位進(jìn)行運(yùn)算的。表2-7操作符 操作 &與 1的補(bǔ)(|或 右^異或( 左表2- Pq000101110011第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 如表2-8所示,當(dāng)且僅當(dāng)一個(gè)操作數(shù)為True時(shí),異或的輸出為True,否則為Flase位操作通常用于設(shè)備驅(qū)動(dòng)程序,例如調(diào)制解調(diào)器程序、磁盤文件管理程序和驅(qū)動(dòng)程序。這是因?yàn)槲徊僮骺傻裟承┪唬缙媾夹r?yàn)位(奇偶校驗(yàn)位用于確保字節(jié)中的其它位不會(huì)發(fā)生錯(cuò)誤通常奇偶校驗(yàn)位是字節(jié)的最。通常我們可把位操作AND作為關(guān)閉位的,這就是說(shuō)兩個(gè)操作數(shù)中任一為0的位,其結(jié)果中對(duì)應(yīng)位置為0。例如,下面的函數(shù)通過(guò)調(diào)用函數(shù)read_modem(),從調(diào)制解調(diào)器端口讀入一個(gè)字符,并將奇偶校驗(yàn)位置成0。[例2-Char{charch=read_modem()從調(diào)制解調(diào)器端口中得到一個(gè)字符*/}字節(jié)的位是奇偶位,將該字節(jié)與一個(gè)位1到位7為1、位8為00。表達(dá)式ch&127正是將ch中每一位同127果h的位8被置成了。在下面的例子中,假定h接收到字符"A"↓內(nèi)容為‘A’的ch,其中奇偶校驗(yàn)位為二進(jìn)制的127 位操作OR與AND1的位將結(jié)果的對(duì)應(yīng)位置1。如128|3的情況是: 異或操作通常縮寫為XOR,當(dāng)且僅當(dāng)做比較的兩位不同時(shí),才將結(jié)果的對(duì)應(yīng)位置位。如下所示,異或操作127^120 一般來(lái)說(shuō),位的AND、OR和XOR操作通過(guò)對(duì)操作數(shù)運(yùn)算,直接對(duì)結(jié)果變量的每一位分別處理。正是因?yàn)檫@一原因(還有其它一些原因,位操作通常不像關(guān)系和邏輯運(yùn)算符那樣用在條件語(yǔ)句中,我們可以用例子說(shuō)明這一點(diǎn):假定X=7,那么x&&8為Ture(1),而x&8卻為Flase(0)記住,關(guān)系和邏輯操作符結(jié)果不是0就是1variable>>右移位數(shù)0(某些計(jì)算機(jī)是送1,詳細(xì)內(nèi)容請(qǐng)查閱相應(yīng)C編譯程序用戶手冊(cè)。切記:移位不同于循環(huán),從一端移出的位并不送回到另一端去,移去的位丟失了,同時(shí)在另一端補(bǔ)0。移位操作可對(duì)外部設(shè)備(如D/A轉(zhuǎn)換器)的輸入和狀態(tài)信息進(jìn)行譯碼,移位操作還可用于2-9所示(0)2,而右移一位等表2- 字符x每個(gè)語(yǔ)句執(zhí)行后的x的值7每左移一位乘2,注意x<<2后,原x的信息已經(jīng)丟失了,因?yàn)橐晃灰呀?jīng)從一端出,每右移一位相當(dāng)于被2除,注意,乘后再除時(shí),除操作并不帶回乘法時(shí)已經(jīng)丟掉的。反碼操作符為~。~的作用是將特定變量的各位狀態(tài)取反,即將所有的1位置成0,所有的位置成1位操作符經(jīng)常用在加密程序中,例如,若想生成一個(gè)不可讀磁盤文件時(shí),可以在文件上1的反碼運(yùn)算,將每個(gè)字節(jié)的每一位取反。注意,對(duì)同一行進(jìn)行連續(xù)的兩次求反,總是得到原來(lái)的數(shù)字,所以第一次求反表示了字節(jié)的編碼,第二次求反進(jìn)行譯碼又得到了原來(lái)的值。charch;{return}?操作C語(yǔ)言提供了一個(gè)可以代替某些if-then-else第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) EXP1,EXP2和EXP3是表達(dá)式,注意冒號(hào)的用法和位?”作用是這樣的,在計(jì)算EXP1之后,如果數(shù)值為True,則計(jì)算EXP2,并將結(jié)果作為整個(gè)表達(dá)式的數(shù)值;如果EXP1的值為Flase,則計(jì)算EXP3,并以它的結(jié)果作為整個(gè)表達(dá)式的值,請(qǐng)看下例:例中,賦給y的數(shù)值是100,如果x被賦給比9y的值將為200,若用if-else語(yǔ)句改寫,有elsey=200;逗號(hào)操作作為一個(gè)操作符,逗號(hào)把幾個(gè)表達(dá)式串在一起。逗號(hào)操作符的左側(cè)總是作為void(無(wú)值),這行將3賦給y,然后將4賦給x,因?yàn)槎禾?hào)操作符的優(yōu)先級(jí)比賦值操作符優(yōu)先級(jí)低,所以必須使用括號(hào)。實(shí)際上,逗號(hào)表示操作順序。當(dāng)它在賦值語(yǔ)句右邊使用時(shí),所賦的值是逗號(hào)分隔開的表中最后那個(gè)表達(dá)式的值。例如,x的值是5,因?yàn)閥的起始值是10,減去5之后結(jié)果再除以25,得到最終結(jié)果。在某種意義上可以認(rèn)為,逗號(hào)操作符和標(biāo)準(zhǔn)英語(yǔ)的and是同義詞。關(guān)于優(yōu)先級(jí)的小表2-10列出了C語(yǔ)言所有操作符的優(yōu)先級(jí),其中包括將在本書后面討論的某些操作符。注意,所有操作符(除一元操作符和?之外)都是左結(jié)合的。一元操作符(*,&和-)及操作符“?”則為右結(jié)合。表2- C語(yǔ)言操作符的優(yōu)先最高 ()[]!~++(type)*&*/+<<<===(續(xù)&^?=+=-=*=最低 表達(dá)式由運(yùn)算符、常量及變量構(gòu)成。C語(yǔ)言的表達(dá)式基本遵循一般代數(shù)規(guī)則,有幾點(diǎn)卻是表達(dá)式中的類型轉(zhuǎn)混合于同一表達(dá)式中的不同類型常量及變量,應(yīng)均變換為同一類型的量。C語(yǔ)言的編譯程序?qū)⑺胁僮鲾?shù)變換為與最大類型操作數(shù)同類型。變換以一次一操作的方式進(jìn)行。具體規(guī)則如下:charch;inti;floatf;doubled;result=(ch/i)+(f*d)-(f+i); 圖2-1所有char及shortint型量轉(zhuǎn)為int型,所有float轉(zhuǎn)換為double如操作數(shù)對(duì)中一個(gè)為longdoublelongdouble。①要不然,一個(gè)為double,另一個(gè)轉(zhuǎn)為double。②要不然,一個(gè)為long,另一個(gè)轉(zhuǎn)為long。③要不然,一個(gè)為一旦運(yùn)用以上規(guī)則。每一對(duì)操作數(shù)均變?yōu)橥愋?。注意,?guī)則2)圖2-1示出了類型轉(zhuǎn)換。首先,charch轉(zhuǎn)換成int,且floatf轉(zhuǎn)換成double;然后ch/i的結(jié)果轉(zhuǎn)換成double,因?yàn)閒*d是double;最后由于這次兩個(gè)操作數(shù)都是double,所以結(jié)果也是第2章數(shù)據(jù)類型、運(yùn)算符和表達(dá) 構(gòu)成符(type)是標(biāo)準(zhǔn)C語(yǔ)言中的一個(gè)數(shù)據(jù)類型。例如,為確保表達(dá)式x/2float,可寫通常認(rèn)為cast是操作符。作為操作符,cast雖然cast在程序中用得不多,但有時(shí)它的使用的確很有價(jià)值。例如,假設(shè)希望用一整數(shù)控制循環(huán),但在執(zhí)行計(jì)算時(shí)又要有小數(shù)部分。[例2-{intiforprintf("%d/2is}若沒(méi)有cast(float),就僅執(zhí)行一次整數(shù)除;有 空格與括冗余的括號(hào)并不導(dǎo)致錯(cuò)誤或減慢表達(dá)式的執(zhí)行速度。我們鼓勵(lì)使用括號(hào),它可使執(zhí)行順序更清楚一些。例如,下面兩個(gè)表達(dá)式中哪個(gè)更易讀一些呢?C語(yǔ)言中的簡(jiǎn)寫形這組操作符對(duì)+=通知編譯程序?qū)+10的值賦予X。這一簡(jiǎn)寫形式適于Cvariable=variable1operator與variable1operator=expression相同。第3 程序控制語(yǔ)通常的計(jì)算機(jī)程序總是由若干條語(yǔ)句組成,從執(zhí)行方式上看,從第一條語(yǔ)句到最后一條語(yǔ)句完全按順序執(zhí)行,是簡(jiǎn)單的順序結(jié)構(gòu);若在程序執(zhí)行過(guò)程當(dāng)中,根據(jù)用戶的輸入或中間結(jié)果去執(zhí)行若干不同的任務(wù)則為選擇結(jié)構(gòu);如果在程序的某處,需要根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次或直到滿足或不滿足某條件為止,這就構(gòu)成循環(huán)結(jié)構(gòu)。大多數(shù)情況下,程序都不會(huì)是簡(jiǎn)單的順序結(jié)構(gòu),而是順序、選擇、循環(huán)三種結(jié)構(gòu)的復(fù)雜組合。三種基本結(jié)構(gòu)的流程圖、N-S圖以及PAD圖可以參看本書第1章1.4選擇控制語(yǔ)句:if;循環(huán)控制語(yǔ)句:for、while、do?while轉(zhuǎn)移控制語(yǔ)句:break、continue、goto我在程序的運(yùn)行過(guò)程中,往往需要由用戶輸入一些數(shù)據(jù),而程序運(yùn)算所得到的計(jì)算結(jié)果等又需要輸出給用戶,由此實(shí)現(xiàn)人與計(jì)算機(jī)之間的交互,所以在程序設(shè)計(jì)中,輸入輸出語(yǔ)句是一類必不可少的重要語(yǔ)句,在C語(yǔ)言中,沒(méi)有專門的輸入輸出語(yǔ)句,所有的輸入輸出操作都是/O庫(kù)函數(shù)的調(diào)用實(shí)現(xiàn)。最常用的輸入輸出函數(shù)有scanf()、printf()、getchar()和putchar(),以下分別介紹。scanf()函格式化輸入函數(shù)scanf()的功能是從鍵盤上輸入數(shù)據(jù),該輸入數(shù)據(jù)按指定的輸入格式被賦給相應(yīng)的輸入項(xiàng)。函數(shù)一般格式為:scanf("控制字符串",輸入項(xiàng)列表其中控制字符串規(guī)定數(shù)據(jù)的輸入格式,必須用雙引號(hào)括起,其內(nèi)容是由格式說(shuō)明和普通字符兩部分組成。輸入項(xiàng)列表則由一個(gè)或多個(gè)變量地址組成,當(dāng)變量地址有多個(gè)時(shí),各變量scanf()中各變量要加地址操作符,就是變量名前加“&”,這是初學(xué)者容易忽略的一個(gè)問(wèn)%[<修飾符>]<格式字各個(gè)格式字符及其意義見(jiàn)表3-1表3- 格式字 按寬度3輸入一個(gè)整數(shù)賦給變量a可以和d、o、x一起使用,加l表示輸入數(shù)據(jù)為長(zhǎng)整數(shù),加h表示輸入數(shù)據(jù)為短整數(shù),例則x按寬度為10的長(zhǎng)整型讀入,而i執(zhí)行該語(yǔ)句,若輸入為“123”空輸入 scanf("%d后的空格,就可跳過(guò)字符“轉(zhuǎn)義字符\n、第3章程序控制語(yǔ) 輸入 1245對(duì)同樣的輸入,其結(jié)果為a=1,b=2,x=4,y=5,z=6,由于在第一個(gè)scanf可打印字當(dāng)輸入為:1,2,q若輸入為 除a=1正確賦值外,對(duì)b與ch的賦值都將以失敗告終,也就是說(shuō),這些不打印字符應(yīng)是輸scanf在讀入時(shí)自動(dòng)去除與可打印字符相同的字符。[例3-1]試編寫求梯形面積的程序,數(shù)據(jù)由鍵盤輸入。分析:設(shè)梯形上底為A,下底為B,高為H面職為S,則{floatprintf("pleaseinputa,b,h:");printf("a=%5.2fb=%5.2fh=%5.2f",a,b,h);} 與格式化輸入函數(shù)scanf()相對(duì)應(yīng)的是格式化輸出函數(shù)printf(),其功能為按控制字符串規(guī)定的格式,向缺省輸出設(shè)備(一般為顯示器)輸出在輸出項(xiàng)列表中列出的各輸出項(xiàng),其基本printf輸出項(xiàng)可以是常量、變量、表達(dá)式,其類型與個(gè)數(shù)必須與控制字符串中格式字符的類型、個(gè)數(shù)一致、當(dāng)有多個(gè)輸出項(xiàng)時(shí),各項(xiàng)之間用逗號(hào)分隔。%[<修飾符>]<格式字符格式字符規(guī)定了對(duì)應(yīng)輸出項(xiàng)的輸出格式,常用格式字符見(jiàn)表3-2表3- 格式字符 格式字 c按字符 d按十進(jìn)制整數(shù)輸 u按無(wú)符號(hào)整數(shù)輸 f按浮點(diǎn)型小數(shù)輸 按e和f格式中較短的一種輸e按科學(xué)輸修飾符是可選的,用于確定數(shù)據(jù)輸出的寬度、精度、小數(shù)位數(shù)、對(duì)齊方式等,用于產(chǎn)生更規(guī)范整齊的輸出,當(dāng)沒(méi)有修飾符時(shí),以上各項(xiàng)按系統(tǒng)缺省設(shè)定顯示。字段寬度修表3- 修飾 格式說(shuō) M以寬度m輸出整型數(shù),不足m時(shí),左補(bǔ)以寬度m輸出整型數(shù),不足m時(shí),左補(bǔ)%m以寬度m輸出實(shí)型小數(shù),小數(shù)位為n輸出 可以看出,當(dāng)指定場(chǎng)寬小于數(shù)據(jù)的實(shí)際寬度時(shí),對(duì)整數(shù),按該數(shù)的實(shí)際場(chǎng)寬輸出,對(duì)浮12.34567按%5.2f輸出,輸出12.35。若場(chǎng)寬小于等于浮點(diǎn)數(shù)整數(shù)部分的寬度,則該浮點(diǎn)數(shù)按實(shí)際位數(shù)輸出,但小數(shù)位數(shù)仍遵守寬度修飾符給出的值。如上面的12.34567按%2.1f12.3。在實(shí)際應(yīng)用中,還有一種更靈活的場(chǎng)寬控制方法,用常量或變量的值作為輸出場(chǎng)寬,方法是以一個(gè)"*"作為修飾符,插入到%之后。第3章程序控制語(yǔ) 對(duì)齊方式修-”號(hào),則例如:i=123,a=12.34567 4d%10.4f,i,a);輸出為:123 10.4f,i,a); l和可以與輸出格式字符d、f、u等連用,以說(shuō)明是用long型或short%hd %hu普通字符包括可打印字符和轉(zhuǎn)義字符,可打印字符主要是一些說(shuō)明字符,這些字符按原樣顯示在屏幕上,如果有漢字系統(tǒng)支持,也可以輸出漢字。轉(zhuǎn)義字符是不可打印的字符,它們其實(shí)是一些控制字符,控制產(chǎn)生特殊的輸出效果。例如:i=123,n=456,a=12.34567,且in 其中\(zhòng)t為水平制表符,作用是跳到下一個(gè)水平制表位,在各個(gè)機(jī)器中,水平制表位的寬度\t”跳到下一個(gè)8的倍數(shù)的列上。 {intlongintb;shortintc;unsignedintd;chare;floatf;}RUNgetchar()函數(shù)與putchar()函putchar()與getchar()ch為字符型變量,上述語(yǔ)句接收從鍵盤輸入的一個(gè)字符并將它賦給ch 輸入一個(gè)字符,回顯該字符并輸出其ASCII碼值第3章程序控制語(yǔ) {charch;} 需要注意的是,字符輸入輸出函數(shù)定義在頭文件stdio.h中,故當(dāng)程序中使用putchar()或程序應(yīng)用舉 {charch;printf("\t\t\tcomplexsAddition\n");printf("pleaseinputthefirstcomplex:\n"); printf("%5.2f+iprintf("\npleaseinputthesecondcomplex:\n"); virtualpart:");printf("%5.2f+i%5.2f\n",a2,b2);printf("\nTheadditionis:");printf("%6.3f+i%6.3f\n",a1+a2,b1+b2);printf("programnormalterminated,pressenter...");}complexspleaseinputthefirstcomplex1.20+ipleaseinputthesecondcomplex:realpart:5.65.60+iTheadditionis:6.800+iprogramnormalterminated,press在程序的三種基本結(jié)構(gòu)中,第二種即為選擇結(jié)構(gòu),其基本特點(diǎn)是程序的流程由多路分支組成,在程序的一次執(zhí)行過(guò)程中,根據(jù)不同的情況,只有一條支路被選中執(zhí)行,而其他分支上的語(yǔ)句被直接跳過(guò)。C語(yǔ)言中,提供if語(yǔ)句和switch語(yǔ)句選擇結(jié)構(gòu),if語(yǔ)句用于兩者選一的情況,而switch用于if 分析:設(shè)三個(gè)數(shù)為A、B、C,由鍵盤讀入,我們用一個(gè)變量MIN來(lái)標(biāo)識(shí)最小數(shù),A、B、A和BMINC與MIN比較,再將小的一個(gè)賦給MIN,則最后MIN即為A、B、C中最小數(shù)。輸入A、B、C將A與B中小的一個(gè)賦給MIN將MIN與C中小的一個(gè)賦給MIN輸出MIN將第2)步細(xì)化為:若A<B,則MINAMINB;其流程圖見(jiàn)圖3-1。第3)步細(xì)化為:若C<MIN,則MIN<==C;其流程圖見(jiàn)圖3-2。 圖3-1例3-5中第2)步的流程 圖3-2例3-5中第3)步的流程對(duì)應(yīng)圖3-1和圖3-2,正是if語(yǔ)句的兩種基本形式,與圖3-2對(duì)應(yīng)的ifif<表達(dá)式>第3章程序控制語(yǔ) 語(yǔ)句2。無(wú)論如何,語(yǔ)句1與語(yǔ)句2每要注意的是:if或if...else,包括后面要講到的嵌套if,即if...elseif.被看成是一條語(yǔ)句,下面是例3-5{intprintf("inputa,b,cif(a<b)min=a;min=b;min=c;printf("Theresultis}inputa,b,c:352Theresultis:這里順便提一下程序書寫的縮排問(wèn)題,所謂縮排,就是下一行與上一行相比,行首向右縮進(jìn)若字符,如上例的min=a、min=b等。適當(dāng)?shù)目s排能使程序的結(jié)構(gòu)、層次清晰、一目了然,增加程序的易讀性。應(yīng)該從一開始就養(yǎng)成一個(gè)比較好的書寫習(xí)慣,包括必要的注釋、適當(dāng)?shù)目招幸约翱s排。{語(yǔ)句語(yǔ)句}[例3-6]讀入兩個(gè)數(shù)x、y,將大數(shù)存入x,小數(shù)存入yx、y從鍵盤讀入,若x>=y,只需順序打出,否則,應(yīng)將x,yt,讀入x、大數(shù)存入x,小數(shù)存入x與y交換;①t<==②x<==③y<==算法的流程圖見(jiàn)圖3-3#include<stdio.h>{

開輸入真圖3-3例3-6floatx,y,t;if(x<y){}printf}inputx,y:43.256.7result:56.700 if...elseif實(shí)際應(yīng)用中常常面對(duì)的選擇,這時(shí),將if...else擴(kuò)展一下,就得到if...elseif結(jié)構(gòu),其if表達(dá)式elseif<表達(dá)式語(yǔ)句elseif表達(dá)式對(duì)應(yīng)的流程圖見(jiàn)圖3-4第3章程序控制語(yǔ) 假表達(dá)式假表達(dá)式 表達(dá)式真語(yǔ)句語(yǔ)語(yǔ)句語(yǔ)句語(yǔ)句語(yǔ)句圖3-4if...elseif語(yǔ)句的流[例3-7] 貨物征稅問(wèn)題,價(jià)格在1萬(wàn)元以上的征5%,5000元以上1萬(wàn)元以下的征3%, 以下的征%,1000元以下的免稅,讀入貨物價(jià)格,計(jì)算并輸出稅金。分析:讀入prc,計(jì)算t,這是一個(gè)較復(fù)雜的分支結(jié)構(gòu)程序設(shè)計(jì)(應(yīng)注意避免重復(fù)征稅)。算法:若則tax=0.05*(price-10000);否則,若則tax=0.03*(price-5000)+tax;否則,若則tax=0.02*(price-1000)+tax;#include<stdio.h>{floatprice,tax=0;{tax=0.05*(price-10000)+tax;}if{}{}printf("thetax=%10.3}the在一個(gè)if語(yǔ)句中可以又出現(xiàn)另一個(gè)if語(yǔ)句,這稱為if語(yǔ)句的嵌套或多重ifif<表達(dá)式1>語(yǔ)句[例3-8]1y=0-1流程圖見(jiàn)圖3-5輸入 真 y=y=-y圖3-5例3-8{floatx,y;printf("inputx,y:");if(x>=0)第3章程序控制語(yǔ)

}對(duì)多重if,最容易犯的錯(cuò)誤是if與else配對(duì)錯(cuò)誤,if(x>=0)

真真

y=-

圖3-6從縮排上可以看出,作者希望else是與ifx>=0配對(duì),但是C語(yǔ)言規(guī)定else總是與離它最近的上一個(gè)if配對(duì),結(jié)果,上述算法的流程圖變成圖3-6,完全違背了設(shè)計(jì)者的初衷。{}switchif語(yǔ)句只能處理從兩者間選擇之一,當(dāng)要實(shí)現(xiàn)幾種可能之一時(shí),就要用if...elseif甚至多重的嵌套if來(lái)實(shí)現(xiàn),當(dāng)分支較多時(shí),程序變得復(fù)雜冗長(zhǎng),可讀性降低。C語(yǔ)言提供了switch開case常量表達(dá)式n語(yǔ)句default:語(yǔ)句其中常量表達(dá)式的值必須是整型,字符型或者枚舉類型,各語(yǔ)句序列允許有多條語(yǔ)句,不需要按復(fù)合語(yǔ)句處理,若語(yǔ)句序列i為空,則對(duì)應(yīng)的break語(yǔ)句可去掉。圖3-7是switch語(yǔ)句的switch{casecasecase3:語(yǔ)句casecase5:語(yǔ)句}語(yǔ)句序列語(yǔ)句序列語(yǔ)句序列語(yǔ)句序列=常量表達(dá)式語(yǔ)句序列量語(yǔ)句序列語(yǔ)句序列語(yǔ)句序列語(yǔ)句序列語(yǔ)句序列圖3-7switch當(dāng)整型變量i的值為1、2或3時(shí),執(zhí)行語(yǔ)句1,當(dāng)i的值為4或5時(shí),執(zhí)行語(yǔ)句2,否則,執(zhí)行[例3-9]輸入月份,打印1999年該月有幾天。{intday;第3章程序控制語(yǔ) printf("pleaseinputthemonthnumber:");switch{casecasecasecasecasecasecase12:casecasecasecasecase2:day=28;default:day=-1;}ifday=-printf("Invalidmonthinputprintf("1999.%dhas%ddays}程序應(yīng)用舉[例3-10]解一元二次方程ax2+bx+c=0,a、b、c由鍵盤輸入。若b<>0,則x=-c/b若①b2-4ac>0②b2-4ac=0用嵌套的if#include<math.h>#include<stdio.h>{doublet;printf("pleaseinputa,b,c:");if(a==0.0)printf("therootis:%f\n",-c/b);elseif(c==0.0)printf("xisinexactive\n");printf("no{{printf("Therearetwodifferentroots:%f}printf("Therearetwoequalroots:%f\n",-{ 虛部的絕對(duì)值*/printf("Therearetwovirtualroots:"); }}}pleaseinputa,b,c:123Therearetwovirtualroots:-1.000000+i1.000000-1.000000-ipleaseinputa,b,c:25Therearetwodifferentroots:-1.500000and-1.000000RNUpleaseinputa,b,c:003Noroot!循環(huán)控制結(jié)構(gòu)(

溫馨提示

  • 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)論