第2章數(shù)據(jù)描述_第1頁(yè)
第2章數(shù)據(jù)描述_第2頁(yè)
第2章數(shù)據(jù)描述_第3頁(yè)
第2章數(shù)據(jù)描述_第4頁(yè)
第2章數(shù)據(jù)描述_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C 語(yǔ) 言數(shù)據(jù)類型基 本數(shù)據(jù)類型導(dǎo) 出數(shù)據(jù)類型double(雙精度浮點(diǎn)型)long(長(zhǎng)整型)char(字符類型)整 型short(短整型)int(整型)浮點(diǎn)型float(單精度浮點(diǎn)型)long double(長(zhǎng)雙精度浮點(diǎn)型)void類型用戶定制類型T*(指針類型)struct(結(jié)構(gòu)體類型)union(共用體類型)文件類型enum(枚舉)函數(shù)類型構(gòu)造類型T(數(shù)組類型) C語(yǔ)言提供的基本數(shù)據(jù)類型包括char(字符)型、int(整)型、float(單精度實(shí))型、double(雙精度實(shí))型。并且還可以通過使用short、long、signed和unsigned修飾char和int,用long修飾dou

2、ble,形成更多的類型。 定點(diǎn)表示和浮點(diǎn)表示,是C語(yǔ)言基本數(shù)據(jù)類型的重要特征。為了說明什么是“定點(diǎn)”,什么是“浮點(diǎn)”,先看值的幾種表示形式: 日常的表示法 C語(yǔ)言中的表示形式3.14159100 3.14159e00.3141591010. 314159e+10.03141591020.0314159e+231.415910-131.4159e-13141.5910-33141.59e-33 . 1 4 1 5 9+1數(shù)值部分(尾數(shù))指數(shù)(階碼) 內(nèi)存中的數(shù)值是以補(bǔ)碼形式存放的,一個(gè)正數(shù)的補(bǔ)碼就是該數(shù)的二進(jìn)制數(shù)(如10的補(bǔ)碼為00000000 00001010)。求一個(gè)負(fù)數(shù)的補(bǔ)碼的方法如下:如

3、-10的補(bǔ)碼可以這樣求: 先取該數(shù)的絕對(duì)值;先取10 然后以二進(jìn)制形式表示;10的二進(jìn)制碼為00000000 00001010 再對(duì)其取反;取反得11111111 11110101 然后加1;加1,得11111111 11110110,即-10的16位存儲(chǔ)形式為:11111111 11110110。 C語(yǔ)言對(duì)不同類型的數(shù)據(jù)分配不同寬度的存儲(chǔ)空間,典型的存儲(chǔ)空間寬度有:1個(gè)字節(jié)(8位)、2個(gè)字節(jié)(16位)、4個(gè)字節(jié)(32位)、8個(gè)字節(jié)(64位)和10個(gè)字節(jié)(80位)幾種。顯然,不同的長(zhǎng)度,對(duì)應(yīng)的數(shù)據(jù)的取值范圍是不同的。當(dāng)然,同樣長(zhǎng)度的取值范圍還與有無符號(hào)、是定點(diǎn)表示(整型)還是浮點(diǎn)表示(實(shí)型)有

4、關(guān)。另外還取決于所用的編譯系統(tǒng)。大多數(shù)編譯系統(tǒng)對(duì)一個(gè)帶符號(hào)整數(shù)的數(shù)值范圍處理為:-2n-1 2n-1-1。其中n為該整數(shù)所占的比特?cái)?shù)。如果一個(gè)整數(shù)所占的比特?cái)?shù)為16,則該想整數(shù)的苑圍為-32 767 32 767。也有一些編譯系統(tǒng)對(duì)一個(gè)帶符號(hào)整數(shù)的數(shù)值范圍處理為:-(2n-1 1) 2n-1-1。如果一個(gè)整數(shù)所占的比特?cái)?shù)為16,則該想整數(shù)的苑圍為-32 768 32 768。數(shù)據(jù)長(zhǎng)度(比特)取值范圍Signed (有符號(hào))Unsigned (無符號(hào))8-127 1270 25516-32 767 32 7670 65 53532-2 147 483 647 2 147 483 6470 4 2

5、94 967 29564-(263-1) 263-10 264-1(18 446 744 073 709 551 615)寬度(比特)數(shù)據(jù)類型機(jī)內(nèi)表示(位數(shù))取值范圍有效數(shù)字和精度階碼尾數(shù)符號(hào)32float 8231|3.4e-38| |3.4e+38|大約7位十進(jìn)制有效數(shù)字,7位精度64double11521|1.7e-308| |1.7e+308|16或17位十進(jìn)制有效數(shù)字,7位精度80long double由具體實(shí)現(xiàn)確定|1.2e-4932| |1.2e+4932|18位十進(jìn)制有效數(shù)字,7位精度 C語(yǔ)言提供了一個(gè)測(cè)定某一種類型數(shù)據(jù)所占存儲(chǔ)空間長(zhǎng)度的運(yùn)算符“sizeof”它的格式為: si

