《C程序設(shè)計(jì)》課件第3章_第1頁
《C程序設(shè)計(jì)》課件第3章_第2頁
《C程序設(shè)計(jì)》課件第3章_第3頁
《C程序設(shè)計(jì)》課件第3章_第4頁
《C程序設(shè)計(jì)》課件第3章_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第三章C程序設(shè)計(jì)初步3.1結(jié)構(gòu)化程序設(shè)計(jì)思想3.2C語句概述3.3賦值語句3.4數(shù)據(jù)輸出3.5數(shù)據(jù)輸入3.6程序設(shè)計(jì)舉例習(xí)題3.1結(jié)構(gòu)化程序設(shè)計(jì)思想3.1.1程序的質(zhì)量標(biāo)準(zhǔn)要設(shè)計(jì)出好的程序,必須先搞懂什么樣的程序才是好程序?在計(jì)算機(jī)發(fā)展初期,由于計(jì)算機(jī)硬件價(jià)格比較貴,內(nèi)存容量和運(yùn)算速度都受到一定的限制,當(dāng)時(shí)程序質(zhì)量的高低取決于程序所占內(nèi)存容量的大小和運(yùn)行時(shí)間的長短。但是現(xiàn)在計(jì)算機(jī)經(jīng)過迅猛的發(fā)展,除了一些特殊場合,計(jì)算機(jī)內(nèi)存容量和運(yùn)算速度在編寫一般程序時(shí),已不成問題。現(xiàn)在已沒有必要為了節(jié)約很少的內(nèi)存和運(yùn)算時(shí)間而采取使人難以理解的技巧了。一個(gè)難以理解的程序,如果作為“產(chǎn)品”推廣出去,所有的用戶都要花費(fèi)大量的時(shí)間、精力去理解和消化它。而且在一個(gè)軟件產(chǎn)品的使用期間往往需要修改和維護(hù)它(例如發(fā)現(xiàn)程序中的某些錯(cuò)誤;增加一些新的功能;或者將程序移植到不同的計(jì)算機(jī)系統(tǒng)上……),這時(shí)程序的可讀性和可維護(hù)性就變得越來越重要了。3.1.2結(jié)構(gòu)化程序設(shè)計(jì)方法在程序設(shè)計(jì)初期,程序設(shè)計(jì)是手工業(yè)式的,每個(gè)人都采取自己認(rèn)為好的技巧,根據(jù)自己的風(fēng)格來設(shè)計(jì)程序,沒有公認(rèn)的規(guī)范。人們沒有約定地使用各種不同的方法和技巧,只要符合語言規(guī)則,程序能得到正確的結(jié)果就可以了。這樣的程序過分依賴程序員的技術(shù)和素質(zhì),質(zhì)量難以保證。正如用手工方式和大生產(chǎn)方式制造汽車一樣,后者必然較前者更容易制造出規(guī)格統(tǒng)一,質(zhì)量穩(wěn)定的汽車,因?yàn)橹圃煺唠m各種各樣,但每個(gè)人的每道工序都必須嚴(yán)格地按照操作規(guī)程進(jìn)行操作。以上就是軟件工程的觀點(diǎn),即把軟件的生產(chǎn)也看做一項(xiàng)“工程”,嚴(yán)格地規(guī)范,按照規(guī)定的步驟逐步展開。結(jié)構(gòu)化程序設(shè)計(jì)方法就是根據(jù)這一思想而提出來的。所謂結(jié)構(gòu)化程序設(shè)計(jì)就是要求程序設(shè)計(jì)者按一定的規(guī)范書寫程序,而不能隨心所欲地設(shè)計(jì)程序。應(yīng)能按照“工程化”生產(chǎn)方法來組織軟件生產(chǎn),每個(gè)人都必須按照同一規(guī)則、同一方法進(jìn)行工作,使生產(chǎn)的軟件有統(tǒng)一的標(biāo)準(zhǔn)、統(tǒng)一的風(fēng)格,成為“標(biāo)準(zhǔn)產(chǎn)品”,便于推廣,便于生產(chǎn)和維護(hù)。結(jié)構(gòu)化程序設(shè)計(jì)方法的核心有二:

(1)一個(gè)大的程序開發(fā)應(yīng)當(dāng)采取“自頂向下,逐步細(xì)化,模塊化”的方法。

