第三章基本輸出與輸入的方法 資訊科技系 林偉川 本章簡介 如何從鍵盤輸入資料以及從螢幕輸出結果, 是寫程式一個很基本的技巧, 因為這也是使用者與電腦交談的重要橋樑 在 C 語言函式庫中有不少輸出 / 入相關函式, 不過較常用到的也只有其中幾個 從螢幕輸出類 : 由鍵盤輸入類 : 2 1
從螢幕輸出類 printf(): 函數名稱取 print 以及 format 兩個字組成 此函式會將我們指定的字串以指定的格式輸出在螢幕上 putchar(): 函數名稱取 put 以及 character 兩個字組成 如名稱所示, 此函式的用途是輸出字元, 而且一次只能輸出一個字元, 也不具備像 printf () 的格式化輸出功能 3 由鍵盤輸入類 scanf(): 函式名稱取 scan 以及 format 兩個字組成 使用者以鍵盤輸入資料後, 需按下 [Enter] 鍵, 函式會將資料讀進程式中處理 getchar(): 函式名稱取 get 以及 character 兩個字組成 同樣在輸入資料後按下 [Enter] 鍵, 此函式會讀取資料的第 1 個字元進程式處理 getche(): 函式名稱取 get character 以及 echo 組成 表示由從鍵盤輸入一個字元後, 函式會馬上讀取而不需要按下 [Enter] 鍵 4 2
由螢幕輸出 :printf() 函式 字串輸出 控制輸出格式 輸出格式的參數 使用 Escape Sequence 控制輸出 5 字串輸出 printf () 函式會將其括號中的雙引號內 ("...") 的字串忠實印出 : 6 3
控制輸出格式 資料的型別有很多種, 如整數 浮點數 字元等等 而使用 printf (...) 函式輸出時, 也可在要輸出的字串 "..." 之中, 以便將不同型別的變數值正確地輸出 "..." 稱為格式化字串, 因為其中的字串, 可包含控制輸出格式的控制符號 這些控制符號是以 '%' 為開頭, 先來看以下整理出來的輸出格式表 : 7 輸出格式表 8 4
呼叫 printf () 函式的語法 輸出格式 : 以 % 開頭的控制符號, 如 %d %f... 均需放在雙引號 " " 裡 : 變數名稱 : 此變數的值, 會依序對應至 "... " 中的輸出格式, 並按照指定格式顯示在螢幕上 9 輸出格式與輸出結果的關係 10 5
輸出格式與輸出結果的關係 11 利用一個 printf ( ) 輸出兩個變數值 12 6
輸出格式的應用 : 與字串結合 當我們利用 printf () 的控制符號輸出變數值時, 也可在 "..." 中加入其它說明文字 這些文字都會依原本的內容顯示出來 : 13 從螢幕輸出數羊的字串 14 7
執行結果 比對執行結果各行的輸出字串為 : 1. 第 8 行 : 第 1 隻羊... 控制符號 %d 會輸出整數型別的變數 n1=1 的值 2. 第 9 行 : 第 2 隻羊... 控制符號 %d 會輸出整數型別的變數 n2=2 的值 15 執行結果 3. 第 10 行 : 第 x 隻羊... 控制符號 %c 會輸出字元型別的變數 nx= 'x' 的值 4. 第 11 行 : 第 1x 隻羊... 控制符號 %d %c 會輸出 n1=1 與 nx= 'x' 的值, 且把兩個數值並在一起 5. 第 12 行 : 第 2x 隻羊... 控制符號 %d %c 會輸出 n2=2 與 nx= 'x' 的值, 且把兩個數值並在一起 16 8
執行結果 6. 第 13 行 : 第 xxx 隻羊... 控制符號 %c %c %c 會輸出字元型別的變數 nx= 'x', 因為變數 nx 出現了 3 次, 所以會輸出 3 次的變數值, 而且會把 3 個數值並在一起 7. 第 14 行 : 睡著了...zzz 控制符號 %c 會輸出字元型別的變數 nx= 'x' 的值 17 輸出格式的應用 :8 進位與 16 進位 利用控制符號 %d %o 以及 %x 可以將整數以非十進位的方式輸出 : int digit=10; printf( %o \t %x\n,digit, digit); //12 a 18 9
不同進位制的轉換 19 執行結果 第 7 8 行, %d 會將變數值以十進位的格式從螢幕輸出 第 9 行, %o 會將變數值以八進位的格式從螢幕輸出 第 10 行, %x 會將變數值以十六進位的格式從螢幕輸出 20 10
輸出格式的應用 : 不同的浮點數表示法 用於輸出浮點數的 %f 與 %e 分別表示以 一般小數表示法 或 科學符號表示法 來輸出浮點數型別的數值 : 21 從螢幕輸出浮點數 22 11
輸出算式的結果 輸出格式符號 : 就是 %d %f... 等 算式 : 可填入一般算式, 如 a+b a/b... 等 : printf( %d,a+b); 23 從螢幕輸出兩數值的和 24 12
指定固定寬度的輸出欄位 整數的設定方式 : 直接以數字指定寬度, 例如 %8d 表示輸出的寬度為 8 個字元, 若變數值不到 8 位數, 則輸出時預設向右對齊, 前面多的位置留空 浮點數的設定方式 : 可同時指定整數部分和小數部分的位數, 其間以小數點隔開, 例如 %4.3f 25 指定固定寬度的輸出欄位 指定位數時, 可在數字前加上 0, 表示多出的位置都填上 0 26 13
指定變數輸出時的寬度 27 執行結果 28 14
正負號也會佔用 1 個字元 (+) 29 自動調整不足的欄位 30 15
數值向左靠齊 (-) 當輸出格式中有使用 - 參數時, 不管此時設定的固定欄位數為何, 也不管是否在空白欄位補 0 與否 輸出的數字一律向左靠齊, 也就是說, 數值的最高位會在正負號 ( 如果存在 ) 後的第 1 位 printf( %-6d,-123); -123 31 加上參數 - 的輸出結果 32 16
使用兩個以上參數的順序 如果要使用兩個以上的參數, 順序如下 : 如以下範例 : 33 使用兩個以上參數的順序 34 17
使用 Escape Sequence 控制輸出 Escape Sequence 一般譯為逸出序列或跳脫序例, 是一個 命令, 然後依該命令的指示, 進行相關的輸出 C 語言的 Escape Sequence 都是以反斜線 (\) 為開頭 : 35 Escape Sequence 控制輸出表 36 18
刪除字元和結束字元 '\b' 會使輸出的字串由 '\b' 的位置開始, 向左刪除一個字元 '\r' 則會從所在位置開始, 把前面的字元都刪除 '\0' 為字串的結束字元, 看到它就表示 : 這個字串已到結尾了 所以跟在 \0 後面的字元都會被忽略而不會被輸出 如以下程式 : 37 練習刪除字元 38 19
輸出單 雙引號與反斜線 因為單 雙引號與反斜線在 C 語言中有特殊用途, 所以這些字元出現在 printf () 的雙引號內, 也無法順利的被輸出到螢幕 因此如果有需要輸出這些符號時, 可使用 \' \" \\: 39 輸出單 雙引號與反斜線 40 20
從螢幕輸出單一字元 :putchar () 函式 putchar () 函式可輸出一個字元, 若引數是數字, 則根據 ASCII 碼將該數字轉換成字元後, 從螢幕輸出 如以下範例中, 我們把 putchar () 括號內加上不同引數後的各種輸出作一整理 : 41 putchar () 從螢幕輸出字元 42 21
執行結果 43 執行結果 第 7 行, 變數 n 的初始值為 100, putchar (n) 會從螢幕輸出 100 的 ASCII 對照字元值 d 第 9 行, putchar (100) 直接用常數 100, 從螢幕輸出結果與 putchar (n) 相同 第 8, 10, 11 行, putchar ('\n') 或 printf ("\n") 使用 Escape Sequence \n, 從螢幕輸出結果產生了換行的效果 第 12 行, putchar ('n') 使用 'n', 以單引號括住 n 代表的意義不再是變數 n 而是字元 n 所以, 從螢幕輸出結果會印出字元 n 44 22
從鍵盤輸入的數值 格式化輸入函式 :scanf() 函式 scanf() 可以配合各種輸入格式控制字元, 讀取任何型別的資料, 也是最常用的鍵盤輸入函式 由鍵盤輸入單一字元 :getchar() 函式 不需要按 [Enter] 鍵的鍵盤輸入 :getche() 函式 不顯示的鍵盤輸入 :getch() 函式 45 scanf () 的格式 使用 scanf() 的格式如下 : scanf( 輸入格式,& 變數名稱 ); 輸入格式 : 與 printf() 的輸出格式 ( 如 %d %f...) 相同, 配合 scanf() 使用時, 就變成輸入格式 & 變數名稱 : 用來接受輸入值, & 表示取得變數在記憶體的位址 使用 scanf() 函式時, 用來接受輸入值的變數名稱前一定要加 & 46 23
scanf () 的格式 scanf () 可以搭配控制符號 % 來決定由鍵盤輸入的格式, 也就是說 scanf () 可以接受任何型別的輸入值 : 47 求兩個數值的和 48 24
執行結果 當 scanf () 一次讀取兩個數值時, 可以在 2 個數值間留一空白字元的方式輸入, 或者分 2 行輸入 輸入完畢記得按下 [Enter] 鍵, 在完成輸入第二個數值前, 按下 [Enter] 鍵只會產生換行的效果, 不會有下一步的執行動作 49 scanf () 由鍵盤輸入輸出 50 25
如果輸入數值的型別與 scanf() 所設的格式不符 該值會被強制轉型為符合 scanf() 所設型別 如果輸入的值不為整數, 仍然會被當整數型別處理 執行結果 51 由鍵盤輸入單一字元 :getchar() 函式 getchar() 是專門為了讀取字元而設的函式 getchar() 的括號內, 不用加任何引數, 因為不管輸入值為何, 此函式一律以字元的型別讀取, 而且只讀取一個字元, 即使輸入多個字元, getchar() 也只會讀到第一個字元 getchar() 所讀到的字元, 會當成函式的傳回值傳回, 因此我們可將這個傳回值指定給一個變數, 或是如下的範例直接使用 : 52 26
getchar() 讀取字元 53 執行結果 第 7 行中, printf () 函式會直接從螢幕輸出 getchar () 函式對傳回值, 也就是直接輸出我們輸入的第一個字元 54 27
從螢幕顯示由鍵盤輸入的數值 可以用 putchar() 從螢幕輸出 getchar() 的結果 因為兩者都是用來處理單一的字元 首先, 宣告一個字元變數, 將 getchar() 讀到的字元傳入字元變數中, 然後再利用 putchar() 從螢幕輸出 : 55 從螢幕顯示由鍵盤輸入的數值 56 28
不需要按 Enter 鍵盤輸入 :getche() 函式 getche() 也是一個讀取單一字元的函式 但它與 getchar() 函式不同 : 使用 getche() 函式時, 只要一輸入字元, 馬上就會被接收處理, 而不需要按下 [Enter] 鍵 舉個例子來說明 : 57 getche() 鍵盤輸入即時處理 58 29
不顯示的鍵盤輸入 :getch() 函式 getch() 函式具有 getche() 的功能, 也就是說會立即取得鍵盤輸入 除此之外使用 getch() 讀取鍵盤輸入時, 不會在螢幕上看到輸入的字元, 因此要將由 getche() 讀到的字元自動回應到螢幕上, 還得自行用 printf() putchar() 等函式將該字元輸出 參考以下範例 : 59 getch () 不會顯示輸入字元即時處理 60 30
綜合演練 印出簡單的圖形 由鍵盤輸入數值作運算 數字轉換成字元 : 利用輸出格式 61 利用 printf () 的輸出功能可印出簡單的圖形, 下面的例子就是用 * 符號印出菱形 : 印出簡單的圖形 62 31
由鍵盤輸入數值作運算 63 數字轉換成字元 : 利用輸出格式 64 32
數字轉換成字元 : 利用 putchar () 函式 65 除錯 getchar(i); scanf(&x); printf( bal=%d6,bal); putchar( \n ); 66 33
執行結果 執行結果為何? int a=14; float b=1.4; printf( %5d,a); // 14 printf( %05d,a); //00014 printf( %+06d,a); //+00014 printf( %-6d,a); //14 printf( %6.2f,b); // 1.40 printf( %06.2f,b); // 001.40 printf( %+06.2f,b);//+01.40 int i; i=getchar(); // 輸入 12345 printf( %c,i); 67 作業 試寫一程式輸入 x y z 之值, 算出 f(x,y,z)=3x+3y-z 之值 試寫一程式輸入一浮點數, 設定輸出寬度為整數和小數各 5 個字元, 多出未用的位數補零, 並顯示出正負號 試寫一程式輸入一整數後, 轉成八進位與十六進位輸出 試寫一程式輸入一整數攝氏度數後, 算出其相對的整數華氏度數 試寫一程式輸入兩整數後, 印出互換後的值 68 34