![C及C++程序設(shè)計課件_第1頁](http://file4.renrendoc.com/view/b306c3e0acebd014f8eb546588925f6c/b306c3e0acebd014f8eb546588925f6c1.gif)
![C及C++程序設(shè)計課件_第2頁](http://file4.renrendoc.com/view/b306c3e0acebd014f8eb546588925f6c/b306c3e0acebd014f8eb546588925f6c2.gif)
![C及C++程序設(shè)計課件_第3頁](http://file4.renrendoc.com/view/b306c3e0acebd014f8eb546588925f6c/b306c3e0acebd014f8eb546588925f6c3.gif)
![C及C++程序設(shè)計課件_第4頁](http://file4.renrendoc.com/view/b306c3e0acebd014f8eb546588925f6c/b306c3e0acebd014f8eb546588925f6c4.gif)
![C及C++程序設(shè)計課件_第5頁](http://file4.renrendoc.com/view/b306c3e0acebd014f8eb546588925f6c/b306c3e0acebd014f8eb546588925f6c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C及C++程式設(shè)計第1章對C語言的初步認識
1.1程式與程式設(shè)計語言
1.1.1程式、程式設(shè)計和程式設(shè)計語言
一般來說,程式是對解決或處理一個問題的方法步驟的描述。而電腦程式,則是用某種電腦能識別的語言工具所描述的解決問題的方法步驟。例如,有兩個數(shù)據(jù)a和b,它們的值分別為1和2,求這兩個量的和c。 編制並記錄解決問題的方法步驟的過程就是程式設(shè)計。在電腦技術(shù)中,將解決一個問題的方法和步驟叫做演算法。進行程式設(shè)計時要使用電腦能識別的描述演算法的工具,這個工具就是電腦程式設(shè)計語言。1.1.2結(jié)構(gòu)化程式設(shè)計方法
電腦程式設(shè)計語言經(jīng)歷了由機器語言、組合語言到高級語言的發(fā)展過程。這些語言的特點是以簡單的語句序列構(gòu)成程式。在20世紀60年代末開始提出結(jié)構(gòu)化程式設(shè)計的概念,也就是將程式由語句序列結(jié)構(gòu)轉(zhuǎn)變?yōu)槟=M集合。
結(jié)構(gòu)化程式設(shè)計方法的基本思想是,將任何複雜問題分解為若干較為簡單的功能模組,每個模組中的任何邏輯問題再用少數(shù)幾種基本結(jié)構(gòu)(如順序結(jié)構(gòu)、選擇結(jié)構(gòu)、迴圈結(jié)構(gòu))加以描述。結(jié)構(gòu)化程式設(shè)計中採用的三種基本結(jié)構(gòu)如圖1.1所示,所有的程式代碼都實現(xiàn)在這三種結(jié)構(gòu)中。圖1.1結(jié)構(gòu)化程式設(shè)計的三種基本結(jié)構(gòu)
進入20世紀80年代後,為了適應(yīng)龐大而複雜程式的開發(fā),出現(xiàn)了面向?qū)ο蟮某淌皆O(shè)計方法和語言。然而它也吸收和繼承了結(jié)構(gòu)化程式設(shè)計的方法。1.2C語言及C語言根源程式的基本結(jié)構(gòu)
1.2.1C語言 C語言是一種編譯方式的結(jié)構(gòu)化高級程式設(shè)計語言。C語言主要有下列一些特點。(1)C語言是一種結(jié)構(gòu)化的程式設(shè)計語言,它具有完整的程式控制語句。(2)C語言是一種模組化程式設(shè)計語言,函數(shù)是組成程式的基本程式單位。
(3)C語言有豐富的數(shù)據(jù)類型和運算操作,使程式設(shè)計更為簡單和方便。(4)C語言提供了類似於組合語言的低級語言動能,如直接訪問記憶體的物理地址,對二進位數(shù)進行位操作等。(5)語法結(jié)構(gòu)簡單,語句數(shù)目不多,但功能很強。所以,C語言簡單易學(xué)且應(yīng)用廣泛。
1.2.2C語言根源程式的基本結(jié)構(gòu)
C語言根源程式,簡稱C程式,是建立在模組的基礎(chǔ)上的,而基本的模組就是函數(shù)。因此,一個C程式是由一個或多個函數(shù)組成的。每個函數(shù)是完成一定功能的一段C語言程式。編寫一個程式,首先是建立一個或若干個函數(shù),然後把它們組織在一起,構(gòu)成一個完整的C語言程式。在這些函數(shù)中必須有且只能有的一個函數(shù)就是main()函數(shù),稱為主函數(shù)。一個程式無論包含多少個函數(shù),程式的運行總是從主函數(shù)開始,在主函數(shù)結(jié)束。在C語言中,除了main()函數(shù)外,其他函數(shù)的函數(shù)名是用戶選定的,稱為自定義函數(shù)。自定義函數(shù)不能像main()函數(shù)那樣能獨立運行,它們只能由主函數(shù)或其他函數(shù)啟動(它也能啟動其他函數(shù)),並開始運行。這裏發(fā)生了兩個過程:調(diào)用和返回??梢姡瘮?shù)之間是互相調(diào)用和返回的關(guān)係。自定義函數(shù)可以互相調(diào)用,但不能調(diào)用主函數(shù)。
在最簡單的情況下,C函數(shù)有如下的格式:
函數(shù)名(){函數(shù)體}
例1.2.1一個最簡單的C語言根源程式。程式由如下一個主函數(shù)組成:main(){}因為函數(shù)體不包含任何語句,所以該程式不執(zhí)行任何功能,稱它是空操作。例1.2.2給例1.2.1的程式加入一個功能:在顯示器上輸出:hello!。程式如下:
main(){printf("hello!");}
主函數(shù)的函數(shù)體由一個語句組成。C語言規(guī)定每個語句必須以分號結(jié)束。分號表示一個語句的結(jié)束。語句
printf("hello!");
hello!是一個輸出語句。在這裏它的功能是在顯示器的螢?zāi)簧巷@示如下的字串:
hello!
例1.2.3由兩個函數(shù)組成的C程式。功能仍然是在顯示器上輸出:hello!。主函數(shù)main()調(diào)用另一個名為hello()的自定義函數(shù)。hello()函數(shù)的功能是在顯示器的螢?zāi)簧巷@示字串:"hello!"。下麵是根源程式清單:
main(){hello();}hello(){printf("hello!");}程式運行後,在顯示器的螢?zāi)簧巷@示如下的字串:
hello!主函數(shù)的函數(shù)體是C語言中的一個語句:
hello();它的功能是調(diào)用函數(shù)hello()。執(zhí)行調(diào)用的結(jié)果,使程式從主函數(shù)轉(zhuǎn)去執(zhí)行hello()函數(shù)。函數(shù)hello()的函數(shù)體是由一個C語句組成:
printf("hello!");
我們已經(jīng)知道這個語句的功能是在顯示器的螢?zāi)簧巷@示hello!。該語句執(zhí)行完畢後,返回主函數(shù)。由於主函數(shù)的所有語句已經(jīng)執(zhí)行完畢,於是程式結(jié)束運行。程式的執(zhí)行從主函數(shù)開始,在主函數(shù)結(jié)束。從以上的討論,可以總結(jié)出以下幾點。(1)C程式是由一個或多個函數(shù)組成的,其中必須有一個也只能有一個規(guī)定名為main的主函數(shù)。(2)程式的執(zhí)行總是從主函數(shù)開始,在主函數(shù)結(jié)束。其他函數(shù)是通過調(diào)用來執(zhí)行的。(3)主函數(shù)可以調(diào)用任何非主函數(shù),非主函數(shù)之間可以互相調(diào)用,但不能調(diào)用主函數(shù)。(4)函數(shù)體是完成函數(shù)功能的一組C語言的語句,每個語句完成一個小功能,並以分號作為一個語句的結(jié)束標誌。1.2.3C語言的基本語句
C語言的基本語句主要有以下幾種:
(1)數(shù)據(jù)定義語句;(2)賦值語句;(3)函數(shù)調(diào)用語句和返回語句;(4)輸入語句和輸出語句;(5)流程控制語句。1.3C語言的基本詞法
構(gòu)成C語言的最小單位是字元,由字元可以構(gòu)成詞類,再由詞構(gòu)成各種語句。有關(guān)C語言的字元和詞類的規(guī)定,就形成了C語言的詞法。這一節(jié)介紹詞法方面的有關(guān)規(guī)定。
1.3.1C語言的字元集在C語言程式中允許使用的所有基本字元的集合,稱為C語言的字元集。C語言的字元集採用的是ASCII(AmericanStandardCodeforInformationInterchange)字元集。
1.3.2識別字
用C字元集中的字元組合,可以為程式中的各種對象起名字。這些名字統(tǒng)稱為識別字。例如常量名,變數(shù)名,函數(shù)名等都是識別字。1.3.3保留字保留字又稱關(guān)鍵字,是C語言編譯系統(tǒng)使用的、具有特定語法意義的一些識別字。這些識別字用戶不能作為自己的識別字使用。
1.3.4C語言的詞類C語言的詞類主要有以下幾種。(1)常量:(2)變數(shù):(3)運算符:(4)運算式:(5)保留字:
1.4根源程式的編譯和C語言的集成開發(fā)環(huán)境
1.4.1C程式的開發(fā)過程
開發(fā)一個C語言程式,要經(jīng)過以下四個階段:(1)編輯根源程式檔;(2)編譯根源程式;(3)程式連接;(4)運行程式。1.4.2C語言的集成開發(fā)環(huán)境
為完成上述的程式開發(fā)過程,C語言系統(tǒng)提供兩種獨立的操作方式。一種是傳統(tǒng)的命令行方式。
2.1數(shù)據(jù)類型在C語言中,數(shù)據(jù)的類型分為基本數(shù)據(jù)類型、構(gòu)造類型、指針類型和空值類型。對於每一種數(shù)據(jù)類型的數(shù)據(jù),又有分成幾種不同類型,如圖2.1所示。各種類型數(shù)據(jù)又可分為常量和變數(shù)。圖2.1C語言的數(shù)據(jù)類型2.2.1整型常量在C語言中使用三種不同進位制的整型常量,它們是:(1)十進位數(shù):(2)八進制數(shù):(3)十六進制數(shù):2.2整型數(shù)據(jù)整型常量在微機上一般佔用兩個位元組的長度。為了擴大整型數(shù)據(jù)的取值範圍,C語言還提供了一種長整型常量。長整型常量在電腦中佔用4個位元組。
2.2.2整型變數(shù)整型變數(shù)在電腦中占兩個位元組。用以說明整型變數(shù)的關(guān)鍵字(也稱為數(shù)據(jù)類型符)為int。定義變數(shù)數(shù)據(jù)類型語句的一般格式為: 數(shù)據(jù)類型符變數(shù)名1,變數(shù)名2,……;C語言規(guī)定,每個變數(shù)在使用前,都必須先定義。 在關(guān)鍵字int前加上修飾符,可改變整型變數(shù)的所占位數(shù)和取值範圍。下列4種修飾符可以用來修飾整型變數(shù): (1)signed (2)unsigned (3)long (4)short 實型數(shù)據(jù)也稱做浮點數(shù),是一種帶小數(shù)點的數(shù)。2.3實型數(shù)據(jù)2.3.1實型常量實型常量就是帶小數(shù)點的10進制常數(shù)。在C語言中實型數(shù)據(jù)有兩種表達(書寫)方式:一種是用數(shù)字和小數(shù)點表示的,如123.456等;另一種是用指數(shù)方式表示的,如1.2e+2或1.2E+2(表示的是1.2×102)。
2.3.2實型變數(shù)實型變數(shù)用來存儲實型數(shù)據(jù)。實型變數(shù)分為如下兩種。(1)單精確度實型變數(shù)或簡稱實型變數(shù)或浮點型變數(shù),其類型識別字為float;(2)雙精度實型變數(shù)或稱雙精度浮點型變數(shù),其類型識別字為double。2.4.1字元型常量C語言的字元型常量是用單引號括起來的單個字元,如“a”,“B”,“*”等都是字元型常量。2.4字元型數(shù)據(jù)與字串
在C語言中支持一類特殊字元,它們以反斜杠“\”開頭,稱為反斜杠字元常量,或稱轉(zhuǎn)義字元。它們都可以看作為字元常量。2.4.2字元型變數(shù)字元型變數(shù)是C語言的一種數(shù)據(jù)類型,用關(guān)鍵字(類型符)char說明,用於存儲字元常量或數(shù)值。一個字元型變數(shù)只能存儲一個字元,它是以該字元的ASCII碼值存儲的,並占一個位元組的寬度。例如,字母a的ASCII碼是97,在變數(shù)的記憶體中存儲的就是97。2.4.3字串常量字串常量簡稱字串。字串不是一種數(shù)據(jù)類型,它是用雙引號擴起來的一串字元。例如:
"abc123","4","AaBb","a"
如果字符串中含有轉(zhuǎn)義字符,則每個轉(zhuǎn)義字符當作一個字符看待。例如,字符串
\\ab\\\'AB\'\141\142表示的是下列字元:
\ab\'AB'ab
每個字元在內(nèi)存占一個位元組的空間。但每個字串在內(nèi)存中佔用的實際位元組數(shù)等於字串的長度加一。因為在每個字串的最後都存放一個“空字元”,其ASCII碼值為0,它的轉(zhuǎn)義字元是“\0”。它起著字串結(jié)束標記的作用。2.5變數(shù)說明與初始化
2.5.1變數(shù)說明(定義)在C程式中,變數(shù)在引用前,必須先進行說明,C語言的編譯系統(tǒng)將根據(jù)變數(shù)說明,給變數(shù)分配相應(yīng)的存儲空間。變數(shù)說明語句的一般格式是:
數(shù)據(jù)類型變數(shù)名列表;例如,下麵是一些變數(shù)說明(定義)語句:
intm,n,k;unsignedintum;doubled1,d2;charch;floatf;2.5.2變數(shù)的初始化在對變數(shù)進行定義的同時給變數(shù)賦值稱為變數(shù)的初始化。變數(shù)初始化的一般格式如下:變數(shù)類型變數(shù)名1=常量1,變數(shù)名2=常量2,……;
變數(shù)的初始化是在程式運行到該變數(shù)所在的函數(shù)時進行的。變數(shù)初始化:
floatfnum=12.12;
實際上相當於執(zhí)行下麵的兩條語句:
floatfnum;fnum=12.12;一般情況下,如果變數(shù)在程式中沒有初始化,則在賦值之前,它的值是不確定的,因此,程式中在引用某變數(shù)之前,該變數(shù)應(yīng)該初始化或賦值。以後我們還會介紹,在某些情況下,沒有初始化的變數(shù)的初始值可以是確定的。2.6.1運算符
運算符也稱操作符,是一種表示對數(shù)據(jù)進行何種運算處理的符號。運算的對象(數(shù)據(jù))稱為運算元。每個運算符代表某種運算功能,每種運算功能有自己的運算規(guī)則,如運算的優(yōu)先順序、結(jié)合性、運算對象類型和個數(shù),以及運算結(jié)果的數(shù)據(jù)類型都有明確的規(guī)定。2.6運算符和運算式
C語言的基本運算符有以下幾大類:算術(shù)運算符;邏輯運算符;關(guān)係運算符;位運算符;賦值運算符;條件運算符;逗號運算符;數(shù)據(jù)長度運算符。除了這些基本運算符外,還有一些專門用途的運算符,如:指針運算符;改變優(yōu)先順序運算符;成員運算符;下標運算符;其他。2.6.2運算式用運算符把運算對象連接起來所組成的運算式,在C語言中叫做運算式。對運算式進行運算所得到的結(jié)果,稱為運算式的值。表2.6.1給出了C語言的各種運算符、名稱、優(yōu)先順序和結(jié)合性。
優(yōu)先級運算符運算符名稱結(jié)合性1()[]->.圓括號數(shù)組下標運算符指向結(jié)構(gòu)指針成員運算符取結(jié)構(gòu)成員->(自左向右)2!~++??-*&sizeof邏輯非反碼(按位取反)加一(自加)減一(自減)取負取地址的內(nèi)容(指針運算)取地址取位元組數(shù)<-(自右向左)表2.6.13*/%乘運算除運算模運算
->4+-加運算減運算->
5<<>>左移右移->6<<=>>=小於小於等於大於大於等於
->優(yōu)先級運算符運算符名稱結(jié)合性7==!=等於不等於->8&按位邏輯與->9^按位邏輯加(異或)->10|按位邏輯或->11&&邏輯與->12||邏輯或->續(xù)表13?:條件運算<-14=+=?=*=/=%=>>=<<=&=^=|=賦值運算自反賦值(複合賦值)<-15,逗號運算(順序求值)->運算式的值的數(shù)據(jù)類型,因運算對象的不同而不同。歸納起來可分為整型、實型和邏輯型。邏輯型數(shù)據(jù)是只有兩個可能值的數(shù)據(jù),這兩個值是:真和假。在C語言中,真用數(shù)字1表示,假用數(shù)字0表示。因此,邏輯值也可以按整型數(shù)看待。
從構(gòu)成運算式的運算符來看,可以把運算式分成以下幾種。(1)算術(shù)運算式:(2)關(guān)係運算式:(3)邏輯運算式:(4)條件運算式:(5)賦值運算式:(6)逗號運算式:
3.1.1算術(shù)運算符與算術(shù)運算式表3.1.1給出了C語言中算術(shù)運算符及其運算功能。3.1算術(shù)運算符和賦值運算符表3.1.1運算符名稱作用優(yōu)先級結(jié)合性--減1減一運算2<-(從右向左)++加1加一運算-取負取負值*乘乘法3->(從左向右)/除除法%模整除取餘(模運算)+加加法4->-減減法模運算的運算對象(運算元)和運算結(jié)果是整型。模運算符“%”是計算兩個整數(shù)進行整除後的餘數(shù)。運算結(jié)果的符號與被除數(shù)相同。對於除法運算,需要強調(diào)的是,兩個整型數(shù)相除時,結(jié)果為整數(shù),小數(shù)部分丟失。加1運算和減1運算是對變數(shù)進行算術(shù)運算的。變數(shù)可以是整型、字元型、指針型和數(shù)組元素。運算結(jié)果仍為原數(shù)據(jù)類型,並存回原運算對象(變數(shù))。在使用加1和減1運算符時,運算符可以放在運算對象的前面,稱為首碼,也可以放在運算對象的後面,稱為尾碼。
例如:
x++;++x;其運算功能都是:
x=x+1;當加1運算和減1運算出現(xiàn)在運算式中時,首碼和尾碼的功能是不同的。在前綴的情況下,其運算規(guī)則是:先對運算對象(變數(shù))進行加1運算或減1運算;然後,使用加1或減1後的運算值參加運算式的運算。在尾碼的情況下,其運算規(guī)則是:先取運算對象(變數(shù))的值參加運算式的運算,然後進行加1運算或減1運算並存入變數(shù)。3.1.2賦值運算符與賦值運算式
C語言中的賦值運算符可分為兩類:賦值運算符和自反賦值運算符(或稱複合賦值運算符)。賦值運算符為“=”。賦值運算符號的作用是:將賦值運算符右邊運算式的值賦予賦值運算符左邊的變數(shù)。例如:將運算式:
a+2-b*c/6+c%3的值賦給變數(shù)b,則應(yīng)該這樣使用賦值運算符:
b=a+2-b*c/6+c%3用賦值運算符組成的運算式叫做賦值運算式。賦值運算式的一般形式為:
變數(shù)=運算式
賦值運算式的值等於賦值運算符左邊變數(shù)的值,也就是右邊運算式的值。
賦值運算符的結(jié)合性是自右向左的,運算式:
a=b=c=43.1.3自反賦值運算符
自反賦值運算符也稱為複合賦值運算符,它是在賦值運算符前加上某個其他運算符構(gòu)成的運算符。自反賦值運算賦共有10個:與算術(shù)運算符有關(guān)的有5個,與位運算符有關(guān)的有5個。下麵先介紹算術(shù)自反賦值運算符,它們是:+=?=*=/=%=
上述運算符的運用可寫成如下的一般形式:
變數(shù)OP=運算式
例如:
a+=8等效於運算a=a+(8)3.2.1賦值語句電腦程式實質(zhì)上是由語句的序列構(gòu)成的,賦值語句主要用來完成數(shù)據(jù)的加工處理任務(wù)。賦值語句有如下兩種格式:
變數(shù)=運算式;變數(shù)OP=運算式;
3.2賦值語句和注釋語句所有C語句都是以分號結(jié)束的。對於第一種格式的賦值語句,其功能是:計算運算式的值,然後賦予變數(shù)。對於第二種格式的賦值語句,其功能是:將變數(shù)和運算式進行指定的運算後,將獲得的值賦予變數(shù)。3.2.2注釋語句
注釋語句只是為程式加的注解或說明文字,對程式的編譯和執(zhí)行不產(chǎn)生任何影響。注釋語句的格式是:
/*注釋/字元集合*/
或
/*注釋字元集合注釋字元集合*/系統(tǒng)函數(shù)很多,也稱為系統(tǒng)庫函數(shù)。這些庫函數(shù)分別定義在擴展名為“h”的各個系統(tǒng)檔中,這些檔稱為頭檔。要在程式中使用某個系統(tǒng)函數(shù),用戶必須在程式的開頭寫出如下的包含命令:3.3輸入輸出語句
#include"頭檔案名.h"
或
#include"<頭檔案名.h>"本節(jié)介紹4個用於輸入和輸出的系統(tǒng)庫函數(shù),它們是函數(shù)putchar()、getchar()、printf()和scanf()。這些函數(shù)的定義包含在頭檔“stdio.h”中。如果編程時要使用上述的輸入輸出函數(shù),應(yīng)先將該頭檔,用包含命令寫在本程式的開頭:
#include"stdio.h"3.3.1字元輸出函數(shù)putchar()
字元輸出函數(shù)的調(diào)用格式為:
putchar(ch);其中的ch是一整型或字元型函數(shù)參數(shù),它可以是變數(shù),也可以是常量。函數(shù)的功能,是將參數(shù)ch的值,按ASCII碼所對應(yīng)的字元輸出到標準輸出設(shè)備(顯示器)當前游標位置。函數(shù)的返回值是對應(yīng)ch的字元。3.3.2字元輸入函數(shù)getchar()字符輸入函數(shù)的調(diào)用格式為:
getchanr();
它的功能是從標準輸入設(shè)備(鍵盤)上接收一個字符。此函數(shù)沒有參數(shù)。它的返回值就是讀取的字符,因此,可以用一個整型或字符型變量來接收函數(shù)的返回值。例如,有字符型變量ch,則語句:
ch=gechar();
接收輸入的字元並存儲到變數(shù)ch中。 用戶從鍵盤輸入數(shù)據(jù)時,數(shù)據(jù)被送入記憶體中專門開闢的緩衝區(qū)。當程式執(zhí)行上面的輸入語句時,輸入函數(shù)從緩衝區(qū)讀區(qū)數(shù)據(jù)。當緩衝區(qū)空時,等待用戶輸入。用戶輸入數(shù)據(jù)並按回車鍵後,數(shù)據(jù)被送入緩衝區(qū)。例3.3.1putchar()函數(shù)和getchar()函數(shù)的簡單應(yīng)用程式。
#include<stdio.h> /*包含命令*/
main()/*主函數(shù)*/{
inta; /*定義整型變數(shù)a*/charb; /*定義字元型變數(shù)b*/
a=getchar();/*鍵盤輸入字元並存入變數(shù)a*/b=getchar();/*鍵盤輸入字符并存入變量b*/
putchar(a);/*輸出變量a*/putchar('\n');/*輸出變量回車換行*/
putchar(b);/*輸出變數(shù)b*/putchar(getchar());/*輸出從鍵盤輸入的字元*/}程式的第一行,是包含命令,它包含了為使用輸入輸出函數(shù)所需要的頭檔。程式只由一個函數(shù)組成,這個函數(shù)就是main()函數(shù)。函數(shù)體由若干語句組成。第一部分是兩個變數(shù)定義語句,接下來是兩個輸入語句,接受鍵盤的輸入。最後是4個輸出語句。語句“putchar('\n');”是輸出一個回車換行,這裏使用了轉(zhuǎn)義字元'\n'。使後面的輸出從下一行開始。語句
putchar(getchar());
中輸出函數(shù)的參數(shù)是字元輸入函數(shù),也就是以接受的字元作為輸出函數(shù)的參數(shù)。因此,此語句的作用是輸出接受到的字元。如果運行程式時,從鍵盤輸入3個字元“ABC”,則程式的輸出應(yīng)為:
ABC3.3.3格式輸出函數(shù)printf()
格式輸出函數(shù)printf()的調(diào)用格式為:
printf(輸出格式字串,輸出運算式列表);輸出函數(shù)printf()的功能是,以自右向左的順序,依次計算輸出列表中各運算式的值,並按格式字元規(guī)定的輸出格式,將數(shù)據(jù)按輸出運算式列表的順序(自左到右)輸出到標準設(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);}這個程式的輸出如下:1:12342:12343:12687.3251954:0000012687.32525:1.268733e+046:12687.3251967:1.26873251956e+04請讀者根據(jù)程式的輸出格式仔細分析上面的輸出清單,掌握輸出格式的應(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);}我們來分析程式中輸出語句的格式字串,其中包含了3個輸出格式字元“%d”,表示輸出3個十進位整型數(shù)據(jù)。3個輸出格式字元依次分別與輸出運算式表中的a,b,a+b3個運算式相對應(yīng)。在輸出格式字串中還包含有非格式字元:在第一個格式符之前的a=;在第二個格式符之前的b=;在第三個格式符之前的a+b=。這些非格式符是按原樣順序輸出的。根據(jù)以上分析可知,這個程式的輸出,也就是輸出語句的執(zhí)行結(jié)果應(yīng)該是:
a=1,b=2,a+b=33.3.4格式輸入函數(shù)scanf()格式輸入函數(shù)scanf()的一般格式為:
scanf(輸入格式字串,輸入變數(shù)地址表);函數(shù)的功能是接受從鍵盤按輸入格式字串規(guī)定的格式輸入的若干數(shù)據(jù),並按輸入變數(shù)地址表中變數(shù)地址的順序,依次存入對應(yīng)的變數(shù)。實際的輸入輸出過程都是通過記憶體的一個專門緩衝區(qū)實現(xiàn)的。例3.3.4格式輸入輸出函數(shù)使用舉例。下麵的程式要求用戶輸入一些不同類型的數(shù)據(jù),然後輸出。設(shè)要求輸入的數(shù)據(jù)是:
c1='a'i1=123i2=456f1=1.25lx=999dx=1.234我們關(guā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);} 對於輸入語句“scanf("%c%d",&c1,&i1);”,為使變數(shù)c1的值為'a',變數(shù)i1的值為123,可以輸入“a123回車”,或者輸入“a空格123回車”,或者輸入“a回車123回車”。 對於輸入語句“scanf("%d,%f",&i2,&f1);”,為使變數(shù)i2的值為456和變數(shù)f1的值為1.25,必須輸入456,1.25,後跟回車。根據(jù)格式以逗號作為2個數(shù)據(jù)之間的間隔。對於輸入語句“scanf("%8ld%5lf",&lx,&dx);”,為使變數(shù)lx的值為999,變數(shù)dx的值為1.234,可以這樣輸入數(shù)據(jù):999空格1.234。使用空格作為2個數(shù)據(jù)的間隔,是因為變數(shù)lx的格式規(guī)定的寬度大於實際寬度,所以用了空格結(jié)束lx數(shù)據(jù)的輸入。對程式中3條輸出語句,請讀者自己來分析。最後,上面程式的輸出為:
a1234561.2500009991.234000例3.3.5應(yīng)用數(shù)據(jù)寬度格式字元的例子。設(shè)有語句:
scanf("%3d%4d",&a,&b);如果輸入1234567給變數(shù)a和變數(shù)b,它們的值分別是什麼呢?格式輸入函數(shù)會自動根據(jù)格式“%3d%4d”,為變數(shù)a截取3位數(shù)據(jù),即123;為變數(shù)b截取4位數(shù)據(jù),即4567。所以,這個語句執(zhí)行後有: a=123b=4567
例3.3.6從鍵盤輸入3個字元的程式。用scanf()語句輸入3個字元給3個變數(shù)時,3個字元一般要連續(xù)輸入,中間不要使用空格或回車,因為空格和回車都會作為字元輸入並賦給相應(yīng)的變數(shù)。程式如下:
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後按回車以結(jié)束輸入。3.4順序結(jié)構(gòu)程式設(shè)計
順序結(jié)構(gòu)的特點是順序地、依次地執(zhí)行程式中語句序列。在程式的運行過程中,每條語句都必定執(zhí)行一次,並且只能是執(zhí)行一次。順序結(jié)構(gòu)的流程圖如第1章圖1.1(a)所示。這一節(jié)將分析幾個順序結(jié)構(gòu)的程式例題,從中學(xué)習(xí)簡單順序結(jié)構(gòu)程式的設(shè)計方法。例3.4.1設(shè)計計算方程:ax2+bx+c=0的實根的程式。已知該方程式滿足條件:b2?4ac>0。 一般程式設(shè)計的步驟不外乎輸入原始數(shù)據(jù),對問題求解和輸出結(jié)果這樣一個過程。數(shù)據(jù)的輸入和輸出,可以很容易地通過相應(yīng)的函數(shù)來完成。剩下的核心問題是求解題目的方法。有了方法,編程就比較容易了。也就是要有一個演算法來解決編程的問題。對於本例題,解該方程的演算法就是公式:
在上面的公式中有一個開平方的運算。在C語言的運算符中是沒有開方運算的,這可以使用系統(tǒng)提供的開平方函數(shù)sqrt()。這個函數(shù)的參數(shù)是雙精度型的被開平方的數(shù)據(jù)(變數(shù)或常量),函數(shù)返回的是參數(shù)的平方根。Sqrt()函數(shù)定義在頭檔math.h,所以在程式中應(yīng)該有相應(yīng)的包含命令。
描述演算法的一個很好的工具就是流程圖。根據(jù)流程圖寫程式,則要容易得多。對於非常簡單的程式,一般不需要流程圖,作為練習(xí),圖3.1給出本例題的流程圖。根據(jù)流程圖寫出程式如下:
#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使兩個變數(shù)的值進行相互交換的程式。設(shè)有兩個變數(shù)a和b,我們的問題是,將變數(shù)a的值賦給變數(shù)b,變數(shù)b的值賦給變數(shù)a。程式的過程還是不外乎:輸入a和b原始數(shù)據(jù),數(shù)據(jù)處理(交換a、b的值),輸出結(jié)果(交換後a、b的值)。輸入和輸出大家都很熟悉。問題是怎樣實現(xiàn)兩個數(shù)據(jù)的交換。一個可能的方法是這樣。定義一個類型與變數(shù)a和b相同的變數(shù)temp,通過變數(shù)temp進行數(shù)據(jù)交換,其步驟如下:(1)變數(shù)a的數(shù)據(jù)送入變數(shù)temp;(2)變數(shù)b的數(shù)據(jù)賦予變數(shù)a;(3)變數(shù)temp的數(shù)據(jù)送入變數(shù)b。圖3.2顯示了上述數(shù)據(jù)交換過程。程式如下:#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è)計一個求4位正整數(shù)中各位數(shù)字的和的程式。問題的關(guān)鍵是如何將一整數(shù)x的個、十、百、千位的數(shù)字分離出來,這是本問題演算法的核心。下麵介紹一種簡單演算法。x%10的模運算的結(jié)果就是所求的個位數(shù),然後,用x/10的整除運算,使十位數(shù)出現(xiàn)在個位上,再通過模運算得到十位數(shù)。如此計算下去,求得百位和千位數(shù)。具體計算步驟如下:第一步,x%10得到x的個位數(shù),存入變數(shù)x1;第二步,x=x/10,x%10得到x的十位數(shù),存入變數(shù)x2;第三步,x=x/10,x%10得到x的百位數(shù),存入變數(shù)x3;
第四步,x=x/10,x%10得到x的千位數(shù),存入變數(shù)x4;第五步,各位數(shù)字的和:x1+x2+x3+x4。有了上述算法,再在此算法前加上輸入數(shù)據(jù)x的操作,演算法後加上輸出計算結(jié)果的操作,就是解決本例題的完整演算法了。根據(jù)上述演算法的描述,可寫出下麵的程式:#include"stdio.h"main(){intx,sum; /*定義變量:分別存儲原始數(shù)據(jù)和各位數(shù)的和*/
intx1,x2,x3,x4; /*定義變數(shù):分別存儲整數(shù)x的個、十、百、千、位數(shù)*/
scanf("%d",&x);/*輸入原始數(shù)據(jù)x*/
關(guān)係運算符是用來確定一個量與另一個量之間的關(guān)係,
C語言提供六種關(guān)係運算符。4.1
關(guān)係運算符及關(guān)係運算運算式
關(guān)係運算的結(jié)果是一個邏輯值。邏輯值是一種只有兩個值的量:真和假。關(guān)係運算的結(jié)果成立,或者說為真(true),則運算結(jié)果為1,也就是用1表示真。比較的結(jié)果不成立,或者說為假(false),則運算結(jié)果為0,也就是用0表示假。例如,關(guān)係運算:10>100 顯然是不成立的,運算式的值為假,實際存儲的數(shù)字為0。例4.1.1設(shè)有變數(shù)定義:
inta=90,b=80;計算下麵關(guān)係運算運算式的值:
a>b>=1<=0==1!=0
按照關(guān)係運算符的優(yōu)先順序和結(jié)合性,上面運算式的運算順序相當於
((((a>b>)=1)<=0)==1)!=0運算式的值為0。上式的運算過程可以用圖4.1來說明。 例4.1.2下麵的程式應(yīng)用關(guān)係運算符判斷用戶輸入的兩個整型變數(shù)數(shù)是否相等,並將比較的結(jié)果輸出。程式如下:
/*Thisprogramillustratestherelationaloperators.*/#include"stdio.h"main(){
intnum1,num2; /*定義變數(shù)*/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(用戶從鍵盤輸入22)
num1=2num2=2result=1 邏輯運算符用於支持基本邏輯運算。三種邏輯運算符及其意義,如表4.2.1所示。4.2邏輯運算符及邏輯運算式
表4.2.1邏輯運算符名稱優(yōu)先級結(jié)合性!邏輯非2<-(自右向左)&&邏輯與11->(自左向右)||邏輯或12邏輯運算是對邏輯量或運算式進行運算的。邏輯運算的對象可以是數(shù)值型的、字元型的,也可以是邏輯量。C語言規(guī)定,邏輯運算的運算對象為0時,代表邏輯量假;運算對象為非0時,代表邏輯量真。邏輯運算的結(jié)果仍是邏輯量:真或假。
例4.2.1分析下麵運算式的值是什麼?
25>5&&!(8>7)||2<=10
根據(jù)上述的關(guān)係運算和邏輯運算的意義以及運算符的優(yōu)先順序,不難知道該運算式的值為真。這可以從圖4.3清楚地看出。
例4.2.2設(shè)有如下變數(shù)定義:
charch='A';/*ch的值是65*/
intk1=65,k2=97;計算下面表達式的值:
k1+32==k1&&k2==ch
上式的計算過程相當於:
((k1+32)==k2)&&(k1==ch)第一步運算k1+32=97;第二步運算97==k2結(jié)果為真;第三步運算k1==ch結(jié)果為真;第四步運算1&&1結(jié)果為真;所以,整個運算式的值為1(真)。例4.2.3編寫程式,求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)於邏輯運算,有一點要特別說注意:當對兩個運算式進行邏輯與運算時,若前一個運算式的值為假,則不再進行後一個運算式的計算,整個運算式的值肯定為假。同樣,當對兩個運算式進行邏輯或運算時,若前一個運算式的值為真,整個運算式的值肯定為真,也不再進行後一個運算式的計算。例如,運算式10>12&&(a=a+1)中前一個運算式的值為0(假),整個運算式的值為0,不進行後面運算式“a=a+1”的計算,a的值保持不變。又如,表達10<121||(a=a+1)中前一個運算式的值為1(真),整個運算式的值為0,不進行後面運算式“a=a+1”的計算,a的值保持不變。4.3選擇語句
選擇語句是用於構(gòu)造選擇程式結(jié)構(gòu)的語句。4.3.1單分支if選擇語句單分支if選擇語句是形式最簡單的if條件轉(zhuǎn)移語句,它的格式如下:
if(運算式)語句;本語句的功能是,首先計算“運算式”的值,如果運算式的值為真,則執(zhí)行“語句”,否則不執(zhí)行,而是轉(zhuǎn)去執(zhí)行本語句後面的語句。單分支if語句的流程圖如圖4.4所示。圖4.4單分支if語句的流程if語句中表達式可以任何類型的C運算式。其中語句也可以是任何語句,包括另一個if語句(稱嵌套if語句);也可以是由若干語句組成的一個組語句。在這種情況下,這組語句需要用花括弧“{}”括起來。
例4.3.1編寫程式,求輸入的整數(shù)的絕對值並將其輸出。整個程式的思路可歸結(jié)為以下三步:(1)輸入整數(shù)a;(2)求a的絕對值並存入a;(3)輸出a。求a的絕對值的簡單方法就是:如果a是負數(shù),再對它取一次負就變?yōu)檎龜?shù)了。按照這個思路,不難寫出如下的程式:
#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選擇語句if_else語句的格式為:
if(運算式)語句1;
else語句2;
語句的功能是,首先計算運算式的值,如果為真,則執(zhí)行語句(塊)1,否則執(zhí)行else後面的語句(塊)2。上述功能如圖4.5所示。圖4.5雙分支if_else選擇語句流程例4.3.2比較用戶輸入的兩個整數(shù)的大小。若輸入的第一個數(shù)大於第二個數(shù),則顯示:
first>second
否則,顯示:
first<=second最後,顯示:
Alldone!顯然,這是一個有兩個分支的程式。用圖4.6的流程圖說明編程的思想。
圖4.6例4.3.2程式的流程圖根據(jù)流程圖可寫出程式如下:#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語句重新編寫例4.3.1的程式??梢岳靡粋€分支處理變數(shù)a為正數(shù)的情況,如令x=a。用另一個分支初處理變數(shù)a為負數(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選擇語句的一個或兩個分支語句中,還包含有if語句,則稱這種結(jié)構(gòu)為“if語句的嵌套”。利用if語句的嵌套,可以構(gòu)成多個分支的選擇結(jié)構(gòu)程式。例4.3.4編寫一程式,進行十進位數(shù)、八進制數(shù)和十六進制數(shù)之間的轉(zhuǎn)換。程式首先給出一個菜單,供用戶選擇所要求的數(shù)制轉(zhuǎn)換。
菜單的形式如下:Convert:1:decimaltohexadecimal(十進位數(shù)轉(zhuǎn)換為十六進制數(shù))2:hexadecimaltodecimal(十六進制數(shù)轉(zhuǎn)換為十進位數(shù))3:decimaltooctal(十進位數(shù)轉(zhuǎn)換為八進制數(shù))4:octaltodecimal(八進制數(shù)轉(zhuǎn)換為十進位數(shù))5:octaltohexadecimal(八進制數(shù)轉(zhuǎn)換為十六進制數(shù))6:hexadecimaltooctal(十六進制數(shù)轉(zhuǎn)換為八進制數(shù))並提示用戶輸入數(shù)制轉(zhuǎn)換類型:
Enteryourchoice:
用戶通過輸入數(shù)字(1~6)選定所要轉(zhuǎn)換類型,然後程式提示用戶輸入待轉(zhuǎn)換的數(shù),例如:
Enteradecimalvalue:
輸入數(shù)據(jù)後,程式輸出換算的結(jié)果。根據(jù)題意可知,本程式應(yīng)該有六個分支語句塊分別處理六種不同情況數(shù)制的轉(zhuǎn)換。在每個分支中數(shù)制之間的轉(zhuǎn)換,可通過函數(shù)printf()的格式控制字元實現(xiàn)。十進位數(shù)用格式字元“%d”輸出。八進制數(shù)用格式字元“%o”輸出,十六進制數(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");}我們看到,本程式通過六個if_else_if結(jié)構(gòu)的語句,構(gòu)成了七個分支的多分支程式。根據(jù)if語句的執(zhí)行流程,當?shù)谝粋€if語句的條件(choice==1)為真時,執(zhí)行它後面的語句塊:進行十→十六的轉(zhuǎn)換,輸出結(jié)果後,程式運行結(jié)束。否則,運算式為假時,通過else分支進入第二個if語句。若運算式(choice==2)為真,執(zhí)行它後面的語句塊:進行十六→十的轉(zhuǎn)換,輸出結(jié)果後,程式運行結(jié)束。否則,運算式為假時,跳過它後面的語句塊,執(zhí)行下一個if語句,等等。以此類推,一直執(zhí)行到第六個if語句。如果用戶輸入的數(shù)字不是在1~6中,則執(zhí)行程式最後一行的else語句。下麵是程式的一次運行輸出實例(十進位數(shù)轉(zhuǎn)換為十六進制數(shù))。程式開始運行後顯示采單:
Convert:1:decimaltohexadecimal;2:hexadecimaltodecimal;3:decimaltooctal;4:octaltodecimal;
5:octaltohexadecimal;6:hexadecimaltooctal;Enteryourchoice:1(輸入1)
Enteradecimalvalue:255(輸入255)
輸出如下的計算結(jié)果:
255inhexadecimalisff
一般情況下,只要在一個if語句中包含有另一個if語句就是if語句的嵌套,組成的就是多分支的選擇結(jié)構(gòu)程式。例如,下麵也是一種多分支的選擇結(jié)構(gòu):
if(運算式)
if(運算式){語句}
else{語句}
elseif(運算式){語句}
else{語句}C語言對語句在程式中書寫形式?jīng)]有嚴格的要求。一行可以寫多個語句,也可以把一個語句寫在兩行裏。一個語句可以從一行的頭開始寫,也可以從一行的某個位置開始寫。為了使嵌套結(jié)構(gòu)清楚、醒目並避免產(chǎn)生錯誤的理解,建議各層嵌套的語句採用不同的縮進書寫形式,如上面所寫的那樣。必要時,使用花括弧也會使是程式的嵌套結(jié)構(gòu)顯示得更清晰。例4.3.5分析下麵的多分支語句:
if(a>b)if(b>5)c=0;elsec=1;
在這個語句中含有兩個if和一個else。從語句的書寫形式上,分支結(jié)構(gòu)不是很清楚??赡墚a(chǎn)生兩種不同的理解。第一種理解是:如果(a>b)並(b>5),則執(zhí)行c=0;否則,(a>b)不成立,則執(zhí)行c=1。這種理解是把else與第一個if配為一對。用縮進格式表達上述理解時,可把語句寫成如下的形式:
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與第二個if配對。用縮進格式表達上述理解時,可把語句寫成如下的形式:
if(a>b)if(b>5)c=0;elsec=1;
第一種理解是把else與第一個if配對;第二種理解是把else與第二個if配對。哪種理解是正確的呢?C語言的規(guī)定:在if嵌套語句中,一般從最內(nèi)層開始,else與它前面最近的if配成一對。根據(jù)“else與它前面最近的if配對”的原則,這裏的else應(yīng)該是與第2個if配對,就是第二種理解是合乎C語法規(guī)則的。語句的功能應(yīng)該這樣理解:如果a>b成立,並且b>5,則把0賦給變數(shù)c;如果a>b成立,但b>5不成立,則把1賦給變數(shù)c。如果這不是我們所要表達的意思。我們要表達的是:如果a>b成立,並且b>5,則把0賦給變數(shù)c;如果a>b不成立,則把1賦給變數(shù)c。這時,else要與第一個if配對。我們應(yīng)該這樣寫:
if(a>b){if(b>5)c=0;}elsec=1;
這裏花括弧是必須的。4.3.4多分支開關(guān)語句switch在許多情況下,switch語句非常適合構(gòu)造多分支選擇結(jié)構(gòu)程式。switch語句的一般格式為:
switch(運算式){
case常量運算式1: 語句(塊)1
break;case常量運算式2: 語句(塊)2
break;……case常量運算式n: 語句(塊)n break;default: 語句(塊)n+1}
switch語句的執(zhí)行過程如下:
首先,計算switch後圓括號內(nèi)的運算式的值,然後,用這個值逐個與各case的常量運算式i的值進行比較。當找到與其相等(匹配)的case時,就執(zhí)行該case中的語句(塊)i,如果在語句(塊)i中有break語句,便退出該switch語句。如果沒有break語句,則在執(zhí)行完某個語句(塊)i後,連續(xù)執(zhí)行其後的語句(塊),直到遇上另一個break語句,結(jié)束switch的執(zhí)行,或者一直執(zhí)行到最後的語句(塊),然後,結(jié)束switch語句的執(zhí)行。switch語句的上述功能如圖4.8所示。
圖4.8switch語句的流程例4.3.6分析下麵應(yīng)用switch語句程式的輸出。
#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語句,退出switch,程式結(jié)束)輸入2,則程式輸出:case2(執(zhí)行break語句,退出switch,程式結(jié)束)輸入3,則程式輸出:case3(沒有break語句,連續(xù)執(zhí)行下後邊的case)輸入3,則程式輸出:case4(執(zhí)行break語句,退出switch,程式結(jié)束)
輸入4,則程式輸出:case4(執(zhí)行break語句,退出switch,程式結(jié)束)輸入1~4以外的數(shù),如6,則程式輸出:default(退出switch,程式結(jié)束)。
4.4選擇結(jié)構(gòu)程式設(shè)計
本節(jié)將通過一些例題,進一步練習(xí)選擇結(jié)構(gòu)程式的編程技術(shù)。例4.4.1用戶從鍵盤輸入三個整數(shù),找出並輸出其中數(shù)值最大的那一個。如果其中有一個以上的最大數(shù)(兩數(shù)相等的情況),也要表示出來。因為程式要多次進行兩個數(shù)的大小比較才能找出其中的最大值,所以這是一個多分支的選擇結(jié)構(gòu)的程式。我們要特別注意各語句中if和else的配對關(guān)係和相應(yīng)的縮進書寫形式。程式如下:
#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(程式的輸出)
需要強調(diào)指出的是,任何合法的C運算式都可以作為if語句的條件運算式。運算式中,關(guān)係操作符和邏輯操作符並不是絕對必要的。只要運算式的值是0,就認為條件為假,非0就認為是真。請看下麵的例子。例4.4.2用戶從鍵盤輸入兩個整數(shù),進行除法運算。其中變數(shù)dividend是被除數(shù),divider是除數(shù),result是商。要求當除數(shù)(divider)為0時,輸出資訊“Can'tdividedbyzero.”,不進行計算。如果除數(shù)不為0,則進行除法運算並輸出計算結(jié)果。程式中用
if(divider)判斷除數(shù)是否是0。這裏運算式divider不是什麼關(guān)係運算式,也不是邏輯運算式,甚至也不是算術(shù)運算式。就是由一個變數(shù)組成的運算式。但是利用0代表假,非0代表真這一規(guī)則,因此,可以用作if語句的判斷條件。程式如下:#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.");}
當然,也可以把上面程式中的if(divider)寫成下麵的關(guān)係運算式的形式:
if(divider!=0)
但這種形式不如前一種形式更為簡單。
在if語句的條件運算式中也可以出現(xiàn)賦值運算式,如if(x=y)。但不要與相等的比較運算(x==y)相混淆。前者是賦值運算式,後者是關(guān)係運算式。請看下麵的例子。例4.4.3判斷兩整型數(shù)的和是否小於0的程式。程式中使用了如下的if語句:
if((z=x+y)<0)其中的z=x+y是賦值運算式。它與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語句中的一個任選的分支,在語句中是可用可不用部分。但是,使用它可能產(chǎn)生很好的效果。在實踐中,它一般用在處理不能與所有的case相匹配的情況。例如,鍵盤輸入錯誤的數(shù)字,則在找不到匹配case後,便執(zhí)
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 執(zhí)行案件代理合同(2篇)
- 八年級上冊道德與法治第二單元 遵守社會規(guī)則 復(fù)習(xí)聽課評課記錄
- 冀教版歷史九年級上冊第2課《古代印度文明》聽課評課記錄
- 新版(修訂版)北師大版小學(xué)五年級數(shù)學(xué)下冊聽評課記錄精寫
- 蘇科版數(shù)學(xué)八年級上冊4.3《實數(shù)》聽評課記錄2
- 湘教版數(shù)學(xué)七年級上冊《2.5整式的加法和減法(1)》聽評課記錄5
- 蘇教版數(shù)學(xué)九年級上冊聽評課記錄《2-1圓(2)》
- 蘇科版數(shù)學(xué)八年級上冊《4.2 立方根》聽評課記錄
- 華師大版歷史九年級上冊第6課《古希臘羅馬文化》聽課評課記錄
- 人民版道德與法治七年級上冊5.1《心中有他人》聽課評課記錄
- 2024年山東省煙臺市初中學(xué)業(yè)水平考試地理試卷含答案
- 2024-2030年中國高油酸花生油市場供需趨勢與營銷推廣渠道分析研究報告
- GB/T 44717-2024民用無人機可靠性飛行試驗要求與方法
- 抗腫瘤治療所致惡心嘔吐護理
- 2024年廣東省中考地理試題(含解析)
- 西安經(jīng)濟技術(shù)開發(fā)區(qū)管委會招聘考試真題
- 冀教版小學(xué)英語六年級下冊全冊教案
- 2024人工智能開源大模型生態(tài)體系研究報告
- 2024年中考語文復(fù)習(xí)分類必刷:非連續(xù)性文本閱讀(含答案解析)
- DL∕T 974-2018 帶電作業(yè)用工具庫房
- 緊密型縣域醫(yī)療衛(wèi)生共同體慢病管理中心運行指南試行等15個指南
評論
0/150
提交評論