版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C及C++程序設(shè)計(jì)第1章對(duì)C語(yǔ)言的初步認(rèn)識(shí)
1.1程序與程序設(shè)計(jì)語(yǔ)言
1.1.1程序、程序設(shè)計(jì)和程序設(shè)計(jì)語(yǔ)言
一般來(lái)說(shuō),程序是對(duì)解決或處理一個(gè)問(wèn)題的方法步驟的描述。而計(jì)算機(jī)程序,則是用某種計(jì)算機(jī)能識(shí)別的語(yǔ)言工具所描述的解決問(wèn)題的方法步驟。例如,有兩個(gè)數(shù)據(jù)a和b,它們的值分別為1和2,求這兩個(gè)量的和c。 編制并記錄解決問(wèn)題的方法步驟的過(guò)程就是程序設(shè)計(jì)。在計(jì)算機(jī)技術(shù)中,將解決一個(gè)問(wèn)題的方法和步驟叫做算法。進(jìn)行程序設(shè)計(jì)時(shí)要使用計(jì)算機(jī)能識(shí)別的描述算法的工具,這個(gè)工具就是計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。1.1.2結(jié)構(gòu)化程序設(shè)計(jì)方法
計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言經(jīng)歷了由機(jī)器語(yǔ)言、匯編語(yǔ)言到高級(jí)語(yǔ)言的發(fā)展過(guò)程。這些語(yǔ)言的特點(diǎn)是以簡(jiǎn)單的語(yǔ)句序列構(gòu)成程序。在20世紀(jì)60年代末開(kāi)始提出結(jié)構(gòu)化程序設(shè)計(jì)的概念,也就是將程序由語(yǔ)句序列結(jié)構(gòu)轉(zhuǎn)變?yōu)槟K集合。
結(jié)構(gòu)化程序設(shè)計(jì)方法的基本思想是,將任何復(fù)雜問(wèn)題分解為若干較為簡(jiǎn)單的功能模塊,每個(gè)模塊中的任何邏輯問(wèn)題再用少數(shù)幾種基本結(jié)構(gòu)(如順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu))加以描述。結(jié)構(gòu)化程序設(shè)計(jì)中采用的三種基本結(jié)構(gòu)如圖1.1所示,所有的程序代碼都實(shí)現(xiàn)在這三種結(jié)構(gòu)中。圖1.1結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)
進(jìn)入20世紀(jì)80年代后,為了適應(yīng)龐大而復(fù)雜程序的開(kāi)發(fā),出現(xiàn)了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法和語(yǔ)言。然而它也吸收和繼承了結(jié)構(gòu)化程序設(shè)計(jì)的方法。1.2C語(yǔ)言及C語(yǔ)言源程序的基本結(jié)構(gòu)
1.2.1C語(yǔ)言 C語(yǔ)言是一種編譯方式的結(jié)構(gòu)化高級(jí)程序設(shè)計(jì)語(yǔ)言。C語(yǔ)言主要有下列一些特點(diǎn)。(1)C語(yǔ)言是一種結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言,它具有完整的程序控制語(yǔ)句。(2)C語(yǔ)言是一種模塊化程序設(shè)計(jì)語(yǔ)言,函數(shù)是組成程序的基本程序單位。
(3)C語(yǔ)言有豐富的數(shù)據(jù)類(lèi)型和運(yùn)算操作,使程序設(shè)計(jì)更為簡(jiǎn)單和方便。(4)C語(yǔ)言提供了類(lèi)似于匯編語(yǔ)言的低級(jí)語(yǔ)言動(dòng)能,如直接訪問(wèn)內(nèi)存的物理地址,對(duì)二進(jìn)制數(shù)進(jìn)行位操作等。(5)語(yǔ)法結(jié)構(gòu)簡(jiǎn)單,語(yǔ)句數(shù)目不多,但功能很強(qiáng)。所以,C語(yǔ)言簡(jiǎn)單易學(xué)且應(yīng)用廣泛。
1.2.2C語(yǔ)言源程序的基本結(jié)構(gòu)
C語(yǔ)言源程序,簡(jiǎn)稱C程序,是建立在模塊的基礎(chǔ)上的,而基本的模塊就是函數(shù)。因此,一個(gè)C程序是由一個(gè)或多個(gè)函數(shù)組成的。每個(gè)函數(shù)是完成一定功能的一段C語(yǔ)言程序。編寫(xiě)一個(gè)程序,首先是建立一個(gè)或若干個(gè)函數(shù),然后把它們組織在一起,構(gòu)成一個(gè)完整的C語(yǔ)言程序。在這些函數(shù)中必須有且只能有的一個(gè)函數(shù)就是main()函數(shù),稱為主函數(shù)。一個(gè)程序無(wú)論包含多少個(gè)函數(shù),程序的運(yùn)行總是從主函數(shù)開(kāi)始,在主函數(shù)結(jié)束。在C語(yǔ)言中,除了main()函數(shù)外,其他函數(shù)的函數(shù)名是用戶選定的,稱為自定義函數(shù)。自定義函數(shù)不能像main()函數(shù)那樣能獨(dú)立運(yùn)行,它們只能由主函數(shù)或其他函數(shù)激活(它也能激活其他函數(shù)),并開(kāi)始運(yùn)行。這里發(fā)生了兩個(gè)過(guò)程:調(diào)用和返回。可見(jiàn),函數(shù)之間是互相調(diào)用和返回的關(guān)系。自定義函數(shù)可以互相調(diào)用,但不能調(diào)用主函數(shù)。
在最簡(jiǎn)單的情況下,C函數(shù)有如下的格式:
函數(shù)名(){函數(shù)體}
例1.2.1一個(gè)最簡(jiǎn)單的C語(yǔ)言源程序。程序由如下一個(gè)主函數(shù)組成:main(){}因?yàn)楹瘮?shù)體不包含任何語(yǔ)句,所以該程序不執(zhí)行任何功能,稱它是空操作。例1.2.2給例1.2.1的程序加入一個(gè)功能:在顯示器上輸出:hello!。程序如下:
main(){printf("hello!");}
主函數(shù)的函數(shù)體由一個(gè)語(yǔ)句組成。C語(yǔ)言規(guī)定每個(gè)語(yǔ)句必須以分號(hào)結(jié)束。分號(hào)表示一個(gè)語(yǔ)句的結(jié)束。語(yǔ)句
printf("hello!");
hello!是一個(gè)輸出語(yǔ)句。在這里它的功能是在顯示器的屏幕上顯示如下的字符串:
hello!
例1.2.3由兩個(gè)函數(shù)組成的C程序。功能仍然是在顯示器上輸出:hello!。主函數(shù)main()調(diào)用另一個(gè)名為hello()的自定義函數(shù)。hello()函數(shù)的功能是在顯示器的屏幕上顯示字符串:"hello!"。下面是源程序清單:
main(){hello();}hello(){printf("hello!");}程序運(yùn)行后,在顯示器的屏幕上顯示如下的字符串:
hello!主函數(shù)的函數(shù)體是C語(yǔ)言中的一個(gè)語(yǔ)句:
hello();它的功能是調(diào)用函數(shù)hello()。執(zhí)行調(diào)用的結(jié)果,使程序從主函數(shù)轉(zhuǎn)去執(zhí)行hello()函數(shù)。函數(shù)hello()的函數(shù)體是由一個(gè)C語(yǔ)句組成:
printf("hello!");
我們已經(jīng)知道這個(gè)語(yǔ)句的功能是在顯示器的屏幕上顯示hello!。該語(yǔ)句執(zhí)行完畢后,返回主函數(shù)。由于主函數(shù)的所有語(yǔ)句已經(jīng)執(zhí)行完畢,于是程序結(jié)束運(yùn)行。程序的執(zhí)行從主函數(shù)開(kāi)始,在主函數(shù)結(jié)束。從以上的討論,可以總結(jié)出以下幾點(diǎn)。(1)C程序是由一個(gè)或多個(gè)函數(shù)組成的,其中必須有一個(gè)也只能有一個(gè)規(guī)定名為main的主函數(shù)。(2)程序的執(zhí)行總是從主函數(shù)開(kāi)始,在主函數(shù)結(jié)束。其他函數(shù)是通過(guò)調(diào)用來(lái)執(zhí)行的。(3)主函數(shù)可以調(diào)用任何非主函數(shù),非主函數(shù)之間可以互相調(diào)用,但不能調(diào)用主函數(shù)。(4)函數(shù)體是完成函數(shù)功能的一組C語(yǔ)言的語(yǔ)句,每個(gè)語(yǔ)句完成一個(gè)小功能,并以分號(hào)作為一個(gè)語(yǔ)句的結(jié)束標(biāo)志。1.2.3C語(yǔ)言的基本語(yǔ)句
C語(yǔ)言的基本語(yǔ)句主要有以下幾種:
(1)數(shù)據(jù)定義語(yǔ)句;(2)賦值語(yǔ)句;(3)函數(shù)調(diào)用語(yǔ)句和返回語(yǔ)句;(4)輸入語(yǔ)句和輸出語(yǔ)句;(5)流程控制語(yǔ)句。1.3C語(yǔ)言的基本詞法
構(gòu)成C語(yǔ)言的最小單位是字符,由字符可以構(gòu)成詞類(lèi),再由詞構(gòu)成各種語(yǔ)句。有關(guān)C語(yǔ)言的字符和詞類(lèi)的規(guī)定,就形成了C語(yǔ)言的詞法。這一節(jié)介紹詞法方面的有關(guān)規(guī)定。
1.3.1C語(yǔ)言的字符集在C語(yǔ)言程序中允許使用的所有基本字符的集合,稱為C語(yǔ)言的字符集。C語(yǔ)言的字符集采用的是ASCII(AmericanStandardCodeforInformationInterchange)字符集。
1.3.2標(biāo)識(shí)符
用C字符集中的字符組合,可以為程序中的各種對(duì)象起名字。這些名字統(tǒng)稱為標(biāo)識(shí)符。例如常量名,變量名,函數(shù)名等都是標(biāo)識(shí)符。1.3.3保留字保留字又稱關(guān)鍵字,是C語(yǔ)言編譯系統(tǒng)使用的、具有特定語(yǔ)法意義的一些標(biāo)識(shí)符。這些標(biāo)識(shí)符用戶不能作為自己的標(biāo)識(shí)符使用。
1.3.4C語(yǔ)言的詞類(lèi)C語(yǔ)言的詞類(lèi)主要有以下幾種。(1)常量:(2)變量:(3)運(yùn)算符:(4)表達(dá)式:(5)保留字:
1.4源程序的編譯和C語(yǔ)言的集成開(kāi)發(fā)環(huán)境
1.4.1C程序的開(kāi)發(fā)過(guò)程
開(kāi)發(fā)一個(gè)C語(yǔ)言程序,要經(jīng)過(guò)以下四個(gè)階段:(1)編輯源程序文件;(2)編譯源程序;(3)程序連接;(4)運(yùn)行程序。1.4.2C語(yǔ)言的集成開(kāi)發(fā)環(huán)境
為完成上述的程序開(kāi)發(fā)過(guò)程,C語(yǔ)言系統(tǒng)提供兩種獨(dú)立的操作方式。一種是傳統(tǒng)的命令行方式。
2.1數(shù)據(jù)類(lèi)型在C語(yǔ)言中,數(shù)據(jù)的類(lèi)型分為基本數(shù)據(jù)類(lèi)型、構(gòu)造類(lèi)型、指針類(lèi)型和空值類(lèi)型。對(duì)于每一種數(shù)據(jù)類(lèi)型的數(shù)據(jù),又有分成幾種不同類(lèi)型,如圖2.1所示。各種類(lèi)型數(shù)據(jù)又可分為常量和變量。圖2.1C語(yǔ)言的數(shù)據(jù)類(lèi)型2.2.1整型常量在C語(yǔ)言中使用三種不同進(jìn)位制的整型常量,它們是:(1)十進(jìn)制數(shù):(2)八進(jìn)制數(shù):(3)十六進(jìn)制數(shù):2.2整型數(shù)據(jù)整型常量在微機(jī)上一般占用兩個(gè)字節(jié)的長(zhǎng)度。為了擴(kuò)大整型數(shù)據(jù)的取值范圍,C語(yǔ)言還提供了一種長(zhǎng)整型常量。長(zhǎng)整型常量在計(jì)算機(jī)中占用4個(gè)字節(jié)。
2.2.2整型變量整型變量在計(jì)算機(jī)中占兩個(gè)字節(jié)。用以說(shuō)明整型變量的關(guān)鍵字(也稱為數(shù)據(jù)類(lèi)型符)為int。定義變量數(shù)據(jù)類(lèi)型語(yǔ)句的一般格式為: 數(shù)據(jù)類(lèi)型符變量名1,變量名2,……;C語(yǔ)言規(guī)定,每個(gè)變量在使用前,都必須先定義。 在關(guān)鍵字int前加上修飾符,可改變整型變量的所占位數(shù)和取值范圍。下列4種修飾符可以用來(lái)修飾整型變量: (1)signed (2)unsigned (3)long (4)short 實(shí)型數(shù)據(jù)也稱做浮點(diǎn)數(shù),是一種帶小數(shù)點(diǎn)的數(shù)。2.3實(shí)型數(shù)據(jù)2.3.1實(shí)型常量實(shí)型常量就是帶小數(shù)點(diǎn)的10進(jìn)制常數(shù)。在C語(yǔ)言中實(shí)型數(shù)據(jù)有兩種表達(dá)(書(shū)寫(xiě))方式:一種是用數(shù)字和小數(shù)點(diǎn)表示的,如123.456等;另一種是用指數(shù)方式表示的,如1.2e+2或1.2E+2(表示的是1.2×102)。
2.3.2實(shí)型變量實(shí)型變量用來(lái)存儲(chǔ)實(shí)型數(shù)據(jù)。實(shí)型變量分為如下兩種。(1)單精度實(shí)型變量或簡(jiǎn)稱實(shí)型變量或浮點(diǎn)型變量,其類(lèi)型標(biāo)識(shí)符為float;(2)雙精度實(shí)型變量或稱雙精度浮點(diǎn)型變量,其類(lèi)型標(biāo)識(shí)符為double。2.4.1字符型常量C語(yǔ)言的字符型常量是用單引號(hào)括起來(lái)的單個(gè)字符,如“a”,“B”,“*”等都是字符型常量。2.4字符型數(shù)據(jù)與字符串
在C語(yǔ)言中支持一類(lèi)特殊字符,它們以反斜杠“\”開(kāi)頭,稱為反斜杠字符常量,或稱轉(zhuǎn)義字符。它們都可以看作為字符常量。2.4.2字符型變量字符型變量是C語(yǔ)言的一種數(shù)據(jù)類(lèi)型,用關(guān)鍵字(類(lèi)型符)char說(shuō)明,用于存儲(chǔ)字符常量或數(shù)值。一個(gè)字符型變量只能存儲(chǔ)一個(gè)字符,它是以該字符的ASCII碼值存儲(chǔ)的,并占一個(gè)字節(jié)的寬度。例如,字母a的ASCII碼是97,在變量的內(nèi)存中存儲(chǔ)的就是97。2.4.3字符串常量字符串常量簡(jiǎn)稱字符串。字符串不是一種數(shù)據(jù)類(lèi)型,它是用雙引號(hào)擴(kuò)起來(lái)的一串字符。例如:
"abc123","4","AaBb","a"
如果字符串中含有轉(zhuǎn)義字符,則每個(gè)轉(zhuǎn)義字符當(dāng)作一個(gè)字符看待。例如,字符串
\\ab\\\'AB\'\141\142表示的是下列字符:
\ab\'AB'ab
每個(gè)字符在內(nèi)存占一個(gè)字節(jié)的空間。但每個(gè)字符串在內(nèi)存中占用的實(shí)際字節(jié)數(shù)等于字符串的長(zhǎng)度加一。因?yàn)樵诿總€(gè)字符串的最后都存放一個(gè)“空字符”,其ASCII碼值為0,它的轉(zhuǎn)義字符是“\0”。它起著字符串結(jié)束標(biāo)記的作用。2.5變量說(shuō)明與初始化
2.5.1變量說(shuō)明(定義)在C程序中,變量在引用前,必須先進(jìn)行說(shuō)明,C語(yǔ)言的編譯系統(tǒng)將根據(jù)變量說(shuō)明,給變量分配相應(yīng)的存儲(chǔ)空間。變量說(shuō)明語(yǔ)句的一般格式是:
數(shù)據(jù)類(lèi)型變量名列表;例如,下面是一些變量說(shuō)明(定義)語(yǔ)句:
intm,n,k;unsignedintum;doubled1,d2;charch;floatf;2.5.2變量的初始化在對(duì)變量進(jìn)行定義的同時(shí)給變量賦值稱為變量的初始化。變量初始化的一般格式如下:變量類(lèi)型變量名1=常量1,變量名2=常量2,……;
變量的初始化是在程序運(yùn)行到該變量所在的函數(shù)時(shí)進(jìn)行的。變量初始化:
floatfnum=12.12;
實(shí)際上相當(dāng)于執(zhí)行下面的兩條語(yǔ)句:
floatfnum;fnum=12.12;一般情況下,如果變量在程序中沒(méi)有初始化,則在賦值之前,它的值是不確定的,因此,程序中在引用某變量之前,該變量應(yīng)該初始化或賦值。以后我們還會(huì)介紹,在某些情況下,沒(méi)有初始化的變量的初始值可以是確定的。2.6.1運(yùn)算符
運(yùn)算符也稱操作符,是一種表示對(duì)數(shù)據(jù)進(jìn)行何種運(yùn)算處理的符號(hào)。運(yùn)算的對(duì)象(數(shù)據(jù))稱為操作數(shù)。每個(gè)運(yùn)算符代表某種運(yùn)算功能,每種運(yùn)算功能有自己的運(yùn)算規(guī)則,如運(yùn)算的優(yōu)先級(jí)、結(jié)合性、運(yùn)算對(duì)象類(lèi)型和個(gè)數(shù),以及運(yùn)算結(jié)果的數(shù)據(jù)類(lèi)型都有明確的規(guī)定。2.6運(yùn)算符和表達(dá)式
C語(yǔ)言的基本運(yùn)算符有以下幾大類(lèi):算術(shù)運(yùn)算符;邏輯運(yùn)算符;關(guān)系運(yùn)算符;位運(yùn)算符;賦值運(yùn)算符;條件運(yùn)算符;逗號(hào)運(yùn)算符;數(shù)據(jù)長(zhǎng)度運(yùn)算符。除了這些基本運(yùn)算符外,還有一些專(zhuān)門(mén)用途的運(yùn)算符,如:指針運(yùn)算符;改變優(yōu)先級(jí)運(yùn)算符;成員運(yùn)算符;下標(biāo)運(yùn)算符;其他。2.6.2表達(dá)式用運(yùn)算符把運(yùn)算對(duì)象連接起來(lái)所組成的運(yùn)算式,在C語(yǔ)言中叫做表達(dá)式。對(duì)表達(dá)式進(jìn)行運(yùn)算所得到的結(jié)果,稱為表達(dá)式的值。表2.6.1給出了C語(yǔ)言的各種運(yùn)算符、名稱、優(yōu)先級(jí)和結(jié)合性。
優(yōu)先級(jí)運(yùn)算符運(yùn)算符名稱結(jié)合性1()[]->.圓括號(hào)數(shù)組下標(biāo)運(yùn)算符指向結(jié)構(gòu)指針成員運(yùn)算符取結(jié)構(gòu)成員->(自左向右)2!~++??-*&sizeof邏輯非反碼(按位取反)加一(自加)減一(自減)取負(fù)取地址的內(nèi)容(指針運(yùn)算)取地址取字節(jié)數(shù)<-(自右向左)表2.6.13*/%乘運(yùn)算除運(yùn)算模運(yùn)算
->4+-加運(yùn)算減運(yùn)算->
5<<>>左移右移->6<<=>>=小于小于等于大于大于等于
->優(yōu)先級(jí)運(yùn)算符運(yùn)算符名稱結(jié)合性7==!=等于不等于->8&按位邏輯與->9^按位邏輯加(異或)->10|按位邏輯或->11&&邏輯與->12||邏輯或->續(xù)表13?:條件運(yùn)算<-14=+=?=*=/=%=>>=<<=&=^=|=賦值運(yùn)算自反賦值(復(fù)合賦值)<-15,逗號(hào)運(yùn)算(順序求值)->表達(dá)式的值的數(shù)據(jù)類(lèi)型,因運(yùn)算對(duì)象的不同而不同。歸納起來(lái)可分為整型、實(shí)型和邏輯型。邏輯型數(shù)據(jù)是只有兩個(gè)可能值的數(shù)據(jù),這兩個(gè)值是:真和假。在C語(yǔ)言中,真用數(shù)字1表示,假用數(shù)字0表示。因此,邏輯值也可以按整型數(shù)看待。
從構(gòu)成表達(dá)式的運(yùn)算符來(lái)看,可以把表達(dá)式分成以下幾種。(1)算術(shù)表達(dá)式:(2)關(guān)系表達(dá)式:(3)邏輯表達(dá)式:(4)條件表達(dá)式:(5)賦值表達(dá)式:(6)逗號(hào)表達(dá)式:
3.1.1算術(shù)運(yùn)算符與算術(shù)表達(dá)式表3.1.1給出了C語(yǔ)言中算術(shù)運(yùn)算符及其運(yùn)算功能。3.1算術(shù)運(yùn)算符和賦值運(yùn)算符表3.1.1運(yùn)算符名稱作用優(yōu)先級(jí)結(jié)合性--減1減一運(yùn)算2<-(從右向左)++加1加一運(yùn)算-取負(fù)取負(fù)值*乘乘法3->(從左向右)/除除法%模整除取余(模運(yùn)算)+加加法4->-減減法模運(yùn)算的運(yùn)算對(duì)象(操作數(shù))和運(yùn)算結(jié)果是整型。模運(yùn)算符“%”是計(jì)算兩個(gè)整數(shù)進(jìn)行整除后的余數(shù)。運(yùn)算結(jié)果的符號(hào)與被除數(shù)相同。對(duì)于除法運(yùn)算,需要強(qiáng)調(diào)的是,兩個(gè)整型數(shù)相除時(shí),結(jié)果為整數(shù),小數(shù)部分丟失。加1運(yùn)算和減1運(yùn)算是對(duì)變量進(jìn)行算術(shù)運(yùn)算的。變量可以是整型、字符型、指針型和數(shù)組元素。運(yùn)算結(jié)果仍為原數(shù)據(jù)類(lèi)型,并存回原運(yùn)算對(duì)象(變量)。在使用加1和減1運(yùn)算符時(shí),運(yùn)算符可以放在運(yùn)算對(duì)象的前面,稱為前綴,也可以放在運(yùn)算對(duì)象的后面,稱為后綴。
例如:
x++;++x;其運(yùn)算功能都是:
x=x+1;當(dāng)加1運(yùn)算和減1運(yùn)算出現(xiàn)在表達(dá)式中時(shí),前綴和后綴的功能是不同的。在前綴的情況下,其運(yùn)算規(guī)則是:先對(duì)運(yùn)算對(duì)象(變量)進(jìn)行加1運(yùn)算或減1運(yùn)算;然后,使用加1或減1后的運(yùn)算值參加表達(dá)式的運(yùn)算。在后綴的情況下,其運(yùn)算規(guī)則是:先取運(yùn)算對(duì)象(變量)的值參加表達(dá)式的運(yùn)算,然后進(jìn)行加1運(yùn)算或減1運(yùn)算并存入變量。3.1.2賦值運(yùn)算符與賦值表達(dá)式
C語(yǔ)言中的賦值運(yùn)算符可分為兩類(lèi):賦值運(yùn)算符和自反賦值運(yùn)算符(或稱復(fù)合賦值運(yùn)算符)。賦值運(yùn)算符為“=”。賦值運(yùn)算符號(hào)的作用是:將賦值運(yùn)算符右邊表達(dá)式的值賦予賦值運(yùn)算符左邊的變量。例如:將表達(dá)式:
a+2-b*c/6+c%3的值賦給變量b,則應(yīng)該這樣使用賦值運(yùn)算符:
b=a+2-b*c/6+c%3用賦值運(yùn)算符組成的表達(dá)式叫做賦值表達(dá)式。賦值表達(dá)式的一般形式為:
變量=表達(dá)式
賦值表達(dá)式的值等于賦值運(yùn)算符左邊變量的值,也就是右邊表達(dá)式的值。
賦值運(yùn)算符的結(jié)合性是自右向左的,表達(dá)式:
a=b=c=43.1.3自反賦值運(yùn)算符
自反賦值運(yùn)算符也稱為復(fù)合賦值運(yùn)算符,它是在賦值運(yùn)算符前加上某個(gè)其他運(yùn)算符構(gòu)成的運(yùn)算符。自反賦值運(yùn)算賦共有10個(gè):與算術(shù)運(yùn)算符有關(guān)的有5個(gè),與位運(yùn)算符有關(guān)的有5個(gè)。下面先介紹算術(shù)自反賦值運(yùn)算符,它們是:+=?=*=/=%=
上述運(yùn)算符的運(yùn)用可寫(xiě)成如下的一般形式:
變量OP=表達(dá)式
例如:
a+=8等效于運(yùn)算a=a+(8)3.2.1賦值語(yǔ)句計(jì)算機(jī)程序?qū)嵸|(zhì)上是由語(yǔ)句的序列構(gòu)成的,賦值語(yǔ)句主要用來(lái)完成數(shù)據(jù)的加工處理任務(wù)。賦值語(yǔ)句有如下兩種格式:
變量=表達(dá)式;變量OP=表達(dá)式;
3.2賦值語(yǔ)句和注釋語(yǔ)句所有C語(yǔ)句都是以分號(hào)結(jié)束的。對(duì)于第一種格式的賦值語(yǔ)句,其功能是:計(jì)算表達(dá)式的值,然后賦予變量。對(duì)于第二種格式的賦值語(yǔ)句,其功能是:將變量和表達(dá)式進(jìn)行指定的運(yùn)算后,將獲得的值賦予變量。3.2.2注釋語(yǔ)句
注釋語(yǔ)句只是為程序加的注解或說(shuō)明文字,對(duì)程序的編譯和執(zhí)行不產(chǎn)生任何影響。注釋語(yǔ)句的格式是:
/*注釋/字符集合*/
或
/*注釋字符集合注釋字符集合*/系統(tǒng)函數(shù)很多,也稱為系統(tǒng)庫(kù)函數(shù)。這些庫(kù)函數(shù)分別定義在擴(kuò)展名為“h”的各個(gè)系統(tǒng)文件中,這些文件稱為頭文件。要在程序中使用某個(gè)系統(tǒng)函數(shù),用戶必須在程序的開(kāi)頭寫(xiě)出如下的包含命令:3.3輸入輸出語(yǔ)句
#include"頭文件名.h"
或
#include"<頭文件名.h>"本節(jié)介紹4個(gè)用于輸入和輸出的系統(tǒng)庫(kù)函數(shù),它們是函數(shù)putchar()、getchar()、printf()和scanf()。這些函數(shù)的定義包含在頭文件“stdio.h”中。如果編程時(shí)要使用上述的輸入輸出函數(shù),應(yīng)先將該頭文件,用包含命令寫(xiě)在本程序的開(kāi)頭:
#include"stdio.h"3.3.1字符輸出函數(shù)putchar()
字符輸出函數(shù)的調(diào)用格式為:
putchar(ch);其中的ch是一整型或字符型函數(shù)參數(shù),它可以是變量,也可以是常量。函數(shù)的功能,是將參數(shù)ch的值,按ASCII碼所對(duì)應(yīng)的字符輸出到標(biāo)準(zhǔn)輸出設(shè)備(顯示器)當(dāng)前光標(biāo)位置。函數(shù)的返回值是對(duì)應(yīng)ch的字符。3.3.2字符輸入函數(shù)getchar()字符輸入函數(shù)的調(diào)用格式為:
getchanr();
它的功能是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))上接收一個(gè)字符。此函數(shù)沒(méi)有參數(shù)。它的返回值就是讀取的字符,因此,可以用一個(gè)整型或字符型變量來(lái)接收函數(shù)的返回值。例如,有字符型變量ch,則語(yǔ)句:
ch=gechar();
接收輸入的字符并存儲(chǔ)到變量ch中。 用戶從鍵盤(pán)輸入數(shù)據(jù)時(shí),數(shù)據(jù)被送入內(nèi)存中專(zhuān)門(mén)開(kāi)辟的緩沖區(qū)。當(dāng)程序執(zhí)行上面的輸入語(yǔ)句時(shí),輸入函數(shù)從緩沖區(qū)讀區(qū)數(shù)據(jù)。當(dāng)緩沖區(qū)空時(shí),等待用戶輸入。用戶輸入數(shù)據(jù)并按回車(chē)鍵后,數(shù)據(jù)被送入緩沖區(qū)。例3.3.1putchar()函數(shù)和getchar()函數(shù)的簡(jiǎn)單應(yīng)用程序。
#include<stdio.h> /*包含命令*/
main()/*主函數(shù)*/{
inta; /*定義整型變量a*/charb; /*定義字符型變量b*/
a=getchar();/*鍵盤(pán)輸入字符并存入變量a*/b=getchar();/*鍵盤(pán)輸入字符并存入變量b*/
putchar(a);/*輸出變量a*/putchar('\n');/*輸出變量回車(chē)換行*/
putchar(b);/*輸出變量b*/putchar(getchar());/*輸出從鍵盤(pán)輸入的字符*/}程序的第一行,是包含命令,它包含了為使用輸入輸出函數(shù)所需要的頭文件。程序只由一個(gè)函數(shù)組成,這個(gè)函數(shù)就是main()函數(shù)。函數(shù)體由若干語(yǔ)句組成。第一部分是兩個(gè)變量定義語(yǔ)句,接下來(lái)是兩個(gè)輸入語(yǔ)句,接受鍵盤(pán)的輸入。最后是4個(gè)輸出語(yǔ)句。語(yǔ)句“putchar('\n');”是輸出一個(gè)回車(chē)換行,這里使用了轉(zhuǎn)義字符'\n'。使后面的輸出從下一行開(kāi)始。語(yǔ)句
putchar(getchar());
中輸出函數(shù)的參數(shù)是字符輸入函數(shù),也就是以接受的字符作為輸出函數(shù)的參數(shù)。因此,此語(yǔ)句的作用是輸出接受到的字符。如果運(yùn)行程序時(shí),從鍵盤(pán)輸入3個(gè)字符“ABC”,則程序的輸出應(yīng)為:
ABC3.3.3格式輸出函數(shù)printf()
格式輸出函數(shù)printf()的調(diào)用格式為:
printf(輸出格式字符串,輸出表達(dá)式列表);輸出函數(shù)printf()的功能是,以自右向左的順序,依次計(jì)算輸出列表中各表達(dá)式的值,并按格式字符規(guī)定的輸出格式,將數(shù)據(jù)按輸出表達(dá)式列表的順序(自左到右)輸出到標(biāo)準(zhǔn)設(shè)備(顯示器)上。
例3.3.2
分析下面程序的輸出。#include<stdio.h>main(){inta;floatb;doubled=12687.3251956;a=1234;b=12687.3251956;printf("1:%d\n",a);printf("2:%10d\n",a);printf("3:%f\n",b);printf("4:%015.4f\n",b);printf("5:%e\n",b);printf("6:%f\n",d);printf("7:%13.11e\n",d);}這個(gè)程序的輸出如下:1:12342:12343:12687.3251954:0000012687.32525:1.268733e+046:12687.3251967:1.26873251956e+04請(qǐng)讀者根據(jù)程序的輸出格式仔細(xì)分析上面的輸出清單,掌握輸出格式的應(yīng)用。例3.3.3分析下面程序的輸出,了解非格式字符的使用。
#include<stdio.h>main(){inta=1,b=2;printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}我們來(lái)分析程序中輸出語(yǔ)句的格式字符串,其中包含了3個(gè)輸出格式字符“%d”,表示輸出3個(gè)十進(jìn)制整型數(shù)據(jù)。3個(gè)輸出格式字符依次分別與輸出表達(dá)式表中的a,b,a+b3個(gè)表達(dá)式相對(duì)應(yīng)。在輸出格式字符串中還包含有非格式字符:在第一個(gè)格式符之前的a=;在第二個(gè)格式符之前的b=;在第三個(gè)格式符之前的a+b=。這些非格式符是按原樣順序輸出的。根據(jù)以上分析可知,這個(gè)程序的輸出,也就是輸出語(yǔ)句的執(zhí)行結(jié)果應(yīng)該是:
a=1,b=2,a+b=33.3.4格式輸入函數(shù)scanf()格式輸入函數(shù)scanf()的一般格式為:
scanf(輸入格式字符串,輸入變量地址表);函數(shù)的功能是接受從鍵盤(pán)按輸入格式字符串規(guī)定的格式輸入的若干數(shù)據(jù),并按輸入變量地址表中變量地址的順序,依次存入對(duì)應(yīng)的變量。實(shí)際的輸入輸出過(guò)程都是通過(guò)內(nèi)存的一個(gè)專(zhuān)門(mén)緩沖區(qū)實(shí)現(xiàn)的。例3.3.4格式輸入輸出函數(shù)使用舉例。下面的程序要求用戶輸入一些不同類(lèi)型的數(shù)據(jù),然后輸出。設(shè)要求輸入的數(shù)據(jù)是:
c1='a'i1=123i2=456f1=1.25lx=999dx=1.234我們關(guān)心的是如何從鍵盤(pán)輸入數(shù)據(jù)和輸出的格式是怎樣的。程序如下:#include"stdio.h"main(){charc1;inti1,i2;floatf1;longlx;doubledx;
scanf("%c%d",&c1,&i1);scanf("%d,%f",&i2,&f1);scanf("%8ld%5lf",&lx,&dx);
printf("%c%d\n",c1,i1);printf("%d%f\n",i2,f1);printf("%ld%f\n",lx,dx);} 對(duì)于輸入語(yǔ)句“scanf("%c%d",&c1,&i1);”,為使變量c1的值為'a',變量i1的值為123,可以輸入“a123回車(chē)”,或者輸入“a空格123回車(chē)”,或者輸入“a回車(chē)123回車(chē)”。 對(duì)于輸入語(yǔ)句“scanf("%d,%f",&i2,&f1);”,為使變量i2的值為456和變量f1的值為1.25,必須輸入456,1.25,后跟回車(chē)。根據(jù)格式以逗號(hào)作為2個(gè)數(shù)據(jù)之間的間隔。對(duì)于輸入語(yǔ)句“scanf("%8ld%5lf",&lx,&dx);”,為使變量lx的值為999,變量dx的值為1.234,可以這樣輸入數(shù)據(jù):999空格1.234。使用空格作為2個(gè)數(shù)據(jù)的間隔,是因?yàn)樽兞縧x的格式規(guī)定的寬度大于實(shí)際寬度,所以用了空格結(jié)束lx數(shù)據(jù)的輸入。對(duì)程序中3條輸出語(yǔ)句,請(qǐng)讀者自己來(lái)分析。最后,上面程序的輸出為:
a1234561.2500009991.234000例3.3.5應(yīng)用數(shù)據(jù)寬度格式字符的例子。設(shè)有語(yǔ)句:
scanf("%3d%4d",&a,&b);如果輸入1234567給變量a和變量b,它們的值分別是什么呢?格式輸入函數(shù)會(huì)自動(dòng)根據(jù)格式“%3d%4d”,為變量a截取3位數(shù)據(jù),即123;為變量b截取4位數(shù)據(jù),即4567。所以,這個(gè)語(yǔ)句執(zhí)行后有: a=123b=4567
例3.3.6從鍵盤(pán)輸入3個(gè)字符的程序。用scanf()語(yǔ)句輸入3個(gè)字符給3個(gè)變量時(shí),3個(gè)字符一般要連續(xù)輸入,中間不要使用空格或回車(chē),因?yàn)榭崭窈突剀?chē)都會(huì)作為字符輸入并賦給相應(yīng)的變量。程序如下:
main(){charch1,ch2,ch3;scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%cch2=%cch3=%c\n",ch1,ch2,ch3);}如果希望ch1='a',ch2='b',ch3='c',則應(yīng)輸入abc后按回車(chē)以結(jié)束輸入。3.4順序結(jié)構(gòu)程序設(shè)計(jì)
順序結(jié)構(gòu)的特點(diǎn)是順序地、依次地執(zhí)行程序中語(yǔ)句序列。在程序的運(yùn)行過(guò)程中,每條語(yǔ)句都必定執(zhí)行一次,并且只能是執(zhí)行一次。順序結(jié)構(gòu)的流程圖如第1章圖1.1(a)所示。這一節(jié)將分析幾個(gè)順序結(jié)構(gòu)的程序例題,從中學(xué)習(xí)簡(jiǎn)單順序結(jié)構(gòu)程序的設(shè)計(jì)方法。例3.4.1設(shè)計(jì)計(jì)算方程:ax2+bx+c=0的實(shí)根的程序。已知該方程式滿足條件:b2?4ac>0。 一般程序設(shè)計(jì)的步驟不外乎輸入原始數(shù)據(jù),對(duì)問(wèn)題求解和輸出結(jié)果這樣一個(gè)過(guò)程。數(shù)據(jù)的輸入和輸出,可以很容易地通過(guò)相應(yīng)的函數(shù)來(lái)完成。剩下的核心問(wèn)題是求解題目的方法。有了方法,編程就比較容易了。也就是要有一個(gè)算法來(lái)解決編程的問(wèn)題。對(duì)于本例題,解該方程的算法就是公式:
在上面的公式中有一個(gè)開(kāi)平方的運(yùn)算。在C語(yǔ)言的運(yùn)算符中是沒(méi)有開(kāi)方運(yùn)算的,這可以使用系統(tǒng)提供的開(kāi)平方函數(shù)sqrt()。這個(gè)函數(shù)的參數(shù)是雙精度型的被開(kāi)平方的數(shù)據(jù)(變量或常量),函數(shù)返回的是參數(shù)的平方根。Sqrt()函數(shù)定義在頭文件math.h,所以在程序中應(yīng)該有相應(yīng)的包含命令。
描述算法的一個(gè)很好的工具就是流程圖。根據(jù)流程圖寫(xiě)程序,則要容易得多。對(duì)于非常簡(jiǎn)單的程序,一般不需要流程圖,作為練習(xí),圖3.1給出本例題的流程圖。根據(jù)流程圖寫(xiě)出程序如下:
#include"stdio.h"#include"math.h"
main(){floata,b,c,x1,x2,d;
printf("Entera,b,c:\n");scanf("%f,%f,%f",&a,&b,&c);
d=sqrt(b*b-4*a*c);x1=(-b+d)/(2*a);x2=(-b-d)/(2*a);
printf("x1=%f,x2=%f\n",x1,x2);}如果輸入a=1.0,b=3.0,c=2.0,則程序的輸出為:
x1=?1.000000,x2=?2.000000例3.4.2使兩個(gè)變量的值進(jìn)行相互交換的程序。設(shè)有兩個(gè)變量a和b,我們的問(wèn)題是,將變量a的值賦給變量b,變量b的值賦給變量a。程序的過(guò)程還是不外乎:輸入a和b原始數(shù)據(jù),數(shù)據(jù)處理(交換a、b的值),輸出結(jié)果(交換后a、b的值)。輸入和輸出大家都很熟悉。問(wèn)題是怎樣實(shí)現(xiàn)兩個(gè)數(shù)據(jù)的交換。一個(gè)可能的方法是這樣。定義一個(gè)類(lèi)型與變量a和b相同的變量temp,通過(guò)變量temp進(jìn)行數(shù)據(jù)交換,其步驟如下:(1)變量a的數(shù)據(jù)送入變量temp;(2)變量b的數(shù)據(jù)賦予變量a;(3)變量temp的數(shù)據(jù)送入變量b。圖3.2顯示了上述數(shù)據(jù)交換過(guò)程。程序如下:#include"stdio.h"
main(){
inta=10;intb=20;inttemp;
printf("a=%db=%d\n",a,b);
temp=a;a=b;b=temp;printf("a=%db=%d\n",a,b);}如果輸入a=10,b=20,則程序的輸出為:
b=20a=10例3.4.3設(shè)計(jì)一個(gè)求4位正整數(shù)中各位數(shù)字的和的程序。問(wèn)題的關(guān)鍵是如何將一整數(shù)x的個(gè)、十、百、千位的數(shù)字分離出來(lái),這是本問(wèn)題算法的核心。下面介紹一種簡(jiǎn)單算法。x%10的模運(yùn)算的結(jié)果就是所求的個(gè)位數(shù),然后,用x/10的整除運(yùn)算,使十位數(shù)出現(xiàn)在個(gè)位上,再通過(guò)模運(yùn)算得到十位數(shù)。如此計(jì)算下去,求得百位和千位數(shù)。具體計(jì)算步驟如下:第一步,x%10得到x的個(gè)位數(shù),存入變量x1;第二步,x=x/10,x%10得到x的十位數(shù),存入變量x2;第三步,x=x/10,x%10得到x的百位數(shù),存入變量x3;
第四步,x=x/10,x%10得到x的千位數(shù),存入變量x4;第五步,各位數(shù)字的和:x1+x2+x3+x4。有了上述算法,再在此算法前加上輸入數(shù)據(jù)x的操作,算法后加上輸出計(jì)算結(jié)果的操作,就是解決本例題的完整算法了。根據(jù)上述算法的描述,可寫(xiě)出下面的程序:#include"stdio.h"main(){intx,sum; /*定義變量:分別存儲(chǔ)原始數(shù)據(jù)和各位數(shù)的和*/
intx1,x2,x3,x4; /*定義變量:分別存儲(chǔ)整數(shù)x的個(gè)、十、百、千、位數(shù)*/
scanf("%d",&x);/*輸入原始數(shù)據(jù)x*/
關(guān)系運(yùn)算符是用來(lái)確定一個(gè)量與另一個(gè)量之間的關(guān)系,
C語(yǔ)言提供六種關(guān)系運(yùn)算符。4.1
關(guān)系運(yùn)算符及關(guān)系運(yùn)算表達(dá)式
關(guān)系運(yùn)算的結(jié)果是一個(gè)邏輯值。邏輯值是一種只有兩個(gè)值的量:真和假。關(guān)系運(yùn)算的結(jié)果成立,或者說(shuō)為真(true),則運(yùn)算結(jié)果為1,也就是用1表示真。比較的結(jié)果不成立,或者說(shuō)為假(false),則運(yùn)算結(jié)果為0,也就是用0表示假。例如,關(guān)系運(yùn)算:10>100 顯然是不成立的,表達(dá)式的值為假,實(shí)際存儲(chǔ)的數(shù)字為0。例4.1.1設(shè)有變量定義:
inta=90,b=80;計(jì)算下面關(guān)系運(yùn)算表達(dá)式的值:
a>b>=1<=0==1!=0
按照關(guān)系運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,上面表達(dá)式的運(yùn)算順序相當(dāng)于
((((a>b>)=1)<=0)==1)!=0表達(dá)式的值為0。上式的運(yùn)算過(guò)程可以用圖4.1來(lái)說(shuō)明。 例4.1.2下面的程序應(yīng)用關(guān)系運(yùn)算符判斷用戶輸入的兩個(gè)整型變量數(shù)是否相等,并將比較的結(jié)果輸出。程序如下:
/*Thisprogramillustratestherelationaloperators.*/#include"stdio.h"main(){
intnum1,num2; /*定義變量*/printf("Entertwonumbers:"); /*提示用戶輸入數(shù)據(jù)*/
scanf("%d%d",&num1,&num2); /*用戶輸入數(shù)據(jù)*/printf("num1=%dnum2=%d\n",num1,num2); /*輸出用戶數(shù)據(jù)*/printf("result=%d\n",num1==num2); /*輸出比較結(jié)果*/}程序輸出舉例:Entertwonumbers:22(用戶從鍵盤(pán)輸入22)
num1=2num2=2result=1 邏輯運(yùn)算符用于支持基本邏輯運(yùn)算。三種邏輯運(yùn)算符及其意義,如表4.2.1所示。4.2邏輯運(yùn)算符及邏輯表達(dá)式
表4.2.1邏輯運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性!邏輯非2<-(自右向左)&&邏輯與11->(自左向右)||邏輯或12邏輯運(yùn)算是對(duì)邏輯量或表達(dá)式進(jìn)行運(yùn)算的。邏輯運(yùn)算的對(duì)象可以是數(shù)值型的、字符型的,也可以是邏輯量。C語(yǔ)言規(guī)定,邏輯運(yùn)算的運(yùn)算對(duì)象為0時(shí),代表邏輯量假;運(yùn)算對(duì)象為非0時(shí),代表邏輯量真。邏輯運(yùn)算的結(jié)果仍是邏輯量:真或假。
例4.2.1分析下面表達(dá)式的值是什么?
25>5&&!(8>7)||2<=10
根據(jù)上述的關(guān)系運(yùn)算和邏輯運(yùn)算的意義以及運(yùn)算符的優(yōu)先級(jí),不難知道該表達(dá)式的值為真。這可以從圖4.3清楚地看出。
例4.2.2設(shè)有如下變量定義:
charch='A';/*ch的值是65*/
intk1=65,k2=97;計(jì)算下面表達(dá)式的值:
k1+32==k1&&k2==ch
上式的計(jì)算過(guò)程相當(dāng)于:
((k1+32)==k2)&&(k1==ch)第一步運(yùn)算k1+32=97;第二步運(yùn)算97==k2結(jié)果為真;第三步運(yùn)算k1==ch結(jié)果為真;第四步運(yùn)算1&&1結(jié)果為真;所以,整個(gè)表達(dá)式的值為1(真)。例4.2.3編寫(xiě)程序,求25&&10,25||10的邏輯值。程序如下:
#include<stdio.h>main(){intx=25,y=10;printf("x=%dy=%dx&&y=%d\n",x,y,x&&y);printf("25||10=%d\n",25||10);}程序的輸出有如下的形式:
x=25y=10x&&y=125||10=1
關(guān)于邏輯運(yùn)算,有一點(diǎn)要特別說(shuō)注意:當(dāng)對(duì)兩個(gè)表達(dá)式進(jìn)行邏輯與運(yùn)算時(shí),若前一個(gè)表達(dá)式的值為假,則不再進(jìn)行后一個(gè)表達(dá)式的計(jì)算,整個(gè)表達(dá)式的值肯定為假。同樣,當(dāng)對(duì)兩個(gè)表達(dá)式進(jìn)行邏輯或運(yùn)算時(shí),若前一個(gè)表達(dá)式的值為真,整個(gè)表達(dá)式的值肯定為真,也不再進(jìn)行后一個(gè)表達(dá)式的計(jì)算。例如,表達(dá)式10>12&&(a=a+1)中前一個(gè)表達(dá)式的值為0(假),整個(gè)表達(dá)式的值為0,不進(jìn)行后面表達(dá)式“a=a+1”的計(jì)算,a的值保持不變。又如,表達(dá)10<121||(a=a+1)中前一個(gè)表達(dá)式的值為1(真),整個(gè)表達(dá)式的值為0,不進(jìn)行后面表達(dá)式“a=a+1”的計(jì)算,a的值保持不變。4.3選擇語(yǔ)句
選擇語(yǔ)句是用于構(gòu)造選擇程序結(jié)構(gòu)的語(yǔ)句。4.3.1單分支if選擇語(yǔ)句單分支if選擇語(yǔ)句是形式最簡(jiǎn)單的if條件轉(zhuǎn)移語(yǔ)句,它的格式如下:
if(表達(dá)式)語(yǔ)句;本語(yǔ)句的功能是,首先計(jì)算“表達(dá)式”的值,如果表達(dá)式的值為真,則執(zhí)行“語(yǔ)句”,否則不執(zhí)行,而是轉(zhuǎn)去執(zhí)行本語(yǔ)句后面的語(yǔ)句。單分支if語(yǔ)句的流程圖如圖4.4所示。圖4.4單分支if語(yǔ)句的流程if語(yǔ)句中表達(dá)式可以任何類(lèi)型的C表達(dá)式。其中語(yǔ)句也可以是任何語(yǔ)句,包括另一個(gè)if語(yǔ)句(稱嵌套if語(yǔ)句);也可以是由若干語(yǔ)句組成的一個(gè)組語(yǔ)句。在這種情況下,這組語(yǔ)句需要用花括號(hào)“{}”括起來(lái)。
例4.3.1編寫(xiě)程序,求輸入的整數(shù)的絕對(duì)值并將其輸出。整個(gè)程序的思路可歸結(jié)為以下三步:(1)輸入整數(shù)a;(2)求a的絕對(duì)值并存入a;(3)輸出a。求a的絕對(duì)值的簡(jiǎn)單方法就是:如果a是負(fù)數(shù),再對(duì)它取一次負(fù)就變?yōu)檎龜?shù)了。按照這個(gè)思路,不難寫(xiě)出如下的程序:
#include"stdio.h"main(){inta,a1;scanf("%d",&a);a1=a;
if(a<0)a=-a;printf("|%d|=%d\n",a1,a);}
如果輸入整數(shù)?5,則程序輸出|?5|=5。4.3.2雙分支if_else選擇語(yǔ)句if_else語(yǔ)句的格式為:
if(表達(dá)式)語(yǔ)句1;
else語(yǔ)句2;
語(yǔ)句的功能是,首先計(jì)算表達(dá)式的值,如果為真,則執(zhí)行語(yǔ)句(塊)1,否則執(zhí)行else后面的語(yǔ)句(塊)2。上述功能如圖4.5所示。圖4.5雙分支if_else選擇語(yǔ)句流程例4.3.2比較用戶輸入的兩個(gè)整數(shù)的大小。若輸入的第一個(gè)數(shù)大于第二個(gè)數(shù),則顯示:
first>second
否則,顯示:
first<=second最后,顯示:
Alldone!顯然,這是一個(gè)有兩個(gè)分支的程序。用圖4.6的流程圖說(shuō)明編程的思想。
圖4.6例4.3.2程序的流程圖根據(jù)流程圖可寫(xiě)出程序如下:#include<stdio.h>main(){intfirst,second;
printf("Entertwonumbers:");scanf("%d%d",&first,&second);
if(first>second)printf("first>second");elseprintf("first<=second");
printf("Alldone!");}例4.3.3用雙分支if語(yǔ)句重新編寫(xiě)例4.3.1的程序??梢岳靡粋€(gè)分支處理變量a為正數(shù)的情況,如令x=a。用另一個(gè)分支初處理變量a為負(fù)數(shù)的情況,如令x=?a。最后輸出結(jié)果。下面給出程序:
#include"stdio.h"main(){inta,x;scanf("%d",&a);if(a>0)x=a;elsex=-a;printf("|%d|=%d\n",a,x);}4.3.3多分支結(jié)構(gòu)如果在if選擇語(yǔ)句的一個(gè)或兩個(gè)分支語(yǔ)句中,還包含有if語(yǔ)句,則稱這種結(jié)構(gòu)為“if語(yǔ)句的嵌套”。利用if語(yǔ)句的嵌套,可以構(gòu)成多個(gè)分支的選擇結(jié)構(gòu)程序。例4.3.4編寫(xiě)一程序,進(jìn)行十進(jìn)制數(shù)、八進(jìn)制數(shù)和十六進(jìn)制數(shù)之間的轉(zhuǎn)換。程序首先給出一個(gè)菜單,供用戶選擇所要求的數(shù)制轉(zhuǎn)換。
菜單的形式如下:Convert:1:decimaltohexadecimal(十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù))2:hexadecimaltodecimal(十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù))3:decimaltooctal(十進(jìn)制數(shù)轉(zhuǎn)換為八進(jìn)制數(shù))4:octaltodecimal(八進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù))5:octaltohexadecimal(八進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù))6:hexadecimaltooctal(十六進(jìn)制數(shù)轉(zhuǎn)換為八進(jìn)制數(shù))并提示用戶輸入數(shù)制轉(zhuǎn)換類(lèi)型:
Enteryourchoice:
用戶通過(guò)輸入數(shù)字(1~6)選定所要轉(zhuǎn)換類(lèi)型,然后程序提示用戶輸入待轉(zhuǎn)換的數(shù),例如:
Enteradecimalvalue:
輸入數(shù)據(jù)后,程序輸出換算的結(jié)果。根據(jù)題意可知,本程序應(yīng)該有六個(gè)分支語(yǔ)句塊分別處理六種不同情況數(shù)制的轉(zhuǎn)換。在每個(gè)分支中數(shù)制之間的轉(zhuǎn)換,可通過(guò)函數(shù)printf()的格式控制字符實(shí)現(xiàn)。十進(jìn)制數(shù)用格式字符“%d”輸出。八進(jìn)制數(shù)用格式字符“%o”輸出,十六進(jìn)制數(shù)用格式字符“%x”輸出。
下面給出程序清單:
#include<stdio.h>main(){intvalue,choice;
printf("Convert:\n"); /*輸出菜單*/
printf("1:decimaltohexadecimal\n");printf("2:hexadecimaltodecimal\n");printf("3:decimaltooctal\n");
printf("4:octaltodecimal\n");printf("5:octaltohexadecimal\n");printf("6:hexadecimaltooctal\n");
printf("Enteryourchoice:"); /*輸入菜單選擇*/
scanf("%d",&choice);if(choice==1){
printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinhexadecimalis%x\n",value,value);}elseif(choice==2){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xindecimalis%d\n",value,value);}elseif(choice==3){printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinoctalis%o\n",value,value);}elseif(choice==4){
printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oindecimalis%d\n",value,value);}elseif(choice==5){printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oinhexadecimalis%x\n",value,value);}
elseif(choice==6){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xinoctalis%o\n",value,value);}elseprintf("Invalidselection.\n");}我們看到,本程序通過(guò)六個(gè)if_else_if結(jié)構(gòu)的語(yǔ)句,構(gòu)成了七個(gè)分支的多分支程序。根據(jù)if語(yǔ)句的執(zhí)行流程,當(dāng)?shù)谝粋€(gè)if語(yǔ)句的條件(choice==1)為真時(shí),執(zhí)行它后面的語(yǔ)句塊:進(jìn)行十→十六的轉(zhuǎn)換,輸出結(jié)果后,程序運(yùn)行結(jié)束。否則,表達(dá)式為假時(shí),通過(guò)else分支進(jìn)入第二個(gè)if語(yǔ)句。若表達(dá)式(choice==2)為真,執(zhí)行它后面的語(yǔ)句塊:進(jìn)行十六→十的轉(zhuǎn)換,輸出結(jié)果后,程序運(yùn)行結(jié)束。否則,表達(dá)式為假時(shí),跳過(guò)它后面的語(yǔ)句塊,執(zhí)行下一個(gè)if語(yǔ)句,等等。以此類(lèi)推,一直執(zhí)行到第六個(gè)if語(yǔ)句。如果用戶輸入的數(shù)字不是在1~6中,則執(zhí)行程序最后一行的else語(yǔ)句。下面是程序的一次運(yùn)行輸出實(shí)例(十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù))。程序開(kāi)始運(yùn)行后顯示采單:
Convert:1:decimaltohexadecimal;2:hexadecimaltodecimal;3:decimaltooctal;4:octaltodecimal;
5:octaltohexadecimal;6:hexadecimaltooctal;Enteryourchoice:1(輸入1)
Enteradecimalvalue:255(輸入255)
輸出如下的計(jì)算結(jié)果:
255inhexadecimalisff
一般情況下,只要在一個(gè)if語(yǔ)句中包含有另一個(gè)if語(yǔ)句就是if語(yǔ)句的嵌套,組成的就是多分支的選擇結(jié)構(gòu)程序。例如,下面也是一種多分支的選擇結(jié)構(gòu):
if(表達(dá)式)
if(表達(dá)式){語(yǔ)句}
else{語(yǔ)句}
elseif(表達(dá)式){語(yǔ)句}
else{語(yǔ)句}C語(yǔ)言對(duì)語(yǔ)句在程序中書(shū)寫(xiě)形式?jīng)]有嚴(yán)格的要求。一行可以寫(xiě)多個(gè)語(yǔ)句,也可以把一個(gè)語(yǔ)句寫(xiě)在兩行里。一個(gè)語(yǔ)句可以從一行的頭開(kāi)始寫(xiě),也可以從一行的某個(gè)位置開(kāi)始寫(xiě)。為了使嵌套結(jié)構(gòu)清楚、醒目并避免產(chǎn)生錯(cuò)誤的理解,建議各層嵌套的語(yǔ)句采用不同的縮進(jìn)書(shū)寫(xiě)形式,如上面所寫(xiě)的那樣。必要時(shí),使用花括號(hào)也會(huì)使是程序的嵌套結(jié)構(gòu)顯示得更清晰。例4.3.5分析下面的多分支語(yǔ)句:
if(a>b)if(b>5)c=0;elsec=1;
在這個(gè)語(yǔ)句中含有兩個(gè)if和一個(gè)else。從語(yǔ)句的書(shū)寫(xiě)形式上,分支結(jié)構(gòu)不是很清楚??赡墚a(chǎn)生兩種不同的理解。第一種理解是:如果(a>b)并(b>5),則執(zhí)行c=0;否則,(a>b)不成立,則執(zhí)行c=1。這種理解是把else與第一個(gè)if配為一對(duì)。用縮進(jìn)格式表達(dá)上述理解時(shí),可把語(yǔ)句寫(xiě)成如下的形式:
if(a>b)if(b>5)c=0;elsec=1;第二種理解是:如果(a>b)并(b>5),則執(zhí)行c=0;否則,(a>b)成立,(b>5)不成立,則執(zhí)行c=1。這種理解是把else與第二個(gè)if配對(duì)。用縮進(jìn)格式表達(dá)上述理解時(shí),可把語(yǔ)句寫(xiě)成如下的形式:
if(a>b)if(b>5)c=0;elsec=1;
第一種理解是把else與第一個(gè)if配對(duì);第二種理解是把else與第二個(gè)if配對(duì)。哪種理解是正確的呢?C語(yǔ)言的規(guī)定:在if嵌套語(yǔ)句中,一般從最內(nèi)層開(kāi)始,else與它前面最近的if配成一對(duì)。根據(jù)“else與它前面最近的if配對(duì)”的原則,這里的else應(yīng)該是與第2個(gè)if配對(duì),就是第二種理解是合乎C語(yǔ)法規(guī)則的。語(yǔ)句的功能應(yīng)該這樣理解:如果a>b成立,并且b>5,則把0賦給變量c;如果a>b成立,但b>5不成立,則把1賦給變量c。如果這不是我們所要表達(dá)的意思。我們要表達(dá)的是:如果a>b成立,并且b>5,則把0賦給變量c;如果a>b不成立,則把1賦給變量c。這時(shí),else要與第一個(gè)if配對(duì)。我們應(yīng)該這樣寫(xiě):
if(a>b){if(b>5)c=0;}elsec=1;
這里花括號(hào)是必須的。4.3.4多分支開(kāi)關(guān)語(yǔ)句switch在許多情況下,switch語(yǔ)句非常適合構(gòu)造多分支選擇結(jié)構(gòu)程序。switch語(yǔ)句的一般格式為:
switch(表達(dá)式){
case常量表達(dá)式1: 語(yǔ)句(塊)1
break;case常量表達(dá)式2: 語(yǔ)句(塊)2
break;……case常量表達(dá)式n: 語(yǔ)句(塊)n break;default: 語(yǔ)句(塊)n+1}
switch語(yǔ)句的執(zhí)行過(guò)程如下:
首先,計(jì)算switch后圓括號(hào)內(nèi)的表達(dá)式的值,然后,用這個(gè)值逐個(gè)與各case的常量表達(dá)式i的值進(jìn)行比較。當(dāng)找到與其相等(匹配)的case時(shí),就執(zhí)行該case中的語(yǔ)句(塊)i,如果在語(yǔ)句(塊)i中有break語(yǔ)句,便退出該switch語(yǔ)句。如果沒(méi)有break語(yǔ)句,則在執(zhí)行完某個(gè)語(yǔ)句(塊)i后,連續(xù)執(zhí)行其后的語(yǔ)句(塊),直到遇上另一個(gè)break語(yǔ)句,結(jié)束switch的執(zhí)行,或者一直執(zhí)行到最后的語(yǔ)句(塊),然后,結(jié)束switch語(yǔ)句的執(zhí)行。switch語(yǔ)句的上述功能如圖4.8所示。
圖4.8switch語(yǔ)句的流程例4.3.6分析下面應(yīng)用switch語(yǔ)句程序的輸出。
#include"stdio.h"main(){intc;scanf("%d",&c);switch(c){
case1:printf("case1\n");break;case2:printf("case2\n");break;case3:printf("case3\n");case4:printf("case4\n");break;default:printf("default\n");}}輸入1,則程序輸出:case1(執(zhí)行break語(yǔ)句,退出switch,程序結(jié)束)輸入2,則程序輸出:case2(執(zhí)行break語(yǔ)句,退出switch,程序結(jié)束)輸入3,則程序輸出:case3(沒(méi)有break語(yǔ)句,連續(xù)執(zhí)行下后邊的case)輸入3,則程序輸出:case4(執(zhí)行break語(yǔ)句,退出switch,程序結(jié)束)
輸入4,則程序輸出:case4(執(zhí)行break語(yǔ)句,退出switch,程序結(jié)束)輸入1~4以外的數(shù),如6,則程序輸出:default(退出switch,程序結(jié)束)。
4.4選擇結(jié)構(gòu)程序設(shè)計(jì)
本節(jié)將通過(guò)一些例題,進(jìn)一步練習(xí)選擇結(jié)構(gòu)程序的編程技術(shù)。例4.4.1用戶從鍵盤(pán)輸入三個(gè)整數(shù),找出并輸出其中數(shù)值最大的那一個(gè)。如果其中有一個(gè)以上的最大數(shù)(兩數(shù)相等的情況),也要表示出來(lái)。因?yàn)槌绦蛞啻芜M(jìn)行兩個(gè)數(shù)的大小比較才能找出其中的最大值,所以這是一個(gè)多分支的選擇結(jié)構(gòu)的程序。我們要特別注意各語(yǔ)句中if和else的配對(duì)關(guān)系和相應(yīng)的縮進(jìn)書(shū)寫(xiě)形式。程序如下:
#include<stdio.h>main(){inta,b,c;printf("Enter3numbers:");scanf("%d%d%d",&a,&b,&c);if(a>b){
if(a>c)printf("max.a=%d\n",a);elseif(a==c)printf("max.a=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(a==b){if(a>c)printf("max.a=b=%d\n",a);elseif(a==c)printf("a=b=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(b>c)printf("max.b=%d\n",b);elseif(b==c)printf("max.b=c=%d\n",b);elseprintf("max.c=%d\n",c);}程序的輸出有如下的形式:
Enter3numbers:132(132是用戶的輸入)
max.b=3(程序的輸出)
需要強(qiáng)調(diào)指出的是,任何合法的C表達(dá)式都可以作為if語(yǔ)句的條件表達(dá)式。表達(dá)式中,關(guān)系操作符和邏輯操作符并不是絕對(duì)必要的。只要表達(dá)式的值是0,就認(rèn)為條件為假,非0就認(rèn)為是真。請(qǐng)看下面的例子。例4.4.2用戶從鍵盤(pán)輸入兩個(gè)整數(shù),進(jìn)行除法運(yùn)算。其中變量dividend是被除數(shù),divider是除數(shù),result是商。要求當(dāng)除數(shù)(divider)為0時(shí),輸出信息“Can'tdividedbyzero.”,不進(jìn)行計(jì)算。如果除數(shù)不為0,則進(jìn)行除法運(yùn)算并輸出計(jì)算結(jié)果。程序中用
if(divider)判斷除數(shù)是否是0。這里表達(dá)式divider不是什么關(guān)系表達(dá)式,也不是邏輯表達(dá)式,甚至也不是算術(shù)表達(dá)式。就是由一個(gè)變量組成的表達(dá)式。但是利用0代表假,非0代表真這一規(guī)則,因此,可以用作if語(yǔ)句的判斷條件。程序如下:#include<stdio.h>{main()
floatdividend,divider,result;
printf("Entertwofloatnumbers:");scanf("%f%f",÷nd,÷r);
if(divider){result=dividend/divider;printf("result=%f",result);}
elseprintf("Can'tdividedbyzero.");}
當(dāng)然,也可以把上面程序中的if(divider)寫(xiě)成下面的關(guān)系表達(dá)式的形式:
if(divider!=0)
但這種形式不如前一種形式更為簡(jiǎn)單。
在if語(yǔ)句的條件表達(dá)式中也可以出現(xiàn)賦值表達(dá)式,如if(x=y)。但不要與相等的比較運(yùn)算(x==y)相混淆。前者是賦值表達(dá)式,后者是關(guān)系表達(dá)式。請(qǐng)看下面的例子。例4.4.3判斷兩整型數(shù)的和是否小于0的程序。程序中使用了如下的if語(yǔ)句:
if((z=x+y)<0)其中的z=x+y是賦值表達(dá)式。它與z==x+y的意義是不同的。程序如下:
#include<stdio.h>main(){intx,y,z;
printf("Entertwonumbers:");scanf("%d%d",&x,&y);
if((z=x+y)<0)printf("Thesumisnegative.\n");elseprintf("Thesumispositive.\n");}default是switch語(yǔ)句中的一個(gè)任選的分支,在語(yǔ)句中是可用可不用部分。但是,使用它可能產(chǎn)生很好的效果。在實(shí)踐中,它一般用在處理不能與所有的case相匹配的情況。例如,鍵盤(pán)輸入錯(cuò)誤的數(shù)字,則在找不到匹配case后,便執(zhí)行
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)政部貨物類(lèi)合同管理規(guī)定
- 鋼琴啟蒙老師年終總結(jié)
- 煤氣檢查和使用安全:預(yù)防火災(zāi)和中毒事故
- 《色彩心理學(xué)》課件
- 《船用卸扣》規(guī)范
- 進(jìn)出口業(yè)務(wù)知識(shí)培訓(xùn)
- 抗蠕蟲(chóng)藥相關(guān)行業(yè)投資規(guī)劃報(bào)告范本
- 骨代謝異常的生物化學(xué)診斷課件
- 鐵路安全警示教育室
- 防治結(jié)核病的內(nèi)容講解
- 用電檢查培訓(xùn)
- 弘揚(yáng)偉大長(zhǎng)征精神圖文.ppt
- 西南石油大學(xué) 《油藏工程》教學(xué)提綱+復(fù)習(xí)提綱)PPT精品文檔
- 六年級(jí)數(shù)學(xué)下冊(cè) 圓錐的體積教案 西師大版 教案
- 企業(yè)質(zhì)量管理體系程序文件(全套)
- 莫迪溫產(chǎn)品介紹
- 天津市寶坻區(qū)土地利用總體規(guī)劃(2015-2020年)
- 中國(guó)早產(chǎn)兒視網(wǎng)膜病變篩查指南(2014年)版
- 話劇《阮玲玉》
- 電子商務(wù)十大風(fēng)云人物
- [專(zhuān)業(yè)英語(yǔ)考試復(fù)習(xí)資料]專(zhuān)業(yè)八級(jí)分類(lèi)模擬41
評(píng)論
0/150
提交評(píng)論