58
博博博博博博博博 博博博博博博博博 博博博博 博博博博

博碩文化出版發行

Embed Size (px)

DESCRIPTION

程式設計. 博碩文化出版發行. 第二章 資料處理. 課前指引 變數與常數主要是用來儲存程式中的資料,以提供程式中各種運算之用。兩者之間最大的差別在於變數的值是可以改變,而常數的值則固定不變。. 章節大綱. 2-1 基本資料型態. 2-2 變數. 2-3 常數. 備註:可依進度點選小節. 2-1 基本資料型態. 前言 資料型態在程式語言中,包含兩個必備的層次 :可說明性及可執行性。 在 C 中共有 整數 、 浮點數 及 字元 等三種基本資料型態。. 2-1 基本資料型態. 整數 (integer) - PowerPoint PPT Presentation

Citation preview

博碩文化出版發行博碩文化出版發行

程式設計程式設計

第二章 資料處理 第二章 資料處理

課前指引變數與常數主要是用來儲存程式中的資料,以提供程式中各種運算之用。兩者之間最大的差別在於變數的值是可以改變,而常數的值則固定不變。

章節大綱

備註:可依進度點選小節

2-1 基本資料型態

2-2 變數

2-3 常數

4

2-1 基本資料型態

前言資料型態在程式語言中,包含兩個必備的層次 :可說明性及可執行性。在 C 中共有整數、浮點數及字元等三種基本資料型態。

5

2-1 基本資料型態

整數 (integer)整數 (int)在 C 中的儲存方式會保留 4 個位元組( 32位元)的空間 整數表示方式可以是 10進位、 8 進位或 16進位。

int no=80; /* 十進位 */ int no=0120; /* 八進位 */ int no=0x50; /* 十六進位 */

6

範例 CH02-01.c /* sizeof()函數的使用 */

2-1 基本資料型態

7

2-1 基本資料型態

執行結果

程式解說 第 7~9 行將三個宣告不同整數型態的變數no1 、 no2 、 no3 ,設定相同的初始值。

8

2-1 基本資料型態

修飾詞英文字母「 U 」、「 u 」與「 L 」、「 l 」可直接放在整數字面常數後標示其為無號(unsigned; 無正負符號的整數 ) 以及長整數(long) 資料型態 45U 、 45u // 標示 45 為無號整數45L 、 45l // 標示 45 為長整數45UL 、 45UL // 標示 45 為無號長整數

9

2-1 基本資料型態

整數資料型態(適用於一般的個人電腦)

資料型態宣告 資料長度 ( 位元組 )

最小值 最大值

short int 2 -32768 32767

signed short int 2 -32768 32767

unsigned short int 2 0 65535

int 4 -2147783648 2147483647

signed int 4 -2147783648 2147483647

unsigned int 4 0 4294967295

long int 4 -2147783648 2147483647

signed long int 4 -2147783648 2147483647

unsigned long int 4 0 4294967295

10

2-1 基本資料型態

範例: CH02-02.c /* 整數的溢位 (over floating) */

11

2-1 基本資料型態

執行結果

12

2-1 基本資料型態

程式解說 第 7~8 行中分別設定 s1 與 s2 的值,並讓 s1 超過無號短整數的最小下限值,而讓 s2 超過短整數的最大上限值。當在第 11~12 行輸出時,卻發現 s1 的值為 65535 ,而 s2 的值為 -32768 。事實上,在 C 的整數溢位處理中,可看成是以一種循環的觀念來處理,當比最大表示值大 1 時,則變為最小表示值,如 s2 ,當比最小表示值小 1時,則變為最大表示值,如 s1 。

13

2-1 基本資料型態

浮點數可以區分為單精度 (float)和倍精度 (double)兩種宣告類型。 float(單精度浮點數 ) 的資料型態長度為 32個位元 (4個位元組 ) ,其數值的精確位數最多儲存到第八位,如果數值的超過了,那麼系統不會儲存後續的數值。double(倍精度浮點數 ) 的資料長度為 64個位元 (8個位元組 ) ,則其數值的精確位數最多儲存到第十五位。