(2)任何程序均由具有良好特性的三種基本模塊(順序、分支、循環(huán))“堆積”搭成,即由基本小單元順序組成一個(gè)大結(jié)構(gòu),從而避免了使用goto語句的缺點(diǎn)。goto語句的隨意跳轉(zhuǎn),使程序轉(zhuǎn)來轉(zhuǎn)去難以理解。goto語句非常容易使程序脫離結(jié)構(gòu)化程序設(shè)計(jì)的軌道,故goto語句是結(jié)構(gòu)化程序設(shè)計(jì)的大敵,除一些特殊情況外應(yīng)盡可能少用。采用結(jié)構(gòu)化程序設(shè)計(jì)方法設(shè)計(jì)程序時(shí),是一個(gè)結(jié)構(gòu)一個(gè)結(jié)構(gòu)地寫下來,整個(gè)程序結(jié)構(gòu)如同一串珠子一樣次序清楚,層次分明。在修改程序時(shí),可以將某一基本結(jié)構(gòu)單獨(dú)取出來進(jìn)行修改,而不致于過大地影響到其余部分。3.1.3結(jié)構(gòu)化程序的標(biāo)準(zhǔn)采用結(jié)構(gòu)化程序設(shè)計(jì)方法編制的程序從基本模塊到整個(gè)程序,都必須滿足結(jié)構(gòu)化程序的標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)簡述如下:

(1)程序符合“清晰第一,效率第二”的質(zhì)量標(biāo)準(zhǔn)。

(2)具有良好的特性。由“模塊”串成而無隨意的跳轉(zhuǎn),不論模塊大小,均應(yīng)滿足:①只有一個(gè)入口。②只有一個(gè)出口(有些分支結(jié)構(gòu)很容易寫成多個(gè)出口)。③無死語句(永遠(yuǎn)執(zhí)行不到的語句),也就是說,結(jié)構(gòu)中的每一部分都應(yīng)當(dāng)有執(zhí)行到的機(jī)會(huì),即每一部分都應(yīng)當(dāng)有一條從入口到出口的路徑通過它(至少一次)。④沒有死循環(huán)(永遠(yuǎn)執(zhí)行不完的無終止的循環(huán))。已經(jīng)證明,順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)即是具有以上特點(diǎn)的良好結(jié)構(gòu),并且由這三種結(jié)構(gòu)所構(gòu)成的程序可以處理任何復(fù)雜的問題。一個(gè)結(jié)構(gòu)化程序是由具有以上特點(diǎn)的基本結(jié)構(gòu)組成的。也就是說,一個(gè)結(jié)構(gòu)化程序不僅本身具有如上特性,而且也必定能分解為三種基本結(jié)構(gòu)的模塊。3.1.4三種基本模塊在結(jié)構(gòu)化程序設(shè)計(jì)方法中,模塊是一個(gè)基本概念。一個(gè)模塊可以是一條語句、一個(gè)程序段或一個(gè)函數(shù)。一個(gè)程序模塊在流程圖中用一個(gè)矩形框來表示。按照結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn),任何功能的程序都可以通過三種基本結(jié)構(gòu)的組合來實(shí)現(xiàn)。這三種基本結(jié)構(gòu)是:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。

1.順序結(jié)構(gòu)順序結(jié)構(gòu)由兩個(gè)程序模塊串接構(gòu)成,如圖3.1所示。圖3.1順序結(jié)構(gòu)圖3.1中(a)是用傳統(tǒng)流程圖方法表示,(b)是用結(jié)構(gòu)化流程圖方法表示。它們都可合并成一個(gè)新的程序模塊(c)。由圖中可以看出,這兩個(gè)程序模塊是順序執(zhí)行的,即先執(zhí)行程序模塊A,然后執(zhí)行程序模塊B。我們把它們合并成一個(gè)新程序模塊。通過這種方法,我們可以將許多順序執(zhí)行的語句合并成一個(gè)比較大的程序模塊。但無論怎樣合并,生成的新程序模塊仍然是一個(gè)整體,只能從模塊的頂部(入口)進(jìn)入模塊,執(zhí)行模塊中的語句,執(zhí)行完模塊中的所有語句之后,再從模塊的底部(出口)退出模塊,這是程序模塊的基本性質(zhì)。

2.分支結(jié)構(gòu)不是所有的程序都可用順序結(jié)構(gòu)表示的,當(dāng)根據(jù)邏輯條件成立與否,分別選擇執(zhí)行不同的程序模塊時(shí),我們引入了分支結(jié)構(gòu),也稱為選擇結(jié)構(gòu)。圖3.2中(a)是用改進(jìn)的傳統(tǒng)流程圖方法表示,(b)是用結(jié)構(gòu)化流程圖方法表示,它們都可合并成一個(gè)新的程序模塊(c)。當(dāng)邏輯條件為“真”時(shí),執(zhí)行程序模塊A,然后執(zhí)行下一程序模塊,否則當(dāng)邏輯條件為“假”時(shí),執(zhí)行程序模塊B,然后執(zhí)行下一程序模塊。在分支結(jié)構(gòu)中也只有一個(gè)入口,一個(gè)出口(下一程序模塊)。程序模塊A和B都應(yīng)該有機(jī)會(huì)執(zhí)行到。在實(shí)際應(yīng)用中也可能某一個(gè)程序模塊為空,這也是允許的。一個(gè)分支結(jié)構(gòu)最后可看成一個(gè)新程序模塊,故對傳統(tǒng)流程圖(可用流程線隨意跳轉(zhuǎn))的改進(jìn)是將一個(gè)基本的模塊用虛線框起來,使之更符合結(jié)構(gòu)化的程序設(shè)計(jì)。圖3.2分支結(jié)構(gòu)

