1 / 82

第四章

第四章. 格式化輸出入函式. 本章投影片僅供使用本書上課 教師 使用 , 非經同意請勿拷貝或轉載. 4-1 printf() 輸出函式. 輸出入介面是使用者和電腦溝通的橋樑。 是撰寫程式時使用率最頻繁函式之一。 有效格式化輸出入介面,設計出來的輸出 介面更富親和力且易操作。 C 本身未提供輸入或輸出敘述,須透過 printf() 輸出函式和 scanf() 輸入函式來 完成輸出入介面的設計工作。. P4-2. 4-1 printf() 輸出函式 ( 續 ). C 透過 printf() 函式由標準輸出裝置 ( 螢幕 ) 來 顯示字串或以指定格式將資料輸出。

Download Presentation

第四章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 格式化輸出入函式 本章投影片僅供使用本書上課教師使用,非經同意請勿拷貝或轉載

  2. 4-1 printf() 輸出函式 • 輸出入介面是使用者和電腦溝通的橋樑。 • 是撰寫程式時使用率最頻繁函式之一。 • 有效格式化輸出入介面,設計出來的輸出介面更富親和力且易操作。 • C本身未提供輸入或輸出敘述,須透過printf()輸出函式和scanf()輸入函式來完成輸出入介面的設計工作。 P4-2

  3. 4-1 printf() 輸出函式 (續) • C 透過 printf() 函式由標準輸出裝置(螢幕)來顯示字串或以指定格式將資料輸出。 • printf()是 C 標準輸出函式,該函式一些相關定義放在 stdio.h 標頭檔內,程式中若有用到 printf() 函式時,先用 #include 將 stdio.h標頭檔含入到程式中。 • 有些 C 已事先載入 stdio.h 標頭檔,在程式最前面不必含入 stdio.h 標頭檔。 • 有些 C 未事先載入stdio.h標頭檔,必須在程式最前面含入 stdio.h 標頭檔,執行 printf() 函式才不會發生錯誤。 P4-2

  4. 4-1 printf()輸出函式 (續) P4-2 • 語法: printf (“控制字串….” ,變數1,變數2….) • 控制字串由下列三部分構成: 1. 一般字元(ordinary characters) 2. 轉換字元(conversion character) 3. 逸出字元(escape character)

  5. 4-1 printf()輸出函式 (續) 1.一般字元 • 控制字串內的一般字元包括:A~Z、0~9、+、-、*、/、…等任何可顯示的符號字元。 • printf() 都會原封不動完整輸出到螢幕。 P4-3

  6. 4-1 printf()輸出函式 (續) 2. 轉換字元 • 是以%轉換字元開始,而以資料型別字元(如d、f、e、g、c、s、u、x等)作結束。 • 轉換字元主要功能是欲在 % 處顯示的變數以指定的資料型別顯示。 • 以 % 開頭的字(word) 就是「變數列印格式」 • 基本分為四個欄位: P4-3

  7. (1) Flag選項  -(負號) 省略正負號時,預設數值均向右對齊;加負號數值均向左靠齊,若為負値前加負號,正值則省略正號。若寬度夠大資料向左靠齊,多出位置補空白。 +(正號)預設只有負數才加負號;加正號,不論正負數均加正負號。  空白省略時預設正數前不加空白;加空白字元,正數前加上空白。 0(零)省略時,預設數字前不補 0;加上 0 時,數字前補 0。 # 省略時,預設頭尾不強迫列印:加上時,強迫列印前導(prefix) 和後置(postfix)字元。如:用來處理八進制和十六進制的前導字元。 P4-3

  8. (2) width 選項- 為顯示資料欄位的總長度。如:%5d表示長度 為5的整數。- 若輸出為小數此長度包括小數點和小數點後面 的數字以及正負號。- 若長度小於資料本身的寬度時,此設定無效, 但資料仍可顯示;若設定寬度夠大,印出的資 料會向右靠齊。 (3) .precision 選項- 可用來設定浮點數小數位置以及字串的輸出格式。- 如浮點數 %7.2f 表示總寬度7位,含小數點、正負 號,小數位數佔2位,超過部分四捨五入。- 字串 %10.2s 表示總寬度10位,只印字串最前面2個字元。

  9. (4) type 選項:用來設定為顯示的資料型別

  10. 下列敘述會由目前的游標處,將雙引號內的資料顯示出來,但碰到雙引號內 %d處是以引數串列中的第一個變數var1值來取代,而該var1變數值是採 %d十進數值顯示; %f 處以引數串列中的第二個變數var2取代,是採浮點數的型態顯示:

  11. 3. 逸出字元 (escape character) • 字元常數 採一對單引號括住字元,如:’a’ 。 • 例外:輸出字串內需要使用到雙引號來表示, 由於雙引號必須成對出現,為避免造成混淆,採用’ \” ’來表示。 • ’ \” ’ : 將「\」倒斜線稱為「逸出字元」。 將 \ 逸出字元和 接在其後的字元一起稱為 「逸出序列」(Escape sequence)。 • 當編譯器碰到 \ 時,將接在 \ 後面的字元當成正常字處理,不會視為特殊字來處理。 P4-5

  12. 逸出字元 (續) P4-5

  13. [例1】printf ("Hello world!\n\n"); 執行方式:  執行時會在目前游標下,先將頭尾雙引號括住的字串『Hello world!』顯示出來。  接著碰到第一個 \n 會將游標移到下一行最前面。  接著碰到第二個 \n 會將游標移到下一行最前面,相當於空一行。 P4-6

  14. 【例2】printf ("\nHello your's book\n") ; • 執行 printf() 函式時先碰到 \n 先將游標移到下一行的最前面。 • 在該游標處顯示「Hello your‘s book」。 • 接著碰到第二個 \n,將游標移到下一行最前面。 • 單引號不影響列印。 P4-5

  15. 【例3】printf (“ \”Hello,your's book\” "); • 執行 printf() 函式時會由目前游標處依序將外層雙引號內的資料顯示在螢幕上。 • 當碰到 \”會將緊接在倒斜線後面的雙引號直接顯示。 • 執行結果顯示「”Hello,your‘s book”」頭尾出現雙引號。 • 最後游標停在該行最後一個字元的後面。 P4-6

  16. P4-6

  17. /* FileName : printf1.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 printf("12345678901234567890\n"); 07 printf("Hello world!\n\n"); 08 printf("Hello\tWorld!\n"); 09 printf("Sorry I do'nt know.\n"); 10 printf("Your lucky number is \"7\". \n"); 11 printf("The \\n代表下跳下一行控制字元. \n"); 12 printf("123456789012345678901234567890\n"); 13 14 system("PAUSE"); 15 return 0; 16 }

  18. printf() 函式- 格式字元 (續) • 在% 轉換字元和上表型態字元之間,各資料型別可依狀況加入下列參數,中括號內參數若需要可擇一,不需要可省略: 1.字 元:%[-] [寬度]c 2.字 串:%[-] [+] [寬度][.小數位數]S 3.有號整數:%[+] [-] [寬度][l] d 4.無號整數:%[-] [#] [寬度] [l] [u|o|x] 5.浮 點 數:%[+] [-] [寬度] [.小數位數] [f|e|g] P4-7

  19. printf() 函式- 格式字元 (續)  使用”+”正號 • 輸出資料是正值,在數字最前面加 ”+” 。 • 輸出資料是負值,在數字最前面加”-”。 • 如省略此符號,只有資料是負值,才在數字最前面加上 ”-” 負號。 P4-7

  20. P4-8

  21. printf() 函式 - 格式字元 (續)  使用”-”負號 • 負號須配合資料寬度一起使用才有效。 • 若資料寬度比目前設定輸出寬度大且加”-”負號,則資料會向左靠齊顯示,右邊多出位置補空白。 • 若省略 ”-” 負號,預設向右對齊,左邊多出位置補空白。 • 若資料寬度比輸出設定位數寬度小,則以原來資料大小顯示,寬度設定值失效。 P4-8

  22. printf() 函式- 格式字元 (續) 使用 # 字元 %#0:指定資料以八進位數輸出,並在最前面加 0(零)。 %#x:指定資料以十六進位數輸出,並在最前面加 0x。 %#[f|e|g]:輸出資料包含小數點。若使用 g 型態字元 輸出資料後面多餘的 0 不會省略。 P4-9

  23. printf() 函式- 格式字元 (續) 省略+、-、# 字元 • 若輸出資料是正值,會在數字前面加上空白。 • 若輸出資料是負值,會在數字前面加上”-”負號。 P4-9

  24.  使用寬度 • 用來指定輸出資料的寬度。 • 若資料本身寬度比輸出設定寬度大,向右靠齊。反之,則輸出設定寬度無效。 • 若輸出資料含有小數時,寬度必須包括小數點、小數位數和正負號。 P4-10

  25. printf() 函式- 格式字元 (續)  使用小數位數 • 若設定的是浮點數型別,即指定輸出資料小數部分佔用的寬度,採四捨五入。 • 如浮點數 %7.2f 表示總寛度 7 位,小數佔 2 位。 • 若設定是字串,即輸出字串最前面的字元個數,如字串 %10.2s 表示總寬度10 位, 只輸出字串最前面 2 個字。

  26. 使用小數位數 P4-10

  27. printf() 函式- 格式字元 (續) 使用 [h | l | L] h:指定輸出的資料以short資料型別顯示。 l:指定輸出的資料以long資料型別顯示。 L:指定輸出的資料以long double資料型別 顯示。 P4-11

  28. P4-11

  29. /* FileName : printf2.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 char ch='B'; 07 int num=66; 08 09 printf ("==|1234567890|==\n"); 10 printf ("1.|%c|\n",ch); 11 printf("2.|%9c|\n",ch); 12 printf("3.|%-9c|\n",ch); 13 printf("4.|%9c|\n",num); 14 printf("5.|%9d|\n",ch); 15 16 system("PAUSE"); 17 return 0; 18 }

  30. P4-12

  31. /* FileName : printf3.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 04 int main(int argc, char *argv[]) 05 { 06 int num1=5168; 07 int num2=-7168; 08 int num3=125; 10 printf("==|1234567890|==\n"); 11 printf("1.|%d|\n",num1); 12 printf("2.|%9d|\n",num1); 13 printf("3.|%+9d|\n",num1); 14 printf("4.|%9d|\n",num2); 15 printf("5.|%-9d|\n",num2); 16 printf("==|1234567890|==\n"); 17 printf("6.|%-5u|\n",num3); 18 printf("7.|%-#5o|\n",num3); 19 printf("8.|%#5x|\n",num3); 21 system("PAUSE"); 22 return 0; 23 }

  32. P4-13

  33. /* FileName : printf4.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 float num1=135.56; 07 float num2=-135.123456; 08 09 printf("========|123456789012345|==\n"); 10 printf("1. %%f =|%f|\n",num2); 11 printf("2. %%12.2f =|%12.2f|\n",num1); 12 printf("3.%%12.5f =|%12.5f|\n",num1); 13 printf("4.%%-12.5f =|%-12.5f|\n",num1); 14 printf("5.%%-+12.5f =|%-+12.5f|\n",num1); 15 printf("6.%%12.5e =|%12.5e|\n",num2); 16 printf("7.%%-12.5e =|%-12.5e|\n",num2);

  34. 17 printf("============|123456789012345|==\n\n"); 19 float f=12.3456; 20 printf("8. f=12.3456\n"); 21 printf("============|123456789012345|==\n"); 22 printf(" %%f =|%f|\n",f); // f=12.345600 23 printf(" %%e =|%e|\n",f); // f=1.234560e+001 24 printf(" %%g =|%g|\n\n",f); // f=12.3456 26 f=0.0123456; /* 大於0.0001 %g 以符點數表之 */ 27 printf("9. f=0.0123456\n"); 28 printf("============|123456789012345|==\n"); 29 printf(" %%f =|%f|\n",f); // f=0.012346 30 printf(" %%e =|%e|\n",f); // f=1.234560e-002 31 printf(" %%g =|%g|\n\n",f); // f=0.0123456 33 f=0.00000163456; 34 printf("10 f=0.00000163456\n"); 35 printf("============|123456789012345|==\n"); 36 printf(" %%f =|%f|\n",f); // f=0.000002 37 printf(" %%E =|%E|\n",f); // f= 1.634560E-006 38 printf(" %%G =|%G|\n\n",f); // f= 1.63456E-006 40 printf("\n"); 41 system("PAUSE"); 42 return 0; 43 }

  35. P4-16

  36. /* FileName : printf5.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 char str1[12]="Hello,world"; 07 printf("==|123456789012345|==\n"); 08 printf("1.|%s|\n",str1); 09 printf("2.|%5s|\n",str1); 10 printf("3.|%15s|\n",str1); 11 printf("4.|%-15s|\n",str1); 12 printf("5.|%9.3s|\n",str1); 13 printf("6.|%-9.3s|\n",str1); 14 printf("==|123456789012345|===\n"); 15 16 system("PAUSE"); 17 return 0; 18 }

  37. 4-2 scanf() 輸入函式 • 輸入資料最常用方法是由鍵盤鍵入。 • C未提供輸入敘述,透過 scanf() 函式由鍵盤鍵 入 資料,將輸入資料以指定資料型別和格式放入對應 變數。 • scanf()當程式執行到此函數時會暫時停止程式執行, 等待由鍵盤鍵入資料按 <Enter>鍵 後,會將鍵入資料 放入對應變數 • printf() 輸出函式是用來做輸出的動作。 • 程式中有用 scanf(),此函式宣告在 stdio.h 標頭檔。 P4-15

  38. scanf() 函式語法 • 格式字串1 配合引數串列中的第1個引數「變數1」,格式字串2 配合引數串列中的第2個引數「變數2」 • 所有格式字串使用一對雙引號括起來。 • 各格式字串間透過空白字元來分隔。 • 空白鍵、跳位鍵、 跳行 等視為「空白字元」(white space characters)。 • scanf() 函式在處理格式字串會忽略這些空白字元,再讀取緊接其後格式字串內規定的資料。 • 每個格式字串可由下面五個欄位組合:[一般字元] % [*] [寬度] [h|l|L] [d|f|u|s|c|e|E]

  39. 2. 格式字串中允許加入一般字元,鍵入資料時必須跟著鍵入同樣的字元:printf ("BirthDay (yyy-mm-dd) : ");scanf ("%d-%d-%d",&yy ,&mm,&dd);printf ("year:%d month:%d date:%d \n",yy,mm,dd);

  40. 3. 輸入資料時,變數前必須加上 & 位址運算子,代表將資料以指定字串格式放到此變數位址內。輸出資料時,printf() 函式內的變數前不必加上&。變數與變數間必須以逗號隔開。 4. [h|l|L] 其中 h(short)、l(long或double)、L(long double)  %hd – short integer  %Lf – long double float  %ld – long decimal integer  %l[d|o|u|x] – long[十進制|八進制|無號|十六進制]  %l[e|f|g] – long double[指數|浮點數|選擇%f或%e較短者] 5. [d|f|u|s|c|e|E] 用法與 printf()函式相同。

  41. 6. 假設c1、c2、c3為字元變數,a、b整數變數,x、y為浮點變數, 代表空白字元,  使用空白鍵當分隔字元,一行連續輸入三個字元scanf (“%c%c%c”, &c1, &c2, &c3); 輸入資料方式:abc<enter>輸入完畢分別將 a、b、c 指定給 c1、c2、c3。  使用空白鍵當分隔字元,一行連續輸入兩個十進整數資料scanf (“%d%d”, &a, &b); 輸入資料方式:1020 <enter> 輸入完畢 將 a10 b20。(表示空白鍵)

  42. 限制輸入三位數資料:scanf(“%3d”, &a); 輸入資料:123 <enter>鍵,a123 。 鍵入資料: 1234 <enter>鍵,a 123 鍵入資料: +1234 <enter>鍵,a +12 鍵入資料: -1234 <enter>鍵,a  -12 使用*忽略字元,跳過一個資料項不讀scanf (“%*d%3d”, &a); 輸入資料方式:123456 結果:鍵入的資料123被跳過,只有將456存入變數a。 scanf(“%c%*c%c”, &c1, &c2); 輸入資料方式:abc 結果:a、c兩個字元分別存入變數c1 和 c2。

  43. 使用 &%f 轉換字元 scanf(“%3d%f%4f ”, &a, &x, &y); 輸入:1231234.561234.56結果:a123 x1234.56 y1234.000000 使用逗號當分隔資料字元 scanf(“%d, %d”, &a, &b); 輸入:3,8 結果:變數a=3 變數b=8 scanf(“a=%d, x=%d”, &a, &x) 輸入:a=3 ,x=8 雙引號格式字串內的一般字元必須一起鍵入結果:a3 b8 scanf(“A,M,P,M%d”,&a) 輸入:A,M,P,M1 結果:變數a存1 控制字串內部不允許使用精確度 scanf(“%7.2f”,&x); 忽略不等待按鍵。

  44. P4-21

  45. /* FileName : scanf1.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 int price,qty,pay,total,change; 07 int n1,n10,n50,n100,n500; 08 printf(" == 找零系統 ===\n\n"); 09 printf(" 1.單價 : "); 10 scanf("%3d",&price); 11 printf("\n 2.數量 : "); 12 scanf("%2d",&qty); 13 total=price*qty; 14 printf("\n 3.金額 : %d 元 \n", total); 15 printf("\n 4.實收 : "); 16 scanf("%d",&pay); 17 change=pay-total;

  46. 18 printf(" ===================== \n"); 19 printf(" 5.找零 : %d 元 \n",change); 20 n500=change/500; 21 change%=500; 22 n100=change/100; 23 change%=100; 24 n50=change/50; 25 change%=50; 26 n10=change/10; 27 change%=10; 28 n1=change; 29 printf("\n *** 應找鈔票如下: \n"); 30 printf("\n 1.500元: %d 張 \t 2.100元: %d 張 \n",n500,n100); 31 printf("\n 3. 50元: %d 張 \t 4. 10元: %d 張 \n",n50,n10); 32 printf("\n 5. 1元: %d 張 \n\n" ,n1); 33 34 system("PAUSE"); 35 return 0; 36 }

  47. P4-23

  48. /* FileName : scanf2.c */ 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(int argc, char *argv[]) 05 { 06 char c1,name[10]; 07 08 printf("\n 請入輸入英文名字 : " ); 09 scanf("%s",&name); 10 getchar(); 11 printf("\n 請輸入一個字元 : "); 12 scanf("%c",&c1); 13 printf("\n Hi, %s ! 您按 %c 字元 . \n\n",name,c1); 14 15 system("PAUSE"); 16 return 0; 17 }

More Related