6、zeof (類型標(biāo)識(shí)符或數(shù)據(jù)) 當(dāng)不了解所使用的編譯器中的某數(shù)據(jù)類型的寬度時(shí),可以使用這個(gè)運(yùn)算符計(jì)算之。例2.1 用sizeof運(yùn)算符測(cè)定所用的C系統(tǒng)中各種類型數(shù)據(jù)的長(zhǎng)度。/* 文件名:ex020101.c */* 測(cè)定數(shù)據(jù)類型長(zhǎng)度 */#include int main(void)int i = 0;printf (char: %d bytes.n,sizeof(char);printf (short: %d bytes.n,sizeof(short);printf (i: %d bytesn,sizeof (i); /* 計(jì)算變量i的字節(jié)數(shù)*/printf (long: %d bytesn

7、,sizeof(long);printf (float: %d bytesn,sizeof(float);printf (double: %d bytesn,sizeof(double);printf (1.23456: %d bytesn,sizeof(1.23456); /* 計(jì)算常量的字節(jié)數(shù)*/printf (double: %d bytesn,sizeof(double);return 0; 2.2.1 整型常量整數(shù)常量的三種進(jìn)制 在C語(yǔ)言中,整型常量可以使用十進(jìn)制數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)等幾種形式書寫。C語(yǔ)言規(guī)定,程序中凡出現(xiàn)以數(shù)字0開頭的數(shù)字序列,一律作為八進(jìn)制數(shù)處理;凡出現(xiàn)以0

8、x開頭,后面跟若干位數(shù)字的,一律作為十六進(jìn)制數(shù)處理;其它數(shù)字作為十進(jìn)制數(shù)處理。 5121(十進(jìn)制正整數(shù))0111(八進(jìn)制正整數(shù),等于十進(jìn)制數(shù)73)010007(八進(jìn)制正整數(shù),等于十進(jìn)制數(shù)4103)0177777(八進(jìn)制正整數(shù),等于十進(jìn)制65537)0XFFFF(十六進(jìn)制正整數(shù),等于十進(jìn)制數(shù)65537)0 xA3(十六進(jìn)制正整數(shù),等于十進(jìn)制數(shù)163)-32768(十進(jìn)制負(fù)整數(shù))09876(非十進(jìn)制數(shù),又非八進(jìn)制數(shù),因?yàn)橛袛?shù)字8和9)20fa(非十進(jìn)制數(shù),又非十六進(jìn)制數(shù),因?yàn)椴皇且? x開頭)0 x10fg(出現(xiàn)了非法字符) 在C語(yǔ)言中整數(shù)可以進(jìn)一步分為short、int、long和long lo

9、gn等類型。那么,對(duì)于一個(gè)常數(shù)如何分辨其類型呢?一般說來,有以下原則: 1)默認(rèn)原則:在沒有任何特別標(biāo)志的情況下,可以按照常數(shù)所在的范圍,決定其類型。例如,在16位的機(jī)器中,當(dāng)一個(gè)常整數(shù)的值在十進(jìn)制-3276832767(八進(jìn)制數(shù)00177777、十六制數(shù)0 x00 xFFFF),則被看作一個(gè)short int或int型整數(shù)。超出上述范圍的整常數(shù),則被看作長(zhǎng)整數(shù)(32位)表示。例如,234、32766、0177776、0 xFFFE等被看作是int型,而-32769、32768、0200000、0 x10000等被看作是long型。 2)后綴字母標(biāo)識(shí)法: 用L或l表示long類型整數(shù)。 用LL

10、或ll表示long long類型整數(shù)。 用U或u表示unsigned類型。 例如:-12L(十進(jìn)制long整數(shù))-12LL(十進(jìn)制long long整數(shù))774545L(十進(jìn)制long整數(shù))076L(八進(jìn)制long整數(shù),等于十進(jìn)制數(shù)32768)0100000L(八進(jìn)制long整數(shù),等于十進(jìn)制62)0 x12l(十六進(jìn)制long整數(shù),等于十進(jìn)制數(shù)18)0X8000l(十六進(jìn)制long整數(shù),等于十進(jìn)制數(shù)32768)12345u(十進(jìn)制unsigned int類型)12345UL(十進(jìn)制unsigned long類型)在16位字長(zhǎng)的機(jī)器中,一旦把一個(gè)常數(shù)表示成long整數(shù),系統(tǒng)便將其存儲(chǔ)空間擴(kuò)充為4

