Subsections

8章 H.22 いろいろなプログラムを作ってみよう

8.1 課題

  1. 再帰呼び出しを用いたプログラムを作成する. (プログラム)
  2. 標準出力の出力をファイルに保存するプログラムを作成せよ. (プログラム, 出力したファイル)
  3. 標準入力から入力し, 操作・演算した結果を出力するプログラムを作成せよ. (プログラム, 出力したファイル)

それぞれ 括弧内を提出すること. 写しただけでなく, 自分で機能を考えてそれを実現するプログラムを作成すること.

8.2 再帰

  1. 「8-3 再帰」について理解する.(List 8-6, List 8-7) 再帰を利用したプログラムを作成する。例えば

8.3 標準入力, 標準出力 とリダイレクト

8.3.1 標準出力への出力をファイルに保存する.

例えば以下のようなプログラムを作成してみましょう. これは, 標準出力に出力するプログラムである.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i;

	for(i=0; i<50; i++)
		printf("%d,%d\n", i, i*i);

	return EXIT_SUCCESS;
}

「標準出力」(STDard Output)への出力は, 特に指定しない場合には画面に出力される.

この結果をファイルに保存するためには, リダイレクトを用いる. そのためには, 後述するように端末の中でプログラムを実行する.

$ ./a.out > abc.csv

8.3.2 端末の中でコマンドを実行する.

  1. Windowsでは「スタート」$\Rightarrow$ 「アクセサリ」から「コマンドプロンプト」を開く. Linuxでは, GNOME端末, kterm, xterm などを開く.
  2. 実行ファイルのあるディレクトリ(フォルダ)に移動する.

  3. 目的のファイルが存在するフォルダまで cd を繰り返しディレクトリを変更する.

  4. 目的とする実行ファイルがあるディレクトリに移動した後に, 以下のようにしてプログラムを実行する. Windowsの場合
    $ abc.exe
    
    UNIX の場合
    $ ./a.out
    

    出力結果をファイルに保存する場合は,

    Windowsの場合

    $ abc.exe > abc.csv
    
    UNIX の場合
    $ ./a.out > abc.csv
    

    出力先のファイルが既に存在する場合は, 上書きされてしまうので十分注意すること.

KDevelop の場合は,

8.4 標準入力からの読み込み

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int returned_value, x, y;
	
	while(1){
		returned_value = scanf("%d%d", &x, &y);
		if(returned_value == EOF)
			break;
		printf("%d X %d = %d\n", x, y, x*y);
	}
	return EXIT_SUCCESS;
}
ここで EOFは入力が終了したことを意味する整数である.

例えば次のように実行できる.

$./a.out
3 4
3 X 4 = 13
8 7
8 X 7 = 56
^Z
Windows では ^Z Unix では ^D により入力を終了できる. ここで, ^Z はコントロールキー (Ctrl) を押しながら Zを押すことを意味する.

このうち 「3 4」の行と「8 7」の行は, キーボードからの入力である.

予め次のようなデータのファイルを作成しておくと, ファイルから入力できる.

3 4
8 7

このファイルのファイル名をabc.datとすると次のように実行できる. ここで 矢印(<)の向きが, 標準出力の出力先を変更する時とは, 逆であることに注意すること.

$ ./a.out < abc.dat
3 X 4 = 12
8 X 9 = 72

上のプログラムは慣用的に次のように書かれる.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int  x, y;
	
	while ( scanf("%d%d", &x, &y) != EOF ) {
		printf("%d X %d = %d\n", x, y, x*y);
	}
	return EXIT_SUCCESS;
}
char 型の入力については, 教科書L8-11を参照のこと.

ここまでの例では 数値をコンマで区切って入力できない. フィールドをコンマで区切って入力する場合は, scanf の書式の対応する部分に コンマ(,) を記述する.

#include <stdio.h>
#include <stdlib.h>

// フィールドをコンマで区切って入力する場合は,
// scanf の書式の対応する部分に コンマ(,) を記述する.
int main(void)
{
	int  x, y;
	
	while ( scanf("%d,%d", &x, &y) != EOF ) {
		printf("%d X %d = %d\n", x, y, x*y);
	}
	return EXIT_SUCCESS;
}

(c)1999-2013 Tetsuya Makimura