3 コンソール入出力関数(16章)

コンピューターのもっとも基本的な入出力装置であるキーボードとディスプレイをコンソー ル(console:操作卓)と呼ぶ.これらのコンソール入出力を利用した関数のプログラムの学習をする. とは言え,諸君はこれらの関数はかなり使ってきている.ここではそれら内容を整理して, これらの使い方の復習を行う.

3.1 標準入力と標準出力

コンソール入出力のことを,標準入出力と言うことがある.この標準入出力には,ファイ ルの入出力先に指定ができ3,そのために名前が付いている.標準入力をstdin,標準出 力をstdoutと言う.これらの関係を,以下に示す.
キーボード $ \rightarrow$ 標準入力 $ \rightarrow$ stdin
ディスプレイ $ \rightarrow$ 標準出力 $ \rightarrow$ stdout

3.2 書式付き出力printf(p.320)

3.2.1 ディスプレイへの出力

printf()関数を使えば,簡単にディスプレイ(標準出力)に表示できる.括弧内の最 初のクォーテーションで囲まれた部分が出力される.Hello worldのプログラムでお なじみであろう.変数に格納されたデータ--整数や実数,文字,文字列--を表示させた ければ,変換仕様(p.320〜)を使う.教科書には,いろいろ書かれており,諸君にはわか りにくいだろう.実際には,
printf("%d+%d=%d\n", a, b, result);
 

にように書く.この文の動作は,図1のとおりである.
図 1: ディスプレイに表示させるprintf関数の意味
\includegraphics[keepaspectratio,scale=1.0]{figure/printf_var.eps}

ここで難しいのは,変換仕様の使い方である.本講義で使う変換仕様はそんなに多くなく, 表1にまとめることができる.この中でも,文字列は滅多に使わ ないだろう.

あと,重要なことはエスケープシーケンス(p.27)である.エスケープシーケンスもいろい ろあるが,'\n'と'\t'の使い方が分かれば,本 講義では十分である.


表 1: 型に依存する変数定義や入出力
表示方法 変換仕様 備考
整数   %d 10進数に変換
実数 浮動小数点 %f 小数点の表示.非常に大きな数値や小さ い数値の表示には向かない.
    %20.15f 合計20カラムで,小数点以下15桁で表示
  指数表示 %e 非常に大きな数値や小さい数値を含む場合に都合が良い.
文字   %c ひとつの文字を表示する場合に使う.
文字列   %s 文字列を表示させる場合に使う.

3.2.2 練習問題

書式付き出力(printf)を使うと,任意の形でデータを出力できる.教科書のP.320〜 325を読み,以下の練習問題を実施せよ.
[練習1]
円周率を,いろいろなフォーマットで出力せよ.ただし,円 周率はmath.hの中でM_PIで定義されている.それ は,リスト4のようにすれば表示できる.
  • 通常の%fで表示せよ.
  • 小数点以下,3桁で表示せよ.
  • 小数点以下,10桁で表示せよ.
  • 指数形式で表示せよ.
リスト4には,数学関数用のヘッダーファイル math.hが使われているので,コンパイルには-lmオ プションが必要である.例えば
			gcc -o fuga hoge.c -lm

とする.
[練習2]
整数の22446688を8進数で表示せよ.また,16進数で表 示せよ.
[練習3]
円周率と円周率の2乗の両方を小数点以下,10桁で表示せよ.た だし,2つの数値の間はタブ区切りとする.

   1 #include <stdio.h>
   2 #include <math.h>
   3 
   4 int main(void){
   5 
   6   printf("%f\n", M_PI);
   7   
   8   return 0;
   9 }

3.3 書式付き入力scanf(p.326)

3.3.1 キーボードからのデータの取り込み

キーボード入力の場合,書式付入力のscanf()という関数を使う方法が最も簡単である.こ の関数の引数は,ポインター4で,キー ボードからのデータを入れる変数のアドレスを指定する.ポインターだのアド レスだのと面倒なことが多いが,そんなことが分からなくても,キーボードからデータの 入力は可能なので安心してよい.

標準入力(キーボード)からデータを読み込んで,それを変数hogeに代入する場合,

scanf("%lf",&hoge);
 

と書けばよい.これは, というようなことを表している.図2のような感じである.
図 2: キーボードからデータを変数に取り込むscanf関数の意味
\includegraphics[keepaspectratio,scale=1.0]{figure/scanf.eps}

キーボードからのデータの入力でも型を指定する必要がある.このようにコンピューター プログラムでは型というものが重要となる.これは,データをメモリーに格納する方法をプログラ マーが指定する必要があるからである.これまで,使ってきた型指定の方法を表 2にまとめる.ただし,倍精度実数で,非常に大きな数値や小さい 数値の場合指数表示(%e)を使う.

表を見て分かると降り,文字列は少し複雑である.幸いなことに,本講義では文字列を使 うことはほとんどないので,この部分は余り気にしなくてよい.

表 2: 型に依存する変数定義や入出力
  整数  倍精度実数 文字 文字列
変数 int hoge double hoge char hoge char hoge[256]
入力 scanf("%d",&hoge) scanf("%lf",&hoge) scanf("%c",&hoge) scanf("%s",hoge)
出力 printf("%d",hoge) printf("%f",hoge) printf("%c",hoge) printf("%s",hoge)
    printf("%e",hoge)    

3.3.2 改行文字の問題

データを入力する場合,データを入れた後に完了を示す[Enter]キーを押す.この [Enter]キーを示す文字'\n'も読み込まれようとして,悪さ をすることがある.この,改行コード'\n'を読み捨てる必要がある. それを行うために,教科書(p.335)には3通りの方法(p.337)を示している.

どれも一長一短がある.諸君が作成するプログラムは,諸君自身でしか使わないので,入 力の処理にこだわらない方がよい.へんなデータを入れて,プログラムがクラッシュして も損害は無いからである.そこで,本講義では最も簡単な,最初の方法をとることにする. すなわち,キーボードから実数を読み込んで,変数hogeに代入する場合,

scanf("%lf%*c",&hoge);
 

と書く.

3.3.3 プログラム例

リスト5にいろいろな型のデータを読み込んで,表示するプログラム を示す.このプログラムが理解できれば,コンソール入出力の基本はOKである.
   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i;
   5   double d;
   6   char c;
   7   char s[256];
   8 
   9   scanf("%d%*c",&i);
  10   scanf("%lf%*c",&d);
  11   scanf("%c%*c",&c);
  12   scanf("%s%*c",s);
  13 
  14   printf("\n\n");
  15 
  16   printf("%d\n",i);
  17   printf("%f\n",d);
  18   printf("%c\n",c);
  19   printf("%s\n",s);
  20   
  21   return 0;
  22 
  23 }

3.3.4 練習問題

[練習4]
キーボードから角度[deg]を読み込んで,三角関数 ( $ \sin,\,\cos,\,\tan$)の値を表示するプログラムを作成せよ.出力 する三角関数の値は,1行に表示しタブ区切りとすること.

3.4 お遊び

リスト6のプログラムの実行結果を予想せよ.分からない場合は,実行してみよ.
   1 #include <stdio.h>
   2 #include <math.h>
   3 
   4 #define NP 50
   5 
   6 int main(void){
   7   int i, iy;
   8   double x;
   9 
  10   for(i=0; i<=NP; i++){
  11     x = 2*M_PI/NP*i;
  12     iy = 30*sin(x)+40;
  13     printf("%*c\n",iy,'*');
  14   }
  15 
  16   return 0;
  17 }

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年6月26日


no counter