14

2-1 基本資料型態

浮點數數值範圍

資料型態 長度 數值範圍

float 4 Byte 1.2*10-38~3.4*10+38

double 8 Byte 2.2*10-308~1.8*10+308

15

2-1 基本資料型態

範例 ch02_03.c /* 浮點數的準確位數 */

16

2-1 基本資料型態

執行結果

17

2-1 基本資料型態

程式解說 第 7~9 行我們刻意宣告了三個變數,其中f1、 f2分別宣告為單精度浮點數,其值設定為123.4568357109375F 與 21341372.1357912 ,而d1則宣告為倍精數浮點數,其值設定為 123456789.123456789123 。在第 11 行中,輸出 123.456833 共八位數,第 12行中輸出 21341372.000000 ,也是只保留八位數精確值。第 13行輸出則可保留 15位數,即是 123456789.123457 。

18

2-1 基本資料型態

範例 CH02-04.c /* 浮點數不應被拿來比較是否相等 */

19

2-1 基本資料型態

執行結果

程式解說第 8行中宣告 f1=1e-25,而在第 10行中我們利用 if指令 (這部份會在第五章中繼續說明 )來判斷是否相等,由程式執行結果中可知兩數並不相等,不過從數學的角度而言,卻是相同。因此通常我們在程式設計上會利用第 13~14 行中,讓兩數相減的絕對值小於某有微小值來做近似相等的判斷。

20

2-1 基本資料型態

範例 CH02-05.c /* 兩種輸出格式之比較 */

21

2-1 基本資料型態

執行結果

程式解說 第 7~8 行中我們宣告並設定單精度浮點數 f1 與 f2 的值。在第 10~11 行中直接利用 %e 格式化字元輸出其科學記號表示法的值。請注意第 11 行的輸出結果,在第 8 行是設定f1=5467.1234 ,但為何輸出時 f2=5467.1235335 ,主要因素就是因為儲存精確度的問題,而輸出時多出的位數,是保留在記憶體中的殘值。

22

2-1 基本資料型態

字元型態字元型態 (char)包含了字母、數字、標點符號及控制符號等,每一個字元佔用 1 位元組( 8 位元)的資料長度,在記憶體中仍然是以整數數值的方式來儲存 當程式中要加入一個字元符號時,必須用單引號將資料括起來char ch='A' //宣告 ch為字元變數,並指定初值為 'A'char ch=65; //宣告 ch為字元變數,並指定初值為 65

23

2-1 基本資料型態

範例 CH02-06.c /* ASCII碼的換算 */

24

2-1 基本資料型態

執行結果

程式解說第 7~8 行宣告兩個字元變數 char1 、 char2 。第 12 、 17 行則分別進行加法與減法運算。第 13 、 18 行則分別輸出運算的結果。

25

2-1 基本資料型態

Char數值範圍

資料型態 資料長度(位元 )

最小值 最大值

char8

-128 127

signed char8

-128 127

unsigned char8

0 255

26

2-1 基本資料型態

範例 CH02-07.c /* 字元與字串之比較 */

27

2-1 基本資料型態

執行結果

程式解說 第 7~8 行分別宣告 ch1 與 ch2 變數, ch1 是以單引號括住資料,而 ch2 則以雙引號括住資料。第 10 、 12 行輸出變數內的資料及所佔的位元組,兩者間的差異是字串多了一個空位元 ('\0') 。

28

2-1 基本資料型態

字串宣告方式方式 1 : char 字串變數 [ 字串長度 ]="初始字串 ";方式 2 : char 字串變數 [ 字串長度 ]={'字元1', '字元 2', ...... ,'字元 n', '\0'};

29

2-1 基本資料型態

範例 CH02-08.c /* 字串中的字元 */

30

2-1 基本資料型態

執行結果

程式解說 第 7 行宣告一字串變數,並設值為 "World!" ,第8 行則配合%s 格式化字元輸出此字串。第 10~16行則逐一輸出此字串中的每個字元,但第 16 行則是輸出 '\0' ,於螢幕中並無法顯示。

31