11、個(gè)字節(jié)。從值的大小上看,12L與12沒有區(qū)別,但它們占用的存儲(chǔ)空間不相同 1. 可打印字符 字符類型的數(shù)據(jù)在內(nèi)存中以相應(yīng)的ASCII代碼存放。例如,a的ASCII碼為97,則在內(nèi)存中的二進(jìn)制存儲(chǔ)形式為:01100001。例2.2/* 文件名:ex020201.c */#include int main(void)char ch;/* 定義了一個(gè)字符類型的變量ch */ch = a;printf (%d,ch);/* 使用整型格式碼 */return 0;運(yùn)行結(jié)果為:97例2.3/* 文件名:ex020301.c */#include int main(void)char ch;int i;ch

12、 = A;ch = ch + 32;i = ch;printf (%d is %cn,i,ch);/* 注意格式碼 */printf(%c is %dn,ch,ch); /* 注意格式碼 */return 0;運(yùn)行結(jié)果如下:97 is aa is 97例2.4/* 文件名:ex020401.c */#include int main(void)char c;c = 0362;printf (%dn, c);return 0;運(yùn)行結(jié)果:-14 ASCII字符分為可打印字符和不可打印字符兩種。在C語(yǔ)言程序中,可打印字符常量是用一對(duì)單撇號(hào)括起來的一個(gè)字符,如a,A,?,。需要注意如下幾點(diǎn): 單撇號(hào)只

13、是字符與其它部分的分隔符,或者說是字符常量的定界符,不是字符常量的一部分,當(dāng)輸出一個(gè)字符常量時(shí)不輸出此撇號(hào)。 不能用雙引號(hào)代替撇號(hào),如a不是字符常量。 撇號(hào)中的字符不能是單撇號(hào)或反斜杠,如或不是合法的字符常量。 轉(zhuǎn)義字符(反斜杠碼)是C語(yǔ)言提供的處理一些特殊字符(包括一些不可打印字符)方法。重要有如下一些: 用反斜杠開頭后面跟一個(gè)字母代表一個(gè)控制字符(不可打印字符); 用代表字符“”,用代表撇號(hào)字符; 用后跟1到3個(gè)八進(jìn)制數(shù)代表ASCII碼為該八進(jìn)制數(shù)的字符; 用x后跟1到2個(gè)十六進(jìn)制數(shù)代表ASCII碼為該十六進(jìn)制數(shù)的字符。轉(zhuǎn)義字符形式意 義n換行t水平制表v垂直制表b退格r回車f走紙換頁(yè)a報(bào)

14、警(如鈴聲)反斜杠?問號(hào)“雙撇號(hào)單撇號(hào)ddd13位八進(jìn)制常數(shù)xhh12位十六進(jìn)制常數(shù)例2.5/* 文件名:ex020501.c */*打印人民幣符號(hào)¥*/#include int main(void)printf(Yb=n);return 0; 該程序運(yùn)行時(shí)先打印一個(gè)字符“Y”。這時(shí)打印頭已走到下一個(gè)位置,用控制代碼b使打印頭回退一格,即回到原先已打印好的Y位置再打印字符“=”,兩字符重迭形成人民幣符號(hào)“¥”。當(dāng)然,這一輸出只能在打印機(jī)上實(shí)現(xiàn),而不能在顯示器上實(shí)現(xiàn)。因?yàn)轱@示器無此重迭顯示功能(在顯示后一字符時(shí)原在該位置上的字符消失)。 轉(zhuǎn)義字符除用來形成一個(gè)外設(shè)控制命令外,還用來輸出不能直接從

15、鍵盤上輸入或不能用字符常量書寫出的ASCII字符。這時(shí)要在反斜杠后跟一個(gè)代碼值,這個(gè)代碼值最多用三位八進(jìn)制碼數(shù)(不加前綴)或兩位十六進(jìn)制數(shù)(以x作前綴)表示。例2.6/* 文件名:ex020601.c */#include int main(void)char ch;ch=362;/*將八進(jìn)制數(shù)362的ASCII字符賦給ch*/printf (%c,ch);return 0;上運(yùn)行可在顯示屏上輸出:在C語(yǔ)言中,把用一對(duì)雙撇號(hào)括起來的零個(gè)或多個(gè)字符序列稱為字符串常數(shù)。如:hello, Programming in C ,A , a , 等。字符串以雙撇號(hào)為定界符,但雙撇號(hào)并不屬于字符串。要在字符

16、串中插入撇號(hào),應(yīng)借助轉(zhuǎn)義字符。例如要處理字符串I say: Goodby!時(shí),可以把它寫為I say: Goodby!字符串中的字符數(shù)稱為該字符串的長(zhǎng)度。字符串常數(shù)在機(jī)器內(nèi)存儲(chǔ)時(shí),系統(tǒng)自動(dòng)在字符串的末尾加一個(gè)“字符串結(jié)束標(biāo)志”,它是轉(zhuǎn)義字符“0”。如字符串“hello”在內(nèi)存中存儲(chǔ)為:hello0C語(yǔ)言中的實(shí)型(浮點(diǎn))數(shù)據(jù)常量用帶小數(shù)點(diǎn)和小數(shù)分量的形式表示,如12.345,也可以用科學(xué)記數(shù)法表示。C語(yǔ)言將實(shí)型數(shù)據(jù)分為:float、double和long double三種類型,并且默認(rèn)的實(shí)型數(shù)據(jù)是double類型的。因此,對(duì)于帶小數(shù)點(diǎn)的常量,C語(yǔ)言編譯器會(huì)將之作為double類型看待。如果要特別

