820 likes | 968 Views
第四章. 格式化輸出入函式. 本章投影片僅供使用本書上課 教師 使用 , 非經同意請勿拷貝或轉載. 4-1 printf() 輸出函式. 輸出入介面是使用者和電腦溝通的橋樑。 是撰寫程式時使用率最頻繁函式之一。 有效格式化輸出入介面,設計出來的輸出 介面更富親和力且易操作。 C 本身未提供輸入或輸出敘述,須透過 printf() 輸出函式和 scanf() 輸入函式來 完成輸出入介面的設計工作。. P4-2. 4-1 printf() 輸出函式 ( 續 ). C 透過 printf() 函式由標準輸出裝置 ( 螢幕 ) 來 顯示字串或以指定格式將資料輸出。
E N D
第四章 格式化輸出入函式 本章投影片僅供使用本書上課教師使用,非經同意請勿拷貝或轉載
4-1 printf() 輸出函式 • 輸出入介面是使用者和電腦溝通的橋樑。 • 是撰寫程式時使用率最頻繁函式之一。 • 有效格式化輸出入介面,設計出來的輸出介面更富親和力且易操作。 • C本身未提供輸入或輸出敘述,須透過printf()輸出函式和scanf()輸入函式來完成輸出入介面的設計工作。 P4-2
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-1 printf()輸出函式 (續) P4-2 • 語法: printf (“控制字串….” ,變數1,變數2….) • 控制字串由下列三部分構成: 1. 一般字元(ordinary characters) 2. 轉換字元(conversion character) 3. 逸出字元(escape character)
4-1 printf()輸出函式 (續) 1.一般字元 • 控制字串內的一般字元包括:A~Z、0~9、+、-、*、/、…等任何可顯示的符號字元。 • printf() 都會原封不動完整輸出到螢幕。 P4-3
4-1 printf()輸出函式 (續) 2. 轉換字元 • 是以%轉換字元開始,而以資料型別字元(如d、f、e、g、c、s、u、x等)作結束。 • 轉換字元主要功能是欲在 % 處顯示的變數以指定的資料型別顯示。 • 以 % 開頭的字(word) 就是「變數列印格式」 • 基本分為四個欄位: P4-3
(1) Flag選項 -(負號) 省略正負號時,預設數值均向右對齊;加負號數值均向左靠齊,若為負値前加負號,正值則省略正號。若寬度夠大資料向左靠齊,多出位置補空白。 +(正號)預設只有負數才加負號;加正號,不論正負數均加正負號。 空白省略時預設正數前不加空白;加空白字元,正數前加上空白。 0(零)省略時,預設數字前不補 0;加上 0 時,數字前補 0。 # 省略時,預設頭尾不強迫列印:加上時,強迫列印前導(prefix) 和後置(postfix)字元。如:用來處理八進制和十六進制的前導字元。 P4-3
(2) width 選項- 為顯示資料欄位的總長度。如:%5d表示長度 為5的整數。- 若輸出為小數此長度包括小數點和小數點後面 的數字以及正負號。- 若長度小於資料本身的寬度時,此設定無效, 但資料仍可顯示;若設定寬度夠大,印出的資 料會向右靠齊。 (3) .precision 選項- 可用來設定浮點數小數位置以及字串的輸出格式。- 如浮點數 %7.2f 表示總寬度7位,含小數點、正負 號,小數位數佔2位,超過部分四捨五入。- 字串 %10.2s 表示總寬度10位,只印字串最前面2個字元。
下列敘述會由目前的游標處,將雙引號內的資料顯示出來,但碰到雙引號內 %d處是以引數串列中的第一個變數var1值來取代,而該var1變數值是採 %d十進數值顯示; %f 處以引數串列中的第二個變數var2取代,是採浮點數的型態顯示:
3. 逸出字元 (escape character) • 字元常數 採一對單引號括住字元,如:’a’ 。 • 例外:輸出字串內需要使用到雙引號來表示, 由於雙引號必須成對出現,為避免造成混淆,採用’ \” ’來表示。 • ’ \” ’ : 將「\」倒斜線稱為「逸出字元」。 將 \ 逸出字元和 接在其後的字元一起稱為 「逸出序列」(Escape sequence)。 • 當編譯器碰到 \ 時,將接在 \ 後面的字元當成正常字處理,不會視為特殊字來處理。 P4-5
逸出字元 (續) P4-5
[例1】printf ("Hello world!\n\n"); 執行方式: 執行時會在目前游標下,先將頭尾雙引號括住的字串『Hello world!』顯示出來。 接著碰到第一個 \n 會將游標移到下一行最前面。 接著碰到第二個 \n 會將游標移到下一行最前面,相當於空一行。 P4-6
【例2】printf ("\nHello your's book\n") ; • 執行 printf() 函式時先碰到 \n 先將游標移到下一行的最前面。 • 在該游標處顯示「Hello your‘s book」。 • 接著碰到第二個 \n,將游標移到下一行最前面。 • 單引號不影響列印。 P4-5
【例3】printf (“ \”Hello,your's book\” "); • 執行 printf() 函式時會由目前游標處依序將外層雙引號內的資料顯示在螢幕上。 • 當碰到 \”會將緊接在倒斜線後面的雙引號直接顯示。 • 執行結果顯示「”Hello,your‘s book”」頭尾出現雙引號。 • 最後游標停在該行最後一個字元的後面。 P4-6
/* 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 }
printf() 函式- 格式字元 (續) • 在% 轉換字元和上表型態字元之間,各資料型別可依狀況加入下列參數,中括號內參數若需要可擇一,不需要可省略: 1.字 元:%[-] [寬度]c 2.字 串:%[-] [+] [寬度][.小數位數]S 3.有號整數:%[+] [-] [寬度][l] d 4.無號整數:%[-] [#] [寬度] [l] [u|o|x] 5.浮 點 數:%[+] [-] [寬度] [.小數位數] [f|e|g] P4-7
printf() 函式- 格式字元 (續) 使用”+”正號 • 輸出資料是正值,在數字最前面加 ”+” 。 • 輸出資料是負值,在數字最前面加”-”。 • 如省略此符號,只有資料是負值,才在數字最前面加上 ”-” 負號。 P4-7
printf() 函式 - 格式字元 (續) 使用”-”負號 • 負號須配合資料寬度一起使用才有效。 • 若資料寬度比目前設定輸出寬度大且加”-”負號,則資料會向左靠齊顯示,右邊多出位置補空白。 • 若省略 ”-” 負號,預設向右對齊,左邊多出位置補空白。 • 若資料寬度比輸出設定位數寬度小,則以原來資料大小顯示,寬度設定值失效。 P4-8
printf() 函式- 格式字元 (續) 使用 # 字元 %#0:指定資料以八進位數輸出,並在最前面加 0(零)。 %#x:指定資料以十六進位數輸出,並在最前面加 0x。 %#[f|e|g]:輸出資料包含小數點。若使用 g 型態字元 輸出資料後面多餘的 0 不會省略。 P4-9
printf() 函式- 格式字元 (續) 省略+、-、# 字元 • 若輸出資料是正值,會在數字前面加上空白。 • 若輸出資料是負值,會在數字前面加上”-”負號。 P4-9
使用寬度 • 用來指定輸出資料的寬度。 • 若資料本身寬度比輸出設定寬度大,向右靠齊。反之,則輸出設定寬度無效。 • 若輸出資料含有小數時,寬度必須包括小數點、小數位數和正負號。 P4-10
printf() 函式- 格式字元 (續) 使用小數位數 • 若設定的是浮點數型別,即指定輸出資料小數部分佔用的寬度,採四捨五入。 • 如浮點數 %7.2f 表示總寛度 7 位,小數佔 2 位。 • 若設定是字串,即輸出字串最前面的字元個數,如字串 %10.2s 表示總寬度10 位, 只輸出字串最前面 2 個字。
使用小數位數 P4-10
printf() 函式- 格式字元 (續) 使用 [h | l | L] h:指定輸出的資料以short資料型別顯示。 l:指定輸出的資料以long資料型別顯示。 L:指定輸出的資料以long double資料型別 顯示。 P4-11
/* 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 }
/* 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 }
/* 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);
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 }
/* 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 }
4-2 scanf() 輸入函式 • 輸入資料最常用方法是由鍵盤鍵入。 • C未提供輸入敘述,透過 scanf() 函式由鍵盤鍵 入 資料,將輸入資料以指定資料型別和格式放入對應 變數。 • scanf()當程式執行到此函數時會暫時停止程式執行, 等待由鍵盤鍵入資料按 <Enter>鍵 後,會將鍵入資料 放入對應變數 • printf() 輸出函式是用來做輸出的動作。 • 程式中有用 scanf(),此函式宣告在 stdio.h 標頭檔。 P4-15
scanf() 函式語法 • 格式字串1 配合引數串列中的第1個引數「變數1」,格式字串2 配合引數串列中的第2個引數「變數2」 • 所有格式字串使用一對雙引號括起來。 • 各格式字串間透過空白字元來分隔。 • 空白鍵、跳位鍵、 跳行 等視為「空白字元」(white space characters)。 • scanf() 函式在處理格式字串會忽略這些空白字元,再讀取緊接其後格式字串內規定的資料。 • 每個格式字串可由下面五個欄位組合:[一般字元] % [*] [寬度] [h|l|L] [d|f|u|s|c|e|E]
2. 格式字串中允許加入一般字元,鍵入資料時必須跟著鍵入同樣的字元:printf ("BirthDay (yyy-mm-dd) : ");scanf ("%d-%d-%d",&yy ,&mm,&dd);printf ("year:%d month:%d date:%d \n",yy,mm,dd);
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()函式相同。
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); 輸入資料方式:1020 <enter> 輸入完畢 將 a10 b20。(表示空白鍵)
限制輸入三位數資料:scanf(“%3d”, &a); 輸入資料:123 <enter>鍵,a123 。 鍵入資料: 1234 <enter>鍵,a 123 鍵入資料: +1234 <enter>鍵,a +12 鍵入資料: -1234 <enter>鍵,a -12 使用*忽略字元,跳過一個資料項不讀scanf (“%*d%3d”, &a); 輸入資料方式:123456 結果:鍵入的資料123被跳過,只有將456存入變數a。 scanf(“%c%*c%c”, &c1, &c2); 輸入資料方式:abc 結果:a、c兩個字元分別存入變數c1 和 c2。
使用 &%f 轉換字元 scanf(“%3d%f%4f ”, &a, &x, &y); 輸入:1231234.561234.56結果:a123 x1234.56 y1234.000000 使用逗號當分隔資料字元 scanf(“%d, %d”, &a, &b); 輸入:3,8 結果:變數a=3 變數b=8 scanf(“a=%d, x=%d”, &a, &x) 輸入:a=3 ,x=8 雙引號格式字串內的一般字元必須一起鍵入結果:a3 b8 scanf(“A,M,P,M%d”,&a) 輸入:A,M,P,M1 結果:變數a存1 控制字串內部不允許使用精確度 scanf(“%7.2f”,&x); 忽略不等待按鍵。
/* 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;
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 }
/* 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 }