loop, array2
ループと配列2

4章つづき

練習問題 復習

下記のプログラムは入力用の配列 @input の個数だけ for 文で数字を 0 から出力するプログラムである. 実行せよ.

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

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);
my $n = @input;
my $i;

print "$n items¥n";
for ($i = 0 ; $i <= $n -1 ; $i = $i + 1){
    print "$i ";
}
print "¥n";

図 4.1

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);

図 4.2

の行について,@ で始まる変数名はスカラー変数ではなく配列変数であることを示す. 右辺のカッコ内に値をカンマで区切って並べたものがリストで, "配列"が入れ物,"リスト"はそれに入るデータという関係になっている.

my $n = @input;

図 4.3

この式は左辺がスカラー変数,右辺が配列変数となっている, この場合,perl では右辺の値が配列の要素数になる約束になっているので スカラー変数 $n に配列 @input の要素数を取り出すことができるので よく使われる.

練習4.1

配列 @input の 1 番目の要素は $input[0] でアクセスできる. 図4.1 のプログラムをコピーし,配列 @input の 全ての要素を一行に一個づつ順に出力するプログラムを作成せよ.
(ヒント:図4.1 の for 文の中を変更して作成すればよい)
出力例を図4.4に示す.

18
92
97
87
24
83
41
89
70
68

図 4.4

"$input[$i]" と書くと変数 $i が 0 のときは 配列 @input の最初の要素, 変数 $i が 1 のときは 配列 @input の 2 番目の要素にアクセスできるので for ループの中で $input[$i] と改行を出力すればよい.

練習4.2

練習4.1のプログラムをコピーし,配列 @input の 要素の和を出力するプログラムを作成せよ.出力例を図4.5に示す. (ヒント:変数を 1 個導入する)

669

図 4.5

例えば合計を保存するための変数 $sum を用意し, ループの中で $input[$i] の値を順に足して行けばよい. 最初に $sum の値を 0 にする必要があるが,perl の場合は 初めて変数を使うときに自動的に 0 に初期化されるので必要ない. 他の言語では明示的に 0 に初期化する処理が必要な場合が多い.

ループを終了し,合計値を計算し終わった後で結果を出力すればよい.

解答例を以下に示す.変数 $sum の初期化は実際には必要ないが, アルゴリズムの理解のために記入している. 配列の合計を求める方法はいろいろなアルゴリズムの基礎になるので 必ず理解すること.

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

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);
my $n = @input;
my $i;
my $sum;

$sum = 0;
for ($i = 0 ; $i < = $n - 1 ; $i = $i + 1){
    $sum = $sum + $input[$i];
}
print "$sum¥n";

図 4.6

練習4.3

練習4.1 のプログラムをコピーし,変更することで次のプログラムを作成する.

配列 @input の要素のうち,偶数の要素だけを 一行に一個づつ順に出力するプログラムを作成せよ.
(ヒント:図4.1 の for 文の中を変更して作成すればよい)
出力例を図4.7に示す.

18
92
24
70
68

図 4.7

練習 4.3 の解答例を示す.

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

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);
my $n = @input;
my $i;

for ($i = 0 ; $i < = $n -1 ; $i = $i + 1){
    if ($input[$i] % 2 == 0 ){
        print "$input[$i]¥n";
    }
}

図 4.8

練習4.4

配列 @input の要素のうち,偶数の要素だけの合計を 計算し,出力するプログラムを作成せよ. (ヒント:練習4.2と練習4.3を組み合わせる) 出力例を図4.9に示す.

272

図 4.9

下記のプログラムは入力用の配列 @input に格納されている要素のうち 偶数の要素の合計を求めるプログラムである.(練習4.4の答)

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

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);
my $n = @input;
my $i;
my $sum;

print "$n items¥n";
$sum = 0;
for ($i = 0 ; $i <= $n -1 ; $i = $i + 1){
    if ($input[$i] % 2 == 0){
        $sum = $sum + $input[$i];
    }
}
print "$sum¥n";

図 4.10

練習 4.5

練習 4.2 を参考に配列 @input 中の値の平均値を 出力するプログラム p0405.pl を作れ. 配列の要素数が変わっても正しく動作するように作ること. 例えば入力が

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);

図 4.11

であれば出力は

66.9

図 4.12

となり,入力行を

my @input = (18, 92);

図 4.13

に変更すると,

55

図 4.14

と出力されなければならない.

練習 4.6

練習 4.3 を参考に配列 @input の要素の最大値を出力するプログラム pr0406.pl を作れ.簡単のため,配列 @input に要素は少なくとも 1個存在すると仮定してよい.

(ヒント:暫定王者を保存する変数 $max を用意しておき, 配列 @input を頭からスキャンしながら暫定王者が負けたら $max の値を新王者のものに変更する.ただし,最初の暫定王者はどうするべきか 熟慮せよ.@input の値が全て負の数でも正しく動くようにせよ.)

下記は練習 4.6 の解答例である.上記ヒントを読んで $max の働きを 理解せよ.

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

my @input = (18, 92, 97, 87, 24, 83, 41, 89, 70, 68);
my $n = @input;
my $i;
my $max;

$max = $input[0];
for ($i = 1 ; $i < $n ; $i++){
    if ($input[$i] > $max){
        $max = $input[$i];
    }
}
print "$max¥n";

図 4.15

練習 4.7

図 4.15 を参考に配列 @input の要素のうち大きいものから順に並べた場合に 2 番目なる要素の値を出力するプログラム pr0407.pl を作れ.簡単のため,配列 @input に要素は少なくとも 2個存在すると仮定してよい.ただしsort 関数を使ってはならない. 入力例 (18, 97, 92, 87, 24, 83, 41, 89, 70, 68)に対して正しく動作するか確認せよ.

課題 2

練習4.6(完成した学生は練習4.7も)で作成したプログラムを 添付メールとして提出せよ.

テスト実行の内容とその狙いを メールの本文内で報告せよ.

メールの宛先は <hiroshi@tokai.ac.jp> とし, Subject (件名)を Seminar 2-2 とせよ.


Updated in October 31, 2019, index, Yamamoto Hiroshi