17、說明某帶小數(shù)點(diǎn)的常量是float類型或long double類型,可以使用后綴字母: 用f或F表示float類型,如123.45f 1.2345e+2F. 用l或L表示long double類型,如1234.5l 1.2345E+3L。使用科學(xué)記數(shù)法(指數(shù)形式)時(shí),要求e的左邊必須有數(shù)值部分(有效數(shù)字),可以是整數(shù),也可以是小數(shù)形式;指數(shù)必須是整數(shù)形式。例如,e5、2e1.23、.e5等都是不合法的。前面介紹的常量都是直接常量,從字面上即可直接看出它們的值是什么,因此又稱“字面常量”。符號(hào)常量則是在一個(gè)程序(或程序的一部分)中指定的用名字代表的常量,從字面上不能直接看出其類型和值。例2.7 求

18、圓面積和周長(zhǎng)的兩個(gè)程序。程序1:/* 文件名:ex020701.c */* 計(jì)算圓的周長(zhǎng)和面積 */#include double calcuArea (double r);double calcuCircumference (double r);int main(void)printf (area=%f, calcuArea (2.0);printf (tcircumference=% fn, calcuCircum (2.0);return 0;double calcuArea(double r) /* 計(jì)算圓面積 */return (3.141592654* r* r);double c

19、alcuCircum(double r) /* 計(jì)算圓周長(zhǎng) */return (2.0* 3.141592654* r):運(yùn)行結(jié)果為:area = 12.566371 circumference = 12.566371程序2:/* 文件名:ex020702.c */* 計(jì)算圓的周長(zhǎng)和面積 */#include define PI 3.141592654 /*定義符號(hào)常數(shù)*/define R 2.0double calcuArea(double r),;double calcuCircum(double r);int main(void)printf (area=%f, area (R);pri

20、ntf (tcircumference=%fn, circumference (R);return 0; double calcuArea(double r)return (PI* r* r) double calcuCircum(double r)return (2.0* PI* r); 程序2的運(yùn)行結(jié)果與程序1完全相同。程序2中PI代替3.141592654,用R代替20,使程序更容易理解,可讀性好,而且當(dāng)需要修改R的值時(shí)只需要改一處即可,方便又不易出錯(cuò)。定義符號(hào)常量的一種方法是使用define命令,它是一種“預(yù)編譯命令”,在編譯整個(gè)程序之前系統(tǒng)會(huì)先對(duì)程序中的預(yù)編譯命令進(jìn)行處理。上面def

21、ine命令的作用是在預(yù)編譯時(shí)將程序中凡出現(xiàn)PI的地方全部以3.141592654代替,凡出現(xiàn)R的地方一律以2.0代替。 在下列情況下,C語(yǔ)言編譯器,可能將數(shù)據(jù)從一種類型轉(zhuǎn)換成另一種類型:(1)顯式轉(zhuǎn)換:使用轉(zhuǎn)換表達(dá)式。(2)隱式轉(zhuǎn)換,包括: 當(dāng)二元運(yùn)算符兩端的操作數(shù)類型不同時(shí)進(jìn)行的轉(zhuǎn)換; 函數(shù)參數(shù)傳遞中的數(shù)據(jù)類型轉(zhuǎn)換; 函數(shù)返回時(shí)的數(shù)據(jù)類型轉(zhuǎn)換; 其他情形。數(shù)據(jù)類型的提升與降格提升可以分為如下3類情況:(1)類型提升:由整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)。(2)整數(shù)提升:由短整數(shù)類型轉(zhuǎn)換為長(zhǎng)整數(shù)類型。(3)同一長(zhǎng)度的整數(shù)有符號(hào)與不有符號(hào)的,屬于同一級(jí)別。例2.8 分析下面程序的執(zhí)行結(jié)果。/* 文件名:ex020

22、801.c */#include int main(void)unsigned short us1 = 32767, us2 = 65535, us;signed short ss = -7; us = ss;printf(1)ss = %d, us = %dn,ss,us);ss = us1;printf(2)us1 = %d, ss = %dn,us1,ss);ss = us2;printf(3)us2 = %d, ss = %dn,us2,ss);return 0;程序執(zhí)行結(jié)果如下:(1)ss = -7, us = 65529(2)us1 = 32767, ss = 32767(3)us