3.循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)分成兩種情形:一種是當(dāng)型循環(huán),如圖3.3所示,當(dāng)型循環(huán)是當(dāng)條件滿足時(shí)執(zhí)行程序模塊,執(zhí)行完后再去判斷條件,一直到條件不成立時(shí)退出循環(huán);另一種是直到型循環(huán),如圖3.4所示,直到型循環(huán)是先執(zhí)行程序模塊,然后去判斷條件,如條件成立則返回繼續(xù)執(zhí)行程序模塊,直到條件不成立時(shí)退出循環(huán)。圖3.3當(dāng)型循環(huán)結(jié)構(gòu)圖3.4直到型循環(huán)結(jié)構(gòu)與順序結(jié)構(gòu)和分支結(jié)構(gòu)一樣,循環(huán)結(jié)構(gòu)也可抽象為一個(gè)新的程序模塊。一個(gè)大程序可看作做一個(gè)程序模塊,它可以由若干個(gè)模塊順序構(gòu)成,而最小的程序模塊又必然是上述三種基本結(jié)構(gòu)之一。這樣一個(gè)大問題就可以細(xì)分為若干個(gè)小問題,逐步細(xì)化至最小模塊時(shí)就可以由相應(yīng)的語句實(shí)現(xiàn)了。這就是“自頂向下,逐步細(xì)化,模塊化”的程序設(shè)計(jì)方法。3.2

C語句概述

C語言是函數(shù)式語言,每一個(gè)函數(shù)是由數(shù)據(jù)說明部分和執(zhí)行語句部分組成的。C語言中的所有語句均是執(zhí)行語句,沒有非執(zhí)行語句。根據(jù)C語言的句法,語句可分為單個(gè)語句、復(fù)合語句和空語句。根據(jù)結(jié)構(gòu)化程序設(shè)計(jì)的三個(gè)模塊大致可分為:用于順序結(jié)構(gòu)中的表達(dá)式語句、賦值語句、函數(shù)調(diào)用語句等;用于分支結(jié)構(gòu)中的if語句、switch語句、轉(zhuǎn)移語句、標(biāo)號語句等;用于循環(huán)結(jié)構(gòu)中的while語句、for語句、do-while語句。另外在后兩種結(jié)構(gòu)中還可出現(xiàn)break語句、continue語句、復(fù)合語句和空語句等。有關(guān)各類的語句說明如下:

(1)邏輯上每個(gè)語句最后都必須有一個(gè)分號(;),一個(gè)語句可分寫成幾行,幾個(gè)語句也可合寫成一行(但不提倡,因其不利于單步調(diào)試)。

(2)空語句直接由分號(;)組成,常用于控制語句中必須出現(xiàn)語句之處,它不做任何操作,只在邏輯上起到有一個(gè)語句的作用。

(3)復(fù)合語句由花括號{}括起的若干個(gè)語句組成,語法上可以看成是一個(gè)語句。復(fù)合語句中最后一個(gè)語句的分號不能省略。如下面是一個(gè)復(fù)合語句:

{z=x+y;

y=x/z;

x=z-y;

}注意:一對{}在同一列上下對齊,代表一個(gè)層次。這種寫法利于程序的閱讀和調(diào)試。

(4)表達(dá)式語句是在各種表達(dá)式后加一個(gè)分號(;)形成一個(gè)語句。如賦值語句由賦值表達(dá)式加一個(gè)分號構(gòu)成:

x=x+y;再如表達(dá)式x++后加一個(gè)分號構(gòu)成表達(dá)式語句:

x++;表達(dá)式和表達(dá)式語句的區(qū)別是表達(dá)式后無分號,可以出現(xiàn)在其它語句中允許出現(xiàn)表達(dá)式的地方;而表達(dá)式語句后有分號,自己獨(dú)立成一個(gè)語句,不能再出現(xiàn)在其它語句的表達(dá)式中。如:

if((a=b)<0)min=a;式中(a=b)為賦值表達(dá)式,出現(xiàn)在if語句的邏輯表達(dá)式中,如寫成:

