Presentation is loading. Please wait.

Presentation is loading. Please wait.

程式設計 博碩文化出版發行.

Similar presentations


Presentation on theme: "程式設計 博碩文化出版發行."— Presentation transcript:

1 程式設計 博碩文化出版發行

2 第三章 格式化輸出與輸入 課前指引 C語言中並沒有直接處理資料輸入與輸出能力,所有相關輸入/輸出運作,都是經由呼叫函數(function)來完成,而這些標準I/O函數的原型宣告都放在<stdio.h>標頭檔中,透過這些函數就可以讀取(或輸出)資料至週邊設備。

3 章節大綱 3-1 printf()函數 3-2 scanf()函數 3-3 其他輸出輸入函數 備註:可依進度點選小節

4 3-1 printf()函數 標準輸出函數名稱 printf()函數
會將指定的文字或字串,透過格式化指定碼(format specifier)設定,輸出到標準輸出設備(螢幕) 。 putchar()函數 可用來輸出指定的單一字元到螢幕上。 puts()函數 可用來輸出指定字串。

5 3-1 printf()函數 標準輸入函數名稱 scanf()函數
可以經由標準輸入設備(鍵盤),透過格式化指定碼(format specifier)設定,把所輸入的數值、字元或字串傳送給指定的變數。 getchar()函數 由鍵盤讀入一個字元,需按enter鍵。 getche()函數 由鍵盤讀入一個字元,不需按enter鍵,會在螢幕上顯示讀入的字元。 getch()函數 由鍵盤讀入一個字元,不需按enter鍵,不會在螢幕上顯示讀入的字元。 gets()函數 gets()函數會回應使用者輸入的整段字串到標準輸出設備(螢幕)。

6 3-1 printf()函數 Printf()函數的使用 指令格式─ printf( 格式化字串, 變數1, 變數2, 變數3...);

7 3-1 printf()函數 跳脫字元 跳脫字元 說明 \a 使電腦發出嗶一聲(alarm) \b 倒退一格(backspace) \f
跳頁(form feed) \n 換行(newline) \r 返回(carriage return) \t 水平跳格,相當於按一次Tab鍵 \v 垂直跳格 \' 顯示單引號' \" 顯示雙引號" \\ 顯示反斜線\

8 3-1 printf()函數 範例CH03_01.c /* printf()函數之使用 */

9 3-1 printf()函數 執行結果 程式解說 第6~8行中我們分別宣告整數、浮點數與字串三種變數。
第10行的prinf()函數只是單純輸出字串,因此只要直接放入“今天是星期天,天氣晴朗.\n”字串即可。 而在第10行的printf()函數中,第一個出現的格式化字元「%s」,是對應到引數列中的food字串變數,而第二個出現的「%f」則對應price浮點數變數,第三個「%d」對應整數變數no,第四個「%f」則是對應到一個運算式。

10 3-1 printf()函數 常用的格式化字元 格式化字元 說明 %c 輸出字元(character)。 %s
輸出字元陣列或字串(string)。 %d 輸出十進位整數(integer)。 %u 輸出不含符號的十進位整數。 %o 輸出八進位整數。 %x 輸出十六進位整數,超過10的數字以小寫字母表示。 %X 輸出十六進位整數,超過10的數字以大寫字母表示。 %f 輸出浮點數(floating number)。 %e 使用科學記號表示法,例如3.14e+05。 %E 使用科學記號表示法,例如3.14E+05(使用大寫E)。 %g、%G 也是輸出浮點數,不過是輸出%e與%f長度較短者。 %p 輸出指標(pointer)。 %% 輸出「%」符號。

11 3-1 printf()函數 範例CH03_02.c /* %o, %x, %X 之使用 */

12 3-1 printf()函數 執行結果 程式解說 第6行宣告並設定一個十進位整數Value。第8行以%o輸出其八進位表示法,第9~10行則分別以%x與%X輸出其16進位小寫與大寫表示法。