23、2 = 65535, ss = -1 (1)第1種情形是把一個(gè)有符號(hào)的數(shù)-7(在變量ss中),賦值給無符號(hào)類型的變量us后,存在無符號(hào)變量中的數(shù)據(jù)變成為65529了。這種變化是由于將原來的符號(hào)數(shù)中的符號(hào)變成了無符號(hào)數(shù)中的最高位而產(chǎn)生。如圖2.4所示,當(dāng)一個(gè)-7的16位補(bǔ)碼被當(dāng)作16位無符號(hào)數(shù)時(shí),由于正數(shù)的原碼=補(bǔ)碼,所以1111 1111 1111 1001 = 65535(全1)-110=65529。1000000000000111-7原碼1111111111111001-7補(bǔ)碼1111111111111001無符號(hào)數(shù)類型轉(zhuǎn)換符號(hào)位變最高數(shù)據(jù)位 (2)第2種情形是將一個(gè)一般的unsigned

24、類型數(shù)據(jù)轉(zhuǎn)換成同長(zhǎng)度的signed類型數(shù)據(jù)。在一般情況下,不會(huì)出現(xiàn)數(shù)據(jù)的錯(cuò)誤。但是在第3種情形卻出現(xiàn)了錯(cuò)誤。這是因?yàn)楫?dāng)無符號(hào)數(shù)較小,其最高位為0時(shí),轉(zhuǎn)換成符號(hào)數(shù)后,最高位雖然被當(dāng)作了符號(hào)位,但并沒有影響數(shù)據(jù)的有效值。而如果無符號(hào)數(shù)大到使最高位為1,則轉(zhuǎn)換成有符號(hào)數(shù)后,被當(dāng)成了負(fù)數(shù)的補(bǔ)碼。于是,出現(xiàn)數(shù)據(jù)錯(cuò)誤。 1111111111111111有符號(hào)數(shù)據(jù)補(bǔ)碼1111111111111111無符號(hào)數(shù)65535類型轉(zhuǎn)換1000000000000001有符號(hào)數(shù)據(jù)原碼最高位變符號(hào)位 當(dāng)一個(gè)實(shí)數(shù)(浮點(diǎn)數(shù))轉(zhuǎn)換為整數(shù)時(shí),實(shí)數(shù)的小數(shù)部分全部舍去,并按整數(shù)形式存儲(chǔ)。例如將實(shí)數(shù)3276.85賦給一個(gè)整型變量i,i的

25、值為3276。但應(yīng)注意,實(shí)數(shù)的整數(shù)部分不要超過整型數(shù)允許的最大范圍(微機(jī)上為-3276832767),否則數(shù)據(jù)出錯(cuò)。 當(dāng)由double型轉(zhuǎn)換為float型時(shí),去掉多余的有效數(shù)字,但按四舍五入處理。 四舍五入會(huì)丟失一些精度,截去小數(shù)也會(huì)丟失一些精度。此外,由long型轉(zhuǎn)換成float或double型時(shí),有可能在存儲(chǔ)時(shí)不能準(zhǔn)確地表示該長(zhǎng)整數(shù)的有效數(shù)字,精度也會(huì)受損失,因?yàn)閒loat型只有7位精度。浮點(diǎn)數(shù)降格時(shí),即double轉(zhuǎn)換為float,或double、float轉(zhuǎn)換成long int、short型。當(dāng)數(shù)據(jù)值超過了目標(biāo)類型的取值范圍時(shí),所得到的結(jié)果將是不確定的(其實(shí)也是有規(guī)律的,只是給出一個(gè)用

26、戶往往難以理解的數(shù)值。例如,將實(shí)數(shù)32768.85賦給16位整型變量i,由于32768超過了16位整數(shù)最大值32767,在內(nèi)存中就把32768存儲(chǔ)為1000000000000000形式,它代表整數(shù)-32768。如果輸出i,得-32768。若將32769.85賦給i,輸出整數(shù)i的值得-32767。這些牽涉到補(bǔ)碼的知識(shí),在此不詳述)。當(dāng)較長(zhǎng)的整數(shù)轉(zhuǎn)換為較短的整數(shù)時(shí),要將高位截去。例如long型為4個(gè)字節(jié),short型為2個(gè)字節(jié),將long型值賦給short類型,只將低字節(jié)內(nèi)容送過去。這就會(huì)有很大誤差,得到的值是原數(shù)據(jù)值以32768為模的余數(shù)。/* 文件名:ex020901.c */#include

27、 int main(void)double a = 123456.789098765;float b;long c;short i,j;b = a; c = a; i = a; j = c;printf (a = %f, b = %f, c = %d, i = %d, j = %dn,a,b,c,i,j);return 0;運(yùn)行結(jié)果如下:a = 123456.789099, b = 123456.789063, c = 123456, i = -7616, j = -7616賦值轉(zhuǎn)換2. 一般表達(dá)式轉(zhuǎn)換 (1)一元轉(zhuǎn)換 操作數(shù)類型標(biāo)準(zhǔn)C語(yǔ)言轉(zhuǎn)換傳統(tǒng)C語(yǔ)言轉(zhuǎn)換float(無轉(zhuǎn)換)double階大

