C プログラミング (C Programming)

[2017/09/25, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 4 の内容

一つの実数を読み込み,それを四種類の書式で出力しています.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4: 	 double x;
 5:      
 6:      printf("一つの実数を入力してください:");
 7:      scanf("%lf", &x);
 8:      
 9:      printf("x = %f\n", x);
10:      printf("x = %9f\n", x);
11:      printf("x = %09f\n", x);
12:      printf("x = %5.3f\n", x);
13:      
14:      return 0;
15:   }

7 行目:scanf("%lf", &x);

 4: 	 double x;
 5:      
 6:      printf("一つの実数を入力してください:");
 7:      scanf("%lf", &x);
 8:

これまでに登場した scanf 関数による数値の読み込みは,すべて整数(int 型)が対象でした.

このサンプルプログラムでは,実数(double 型)を読み込んでいます.

基本的な方法は int 型の場合と同じで,書式指定の部分(つまり "%d")が違ってくることになります.
ここがポイントなのですが, scanf では "%f" ではなく "%lf" (小文字のエルとエフ)を書式として指定します.

int 型の場合,printf と scanf の両方で "%d" と共通であったのに, double 型の場合は printf では "%f",scanf では "%lf" と違っているんです.
データ型   printf での出力     scanf での入力  
int 型 %d
  double 型   %f %lf

10 行目:printf("x = %9f\n", x);

 9:      printf("x = %f\n", x);
10:      printf("x = %9f\n", x);
11:      printf("x = %09f\n", x);
12:      printf("x = %5.3f\n", x);  

printf 関数で実数を出力する場合は,上で説明したように "%lf" ではなく "%f" を使うのですが,この際,% と f の間に追加情報を指定することでより細かく出力の書式を決めることができます.

基本となるのが,10 行目のように % と f の間に自然数を一つ入れるタイプです.

この場合,指定された自然数は,出力の桁数(横幅)を表します.
サンプルプログラムでは 9 と指定してあるので,9 桁分の幅を用意して,その中に数値を(右詰めで)表示させます.
1 2 3 4 5 6 7 8 9
  3 . 1 4 1 5 0 0
この場合,左端が 1 マス空いたかたちになります.

11 行目:printf("x = %09f\n", x);

 9:      printf("x = %f\n", x);
10:      printf("x = %9f\n", x);
11:      printf("x = %09f\n", x);
12:      printf("x = %5.3f\n", x);  

続いて,% と f の間に指定する桁数の前に 0 を付けて書くと, 上位桁を 0 で埋めて出力するようになります.

次のようなかたちになります:
1 2 3 4 5 6 7 8 9
0 3 . 1 4 1 5 0 0

12 行目:printf("x = %5.3f\n", x);

 9:      printf("x = %f\n", x);
10:      printf("x = %9f\n", x);
11:      printf("x = %09f\n", x);
12:      printf("x = %5.3f\n", x);  

% と f の間に小数点付きで桁数を書くと, 全体の桁数と小数点以下の桁数を指定された幅で出力するようになります.

小数点より左が全体の桁数,右が小数点以下の桁数に対応し,次のようなかたちになります:
1 2 3 4 5
3 . 1 4 2
小数点以下が途中までになった場合,四捨五入されるかどうかは保証の限りではありません

なお,全体の桁数を省略して,小数点以下の桁数のみを指定した printf("x = %.3f\n", x); という書き方も許されます.