13 3-1 printf()函數 範例CH03_03.c /* %f, %e, %g 之使用 */

14 3-1 printf()函數 執行結果 程式解說 第6~7行中宣告並設定兩個浮點數number、number1。
第9行是以一般的浮點數格式%f輸出,第10行則以科學符號格式%e輸出,第11行則選擇%f與%e中較短者的%e格式輸出。 第15行的結果希望各位與第11行做比較,在此要提醒您,以%g預設會顯示6位的有效數字。

15 3-1 printf()函數 範例CH03_04.c /* %s, %d與%%之使用 */

16 3-1 printf()函數 執行結果 程式解說 第6行宣告了一個字串變數monkey,第8行則在printf()函數中以%s輸出字串,而如要輸出百分比符號「%」,格式化字元必須寫成「%%」。

17 3-1 printf()函數 欄寬設定功能 透過格式化字元的欄寬設定,可以達到對齊效果 ,語法如下所示: %[width]格式化字元

18 3-1 printf()函數 範例CH03_05.c /* 指定欄位寬度 */

19 3-1 printf()函數 執行結果

20 3-1 printf()函數 程式解說 第6行宣告一個十進位的四位整數。
第8行直接以%d格式化字元輸出,所以會靠右對齊,與「=」間沒有空格。 第9行則是設定欄寬為6個欄位,由於no只有四位數,所以輸出時會向右退二格,與「=」間有2個空格。 第10行則是設定欄寬為8個欄位,所以輸出時會向右退四格,,與「=」間有4個空格。 第11行由於欄寬設定值小於原本的顯示字元數,所以和%d的輸出結果一致。

21 3-1 printf()函數 範例CH03_06.c /* 「*」號之使用 */

22 3-1 printf()函數 執行結果 程式解說 第8~11行請自行比較與CH03_05.c程式中第8~11行的差別,不過輸出的結果是一模一樣。

23 3-1 printf()函數 精度設定功能 透過精度設定,就可以使數值資料輸出時,依照精度所指定的精確位數(精度)輸出。如下所示:
%[.precision]格式化字元 精度也可以搭配欄寬來一起設定,如下所示: %[width][.precision]格式化字元

24 3-1 printf()函數 範例CH03_07.c /* 整數的精確位數 */

25 3-1 printf()函數 執行結果 程式解說 第8行中設定整數輸出的精度為6,由於no只有四位數,所以輸出時會向右退二格,與「=」間補上2個0。 第10行中設定整數輸出的精度為8,所以輸出時會向右退4格,與「=」間補上4個0。 第11行精度設定值小於原本的顯示字數,就不會產生任何影響,如同沒有設定一般。

26 3-1 printf()函數 範例CH03_08.c /* 浮點數的精確位數 */

27 3-1 printf()函數 執行結果 程式解說 第6行宣告fo為一浮點數,設值為234.567。第8行以%f格式輸出,不設定精度。
第9行精度設定為.2,輸出時小數位數只有2位,第3位則四捨五入。 第10行精度設定為.3,輸出時小數位數則有3位。 第11行精度設定值大於原本fo的小數位數,所以不足的位數補0。

28 3-1 printf()函數 範例CH03_09.c /* 字串的精確位數 */

29 3-1 printf()函數 執行結果 程式解說 第6行宣告字串變數name,並設值"Applepine"。
第9行精度設定為.2,輸出時會由左至右讀出此字串的2個字元。 第10行精度設定為.5,輸出時會由左至右讀出此字串的5個字元。 第11行則因為精度設定值大於原本的字元數,所以還是輸出原來的字串。

30 3-1 printf()函數 範例CH03_10.c /* 指定欄寬與精度 */

31 3-1 printf()函數 執行結果