28、于或等于int的整型數(shù)據(jù)(無轉(zhuǎn)換)(無轉(zhuǎn)換)階小于int的有符號(hào)類型數(shù)據(jù)intint階小于int的無符號(hào)類型數(shù)據(jù),所有值可以用int類型表示intunsigned int階小于int的無符號(hào)類型數(shù)據(jù),所有值不可用int類型表示unsigned intunsigned int(2)二元轉(zhuǎn)換按照優(yōu)先級(jí)順序?qū)⒏鞫\(yùn)算符兩端的操作數(shù)提升成同一類型。轉(zhuǎn)換按照下面的算法進(jìn)行。IF(一個(gè)操作數(shù)為long double) 另一個(gè)操作數(shù)轉(zhuǎn)換為long doubleELSE IF(一個(gè)操作數(shù)為double) 另一個(gè)操作數(shù)轉(zhuǎn)換為doubleELSE IF(一個(gè)操作數(shù)為float) 另一個(gè)操作數(shù)轉(zhuǎn)換為floatEL

29、SE IF(一個(gè)操作數(shù)為unsigned long) 另一個(gè)操作數(shù)轉(zhuǎn)換為unsigned longELSE IF(一個(gè)操作數(shù)為long) 另一個(gè)操作數(shù)轉(zhuǎn)換為longELSE IF(一個(gè)操作數(shù)為unsigned) 另一個(gè)操作數(shù)轉(zhuǎn)換為unsignedchar c;int i;float f;double d;int result;result = c * i + f / d - ( f + i);floatintdoubledoubledoubleintdoublefloatd o ubledoubledoubleint 例如,一個(gè)long型數(shù)在printf()中指定用%d格式輸出,相當(dāng)于先將lo

30、ng轉(zhuǎn)換為int型后再輸出。一個(gè)int型數(shù)也可按無符號(hào)方式輸出(使用%u轉(zhuǎn)換等)。 C語(yǔ)言提供一種“強(qiáng)制類型轉(zhuǎn)換”運(yùn)算符,將一個(gè)類型的變量強(qiáng)制轉(zhuǎn)換為另一種類型。例如:(int)3.5中(int)的作用是將3.5轉(zhuǎn)換成整型。(類型標(biāo)識(shí)符)表達(dá)式例如:(char) (3-3.14159 *x)(得到字符型數(shù))k=(int)(int)x+(float)i+j)(得到整型數(shù))(float)(x=99)(得到實(shí)型單精度數(shù)) C系統(tǒng)提供的數(shù)學(xué)函數(shù)中多數(shù)要求參數(shù)為double型,在調(diào)用這些函數(shù)時(shí)可以用顯示轉(zhuǎn)換方法進(jìn)行類型轉(zhuǎn)換。例如:double atan (double)i)double cos (doub

31、le)i)double sqrt (double)i)double log (double)i)double exp (double)i) 輸入輸出的對(duì)象是數(shù)據(jù),而數(shù)據(jù)是以介質(zhì)為載體的,因此進(jìn)行輸入輸出操作就要與各種外部設(shè)備發(fā)生聯(lián)系,要指定從哪個(gè)設(shè)備(文件)讀入數(shù)據(jù),將數(shù)據(jù)輸出到哪個(gè)設(shè)備(文件)上去。本節(jié)只討論從終端(鍵盤)輸入和輸出到終端(顯示器)的輸入輸出函數(shù)。通常也把這些函數(shù)稱為控制臺(tái)輸入輸出函數(shù)。主要是用得最廣泛的scanf函數(shù)、printf函數(shù)、getchar函數(shù)和putchar函數(shù)等。其中scanf和printf用于格式化輸入輸出。1. printf()基本格式printf()函數(shù)

32、的一般形式如下:int printf(格式控制字符串,輸出表達(dá)式1,輸出表達(dá)式2,);%修飾寬度精度長(zhǎng)度修正 格式碼a/A,c,d,e/E,f,g/G,i,n,o,p,s,u,x/X,%l/L,h,ll,hh,j,z,t. 十進(jìn)制整數(shù)十進(jìn)制整數(shù)-,0,+,空格,#格式碼輸出說明舉 例輸出結(jié)果d/i帶符號(hào)十進(jìn)制定點(diǎn)格式int a=975311;printf(“%d”,a);975310u無符號(hào)十進(jìn)制定點(diǎn)格式int a=975311;printf(“%u”,a);975310o無符號(hào)八進(jìn)制定點(diǎn)格式int a=975311;printf(“%o”,a);3560717x/X無符號(hào)十六進(jìn)制定點(diǎn)格式in

33、t a=975311;printf(“%x”,a);ee1cfc字符int a=68;printf(“%c”,a);Ds字符串char s=”abcde”; printf(“%s”,s);abcdef小數(shù)形式十進(jìn)制double a=123.456;printf(%f,a);123.456000e/E科學(xué)記數(shù)法double a=123.456;printf(%E,a);1.234560E+002g/Gf和e中短者,不印無效0double a=123.456;printf(%G,a);123.456p輸出地址,格式由實(shí)現(xiàn)定義double a=123.456;printf(%p,&a);00

