練習5-1のソースファイル
//hello.c
int main(void) {
printf("hello\n");
return 0;
}
hello.c
では,printf
という関数が使われています(hello.c
には,printf
というトークンがあり,これは関数名を表す識別子です.)
printf
は,
与えられた入力を,画面に(ターミナルに)表示する
という処理を行う関数です.ターミナルに文字の列や数字などを表示する場合などに用います.
今回は,printf
の二通りの「使い方」を学びます:
「書式化」を行わない場合
「書式化」を行う場合
printf目次書式化を行わない場合練習6-1練習6-1-1(教科書 List1_6に対応)練習6-1-2書式化を行う場合数字を入力とする場合数字と文字列を入力とする場合複数の数字を入力とする場合練習6-2練習6-2-1(renshu6_2_1.cを完成させよ)練習6-2-2:(renshu6_2_2.cを完成させよ)
まずは,より簡単な「書式化」を行わない場合について説明します.この場合,printf
は
「文字列リテラル」が入力として与えられたときに,画面(ターミナル)に「文字列」を表示する
という処理を行います.
printf("文字列") → ターミナルに文字列を表示
ここで,printf
が関数名です.文字列をダブルクォーテーションで囲んだものが文字列リテラルです.
hello.c
ではprintf
という関数に
"hello\n"
という文字列を入力として与え,それにより
helloという文字列を画面(ターミナル)に表示させています.
これをプログラムでは
xxxxxxxxxx
printf("hello\n");
のように記述しています.実行すると,
xxxxxxxxxx
hello
と表示されます.
補足 :\n
の意味についてはこちらのポイント5を参照.
次のプログラムにおいて「福岡太郎」を自分の氏名に変更し,renshu6_1_1.c
という名前で保存.
実行ファイル名を指定せずコンパイル.
実行.
xxxxxxxxxx
//renshu6_1_1.c
int main(void) {
printf("こんにちは。\n");
printf("私の名前は福岡太郎です。\n");
return 0;
}
コンパイル・実行方法については,こちらの9ページ目を参照のこと.
上記のrenshu6_1_1.c
を編集し,printfを一度だけ使用して練習6-1-1と同じ結果が得られるようにする.
編集したファイルをrenshu6_1_2.c
という名前で保存.
renshu6_1_2.c
をコンパイルし,renshu6_1_2
という実行ファイルを生成.
renshu6_1_2
を実行.
書式とは,英語ではformatといいます.printf
のf
はformatの「f」です.
用語の確認
書式化:表示させたいものを「どのような体裁で表示するか」を指定すること.
変換指定:「どのような体裁で表示するか」を指定する記号.具体的には,%
の後に数値やドットやアルファベットが特定の順序で並んだものです(詳細は教科書p. 376 - p. 379)
今回は,数字を入力とする場合について扱います.文字列に対する書式化については,扱いません.
変換と数字をprintf関数への入力として与えると,指定された書式でターミナルに数字が表示されます.
printf("変換指定", 数字)
→ 変換指定に基づき数字を表示
「整数を小数点以下6桁に丸めて表示することはできない」などのように,与える数字のタイプ(型)と変換書式の与え方にはルールがあり,それを満たさなければエラーとなる.
第一引数に"変換書式",第二引数に数字を入れること.また,変換書式の両端にダブルクオーテーションを忘れずにつけること(数字を文字列として表示させるため).
書式変換の具体例
%d
:与えられた整数を,10進数で表示させるための変換指定(dはdecimal(10進数)の「d」)
%x
:与えられた整数を,16進数で表示させるための変換指定(xはhexadecimal(16進数)の「x」 )
%f
:与えられた浮動小数点数を,小数点以下6桁に丸めて表示させるための変換指定(fは floating point number(浮動小数点数)の「f」)
%.3f
:与えられた浮動小数点数を,小数点以下3桁に丸めて表示させるための変換指定(3は小数点以下第3位までを表示することを意味)
浮動小数点数:小数点のついた数値.
「丸め方」は実行環境によって異なる.演習室の環境では,最も近い方向へ丸める.
例題1
10という整数を10進数で表示
xxxxxxxxxx
printf("%d", 10);
出力は
xxxxxxxxxx
10
例題2
10という整数を16進数で表示
xxxxxxxxxx
printf("%x", 10);
出力は
xxxxxxxxxx
a
(10進数の0, 1, ..., 8, 9, 10, 11, 12, 13, ...は16進数で0, 1, ..., 8, 9, a, b, c, d, ...に対応.)
例題3
3.1415という浮動小数点数を小数点以下3桁に丸めて表示
xxxxxxxxxx
printf("%.3f", 3.1415);
出力は
xxxxxxxxxx
3.142
ここでは,
xxxxxxxxxx
円周率を3.14とおく
のように,数字と文字列を組み合わせて表示させたい場合について,扱います.
変換指定を含む文字列と数字をprintf関数への入力として与えると,指定された書式に変換された数字を伴う文字列が表示されます.
printf("変換指定を含む文字列")
→ ターミナルに数字を含む文字列を表示
例題4
「10を10進数で表示:」という文字列の後に,10を10進数で表示
xxxxxxxxxx
printf("10を10進数で表示:%d\n",10);
出力は
xxxxxxxxxx
10を10進数で表示:10
例題5
「10を16進数で表示:」という文字列の後に,10を16進数で表示
xxxxxxxxxx
printf("10を16進数で表示:%x\n",10);
出力は
xxxxxxxxxx
10を16進数で表示:a
複数の数字をターミナルに表示させることもできます.
複数の数字を表示する場合には,printf関数の( )内部にカンマで区切って実引数を追加します.
printf("変換指定を複数含む文字列", 1つめの数字, 2つめの数字, ...)
→ ターミナルに,複数の数字を含む文字列を表示
例題6
「10を10進数で表示すると■で,16進数で表示すると□です」という文字列において,■に10を10進数で,□に10を16進数で表示
xxxxxxxxxx
printf("10を10進数で表示すると%dで,16進数で表示すると%xです\n", 10, 10);
出力は
xxxxxxxxxx
10を10進数で表示すると10で,16進数で表示するとaです
学籍番号の数字の部分(7桁)について,以下の2通りに表示せよ.
文字列として表示(書式化を行わない)
10進数として表示(変換指定は%d
)
学籍番号が2212345の場合の出力結果の例
xxxxxxxxxx
文字列:2212345
10進数:2212345
学籍番号の4桁目までを整数,5桁目以降を小数点以下の数とみなして(学籍番号が2212345であれば「2212.345」とみなす),以下の2通りに表示せよ.
浮動小数点数として小数点以下第6位まで表示(変換指定は %f
)
浮動小数点数として小数点以下第2位まで表示(変換指定は %.2f
)
学籍番号が2212345の場合の出力結果の例
xxxxxxxxxx
浮動小数点数(小数第6位まで):2212.345000
浮動小数点数(小数第2位まで):2212.34