if((a=b;)<0)min=a;編譯時(shí)將出現(xiàn)語法錯(cuò)誤。表達(dá)式能構(gòu)成語句是C語言的一個(gè)特色。

(5)控制語句有條件判斷語句(if、switch)、循環(huán)語句(for、while、do-while)和轉(zhuǎn)移語句(goto、continue、break、return),我們將在第四、五、六章中分別介紹。3.3賦值語句賦值語句是由賦值表達(dá)式加上一個(gè)分號構(gòu)成的。如“x=a+b;”。C語言的賦值語句具有其它高級語言中賦值語句的一切特點(diǎn)和功能,也有C語言自己的特色:

(1)C語言中賦值號“=”作為賦值運(yùn)算符。

(2)其它高級語言沒有賦值表達(dá)式這個(gè)概念。C的賦值表達(dá)式可以出現(xiàn)在其它表達(dá)式能出現(xiàn)的地方,也可出現(xiàn)在其它表達(dá)式之中。例如:

if((x=a+b)!=0)t=10;此語句先執(zhí)行了a+b的和賦給變量x,賦值表達(dá)式的值為x的值,當(dāng)x不等于0時(shí),將10賦給變量t。而在其它語言中,必須分成兩句來寫,即寫成:

x=a+b;

if(x!=0)t=10;

C的這種表達(dá)是基于其無真正的邏輯量,而用零和非零表示邏輯值。當(dāng)(x=a+b)!=0成立時(shí),條件滿足,為“真”,而C語言中非零也為“真”,所以可寫成“if(x=a+b)t=10;”,此時(shí)將賦值的結(jié)果x的值認(rèn)為是邏輯值,不管a+b算出是幾,只要是非零,條件就算成立。初學(xué)者可能會(huì)感到有些別扭,但熟悉之后,這種表示方法既靈活,又使程序非常簡練,是C語言的特色之一,但書寫上一定要注意,如寫成“if(x=a+b;)t=10;”就錯(cuò)了。因?yàn)闂l件語句中條件部分只能是一表達(dá)式而不能是一個(gè)語句。當(dāng)然此條件語句與“if(x==a+b)t=10;”也是不一樣的。二者雖在語法上都正確,但條件的含義不一樣,后者是x與a+b相比較,二者相等時(shí)才算條件成立。將關(guān)系符“==”少寫一個(gè)等號變成賦值符“=”會(huì)導(dǎo)致程序結(jié)果出錯(cuò),編譯時(shí)卻能無錯(cuò)通過,這是初學(xué)者非常易犯的錯(cuò)誤,切記!3.4數(shù)據(jù)輸出數(shù)據(jù)輸出是要把計(jì)算機(jī)內(nèi)存中的某些數(shù)據(jù)送到外部設(shè)備上去,如送到屏幕顯示器、打印機(jī)等等。我們最常用的是要把數(shù)據(jù)送到stdout這個(gè)文字流去,它是和標(biāo)準(zhǔn)輸出設(shè)備屏幕顯示器相連的。下面我們介紹幾個(gè)標(biāo)準(zhǔn)輸出庫函數(shù)。它們都是將數(shù)據(jù)送到顯示器上。3.4.1putchar()函數(shù)(字符輸出函數(shù))函數(shù)調(diào)用形式:

charch;

putchar(ch);

putchar()函數(shù)在顯示屏上輸出括號內(nèi)字符變量ch所代表的字符;括號內(nèi)也可以是字符常量;ch還可以是整型變量,此時(shí)僅輸出低字節(jié)所代表的字符。在使用標(biāo)準(zhǔn)輸入/輸出函數(shù)時(shí),在程序的頭部要使用文件包含命令:

#include<stdio.h>

例3.1

字符數(shù)據(jù)的輸出。

#include<stdio.h>

voidmain()

{

chara,b;

a=′b′;b=′o′;

putchar(a);putchar(b);

putchar(′y′);putchar(′\n′);

}經(jīng)編譯后運(yùn)行,在屏幕上顯示:

boy3.4.2printf()函數(shù)(格式輸出函數(shù))

putchar()函數(shù)僅能輸出一個(gè)字符,當(dāng)要輸出具有某種格式的數(shù)據(jù)(如實(shí)型數(shù)、八進(jìn)制等各種進(jìn)制整數(shù))時(shí),就要使用格式輸出函數(shù)printf()了。函數(shù)的調(diào)用形式:

printf("控制字符串",參量表);其中參量表是要輸出的變量、常量、表達(dá)式等,參量表中參數(shù)的個(gè)數(shù)是0個(gè)到若干個(gè),當(dāng)超過一個(gè)時(shí),用逗號分隔。“控制字符串”由兩種不同類型的內(nèi)容組成。第一類是一些字符,函數(shù)將它們原樣輸出到屏幕上,同樣地,它們還可以是轉(zhuǎn)義字符。第二類是格式說明,它們定義參量的顯示格式,一個(gè)參量需要一個(gè)對應(yīng)的格式說明。格式說明的開頭帶有一個(gè)百分號(%),后面是一個(gè)類型字符。例如:

printf("Theoutputx=%d\n",x);若x=10,則輸出為“Theoutputx=10”。

printf()的格式說明如表3.1所示。表3.1printf()的格式說明一個(gè)格式說明還可以帶有幾個(gè)修飾項(xiàng),用來確定顯示寬度、小數(shù)位數(shù)及左端對齊等。修飾符有m,.n,-,l(小寫L)等,下面具體說明:

(1)%md表示輸出十進(jìn)制整數(shù),最小寬度為m位,即輸出字段的寬度至少占m列。右對齊,少于m位則在數(shù)據(jù)左端補(bǔ)空格或0到m位;超過m位則m不起作用,即突破m的限制,按數(shù)據(jù)的實(shí)際位數(shù)輸出,保證數(shù)據(jù)的正確性。數(shù)據(jù)前要補(bǔ)0,則在m前面加個(gè)0,例如:

%05d輸出12為00012;

%5d輸出12為┗┛┗┛┗┛12;

%5d輸出-123456為-123456。類似地還有%mc,%mo,%mx,%mu,%ms等。

(2)%m.nf表示輸出數(shù)據(jù)為小數(shù)形式,m為總寬度(包括小數(shù)點(diǎn)),n為小數(shù)部分位數(shù),小數(shù)長度不夠則補(bǔ)0;小數(shù)部分超過n位,則n+1位向n位四舍五入,整個(gè)數(shù)據(jù)小于m位左補(bǔ)空;超過m位,則m不起作用。當(dāng)m省略時(shí),則m等于n。例如:

%10.4f輸出123.45為┗┛┗┛┗┛

123.4500;

%10.2f輸出123.456為┗┛┗┛┗┛┗┛

123.46;

%4.2f輸出-123.45為-123.45;

%.2f輸出123.456為123.46。類似地有%m.ne,%m.ng,其中e格式小數(shù)部分取n位(包括e在內(nèi)),全部長度取m位。

(3)當(dāng)%m.n后是字符串格式說明符s,m仍是總寬度,但當(dāng)實(shí)際位數(shù)超過時(shí)不突破,多余者被刪除,n表示只取字符串中左端的n位,n<m時(shí),左邊補(bǔ)空格;n>m時(shí),m自動(dòng)取n值,保證n位字段的正常輸出。例如:

%7.3s輸出"12345"為┗┛┗┛┗┛┗┛

123;

%7.3s輸出"12345678"為┗┛┗┛┗┛┗┛

123;

%5.7s輸出"12345678"為1234567。

(4)-表示左對齊格式,如沒有則為右對齊格式,它出現(xiàn)在%后面。例如:

%-10.2f輸出123.456為123.46┗┛┗┛┗┛┗┛;

%-5d輸出12為12┗┛┗┛┗┛┗┛

(5)l在輸出d,i,o,u,x等整型量時(shí),在其前加上l表示輸出的是一個(gè)長整型數(shù);在e,f,g等實(shí)型量前加l表示輸出的是一個(gè)雙精度實(shí)型數(shù)??刂谱址梢粚﹄p引號括起來。對于printf()函數(shù)還有如下說明(具體細(xì)節(jié)比較繁瑣,建議讀者上機(jī)體會(huì),利于掌握):

(1)數(shù)據(jù)的格式轉(zhuǎn)換按前面不同類型賦值的方法進(jìn)行轉(zhuǎn)換。如一個(gè)整數(shù)可用%d,%o,%x,%u,%c來輸出。例如:

inti=123;printf("decimal_i=%d,octo_i=%o,hex_i=%x,unsigned_i=%u,ascii_i=%c\n",i,i,i,i,i);輸出為:

decimal_i=123,octo_i=173,hex_i=7b,