34、12FF74(a的地址)%printf(%);%長(zhǎng)度修正符可修飾的格式碼參數(shù)類型ld,i,o,u,x,Xlong, lld,i,o,u,x,Xlong long int, unsigned long long inthd,i,o,u,x,Xshort, unsigned shorthhd,i,o,u,x,Xchar, unsigned charLa,A,e,E,f,g,Glong double 域?qū)捙c精度說明的格式為:m.n。其中: m為輸出域?qū)?,用字符?shù)表示。對(duì)實(shí)數(shù),包括了一個(gè)小數(shù)點(diǎn)的位置。 n為精度,其用法有如下幾種情形: 配合格式碼f、e/E時(shí),指定小數(shù)點(diǎn)后面的位數(shù);未指定精度時(shí),默認(rèn)小

35、數(shù)點(diǎn)后6位。 配合格式碼g/G時(shí),指定有效位的數(shù)目。 作用于字符串時(shí),精度符限制最大域?qū)挕?作用于整型數(shù)據(jù)時(shí),指定必須顯示的最小位數(shù),不足時(shí)左惻補(bǔ)先導(dǎo)0。/* 文件名:ex021001.c */#include int main(void) printf(“%12.5fn”,123.1234567); printf(“%12fn”,123.1234567); printf(“%12.5gn”,123.1234567); printf(“%5.10s%sn”,”abcdefghijklm”,”a”); printf(“%12.8dn”,12345); return 0;執(zhí)行結(jié)果如圖2.8所示。域

36、寬12,精度5123.12346123.123457123.12abcdefghija00012345域?qū)?2,未指定精度,默認(rèn)6位精度域?qū)?2,有效位5位最少5個(gè)字符,最大域?qū)?0域?qū)?2,未必須最少顯示8位,不足時(shí)左惻補(bǔ)0修飾符意 義-數(shù)據(jù)在輸出域中左對(duì)齊顯示0用“0”而非空格進(jìn)行前填充+在有符號(hào)數(shù)前輸出前綴“+”或“-”空格對(duì)正數(shù)加前綴空格,對(duì)負(fù)數(shù)加前綴“-”#在g,f和f前,確保輸出字段中有一個(gè)小數(shù)點(diǎn);在x前,確保輸出的十六進(jìn)制數(shù)前有前綴0 x*做占位符號(hào)格式字段數(shù)據(jù)項(xiàng)表輸 出 結(jié) 果說 明%20di123456域中右對(duì)齊輸出%20 x,i1e240%20fx333.012346%#2

37、0 xi0 x1e240確保加前綴0 x%-20fx333.012346域中左對(duì)齊% 20fx333.012346填充空格前導(dǎo)%020fx0000000000333.012346填充0前導(dǎo)%+20fy+333.012346確保加正負(fù)號(hào)%+20fy-555.012346%*.*f20,8,x333.01234568數(shù)據(jù)替代占位符例2.12 一個(gè)顯示美國(guó)各州面積、森林覆蓋面積和森林覆蓋率的簡(jiǎn)單程序。/* 文件名:ex021201.c */* 美國(guó)各州面積列表 */#include int main(void)double ar ,por,perc;printf(%-12s%12s%12s%12sn

38、,State,Area,Forest,Percent);printf(-n);ar = 50750; por = 33945; perc = por/ar*100;printf(%-12s%12.0f%12.0f%10.2f%n,Alabama,ar,por, perc);ar = 591000;por = 201642; perc = por/ar*100;printf(%-12s%12.0f%12.0f%10.2f%n,Alaska,ar,por, perc);ar = 114000;por = 30287; perc = por/ar*100;printf(%-12s%12.0f%12.

39、0f%10.2f%n,Arlzona,ar,por, perc);ar = 53187;por = 26542; perc = por/ar*100;printf(%-12s%12.0f%12.0f%10.2f%n,Arkanasas,ar,por, perc);ar = 158706;por = 61532; perc = por/ar*100;printf(%-12s%12.0f%12.0f%10.2f%n,California,ar,por, perc);ar = 104000;por = 33340; perc = por/ar*100;printf(%-12s%12.0f%12.0f

40、%10.2f%n,Colorado,ar,por, perc);printf(“n”);return 0;/* 文件名:ex021301.c */#include int main(void)int a= 1, b = 2; printf( x = %d , y = %dn,+ a + b,+ b + a);return 0;程序執(zhí)行結(jié)果如下:x = 5, y = 4 scanf()函數(shù)的功能是將輸入數(shù)據(jù)送入相應(yīng)的存儲(chǔ)單元。具體地說,它是按格式參數(shù)的要求,從終端上把數(shù)據(jù)傳送到地址參數(shù)所指定的內(nèi)存空間中。其原型為:int scanf (格式控制字符串,地址1,地址2,);地址參數(shù) C語(yǔ)言允許程序