2-1 基本資料型態

四種字串宣告方式char Str_1[6]="Hello!";char Str_2[6]={ 'H', 'e', 'l', 'l', 'o', '!', '\0'};char Str_3[]="Hello!";char Str_4[]={ 'H', 'e', 'l', 'l', 'o', '!', '\0'};

32

2-1 基本資料型態

範例 CH02-09.c /* 字串的不同設定方式 */

33

2-1 基本資料型態

執行結果

程式解說 第 8~10 行是正統的字串宣告方式,而第 11 行的宣告僅是一種字元陣列,因為沒有結尾字元 (‘\0’) ,不算是一種字串。在第 17 行輸出時,因無結尾字元,故輸出時出現奇怪的符號。

34

2-1 基本資料型態

常用跳脫字元跳脫字元 說明 十進位

ASCII碼

八進位ASCII碼

十六進位ASCII 碼

\0 字串結束字元。 (Null Character) 0 0 0x00

\a 警告字元,使電腦發出嗶一聲( alarm )

7 007 0x7

\b 倒退字元 (backspace) ,倒退一格 8 010 0x8

\t 水平跳格字元 (horizontal Tab) 9 011 0x9

\n 換行字元 (new line) 10 012 0xA

\v 垂直跳格字元 (vertical Tab) 11 013 0xB

\f 跳頁字元 (form feed) 12 014 0xC

\r 返回字元 (carriage return) 13 015 0xD

\" 顯示雙引號 (double quote) 34 042 0x22

\' 顯示單引號 (single quote) 39 047 0x27

\\ 顯示反斜線 (backslash) 92 0134 0x5C

35

2-1 基本資料型態

範例 CH02-10.c /* 輸出嗶聲 */

36

2-1 基本資料型態

執行結果

程式解說 第 7~10 行是屬於跳脫字元的應用,都能讓電腦發出嗶的聲響,第 13 行則是以跳脫字元與 16 進位來設定 WORLD! 字串。當程式執行到第 15 行時,會輸出四聲嗶聲顯示字串 st 的內容值。

37

範例 CH02-11.c /* 輸出單引號與雙引號 */

2-1 基本資料型態

38

執行結果

程式解說 第 6 行將 ch1 中的值設定為跳脫序列 \' ,在第 8行中則以 %c 輸出 ch1 的值,並且利用 (\") 在printf() 函數中顯示出雙引號。

2-1 基本資料型態

39

2-2 變數簡介

前言變數型態:整數、浮點數或字元。變數名稱:變數本身在程式中的名字,必須符合識別字的命名規則及可讀性。值:程式中變數所賦予的值。參考位置或記憶體位址:變數在記憶體中儲存的位置。

40

2-2 變數簡介

變數的宣告由於變數本身的內容值是可以被改變,因此不同資料型態的變數,所使用的記憶體空間大小以及可表示的資料範圍自然不同。至於在程式語言的領域中,有關變數儲存位址的方法則有兩種,分述如下:

41

2-2 變數簡介

範例 CH02-12.c /* 初始化與未初始化 */

42

2-2 變數簡介

執行結果

程式解說 第 6~8 行中宣告了三個變數,其中 a 變數並未設定初值。當從第 10 行中輸出 a 時,各位在螢幕上會發現a=2 ,如果您的電腦顯示的不是 2 ,那也很正常,因為這個值是系統並未清除原先在那塊位址上的內容,所出現先前存放的數字。

43

2-2 變數簡介

變數的生命週期與可視範圍「全域變數」( Global variable)

宣告在程式區塊與函數之外,且在宣告指令以下的所有函數及程式區塊都可以使用到該變數。通常全域變數是用來定義一些常數,但是初學者不應為了方便而將所有的變數都設定為全域變數,否則將來一定會發生變數名稱管理上的問題。全域變數的生命週期始於程式開始之時,終止於程式結束之後:

float pi=3.14; /* pi 是全域變數 */int main(){… …}

44

2-2 變數簡介

變數的生命週期與可視範圍區域變數

