Lecture on Programming I 6/1

Menu Menu


先週の復習

    発見的プログラミング
    配列
    連想配列


Typing の練習

今日も typing の練習をすること (20分)

結果をscript でメールすること。

整形した結果を、

    Subject: Report on Programming I   6/1-typist

というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。


Turtle Graphics の復習

    前に進む $turtle->forward($length)
    方向を変える $turtle->turn($degree)

を使って、酔っ払いの動きをシミュレーションしてみよう。

drunken.pl Turtle.pm 2次元配列 $visit[$x][$y] を使って、酔っ払いがどこにどれだけいたかを積算してみる。Perl の配列にはマイナスの添字が使えないので、ちょっとオフセットを足すのが良い。

    亀の位置  $turtle->{-x},$turtle->{-y}

亀の位置は、浮動小数点の数値なので、int()を使って整数に直す。

2次元配列の内容を、gnuplot で表示できるように以下の形式で出力する。

    X Y Count

gnuplot の splot コマンドで表示してみよう


2次元配列

  DB<2> $a[0][0]=1
  DB<3> $a[0][1]=2
  DB<4> $a[1][0]=3
  DB<5> $a[1][1]=4
  DB<6> p $a[0]
  ARRAY(0x813ba94)

Perl の2次元配列は、配列の配列になっている。この、
  ARRAY(0x813ba94)

とななんだろうか?


Perlの参照

  ARRAY(0x813ba94)

は、Perl の参照と呼ばれるスカラの値である。スカラなので、普通の変数に代入することができる。

      DB<8> $b = $a[1]
      DB<9> p $b
    ARRAY(0x813b43c)
      DB<10> p $b[1]
      DB<11> p $b->[1]
    4

$b[1] は、配列@b の2番目の値であって、$b の値とは違う。$b に入った配列への参照は、-> を使ってアクセスすることができる。

      ->    参照へのアクセス

Perl のデータ構造は、\ を使って参照に変えることができる。

      DB<12> @c=(1,2,3,4,5)
      DB<13> $b->[3] = \@c
      DB<14> p $b->[3]
    ARRAY(0x813be4c)
      DB<15> p $b->[3]->[2]
    3


問題

参照を使って、-> が4つ以上続くデータアクセスの例を作成せよ。正しく動くことを perl5 -de 0 のデバッガで確認すること。

      DB<9> p $b
    ARRAY(0x813b43c)

であるときに、
    $b = 0;

とすると、どうなるか? $b から参照されていた配列はどうなるのか考察せよ。
    $c = $b;
    $b = 0;

ならばどうか?


1次元配列を使って2次元配列を表す

2次元配列は、以下のように1次元配列を使って表すこともできる。

    $col_size = 10;
    $a[$x * $col_size + $y]


問題

酔っ払いの位置を積算する場合について、この1次元配列による2次元配列を実装する方法と、配列の配列で2次元配列を実装する方法を比較し、双方の良い点と悪い点をそれぞれ2つづつあげよ。


Perl の構文について

正しい文の作り方

式とは何か?

文とは何か?

文法構造とはなにか?

    if-statement 
	: if ( condition ) { statement }
	| if ( condition ) { statement } else { statement }
	| if ( condition ) { statement } else-if-statement
	;
    else-if-statement
	: elsif ( condition ) { statement }
	| elsif ( condition ) { statement } else { statement }
	| elsif ( condition ) else-if-statement
	;

このことについてはコンパイラの授業で詳しく習う。


Perl のmy について

    $i = 4;
    print "1: $i\n";
    &test();
    print "2: $i\n";
    sub test {
	my $i;
	print "3: $i\n";
	$i = 3;
	print "4: $i\n";
	&test2();
    }
    sub test2 {
	print "5: $i\n";
    }

以上のプログラムを実行し、my の役割と、$i の意味について、自分の言葉で100文字程度で、 説明せよ。

test を以下のものに置き換えたらどうなるか?

    sub test {
	my $i;
	print "3: $i\n";
	$i = 3;
	$j = \$i;
	print "4: $i\n";
	&test2();
    }
    print "6: $j\n";
    print "7: $$j\n";


Perlのパターンと文字列処理について

このプログラム は、 メールを読んで、そこから、 速度と正答率を抜き出すものである。

これから、gnuplot 向きのデータを作成するプログラムを生成し、表示させて、データについて分析せよ。


宿題

以上の問題を

  Subject: Report on Programming I   6/1

というサブジェクトで、kono@ie.u-ryukyu.ac.jp までメールを出すこと。

Shinji KONO / Thu Jun 1 14:41:29 2000