unsigned_i=123,ascii_i={其中逗號為分隔符,在雙引號內(nèi)為普通字符,原樣輸出,173是123的八進(jìn)制數(shù),7b是123的十六進(jìn)制數(shù),′{′的ASCII碼是123,按%c是輸出該碼的字符,\n是回車換行。

(2)一個(gè)字符可用%c或%d來輸出,而一個(gè)字符串要用%s來輸出。例如:

char

ch=′a′;

printf("%c,%d,%s\n",ch,ch,"abcd");輸出為:

a,97,abcd一個(gè)字符按%c是輸出其字符,而按%d是輸出其ASCII碼值。由于字符串最后一定有截止符′\0′,因此字符串輸出會(huì)自動(dòng)結(jié)束,但′\0′是不輸出的。

(3)一個(gè)實(shí)數(shù)可以按%f和%e來輸出,如按%f輸出,則能輸出全部整數(shù),并保留6位小數(shù),但有效位數(shù)只有前5位。如按%e輸出,則系統(tǒng)自動(dòng)給出6位小數(shù),小數(shù)點(diǎn)前有一位非零整數(shù),后跟一個(gè)e,指數(shù)的正、負(fù)號占1位,數(shù)值部分占2位(這是TurboC的輸出格式)。例如:

floatx=123.456;

printf("%f,%e\n",x,x);輸出為:

123.455994,1.23456e+02

例3.2

不同類型數(shù)據(jù)的輸出。程序:

#include<stdio.h>

voidmain()

{

inta=-2;

floatb=123.456;

charc=′a′;

printf("a=%3d,%o,%x,%u\n",a,a,a,a);

printf(“b=%10.2f,%.2f

┗┛┗┛

%-10.2f\n",b,b,b);

printf("c=\′%3c\′,\′%-3c\′\n",c,c);

printf("%3s,%7.2s,%.3s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA");

}運(yùn)行結(jié)果:

a=┗┛

-2,177776,fffe,65534

b=┗┛┗┛┗┛┗┛123.46,123.46┗┛┗┛123.46

c=′┗┛┗┛a′,′a┗┛┗┛′CHINACH,CHI,CHI┗┛┗┛

例3.3

無符號十進(jìn)制格式的輸出。程序:

#include<stdio.h>

voidmain()

{

inti=-1;

printf("%d,%u\n",i,i);

}運(yùn)行結(jié)果:-1,655353.4.3puts()函數(shù)(字符串輸出函數(shù))字符串除了在printf()函數(shù)中用%s格式輸出外,標(biāo)準(zhǔn)輸入/輸出庫中還提供了一個(gè)字符串輸出函數(shù)puts()。函數(shù)的原型是:

char*puts(char*s)函數(shù)值和參數(shù)都是字符指針,這在學(xué)習(xí)指針后就能理解了。該函數(shù)的調(diào)用形式是:

puts(字符串?dāng)?shù)據(jù));

puts()函數(shù)將字符串?dāng)?shù)據(jù)(可以是字符串常量、字符指針或字符數(shù)組名)寫在屏幕上并換行。它比使用printf()函數(shù)帶來的冗余操作少,它僅用來輸出一字符串,不能輸出數(shù)值也不能進(jìn)行格式變換。也可使用反斜杠“\”控制符輸出轉(zhuǎn)義字符。該函數(shù)返回一個(gè)指向該字符串首址的指針。在使用puts()函數(shù)前應(yīng)加上文件包含命令:

#include<stdio.h>例:puts("hello");輸出為:

hello3.5數(shù)據(jù)輸入數(shù)據(jù)輸入是要把計(jì)算機(jī)外部設(shè)備的某些數(shù)據(jù)送到計(jì)算機(jī)內(nèi)存中。如從鍵盤、磁盤文件等設(shè)備讀入。最常用的控制臺(tái)(鍵盤)上的數(shù)據(jù)形成了stdin文字流,我們再通過標(biāo)準(zhǔn)輸入函數(shù)讀到內(nèi)存中。下面我們介紹幾個(gè)標(biāo)準(zhǔn)輸入庫函數(shù),它們都是從鍵盤上得到數(shù)據(jù)。3.5.1getche()函數(shù)與getchar()和getch()函數(shù)

getche()函數(shù)的調(diào)用形式:

charch;

ch=getche();

getche()用于等待從鍵盤上鍵入一個(gè)字符,返回它的值并在屏幕上自動(dòng)回顯該字符。使用該函數(shù)必須在程序的頭部使用文件包含命令:

#include<conio.h>

例3.4

單個(gè)字符的輸入和輸出。程序:

#include<conio.h>

#include<stdio.h>

voidmain()

{

charch;

ch=getche();

putchar(ch);putchar(′\n′);

}經(jīng)編譯后運(yùn)行,輸入a,最后在屏幕上顯示:

aa其中:第一個(gè)a是鍵盤上輸入系統(tǒng)自動(dòng)回顯的;第二個(gè)a是putchar(ch)輸出的。

