scalar context anda list contexis
スカラーコンテキストとリストコンテキスト

3章続き

練習問題

前回の練習問題3,4を参考に以下のプログラムを作成せよ.

  1. 一行に一個ずつ5個の数値を入力すると,そのうち偶数が何個あったかを 出力するプログラムを書け.(ヒント: $n % 2 は $n を 2 で割った余りが求める演算.2で割った余りが 0 であれば偶数,そうでなければ奇数と判定できる.)

3.6 節(第6版では3.8 節)で foreach 制御構造について説明し, デフォルト変数 $_ について説明する

教科書 p.52 3.6節(第6版ではp.65, 3.8節)最初の例を実際に動作させ,確認せよ.

3.6.1節(第6版は3.8.1 節)の "$_" も良く使われる簡略化なので知っておく必要がある.

スカラーコンテキストとリストコンテキスト

配列全体を表すには添字なしで変数名の頭に "@" 記号をつけて表す. (p.48,第6版ではp.60) 配列である "@" つきの変数の内容は本来リストである. しかし,スカラーが要求される場所に配列変数を書くと, 配列のサイズの値がスカラーとして得られる.下のプログラムを実行して確認せよ.

$name[0] = 'Randal' ;
$name[1] = 'Tom' ;
$x = @name;
print "$x\n";

この配列の要素数を得る方法は配列すべての要素を処理するときによく使われる. 下記がその典型的な例である.

$name[0] = 'Randal' ;
$name[1] = 'Tom' ;
for ($i = 0 ; $i < @name ; $i++){
    print "$name[$i]\n";
}

この方法でループの終わりを指定することで配列の要素数が分からなくても 正しくすべての要素に対して処理が行える. 3.8節(第6版では3.10 節)の p.59, 17行目(第6版ではp.73, 18 行目)の 文によりリストコンテキストで<STDIN>を使うと配列 @lines には 入力された行数に応じて可変個の要素が格納される.それをすべて出力 させるプログラムが以下のものである.

@lines = <STDIN>;
chomp (@lines);
for ($i = 0 ; $i < @lines ; $i++){
    print "$lines[$i]\n";
}

上記プログラムを実行すると入力待ちになるので 文字列を数行入力した後,行頭で Ctrl-D を押せ. これで入力が終わったことをプログラムに伝えることができる. 入力した行がそのまま出力されることを確認せよ.

練習問題

以下の練習問題を解け.授業中に動作確認を行う.

  1. 一行に一個ずつ数値を入力すると,(最後の入力が終わったら行頭で Ctrl-D) 入力された全ての数値の合計を出力するプログラムを書け.
  2. 一行に一個ずつ数値を入力すると, 入力された全ての数値の最大値を出力するプログラムを書け.
  3. 一行に一個ずつ数値を入力すると, 入力された数値のうち偶数のものの個数を出力するプログラムを書け. (ヒント: (n % 2) は n が偶数のとき0,そうでないとき1)

課題4

3.9(第6版では3.11) 練習問題を解け. 解答プログラムを添付メールとして提出せよ. メールの宛先は <hiroshi@tokai.ac.jp> とし, Subject (件名)を Seminar 1-4 とせよ.


Updated in May 3, 2019, schedule, Yamamoto Hiroshi