是指宣告在函數之內的變數。它的可視範圍只在宣告的函數區塊之中,其它的函數不可以使用該變數。區域變數的生命週期開始於函數被呼叫之後,終止於函數執行完畢之時。

void circle(){ float pi=3.14; /* pi 是 circle() 函數中的區域變數 */}int main(){… …}

45

2-2 變數簡介

變數的生命週期與可視範圍區塊變數

是指宣告在某個程式區塊之中的變數,也是屬於區域變數的一種。在某些程式碼區塊中所宣告的變數其有效範圍僅在此程式碼區塊中,此程式碼區塊以外的程式碼都不能參考此變數:

{ /* 在此區塊中宣告一個變數 sum ,其有效範圍為此「程式

區塊」範圍 */ int sum ; ...}

46

2-2 變數簡介

範例 CH02-13.c /* 全域變數與區塊變數*/

47

2-2 變數簡介

執行結果

程式解說 第 4 行宣告 salary 為全域變數,在整個程式的任何位置的指令都可以合法使用該變數。第 9 行將輸出全域變數 salary 的值。第 11 行在此宣告 salary 為區塊變數,因此第 12 行所輸出的是區塊變數 salary 的值。但在第 14 行時,因為離開了程式區塊,所以又將輸出全域變數 salary 的值。

48

2-2 變數簡介

變數資料型態轉換針對變數執行上的要求,可以「暫時性」轉換資料型態的方式。基本上,資料型態轉換只是針對變數儲存的「資料」作轉換,但是不能轉換變數本身的「資料型態」。要在運算式中強制的轉換資料型態,可以使用如下的語法:

( 資料型態 ) 變數名稱;

49

2-2 變數簡介

範例 CH02-14.c /* 資料型態的強制轉換*/

50

2-2 變數簡介

執行結果

程式解說 第 7~8 行宣告整數與浮點數變數,並在第 10-11行中進行整數強制型態轉換,,請注意!這個包含型態名稱的小括號,可絕對不能省略。當第 13 行輸出時,我們發現 no1 與 no2 的值是f1 與 f2 的整數值,而且 f1 與 f2 的值並沒有受到任何影響。

51

2-3 常數

前言常數則在程式執行時會固定不變。例如 10、 -568、 0 、 5000等是整數常數,而3.1416、 0.001、 82.51等則是屬於浮點數常數,如果是字元常數時,常數值必須以單引號‘ ’括住字元,例如:‘ a’、‘ c’。當資料型態為字串時,必須以雙引號“ ”括住字串。

52

2-3 常數

常數識別字方式 1 : #define 常數名稱 常數值

利用巨集指令 #define 來宣告。所謂巨集 (macro) ,又稱為「替代指令」,主要功能是以簡單的名稱取代某些特定的常數、字串或函數,善用巨集可以節省不少程式開發的時間。由於 #define 為一巨集指令,並不是指定敘述,因此不用加上「 = 」與「 ; 」。例如以下定義常數方式:

#define PI 3.14159

53

2-3 常數

範例 CH02-15.c /* 巨集指令 #define 之使用 */

54

2-3 常數

執行結果

程式解說 第 9 行是使用 #define 來宣告 PI 為 3.14159 ,自宣告以後,程式中所有出現 PI 的部份,都是代表3.14159 的常數值,當指令結束時,也不用加上 ;號。第 11 行則是計算圓面積的公式。

55

2-3 常數

常數識別字方式 2 : const 資料型態 常數名稱 = 常數值

利用 const 保留修飼字來宣告與設定之後的常數識別字名稱的資料值,其實這還是將所宣告的變數限制其在執行中,都無法再度改變其資料值。如果宣告時,並未設定初值,之後也不可以再設值了。使用 const 保留字定義常數方式如下:

const float PI=3.14159;

56

2-3 常數

範例 CH02-16.c /* 常數資料型態 */

57

2-3 常數

執行結果

程式解說第 6 行宣告 salary 為常數,第 10 行則在此程式區塊中宣告 salary 為常數。各位會發現在第 11 、 14 行中所輸出的 salary 值並不相同。

58

Q&A討論時間

本章結束