コンピューターのもっとも基本的な入出力装置であるキーボードとディスプレイをコンソー
ル(操作卓)と呼ぶ。これらのコンソール入出力を利用した関数のプログラムの学習をする。
とは言え、諸君はこれらの関数はかなり使ってきている。ここではそれら内容を整理して、
これらの使い方の復習を行う。
これまでの学習で、C言語のプログラムは関数の集まりであることが理解できていると思
う。この関数には、プログラマーが作成する関数ともともとコンパイラーが用意している
関数がある。例えば、リスト
1のプログラムでは、
- printf()は、コンパイラーが用意している関数
- main()とplus_print()はプログラマーが作成した関数
である。
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 }
これまでの学習で、
printf()や
scanf()など、コンパイラーが用意している関
数をしばしば使用した。これらの関数を、一般にライブラリー関数と呼ぶ。ライブラリ関
数には、ANSI Cで定められている関数と、それ以外に処理系ごとに特別に用意された関数が
とに分けることができる。前者は、ANSI Cの規格にもとづいたC言語のコンパイラーには
必ず用意されている関数で、
printf()や
scanf()、
sin(),
cos()などがこれに含まれる。一方、後者はコンパイラーに依存する関数である
2。例
えば、マイクロ秒単位でプログラムの実行を停止する関数
usleep()が、これにあた
る。例えば、リスト
2のプログラムでは、
- printf()は、標準ライブラリー関数
- usleep()は、コンパイラーに依存するライブラリー関数
である。
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 }
これまでの関数の種類について、まとめると次のようになる。プログラムの構成を関数の
種類から考えると、図
1のように分類できる。
- C言語のプログラムは関数から構成される。
- プログラムで使われる関数は3種類ある。
- プログラマーが作る関数
- 全てのC言語のコンパイラーが用意しているANSI Cで規格が決められている標準
ライブラリー関数
- コンパイラーに依存するライブラリー関数
本講義では、標準でないコンパイラーが独自に用意した関数を使うことはない。諸君は、
教科書の付録(p.408-466)に書かれている標準ライブラリー関数を使って、プログラムを
作成することに心がけよ。
図 1:
C言語のプログラムで使われている関数の分類
|
- [練習1]
- 標準ライブラリーにどのようなものがあるか、教科書p.408〜
466を軽く眺めよ。
コンソール入出力のことを、標準入出力と言うことがある。この標準入出力には、ファイ
ルの入出力先に指定ができ
3、そのために名前が付いている。標準入力を
stdin、標準出
力を
stdoutと言う。これらの関係を、以下に示す。
キーボード |
|
標準入力 |
|
stdin |
ディスプレイ |
|
標準出力 |
|
stdout |
書式付き出力(
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 }
キーボード入力の場合、書式付入力のscanfという関数を使う方法が最も簡単である。こ
の関数の引数は、ポインター
4で、キー
ボードからのデータを入れる変数のアドレスを指定する。
データを入力する場合、データを入れた後に、完了を示す[Enter]キーを押す。この
[Enter]キーをしめす文字'\n'も読み込まれようとして、悪さ
をすることがある。この、改行コード'\n'を読み捨てる必要がある。
そのためには、4通りの方法がある。
- ダミーの文字型変数を用意して、それに改行コード'\n'読み
込む方法。
- 代入を抑止する方法。
- fgetsで読み込む方法。
- rewind関数5でバッファー
の内容を捨てる。
私は、最初の方法をよく使いますが、どれを使っても良い。
以下に、実際に、書式入力(scanf)を使ったキーボード入力を示す。
キーボードから1文字を入力し、変数
aに格納する。変数宣言は
char a;
char temp;
char dmystr[128];
とする。
[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。
- scanf("%c%c", &a, &temp);
- scanf("%c%*c", &a);
- scanf("%c", &a);
fgets(dmystr, 128, stdin);
- scanf("%c", &a);
rewind(stdin);
キーボードから文字列を入力し、配列
a[]に格納する。変数宣言は
char a[128];
char temp;
char dmystr[128];
とする。
[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。配
列名はアドレスを示すので、
&をつける必要はない。文字列の中に空白があると
scanf()は使えない。空白はデータの区切りと解釈さ留殻である。そのときは、
gets()を使う。
- scanf("%s%c", a, &temp);
- scanf("%s%*c", a);
- scanf("%s", a);
fgets(dmystr, 128, stdin);
- scanf("%s", a);
rewind(stdin);
キーボードから整数を入力し、変数
aに格納する。変数宣言は
int a;
char temp;
char dmystr[128];
とする。
[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。
- scanf("%d%c", &a, &temp);
- scanf("%d%*c", &a);
- scanf("%d", &a);
fgets(dmystr, 128, stdin);
- scanf("%d", &a);
rewind(stdin);
キーボードから倍精度実数を入力し、変数
aに格納する。変数宣言は
double a;
char temp;
char dmystr[128];
とする。
[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。
- scanf("%lf%c", &a, &temp);
- scanf("%lf%*c", &a);
- scanf("%lf", &a);
fgets(dmystr, 128, stdin);
- scanf("%lf", &a);
rewind(stdin);
キーボードから2個の倍精度実数を入力し、変数
aと
bに格納する。変数宣言は
double a, b;
char temp;
char dmystr[128];
とする。
[Enter]キーの問題を回避した4通りの入力方法は、以下の通りである。
入力データの区切りは、空白あるいはtab、改行です。
- scanf("%lf%lf%c", &a, &b, &temp);
- scanf("%lf%lf%*c", &a, &b);
- scanf("%lf%lf", &a, &b);
fgets(dmystr, 128, stdin);
- scanf("%lf%lf", &a, &b);
rewind(stdin);
- [練習1]
- 2つの整数をキーボードから読み込み、その和と差、積、商を
表示せよ。
- [練習2]
- 整数と倍精度実数をキーボードから読み込み、積を指数形式
と小数点以下8桁で表示せよ。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年6月27日