32 3-1 printf()函數 程式解說 第9行以一般的%d格式化輸出,第10行則將欄寬設定為3,精度設定為.6,輸出時,因為精度大於顯示字數,於數值前補足位數,不足數補0,所以輸出時多補2個0。 第11行欄寬設定為5,精度設定為.2,如果欄寬值大於欲顯示的資料長度,就會自動填入空白,所以輸出時多補1個空格。 第13行以一般的%f格式化輸出,第14行輸出浮點數,且欄寬設定為6,精度設定為.2,所以含前面的空格,共保留6個欄位。 第15行也是輸出浮點數,且欄寬設定為7,精度設定為.5,所以小數點後輸出5位數,最後一位補0。

33 3-1 printf()函數 旗標設定功能 旗標設定功能主要是利用如‘+’、‘-’字元等指定輸出格式,來作為正負號顯示、資料對齊方式及格式符號等。例如當使用正號(+),輸出靠右同時顯示數值的正負號,如果使用負號(-),則輸出靠左對齊。 基本上,這項參數可有可無,並可選擇一個或以上的參數設定值。

34 3-1 printf()函數 旗標設定字元 旗標設定字元 特色與說明 +
如果使用正號(+),輸出靠右,並同時顯示數值的正負號,再以空白字元補齊左邊空位。 未指定 顯示時依照指定格式向右對齊。 - 顯示時靠左對齊。 # 會依照格式符號的不同有不同的作用。顯示8進位時,會於數值前會加上數字0。顯示16進位時,於數值前會加上0x。如果配合%f、%e等浮點數格式化字元時,即使所設定的數值不含小數位數,但仍會包含小數點。 空白 輸出值為正數或0時,顯示空白。輸出值為負數時,顯示負號。 設定欄寬時,若數值位數小於欄寬值,不足數於數值左側補0。

35 3-1 printf()函數 範例CH03_11.c /*旗標+, -之使用*/

36 3-1 printf()函數 執行結果

37 3-1 printf()函數 程式解說 第10行輸出整數,欄寬設定為6,前面有2個空格,第12行輸出整數,且欄寬設定為6,不過旗標設定為+,所以會多輸出一個「+」號,因為佔了一個欄位,所以前面只會多一個空格。 第14行也是輸出整數,且欄寬設定為6,不過旗標設定為-,所以會直接靠左對齊。 第20行則輸出浮點數,且欄寬設定為6,精度設定為.2,旗標設定為+,因此最前面欄位為「+」號。 第22行則輸出浮點數,且欄寬設定為6,精度設定為.2,旗標設定為-,所以會直接靠左對齊。

38 3-1 printf()函數 範例CH03_12.c /* 旗標+, -, #, 0之使用 */

39 3-1 printf()函數 執行結果

40 3-1 printf()函數 程式解說 第6行宣告一個10進位整數iVal=345。 第10行的輸出結果帶有「+」號,第11行則是靠左對齊。
第12行加上「#」輸出8進位時,會於數值前會加上數字「0」。 第13行加上「#」輸出16進位時,於數值前會加上「0x」。 第14行加上「0」來輸出10進位數,因為數值位數小於欄寬值,將於數值左側補上3個0。

41 3-2 scanf()函數 scanf()函數的使用
scanf()函數與printf()函數的最大不同點,是必須以變數位址為參數,引數列中每個變數前要加上&(又叫取址運算子)將變數位址傳入 指令格式─ scanf( 格式化字串, &變數1, &變數2, &變數3...);

42 3-2 scanf()函數 scanf()函數常用的格式化字元 格式化字元 說明 %c 輸出字元(character)。 %s
輸出字元陣列或字串(string)。 %d 輸出十進位整數(integer)。 %o 輸出八進位整數。 %x 輸出十六進位整數,超過10的數字以小寫字母表示。 %X 輸出十六進位整數,超過10的數字以大寫字母表示。 %f 輸出浮點數(floating number)。 %e 使用科學記號表示法,例如3.14e+05。 %E 使用科學記號表示法,例如3.14E+05(使用大寫E)。

43 3-2 scanf()函數 範例CH03_13.c /*浮點數之讀入*/

44 3-2 scanf()函數 執行結果 程式解說 第6行宣告兩個浮點數no1與no2。
第9行直接輸出兩數的和。

