subroutine 3
サブルーチン 3

4章つづき

練習問題

以下のサブルーチン使った例のための(あまり意味のない) プログラムをp1.pl というファイル名で保存し, 実行パーミッションを与えて (chmod 755 p1.pl) 実行せよ.

#!/usr/bin/perl -w
use strict;

my $n;

sub f1_1 {
    my ($number) = @_;

    my $result = 1;
    return $result;
}

for ($n = 2; $n <= 100; $n++){
    if (&f1_1($n) == 1) {
        print "$n\n";
    }
}

図1.1 p1.pl

p1.pl のサブルーチン f1_1 は最後に値を return で返すタイプの 関数である.f1_1 では最初に $result に 1 を代入し,何もせずに $result を返しているのでこの関数は常に 1 を返す.

ここからの例題では 1 が真,0 が偽を表すとして作製するので このプログラムのメインルーチンで f1_1 が呼ばれたときは常に 真を返すことになるのでループ変数 n で与えられる 2 から 100 の整数すべてについて if 文の括弧内が真に なり,結果として全てが出力される.出力を実際に確認せよ.

次にサブルーチンf1_1を基に,2の倍数でないときだけ 真を返すサブルーチンを作る.以下のように作ればよい. p2.pl として保存し,実行権限をつけて実行せよ.

#!/usr/bin/perl -w
use strict;

my $n;

sub f1_2 {
    my ($number) = @_;

    my $result = 1;
    if ($number % 2 == 0){
        $result = 0;
    }
    return $result;
}

for ($n = 2; $n <= 100; $n++){
    if (&f1_2($n) == 1) {
        print "$n\n";
    }
}

図1.2 p2.pl

関数名が f1_2 に変更されたのでそれを呼び出すメインルーチン内の 関数名も f1_2 に変更しなければいけないことに注意する.

f1_2 内部のロジックは, 「最初に result を 1 と置いておき,2 で割れたら 0 に書き換える」 というものである.2 の倍数であれば result が 0 に書き換えられて 関数 f1_2 は return 文で 0,すなわち偽を返す. 2 の倍数でないなら result は書き換えられずに関数の最後まで到達するので result が 1 のまま return される,すなわち真を返すことを利用している. 出力結果として 2 から 100 のうち 2 の倍数以外(奇数)が出力されていることを 確認せよ. 関数 f1_2 は「2の倍数でないときに真(1),それ以外は偽(0)を返す関数」である.

2 でも 3 でも割れないと真を返し,それ以外は偽を返す関数 f1_3 は以下のように書ける.なぜ正しいか考察せよ.

sub f1_3 {
    my ($number) = @_;

    my $result = 1;
    if ($number % 2 == 0){
        $result = 0;
    }
    if ($number % 3 == 0){
        $result = 0;
    }
    return $result;
}

図1.2 関数 f1_3

練習問題1.1

2 から順に 10 までの整数を 図1.2の関数 f1_3 に入力として 与えた返り値を出力するプログラム ex1_2.pl を作れ. 図1.2の関数 f1_3 の内容は変えてはいけない.

練習問題1.2

2 から順に 10 までの整数を 図1.2の関数 f1_3 に入力として与えたとき, 返り値が 1 になるものだけについてf1_3への入力の値を出力するプログラム ex1_3.pl を作れ. 図1.2の関数 f1_3 の内容は変えてはいけない.


Updated in October 4, 2017, index, Yamamoto Hiroshi