580 likes | 726 Views
程式設計. 博碩文化出版發行. 第二章 資料處理. 課前指引 變數與常數主要是用來儲存程式中的資料,以提供程式中各種運算之用。兩者之間最大的差別在於變數的值是可以改變,而常數的值則固定不變。. 章節大綱. 2-1 基本資料型態. 2-2 變數. 2-3 常數. 備註:可依進度點選小節. 2-1 基本資料型態. 前言 資料型態在程式語言中,包含兩個必備的層次 :可說明性及可執行性。 在 C 中共有 整數 、 浮點數 及 字元 等三種基本資料型態。. 2-1 基本資料型態. 整數 (integer)
E N D
程式設計 博碩文化出版發行
第二章 資料處理 課前指引 變數與常數主要是用來儲存程式中的資料,以提供程式中各種運算之用。兩者之間最大的差別在於變數的值是可以改變,而常數的值則固定不變。
章節大綱 2-1 基本資料型態 2-2 變數 2-3 常數 備註:可依進度點選小節
2-1 基本資料型態 前言 資料型態在程式語言中,包含兩個必備的層次 :可說明性及可執行性。 在C中共有整數、浮點數及字元等三種基本資料型態。
2-1 基本資料型態 整數(integer) 整數(int)在C中的儲存方式會保留4個位元組(32位元)的空間 整數表示方式可以是10進位、8進位或16進位。 int no=80; /* 十進位 */ int no=0120; /* 八進位 */ int no=0x50; /* 十六進位 */
範例CH02-01.c /* sizeof()函數的使用 */ 2-1 基本資料型態
2-1 基本資料型態 執行結果 程式解說 第7~9行將三個宣告不同整數型態的變數no1、no2、no3,設定相同的初始值。
2-1 基本資料型態 修飾詞 英文字母「U」、「u」與「L」、「l」可直接放在整數字面常數後標示其為無號(unsigned;無正負符號的整數)以及長整數(long)資料型態 45U、45u //標示45為無號整數 45L、45l //標示45為長整數 45UL、45UL //標示45為無號長整數
2-1 基本資料型態 整數資料型態(適用於一般的個人電腦)
2-1 基本資料型態 範例:CH02-02.c /* 整數的溢位(over floating) */
2-1 基本資料型態 執行結果
2-1 基本資料型態 • 程式解說 • 第7~8行中分別設定s1與s2的值,並讓s1超過無號短整數的最小下限值,而讓s2超過短整數的最大上限值。 • 當在第11~12行輸出時,卻發現s1的值為65535,而s2的值為-32768。 • 事實上,在C的整數溢位處理中,可看成是以一種循環的觀念來處理,當比最大表示值大1時,則變為最小表示值,如s2,當比最小表示值小1時,則變為最大表示值,如s1。
2-1 基本資料型態 浮點數 可以區分為單精度(float)和倍精度(double)兩種宣告類型。 float(單精度浮點數)的資料型態長度為32個位元(4個位元組),其數值的精確位數最多儲存到第八位,如果數值的超過了,那麼系統不會儲存後續的數值。 double(倍精度浮點數)的資料長度為64個位元(8個位元組),則其數值的精確位數最多儲存到第十五位。
2-1 基本資料型態 浮點數數值範圍
2-1 基本資料型態 範例ch02_03.c /* 浮點數的準確位數 */
2-1 基本資料型態 執行結果
2-1 基本資料型態 • 程式解說 • 第7~9行我們刻意宣告了三個變數,其中f1、f2分別宣告為單精度浮點數,其值設定為123.4568357109375F與21341372.1357912,而d1則宣告為倍精數浮點數,其值設定為123456789.123456789123。 • 在第11行中,輸出123.456833共八位數,第12行中輸出21341372.000000,也是只保留八位數精確值。 • 第13行輸出則可保留15位數,即是123456789.123457。
2-1 基本資料型態 範例CH02-04.c /* 浮點數不應被拿來比較是否相等 */
2-1 基本資料型態 執行結果 程式解說 第8行中宣告f1=1e-25,而在第10行中我們利用if指令(這部份會在第五章中繼續說明)來判斷是否相等,由程式執行結果中可知兩數並不相等,不過從數學的角度而言,卻是相同。 因此通常我們在程式設計上會利用第13~14行中,讓兩數相減的絕對值小於某有微小值來做近似相等的判斷。
2-1 基本資料型態 範例CH02-05.c /* 兩種輸出格式之比較 */
2-1 基本資料型態 執行結果 程式解說 第7~8行中我們宣告並設定單精度浮點數f1與f2的值。 在第10~11行中直接利用%e格式化字元輸出其科學記號表示法的值。 請注意第11行的輸出結果,在第8行是設定f1=5467.1234,但為何輸出時f2=5467.1235335,主要因素就是因為儲存精確度的問題,而輸出時多出的位數,是保留在記憶體中的殘值。
2-1 基本資料型態 字元型態 字元型態(char)包含了字母、數字、標點符號及控制符號等,每一個字元佔用1位元組(8位元)的資料長度,在記憶體中仍然是以整數數值的方式來儲存 當程式中要加入一個字元符號時,必須用單引號將資料括起來 char ch='A' //宣告ch為字元變數,並指定初值為'A' char ch=65; //宣告ch為字元變數,並指定初值為65
2-1 基本資料型態 範例CH02-06.c /* ASCII碼的換算 */
2-1 基本資料型態 執行結果 程式解說 第7~8行宣告兩個字元變數char1、char2。 第12、17行則分別進行加法與減法運算。 第13、18行則分別輸出運算的結果。
2-1 基本資料型態 Char數值範圍
2-1 基本資料型態 範例CH02-07.c /* 字元與字串之比較 */
2-1 基本資料型態 執行結果 程式解說 第7~8行分別宣告ch1與ch2變數,ch1是以單引號括住資料,而ch2則以雙引號括住資料。 第10、12行輸出變數內的資料及所佔的位元組,兩者間的差異是字串多了一個空位元('\0')。
2-1 基本資料型態 字串宣告方式 方式1:char 字串變數[字串長度]="初始字串"; 方式2:char 字串變數[字串長度]={'字元1', '字元2', ...... ,'字元n', '\0'};
2-1 基本資料型態 範例CH02-08.c /* 字串中的字元 */
2-1 基本資料型態 執行結果 程式解說 第7行宣告一字串變數,並設值為"World!",第8行則配合%s格式化字元輸出此字串。第10~16行則逐一輸出此字串中的每個字元,但第16行則是輸出'\0',於螢幕中並無法顯示。
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'};
2-1 基本資料型態 範例CH02-09.c /* 字串的不同設定方式 */
2-1 基本資料型態 執行結果 程式解說 第8~10行是正統的字串宣告方式,而第11行的宣告僅是一種字元陣列,因為沒有結尾字元(‘\0’),不算是一種字串。 在第17行輸出時,因無結尾字元,故輸出時出現奇怪的符號。
2-1 基本資料型態 常用跳脫字元
2-1 基本資料型態 範例CH02-10.c /* 輸出嗶聲 */
2-1 基本資料型態 執行結果 程式解說 第7~10行是屬於跳脫字元的應用,都能讓電腦發出嗶的聲響,第13行則是以跳脫字元與16進位來設定WORLD! 字串。當程式執行到第15行時,會輸出四聲嗶聲顯示字串st的內容值。
範例CH02-11.c /* 輸出單引號與雙引號 */ 2-1 基本資料型態
執行結果 程式解說 第6行將ch1中的值設定為跳脫序列\',在第8行中則以%c輸出ch1的值,並且利用(\")在printf()函數中顯示出雙引號。 2-1 基本資料型態
2-2 變數簡介 前言 變數型態:整數、浮點數或字元。 變數名稱:變數本身在程式中的名字,必須符合識別字的命名規則及可讀性。 值:程式中變數所賦予的值。 參考位置或記憶體位址:變數在記憶體中儲存的位置。
2-2 變數簡介 變數的宣告 由於變數本身的內容值是可以被改變,因此不同資料型態的變數,所使用的記憶體空間大小以及可表示的資料範圍自然不同。至於在程式語言的領域中,有關變數儲存位址的方法則有兩種,分述如下: 就
2-2 變數簡介 範例CH02-12.c /* 初始化與未初始化 */
2-2 變數簡介 執行結果 程式解說 第6~8行中宣告了三個變數,其中a變數並未設定初值。 當從第10行中輸出a時,各位在螢幕上會發現a=2,如果您的電腦顯示的不是2,那也很正常,因為這個值是系統並未清除原先在那塊位址上的內容,所出現先前存放的數字。
2-2 變數簡介 變數的生命週期與可視範圍 「全域變數」(Global variable) 宣告在程式區塊與函數之外,且在宣告指令以下的所有函數及程式區塊都可以使用到該變數。 通常全域變數是用來定義一些常數,但是初學者不應為了方便而將所有的變數都設定為全域變數,否則將來一定會發生變數名稱管理上的問題。 全域變數的生命週期始於程式開始之時,終止於程式結束之後: float pi=3.14; /* pi是全域變數 */ int main() { … … }
2-2 變數簡介 變數的生命週期與可視範圍 區域變數 是指宣告在函數之內的變數。 它的可視範圍只在宣告的函數區塊之中,其它的函數不可以使用該變數。 區域變數的生命週期開始於函數被呼叫之後,終止於函數執行完畢之時。 void circle() { float pi=3.14; /* pi是circle()函數中的區域變數 */ } int main() { … … }
2-2 變數簡介 變數的生命週期與可視範圍 區塊變數 是指宣告在某個程式區塊之中的變數,也是屬於區域變數的一種。在某些程式碼區塊中所宣告的變數其有效範圍僅在此程式碼區塊中,此程式碼區塊以外的程式碼都不能參考此變數: { /*在此區塊中宣告一個變數sum,其有效範圍為此「程式區塊」範圍*/ int sum ; ... }
2-2 變數簡介 範例CH02-13.c /*全域變數與區塊變數*/
2-2 變數簡介 執行結果 程式解說 第4行宣告salary為全域變數,在整個程式的任何位置的指令都可以合法使用該變數。 第9行將輸出全域變數salary的值。 第11行在此宣告salary為區塊變數,因此第12行所輸出的是區塊變數salary的值。 但在第14行時,因為離開了程式區塊,所以又將輸出全域變數salary的值。
2-2 變數簡介 變數資料型態轉換 針對變數執行上的要求,可以「暫時性」轉換資料型態的方式。基本上,資料型態轉換只是針對變數儲存的「資料」作轉換,但是不能轉換變數本身的「資料型態」。要在運算式中強制的轉換資料型態,可以使用如下的語法: (資料型態) 變數名稱;
2-2 變數簡介 範例CH02-14.c /*資料型態的強制轉換*/
2-2 變數簡介 執行結果 程式解說 第7~8行宣告整數與浮點數變數,並在第10-11行中進行整數強制型態轉換,,請注意!這個包含型態名稱的小括號,可絕對不能省略。 當第13行輸出時,我們發現no1與no2的值是f1與f2的整數值,而且f1與f2的值並沒有受到任何影響。