45 3-2 scanf()函數 範例CH03_14.c /*整數之讀入*/

46 3-2 scanf()函數 執行結果 程式解說 第8行在兩個格式化字元%d間加上「,」,實際輸入資料時也必須加上「,」號,再按下Enter鍵。 這時也不可分開兩筆,再按下Enter鍵輸入,否則也會發生錯誤。

47 3-2 scanf()函數 加上提示訊息 適當地從螢幕輸出提示訊息,以方便使用者輸入正確的資料,例如:
scanf("no:%d",&no); 上行指令等於以下兩行指令 printf("no:"); scanf("%d",&no);

48 3-2 scanf()函數 範例CH03_15.c /* 加上提示訊息 */

49 3-2 scanf()函數 執行結果 程式解說 第6行宣告兩個整數變數no、no1。
第11~12行則使用printf()函數,以便在scanf()函數輸入時加上提示字元。

50 3-2 scanf()函數 範例CH03_16.c /*連續輸入字元*/

51 3-2 scanf()函數 執行結果 程式解說 第10行中因為是以兩個連續%c來控制輸入格式,所以如果是輸入ab兩字元,在第12~13行則會輸出a、b與兩者的ASCII碼97、98。但如果輸入一個c,接著空一格,再按Enter鍵,在第12~13行則會輸出c、空格與兩者的ASCII碼99、32。假如各位輸入一個d,然後直接就按Enter鍵。

52 3-2 scanf()函數 範例CH03_17.c /* %c前空一格之使用 */

53 3-2 scanf()函數 執行結果 程式解說 第10行scanf()函數的格式化字串中,我們在%c前面空了一個字元,因此您可嘗試不論按下多少空白鍵、Tab鍵或Enter鍵,c1變數都只會接收第一個非空白的字元。 第12行輸出接收的字元及其ASCII值。

54 3-2 scanf()函數 範例CH03_18.c /* %c前空一格之時機 */ ※前面有其他資料輸入時, %c前應空一格

55 3-2 scanf()函數 執行結果

56 3-2 scanf()函數 程式解說 第10行中當輸入一個整數值(如55),並按下Enter鍵後,或直接跳過第11~12行。
第13行中會輸出v1=55,而c1的ASCII值會直接輸出10(‘\n’字元)。 第16行中當輸入一個整數值(如88),並按下Enter鍵後,會停在第18行處等待各位輸入字元。 第19行會輸出v2=88及c2的字元ASCII碼,當然這個結果就是第18行中我們在%c格式化字元前空一格的緣故。

57 3-2 scanf()函數 範例CH03_19.c /*指定位數的整數輸入*/

58 3-2 scanf()函數 執行結果 程式解說 第8行中將所輸入的數值,分別以4位數與5位數的整數值來讀取與儲存。
第11行中輸出此4位數,第12行中輸出此5位數,第13行中則計算兩者的數字總和。

59 3-2 scanf()函數 輸入字串 基本上,scanf()函數是以%s來讀取所輸入的字串,並且在中間不能有任何空白字元,因為從讀取第一個非空白字元到出現空白字元,就會自動停止。可以寫成如下語法: scanf("%s",name);

60 3-2 scanf()函數 範例CH03_20.c /*字串的輸入*/

61 3-2 scanf()函數 執行結果

62 3-2 scanf()函數 程式解說 第6行宣告3個字元陣列,可用來存放最多10個字元,分別是name、name1、name2。
第9行輸入一個字串,name之前不用加&號,輸入完所有字元後,請按下Enetr鍵,這時在所輸入的最後一個字元後,就會加上「‘\0’」。 第10行中會逐字輸出此字元陣列的每一個字元,直到遇到「‘\0’」為止。 第13行中則輸入兩個字串,兩個字串間可用空白鍵、Tab鑑或Enter鍵來區隔。

63 3-2 scanf()函數 範例CH03_21.c /*指定字元數的字串輸入*/