41、員間接地使用內(nèi)存地址,這個(gè)地址是通過對(duì)變量名“求地址”運(yùn)算得到的。求地址的運(yùn)算符為&。例如對(duì)于定義: short a; float b; &a給出的是變量a兩字節(jié)空間的首地址,&b給出的是變量b四字節(jié)空間的首地址。2. 格式說明字段 scanf()與printf()有相似之處,也有不同之處。scanf()格式控制字符串中的主要成分是格式說明字段和數(shù)據(jù)項(xiàng)。scanf()的格式說明字段的結(jié)構(gòu)如圖2.9所示。%寬度長(zhǎng)度修正 格式碼a/A,c,d,e/E,f,g/G,i,n,o,p,s,u,x/X,%l/L,h,ll,hh,j,z,t十進(jìn)制整數(shù)格式碼長(zhǎng)度修正符輸入數(shù)據(jù)類型說 明

42、d無hhhlllint charshortlonglong long輸入帶符號(hào)十進(jìn)制整數(shù),可選加+或-ihhhlllcharshortlonglong long輸入帶符號(hào)整數(shù),可選加+或-以及0(八進(jìn)制)、0 x(十六進(jìn)制)u無unsigned輸入帶符號(hào)十進(jìn)制整數(shù)ohhunsigned char輸入無符號(hào)八進(jìn)制整數(shù),可選加+或-xhlllunsigned shortunsigned longunsigned long long輸入無符號(hào)十六進(jìn)制整數(shù),可選加+或-c無char讀取字符s無字符串連續(xù)讀取字符,直到遇到文件結(jié)束符、空白或達(dá)到指定字段寬度n無hhhlllint charshortlon

43、glong long不讀取字符,而是而是把scanf()所處理的字符總數(shù)寫入到對(duì)應(yīng)參數(shù)指定的變量中。p無地址讀取地址f, e, g,a無lLfloatdoublelong double讀取帶符號(hào)十進(jìn)制實(shí)數(shù) 無字符搜索集合只能輸入定義在搜索集合中的字符,例如%abcdefgh或%a-h%無%讀取%/* 文件名:ex021401.c */#include int main(void)double a,b,c,d;scanf(%f%f,&a,&b); printf(na=%1f,b=%1fn,a,b);scanf(%lf%lf,&c,&d);printf(nc=%lf

44、,d=%lfn,c,d);return 0; scanf()是從輸入數(shù)值數(shù)據(jù)流中接收非空的字符,再轉(zhuǎn)換成格式項(xiàng)描述的格式,傳送到與格式項(xiàng)對(duì)應(yīng)的地址中去。當(dāng)操作者在終端上鍵入一串字符時(shí),系統(tǒng)怎么知道哪幾個(gè)字符算作一個(gè)數(shù)據(jù)項(xiàng)呢?有以下幾種方法: (1)使用默認(rèn)分隔符:空格、跳格符(t)、換行符(n)。/* 文件名:ex021501.c */#include int main(void)int a;float b,c;scanf (%d%f%f,&a,&b,&c);printf (a=%d,b=%f,c=%f,a,b,c);return 0; 一次運(yùn)行情況如下:12 345

45、6789 87654321 a=12,b=345.000000,c=6789.000000 注意,當(dāng)從鍵盤上鍵入一串字符流后,只有鍵入回車時(shí),系統(tǒng)才開始執(zhí)行執(zhí)行scanf()規(guī)定的操作。/* 文件名:ex021601.c */#include int main(void)int a;float b,c;scanf (%2d%3f%4f,&a,&b,&c);printf (a=%d,b=%f,c=%f,a,b,c);return 0;一次運(yùn)行情況如下:12345678987654321 a=12,b=345.000000,c=6789.000000 (3)根據(jù)格式字符的含

46、義從輸入流中取得數(shù)據(jù),當(dāng)輸入流中數(shù)據(jù)類型與格式字符要求不符時(shí),就認(rèn)為這一數(shù)據(jù)項(xiàng)結(jié)束。#include int main(void)int a;char b;float c;printf (input a,b,c:n);scanf (%d%c%f,&a,&b,&c);printf (a=%d,b=%c,c=%f,a,b,c);return 0;一次執(zhí)行結(jié)果為:input a b c: 1234r1234.567(帶下劃線者為輸入流)a=1234,b=r,c=1234.567017(4)格式控制字符串中的非空白字符 在scanf()中的格式控制字符串中,除了格式說明字段中的字符外,所出現(xiàn)的其他字符,都必須在輸入數(shù)據(jù)流時(shí)照樣輸入。例2.18/* 文件名:ex021801.c */#include int main(void) int a, b ; scanf(input:%d$%d,&a,&b); printf(%d,%dn,a,b); return 0;輸入的情形如下:input:123$456123,456 在輸入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論