getche()有兩個(gè)重要的變體。第一個(gè)是getchar(),它是UNIX系統(tǒng)的字符輸入函數(shù)原型。這個(gè)函數(shù)的缺點(diǎn)是它的輸入緩沖區(qū)一直到鍵入一個(gè)回車符才返回給系統(tǒng)。這樣就可能在getchar()返回之后還留下一些字符在輸入排隊(duì)流中。這個(gè)結(jié)果與現(xiàn)在使用的內(nèi)部環(huán)境很不協(xié)調(diào),所以建議不要使用這個(gè)函數(shù)。getchar()函數(shù)要使用頭部文件<stdio.h>。第二個(gè)變體getch()十分常用,它的作用和getche()基本一致,只是不把讀入的字符回顯在屏幕上??梢岳眠@一點(diǎn)來編程序避免不必要的顯示。例如輸入密碼,用getch()就不回顯。本函數(shù)要使用頭部文件<conio.h>。

例3.5

多個(gè)字符的輸入和輸出。程序:

#include<stdio.h>

#include<conio.h>

voidmain()

{

chara,b,c;

a=getch();b=getch();c=getch();

putchar(a);putchar(b);putchar(c);

putchar(′\n′);

getch();

}經(jīng)編譯后運(yùn)行,輸入BOY,最后在屏幕上顯示:

BOY(此顯示結(jié)果將停留至有一鍵按下)從鍵盤上輸入的BOY并不回顯,而輸出的BOY是三個(gè)putchar()函數(shù)逐個(gè)輸出的。若將例3.5中的前三個(gè)getch()換成getche(),結(jié)果一樣否?請讀者上機(jī)試之。3.5.2scanf()函數(shù)(格式輸入函數(shù))

getche()函數(shù)僅能從鍵盤上讀入一個(gè)字符,當(dāng)要輸入具有某種格式的數(shù)據(jù)時(shí)(如實(shí)型數(shù)、八進(jìn)制整數(shù)等),就要使用格式輸入函數(shù)scanf()了。

scanf()函數(shù)的調(diào)用形式:

scanf("控制字符串",參量表);如scanf("a,b=%d,%d",&a,&b);即要在鍵盤上輸入

a,b=12,-34↙此時(shí)12送給變量a,-34送給變量b,而控制字符串中a,b=和兩個(gè)%d之間的逗號必須原封不動(dòng)照樣輸入。

scanf()函數(shù)括號中的參量表是用來接收數(shù)據(jù)的變量地址,即變量名前加取地址運(yùn)算符&。也就是說,如不加&則為變量名,而在變量名前加&則是變量的地址。當(dāng)超過一個(gè)參量時(shí),用逗號分隔。參量表不能是表達(dá)式。

scanf()函數(shù)括號中的控制字符串包含三類不同的字符內(nèi)容:

(1)格式說明;

(2)空白字符;

(3)非空白字符。格式說明前也是一個(gè)百分號,這個(gè)說明告訴scanf()函數(shù)下一個(gè)將讀入什么類型的數(shù)據(jù)。這些格式說明類似于printf()函數(shù)中的格式說明,如表3.2所示。表3.2scanf()的格式說明在格式控制字符串中的一個(gè)空白字符會(huì)使scanf()函數(shù)在讀操作中略去輸入流中的一個(gè)或多個(gè)空白字符??瞻鬃址梢允强崭?′┗┛′)、制表符(′\t′)或換行符(′\n′)。例如:

scanf("%d┗┛%d",&a,&b);輸入“123┗┛┗┛┗┛456↙”,此時(shí)變量a得到值123,變量b得到值456。由于控制字符串中有一個(gè)空格,因此要略去輸入流中的一個(gè)或多個(gè)(現(xiàn)為三個(gè))空白字符(現(xiàn)為空格)。這些空白字符被讀入,但是不存儲(chǔ)它們,遇到非空白字符(包括0在內(nèi))才存儲(chǔ)起來。一個(gè)非空白字符會(huì)使scanf()函數(shù)在讀入時(shí)剔除與這個(gè)非空白字符相同的字符。例如:

scanf("%d,%d",&a,&b);輸入“123,456↙”,此時(shí)變量a為123,變量b為456。此時(shí)逗號被讀入,但不存儲(chǔ)。在輸入流中必須有這相同的非空白字符,如這特定字符沒有找到,scanf()函數(shù)就終止了。例如:

scanf("%d,%d",&a,&b);輸入“123;456↙”,此時(shí)變量a為123,而控制字符串中的特定字符逗號沒找到(輸入為分號),輸入函數(shù)就終止了,結(jié)果變量b未得到任何值。當(dāng)輸入多個(gè)數(shù)據(jù)項(xiàng)時(shí),有兩種分隔方式:第一種控制字符串格式說明符之間有空白字符或無任何間隔,輸入數(shù)據(jù)必須用空格、制表符或回車來分隔,此時(shí)標(biāo)點(diǎn)符號(如逗號、分號、引號等)不能作為分隔符使用;第二種在數(shù)據(jù)之間使用與控制字符串之間相同的非空白字符(常用逗號)。例如:

scanf("%d┗┛%d",&a,&b);或

scanf("%d%d",&a,&b);在輸入時(shí)可以用

12┗┛23↙也可以用

12↙

23↙但不能是

12,23↙又如:

scanf("a=%d,b=%d",&a,&b);在輸入時(shí)必須用

a=12,b=23而輸入

12┗┛23↙

a=12┗┛b=23↙就會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。一個(gè)格式說明還可以帶修飾項(xiàng)。用來確定數(shù)據(jù)的最大位數(shù)的修飾符為m,當(dāng)輸入數(shù)據(jù)位數(shù)少于該數(shù)(即遇空白字符或非法字符)表示該數(shù)據(jù)輸入結(jié)束;當(dāng)輸入數(shù)據(jù)位數(shù)多于該數(shù),則只讀入該數(shù)所表示的位數(shù),多余數(shù)據(jù)將作為下一個(gè)數(shù)據(jù)讀入其它變量。例如:

scanf("%3d%3d",&a,&b);輸入“12345↙”,則a變量得到123,b變量得到45(遇回車)。又如:輸入“1┗┛2345↙”,則a變量得到1(遇空格)而不是12或102,b變量得到234。一個(gè)格式說明中出現(xiàn)“*”修飾符時(shí),表示讀入一個(gè)該類型的數(shù)據(jù)并不存儲(chǔ)(即跳過該數(shù)據(jù))。例如:

scanf("%d%*c%d",&a,&b);輸入“12/23↙”,則變量a得到12(遇非空白字符),而字符/由于%*c而被忽略(不存儲(chǔ),因此也不必有參數(shù)與其對應(yīng)),變量b得到23。在格式說明符d,o,x前加修飾符l表示輸入長整型數(shù),而格式說明符f,e前加修飾符l表示輸入雙精度實(shí)型數(shù)。

說明:

(1)scanf()函數(shù)中各格式說明符在個(gè)數(shù)和順序及類型上與參量表中的變量必須一一對應(yīng)。

(2)雖然空格,制表符和換行符可作為數(shù)據(jù)的分隔符使用,但在讀入單個(gè)字符且格式說明符為%c時(shí),它們也被當(dāng)作其它單個(gè)字符一樣被讀入。例如,輸入流為x┗┛y時(shí),

scanf("%c%c%c",&a,&b,&c);則返回值x給變量a,空格給變量b,y給變量c。所有字符(包括轉(zhuǎn)義字符)都可以作為字符輸入。

(3)格式說明符%s是讀入字符串的格式說明,在輸入字符串時(shí)必須以空白字符結(jié)束。而參量表內(nèi)必須是字符數(shù)組名或字符指針,在使用字符數(shù)組名或指針名時(shí),前面不必加&,因?yàn)閿?shù)組名是數(shù)組存儲(chǔ)的起始地址,指針內(nèi)放的也是地址。

(4)輸入實(shí)數(shù)時(shí)不能規(guī)定精度。例如“scanf("%4.1f",&f);”是非法的,不能企圖輸入12.1。3.5.3

gets()函數(shù)(字符串輸入函數(shù))字符串除了在scanf函數(shù)中用%s格式輸入外,標(biāo)準(zhǔn)輸入/輸出庫中還提供了一個(gè)字符串輸入函數(shù)gets()。函數(shù)的原型是:

char*gets(char*s);其中s是一個(gè)字符數(shù)組或有存儲(chǔ)空間的字符指針。

gets()函數(shù)用來從鍵盤讀入一串字符,并把它們送到gets()函數(shù)中的字符數(shù)組成字符型指針?biāo)付ǖ刂返拇鎯?chǔ)單元中。在輸入字符串后,必須用回車作為輸入結(jié)束,該回車符并不屬于這串字符,由一個(gè)“空操作字符(′\0′)”在串的最后來代替它。此時(shí)空格不能結(jié)束字符串的輸入。gets()函數(shù)返回一個(gè)指針。例3.6

字符串的輸入和輸出。程序:

#include<stdio.h>

voidmain()

{

charstr[80];

gets(str);

puts(str);

}運(yùn)算結(jié)果:

ABCDEF↙ABCDEF輸入以回車結(jié)束,第二個(gè)字符串是把str字符數(shù)組中的內(nèi)容在顯示器上輸出。3.6程序設(shè)計(jì)舉例

例3.7

輸入一個(gè)小寫字母,按大寫輸出。程序一:

#include<stdio.h>

#include<conio.h>

voidmain()

{

charch;

ch=getche();

putchar(ch-32);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論