64 3-2 scanf()函數 執行結果 程式解說 第5行宣告2個字元陣列,分別是area和tel。
第8行可以輸入一串字元,我們利用%3s與%7s兩個格式化字元來將這串字元,分別拆成3個與7個字元存入兩個字串中。 接著在第11~12行可以直接利用%s來接2個字串內容輸出。

65 3-3 其他輸出輸入函數 前言 除了print()函數與scanf()函數扮演了C中最重要的輸出入功能外,本節中還要介紹C函數庫中所提供的其它字元與字串輸出及輸入函數,它們的原型都定義在stdio.h標頭檔中,包括getchar()函數、putchar()函數、getche()函數、getch()函數、gets()函數、puts()函數等。

66 3-3 其他輸出輸入函數 getchar()函數與putchar()函數
getchar()函數的功用是讓程式停留在該處,等到使用者從鍵盤輸入一個字元,並按下Enter鍵後,才會開始接收及讀取第一個字元。語法格式如下 putchar()函數的功能正好相反,可用來將指定的單一字元輸出到螢幕上。語法格式如下: char 字元變數 字元變數=getchar(); putchar(字元變數);

67 3-3 其他輸出輸入函數 範例CH03_22.c /*putchar()與getchar()之使用*/

68 3-3 其他輸出輸入函數 執行結果 程式解說 第8行中會讀入第一個輸入的字元,輸入完畢後記得按下 Enetr鍵,就會把這字元儲存到c1中。
第10行以printf()函數輸出c1字元。 第11行則利用putchar()來達到跳脫序列中換行的功能。

69 3-3 其他輸出輸入函數 getche()函數與getch()函數
getche()函數與getch()函數的功能與getchar()函數類似,都可用來讀取一個字元,最大不同之處是getchar()函數需要按下Enter鍵後,才表示結束字元的輸入動作。 getche()函數與getch()函數都是不必讀取緩衝區的字元,只要使用者輸入字元,就會立刻讀取,而不需要等待輸入Enter鍵。 這兩個函數間的唯一差別是getch()函數不會將所輸入的字元顯示到螢幕上,但是getche()函數會在螢幕上回應(echo)讀入的字元,也就是立刻顯示在營幕上。語法格式如下: 字元變數=getche(); /* 顯示輸出的字元 */ 字元變數=getch();/* 不會顯示輸出的字元 */

70 3-3 其他輸出輸入函數 範例CH03_23.c /*getche()與getch()之使用*/

71 3-3 其他輸出輸入函數 執行結果 程式解說 第6行宣告並定義字元變數 c1、c2。
第9行使用getche()輸入字元,當各位輸入任一字元後,即可自動往下繼續執行,還會將輸入的字元顯示到螢幕上。 第14行使用getch()函數輸入字元,並不會將所輸入的字元顯示在螢幕上。

72 3-3 其他輸出輸入函數 gets()函數與puts()函數
gets()函數不需要配合格式化字串的設定,會直接回應使用者輸入的整段字串到標準輸出設備(螢幕),當使用者按下Enter鍵時,才會讀取緩衝區的所有字元並存放到指定字元陣列中,並自動在最後加上‘\0’字元。語法格式如下: puts()函數可用來逐一輸出指定字串,直到遇到'\0'字元才會停止,並且執行換行的動作。語法格式如下: gets (字串變數); puts(字串);

73 3-3 其他輸出輸入函數 範例CH03_24.c /*gets()與puts()之使用*/

74 3-3 其他輸出輸入函數 執行結果 程式解說 第6行宣告sentence為可儲存20個字元的字元陣列。
第9行利用gets()函數來輸入英文句子,中間可包括空白或tab字元,直到按下Enetr鍵就會將輸入的所有字元儲存到字元陣列。 第10、11行使用puts()函數來輸出,輸入完後會自動換行。

75 本章結束 Q&A討論時間


Download ppt "程式設計 博碩文化出版發行."

Similar presentations


Ads by Google