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

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

2.1 標準ライブラリー関数(p.282)

2.1.1 プログラマー作成の関数とライブラリー関数

これまでの学習で、C言語のプログラムは関数の集まりであることが理解できていると思 う。この関数には、プログラマーが作成する関数ともともとコンパイラーが用意している 関数がある。例えば、リスト1のプログラムでは、 である。
   1 #include <stdio.h>
   2 
   3 void plus_print(int i, int j);
   4 
   5 /*=============================================*/
   6 /*   main 関数                                  */
   7 /*=============================================*/
   8 int main(void){
   9 
  10   plus_print(1, 4);
  11 
  12   return 0;
  13 }
  14 
  15 /*=============================================*/
  16 /*   plus_print 関数                            */
  17 /*=============================================*/
  18 void plus_print(int i, int j){
  19   int sum;
  20 
  21   sum = i+j;
  22 
  23   printf("%d+%d=%d\n", i, j, sum);
  24 
  25 }

2.1.2 標準ライブラリー関数とコンパイラー依存のライブラリー関数

これまでの学習で、printf()scanf()など、コンパイラーが用意している関 数をしばしば使用した。これらの関数を、一般にライブラリー関数と呼ぶ。ライブラリ関 数には、ANSI Cで定められている関数と、それ以外に処理系ごとに特別に用意された関数が とに分けることができる。前者は、ANSI Cの規格にもとづいたC言語のコンパイラーには 必ず用意されている関数で、printf()scanf()sin(), cos()などがこれに含まれる。一方、後者はコンパイラーに依存する関数である 2。例 えば、マイクロ秒単位でプログラムの実行を停止する関数usleep()が、これにあた る。例えば、リスト2のプログラムでは、 である。
   1 #include <stdio.h>
   2 #include <unistd.h>
   3 
   4 int main(void){
   5   int i;
   6   unsigned long int t;
   7 
   8   t=1;
   9 
  10   for(i=1;i<23;i++){
  11 
  12     t*=2;
  13    
  14     usleep(t);
  15     printf("%lu\tHello World\n",t);
  16   }
  17   return 0;
  18 }

2.1.3 まとめ

これまでの関数の種類について、まとめると次のようになる。プログラムの構成を関数の 種類から考えると、図1のように分類できる。

本講義では、標準でないコンパイラーが独自に用意した関数を使うことはない。諸君は、 教科書の付録(p.408-466)に書かれている標準ライブラリー関数を使って、プログラムを 作成することに心がけよ。

図 1: C言語のプログラムで使われている関数の分類
\includegraphics[keepaspectratio, scale=1.0]{figure/classfication_function.eps}
[練習1]
標準ライブラリーにどのようなものがあるか、教科書p.408〜 466を軽く眺めよ。

2.2 標準入力と標準出力

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

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

書式付き出力(printf)を使うと、任意の形でデータを出力できる。教科書のP.320〜 325を読み、以下の練習問題を実施せよ。
[練習1]
円周率を、いろいろなフォーマットで出力せよ。ただし、円 周率はmath.hの中でM_PIで定義されている。それ は、リスト3のようにすれば表示できる。
  • 通常の%lfで表示せよ。
  • 小数点以下、3桁で表示せよ。
  • 小数点以下、10桁で表示せよ。
  • 指数形式で表示せよ。
[練習2]
整数の22446688を8進数で表示せよ。また、16進数で表 示せよ。
[練習3]
円周率と円周率の2乗の両方を小数点以下、10桁で表示せよ。た だし、2つの数値の間はタブ区切りとする。

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

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

キーボード入力の場合、書式付入力のscanfという関数を使う方法が最も簡単である。こ の関数の引数は、ポインター4で、キー ボードからのデータを入れる変数のアドレスを指定する。

データを入力する場合、データを入れた後に、完了を示す[Enter]キーを押す。この [Enter]キーをしめす文字'\n'も読み込まれようとして、悪さ をすることがある。この、改行コード'\n'を読み捨てる必要がある。 そのためには、4通りの方法がある。

私は、最初の方法をよく使いますが、どれを使っても良い。

以下に、実際に、書式入力(scanf)を使ったキーボード入力を示す。

2.4.1 1文字の場合

キーボードから1文字を入力し、変数aに格納する。変数宣言は
char a;
char temp;
char dmystr[128];
とする。[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。

2.4.2 文字列の場合

キーボードから文字列を入力し、配列a[]に格納する。変数宣言は
char a[128];
char temp;
char dmystr[128];
とする。[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。配 列名はアドレスを示すので、&をつける必要はない。文字列の中に空白があると scanf()は使えない。空白はデータの区切りと解釈さ留殻である。そのときは、 gets()を使う。

2.4.3 整数(10進数)の場合

キーボードから整数を入力し、変数aに格納する。変数宣言は
int a;
char temp;
char dmystr[128];
とする。[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。

2.4.4 倍精度実数の場合

キーボードから倍精度実数を入力し、変数aに格納する。変数宣言は
double a;
char temp;
char dmystr[128];
とする。[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。

2.4.5 2個以上読み込むの場合

キーボードから2個の倍精度実数を入力し、変数abに格納する。変数宣言は
double a, b;
char temp;
char dmystr[128];
とする。[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。
入力データの区切りは、空白あるいはtab、改行です。

[練習1]
2つの整数をキーボードから読み込み、その和と差、積、商を 表示せよ。
[練習2]
整数と倍精度実数をキーボードから読み込み、積を指数形式 と小数点以下8桁で表示せよ。

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


no counter