Lecture on Programming I 5/31

Menu Menu

来週 6/7 は、この教室で自習とします。typist はいつも通りメールで、提出すること。

再来週からは、Java に入ります。


先週の復習

名前の付け方

デバッグの方法

2次元配列

再帰呼び出し

継承

正規表現によるパターンと置換


Typing の練習

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

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

整形した結果を、

    Subject: Report on Programming I   5/31-typist

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

    % rsh pw006 "Mail -s 'Report on Programming I   5/31-typist' kono@ie.u-ryukyu.ac.jp" < typescript


push/pop と shift/unshift

push/pop は、スタックという構造を作る。First-in, Last-out で、FILO とも呼ばれる。

    push(@a,$d) は、@a = (@a,$d)と同じ
    $d = pop(@a) は、$d = $a[$#a]; $#a --; と同じ

$#a に値を代入して、任意の大きさの配列を作ることができる。配列を作るのにどれだけ時間がかかるかをしらべよう。

    $#a = 10000;
    @a = 1..10000;

push/pop を使って、配列を逆順に表示するプログラムを作れ。

shift/unshift は、キュー(またはバッファ)という構造を作る。First-in, First-out で、FIFO とも呼ばれる。

shift/unshift に相当する操作を配列と $#a を使って書いてみよ。

shift/unshift を使って、コマンドラインから、- で始まる引数を削除するプログラムを書け。


splice

配列を変更する一般的な操作


ランダムな配列を作る

1..100 を使うと、1から100まで整列した配列を作ることができる。

	@old = 1..100;

これによって配列を作成し、どのような配列が作られるかを観察せよ。

ランダムな順序に並べられた任意の長さの配列を作るには、以下の文を使うことが出来る。これを用いて、

    while(@old) { push(@new,splice(@old,rand(@old),1)); }

ソートのためのテストデータを作ることができる。


splice, randなどを調べて、何故、これがランダムな配列を作るのか説明せよ。(ヒント: ひとつひとつの関数の結果を表示させてみると良い)


Sort

ソート(Sort)とは、配列に格納されたデータを特定の順序に並べる手続きである。整列とも言う。

Perl には、既に sort をおこなう機能がある。その使い方を調べよう。

もともとのsortは、文字列として順序をそろえる。

    print join(" ",sort (100,90,9,999))

この文字列の順序を辞書式順序という。

これを数値の比較にするには、

    print join(" ",sort {$a <=> $b} (100,90,9,999))

とする。
    print join(" ",sort {$b <=> $a} (100,90,9,999))

とすると順序が逆になる。

sort のシュワルツ変換とは、sort する対象のみからなる配列を前もって作って、それをsort する技術である。Perl のマニュアルを参考にして理解しよう。

    /etc/passwd の情報を名前と名字順にsortするプログラムを作れ


Perlでのファイルの扱い

open(FH,"filename") という形を使う。いくつか決まった使用法がある。

	open(FH,"< $filename") || die("$!");
	open(FH,"> $filename") || die("$!");
	open(FH,"$filename") or die("$!");

$! が何を意味するかを調べてみよ。

オープンした後は、

	while(<FH>) {
	    print;
	}

とのように扱う。

ファイル a からファイル b にコピーするプログラムを作ろう。


Perlでのデータベースの扱い

データベースって何?


あと、何を勉強すべきか?

Perl でなんでもできるのか?


HTML の生成、WWW page の作り方

この授業のWWWページは、以下のプログラムを使って作られている。

o2html これを使って簡単なWWWページを作り、/net/home/y01/j01005/public_html/index.html などに置いて、自分のホームページを作成してみよ。


マニュアルの使い方

reverse という Perl の関数の使い方を調べる方法を示せ。

reverse の使い方を示す Perl のソースを記述せよ。


変数

$a の $ とはどういう意味か説明せよ。

@a と $a の違いを説明せよ。


値の変換

$a = 3 ; $a .= " yen"; で起きる変換について説明せよ。

"300yen" という文字列から、300という数字を抜き出す方法を示せ。

その方法で、数字をうまく抜き出すことが出来ない文字列の例を示せ。そのような文字列がない場合は、それが何故かを説明せよ。

print "$a" と、print $a、print $a+0 の違いがわかる例を提示せよ。


メインループ

ファイルに行番号を付けるプログラムを作成せよ。

特定のパターンを探して、そこから5行表示するプログラムを示せ。


代入

$a = ($b = 3) + 4 を実行したときに、$a, $b の値はいくつか?

$a = $b = $c + 3 = $d = 3 はエラーになる。このエラーについて説明せよ。また、どのように直せば良いかを示せ。

代入されてない変数を使用するとどうなるかを実例を交えて説明せよ。

配列にスカラを代入するのと、スカラに配列を代入することの違いを実例を交えて説明せよ。


配列

@a = (1,2,3,4); の実行の後、$a[3] の値はいくつか?

1から99までの数字を順に含む配列@bを作るプログラムを、for文、while文、do-whie 文、.. 演算子を使って作成せよ。

1から99までの数値を、順に受け取って順に返すFIFO、受け取ったのと逆の順序に値を返すサブルーチンを配列を使って作成せよ。push/pop/shift/unshift を使う版と使わないの二つを示せ。

Perl の配列は、どの程度の大きさまで使えるのだろうか? 具体的な数字を理由を付けて示せ。


連想配列

ファイルから、重複した行のみを表示するプログラムを作れ。


subroutine

サブルーチンを定義し、そのサブルーチンを呼び出す3つの異なる構文を示せ。

return 文を使わずに値を返すにはどうすれば良いか?

サブルーチンの引数に配列を二つ渡す方法を示せ。

サブルーチン自体を引数で渡すにはどうすれば良いか? 配列とサブルーチンを与えて、配列の要素一つ一つにサブルーチンを適用する関数 apply を作成せよ。


if 文

うるう年を判別するif 文を作成せよ。

if (defined($test)) ... と if ($test) ... の違いがわかるような実例を示せ。


pattern

2000年入学の学籍番号から情報工学のアカウントの番号を生成するプログラムを示せ。


参照

$a が未定義の時に、
	$a->[1]->[3]->[4] = 5;

で作成さる無名配列の数はいくつか?

$a で作成された配列を削除したい。2つを残して削除する方法を示せ。

その二つの配列のアドレスを表示する方法を示せ。


Turtle Graphics

ABCD などの文字をTurtle Graphics で書くサブルーチンを作成せよ。

文字の大きさを変えられるようにするにはどうすれば良いか?

Turtle Graphics の色を連続的に変更したい。#RRRGGGBBB という形で色を指定することができらしい。色を連続的に変更するサブルーチンを作り、Turtle Graphics のさまざまな曲線に適用してみよ。


宿題

以上の問題を

  Subject: Practice on Programming I   5/31

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

残りは、

  Subject: Report on Programming I   5/31

というサブジェクトで、来週までに提出すること。

(*) がついている問題は option とします。


Shinji KONO / Thu May 31 16:46:03 2001