「情報処理」1 年文 I/II クラス 9-10 ＃ 7
久野靖∗

1994.12.1

本日の目標

0

前回の資料で WWW のところがだいぶイモだったのでご迷惑をお掛けしました。以下に補足資料を用意しましたので参照してください。そして、課題 6A の期限を 12/3 までとしますので、まだできてない人はぜひややってください。プログラミングについては、ループが入って、だいぶ「面白く」ないし「難しく」なりましたね? 本日の目標は次の通り:• while ループの使い方の復習をする。

• ループ中に入力や出力を置くことを学ぶ。
• 計数ループ (for ループ) を学ぶ。

• 電子ニュースの読み書きができるようになる。

1

復習: WWW の情報の作り方

1.1

要点のまとめ

前回理解していただくのがむずかしかった点をまとめておこう。

• 個人の情報ページは、ディレクトリ WWW の下のファイルに対応する。

• 必ず、1 つの「なんとか.html」(最後の文字は小文字のエルであって、数字の１ではない!!)というファイルが、1 つのページに対応する。ホームページは「index.html」というファイルに対応する。
• 各ファイルの中は HTML という書き方で字の大きさや配置などを指定する。

• 絵を入れたい場合には、ディレクトリ WWW の下に「なんとか.gif」という GIF 形式のファイルを置き、HTML ファイルの中の絵を埋め込みたい場所に「<IMG SRC="なんとか.gif>」という指定を書いて置く。
• 「つつくと他のページへ飛ぶ」場所を作るには、HTML ファイルの中に「<A HREF="なんとか.html">○○○○</A>」という指定を書いて置く。「○○○○」だけが下線つきでモザイクの画面に現れ、そこをつつくと「なんとか.html」に対応するページへ飛ぶ。

1図 1: XV のコントロールパネル

1.2

絵の変換方法ところで、せっかく書いた絵が WWW に埋め込むと正しい色にならないという問題があったので、前回と別の方法で GIF に変換するやり方を説明する。こんどは「xv」というプログラムを使用する。

1. xv test.tiff &[RET] のようにして、TIFF ファイルを指定して xv を起動する。
2. 画面に絵の入った窓が現れるので、その窓の上でマウス右ボタンをクリックして図 1 のコントロールパネルを出す。
3. パネルの中の「Save」をつついて、図 2 の保存パネルを出す。
4. ファイル形式選択ボタンの「GIF」をつついて選ぶ。
5. ファイル名指定の窓で「WWW/mark.gif[RET]」などとして保存。(既にそのファイルがあるなら「書き換えていいか?」と聞かれるのでマウスで OK を選ぶ。)

1.3

ページの中身 (HTML ファイル) の作り方

さて、前回の練習で関連のあるファイル (すべてディレクトリ WWW の下にある) は次の通りだった。

WWW/index.html
WWW/selfintro.html
WWW/sampleprog.html
WWW/computers.html
WWW/mark.gif

ホームページ
自己紹介のページ
例題プログラムのページ
計算機についてのページトレードマークの絵

絵のファイルは上で説明したので、残りのファイルについて作り方を復習する。いずれも、作成するには Mule の窓で^X^FWWW/index.html[RET]∗筑波大学大学院経営システム科学専攻2図 2: XV のファイル保存パネルのようにファイル名を指定した後中身を打ち込み、最後に^X^S で保存すればよい。
まず自分のホームページであるが、大体次のような感じになるだろう (もちろん、独自性を発揮してもよい)<TITLE>○○のホームページ</TITLE><BODY><H1><IMG SRC="mark.gif">○○のホームページです。</H1>○○です。よろしく。ここから以下のページに行くことができます。 <P><UL><LI><A HREF="selfintro.html">自己紹介</A><P><LI><A HREF="sampleprog.html">本日書いたプログラム</A><P><LI><A HREF="computers.html">計算機について</A><P></UL></BODY>
なお、TITLE と BODY は文字通りタイトルと本体、<H1>〜</H1>は大きい表題、IMG は上述の通り、<P>はパラグラフの終りである。 UL は箇条書きで、下記参照。
まずこれを書いたら、 xomsaic を動かして「受講生ホームページ一覧」の中の自分の番号をつつき、それらしいのが出ることを確認する。うまく行かなくてファイルを Mule で直した後は、xmosaic の「Reload」ボタンを押すと更新される。
注意! 多い間違いは、ファイル名の「.html」の最後が小文字のエルでなく数字の 1 になっているもの、および「＜」など 16 ビットの記号を打ってしまったものである。 16 ビットの記号をまとめて 8 ビットに直すには、おまじないのようだが次のように打てばできる。

[ESC]<[ESC]>[ESC]xhankaku[SP]r[RET]3次に、自己紹介だが、これは以下のような箇条書きを駆使するのがよさそうである。まず黒丸 (•)
を使った箇条書きは:<UL><LI> 項目 1…<P><LI> 項目 2…<P>…
</UL>
ここで UL を OL に変えると 1、2、3、…のように数字づけされた箇条書きになる。あともう 1 つ、<DL>
<DT> 表題 1 <DD> 項目 1…<P><LI> 表題 2 <DD> 項目 2…<P>…
</DL>というのもあり、これを使うと表題つきの箇条書きになる。これを使って自己紹介のページは例
えば次のように書けばよさそう。

<TITLE>○○の自己紹介</TITLE><BODY><H1><IMG SRC="mark.gif">○○の自己紹介です。</H1>○○です。私の自己紹介をします。 <P><DL><DT> 本名 <DD> ○○×× <P><DT> 専攻 <DD> 計算機科学 <P><DT> 趣味 <DD> スキー、読書、音楽 (浜田省吾と竹内まりやが好き)、計算機で遊ぶこと。 <P>…
</DL></BODY>
今日作ったプログラムのページの場合には、プログラムが詰め合わされずに出てくるためには<PRE>…</PRE>で囲む必要がる。つまり、次のような感じかな?

<TITLE>今日作ったプログラム</TITLE><BODY><H1><IMG SRC="mark.gif">ループのプログラム第 1 号です。</H1>
今日作ったプログラムのリストを以下に載せます。 <P><PRE>program ....
...
</PRE>
とっても、大変でした。<P></BODY>4

ところで、プログラム本体を全部打つのはあほらしい。既にプログラムはファイルに入っているのだから、それを挿入する。それには、Mule で入れたい場所にカーソルを持って行ってから^Xiと打つとファイル名を聞いてくるので、ファイル名を打ち込んで [RET] すればそこに入る。
残った、「計算機について」のページは自分で工夫してみてください。

2

while ループの復習/2 分探索法

さて、前回の練習問題 (そうそう、翌週の資料に解説が出てしまうと考える楽しみがなくなるなと思ったので、前回の問題の解説は 2 週間後つまり来週の資料に載せます) では値が整数ばっかりだったが、実数を駆使した面白いテーマがあるのでこれを取り上げよう。そのテーマとは、一般に関数 f についてf (x) = 0を満たす x(つまり「根」を) 求めることである。たとえば、f (x) = x2 − 2 だとすれば、その根はf(x)aa+b2b根

図 3: 根の 2 分探索の原理√2 ですね? ここで述べる方法では、関数が (根を含む知られた区間 [a, b] で) 単調増加かつ連続であれば、どんな関数であろうとその根を求めることができる。すごいでしょう? ただし、代数的√に ( 2 とか) 求まるのではなく、数値的に (1.41421356 のように) 求まる。その精度は (計算機の演算命令の限界内で) 自由に指定できる。
その考え方は次の通り。まず、根を含む区間 [a, b] の情報を考える。f (x) は単調増大なのだから、f (a) < 0 かつ f (b) > 0 のはずである。さて、許される誤差を e とすると、b − a ≤ e ならもう答えは求まっていることになる (でしょう?)。もしそうでなければ、区間の中点 a+b2 を考え、ここでのa+bf (x) を計算してみる。それがもし正であれば、新しい区間として [a, 2 ] を考え (つまり b を a+b2a+b,b]を考える(つまりaをで置き換えで置き換える)、そうでなければ、新しい区間として [ a+b22る)。どちらにせよ、新しい区間に根が含まれていることは図 3 を見れば分かると思う。
さて、これを 1 回繰り返すごとに区間の幅は半分ずつになっていくから、いつかは幅が e よりも小さくなる。つまり、指定した誤差で解が求まったことになりますね? このアルゴリズムを PADで記したものを図 4 に示す。
演習 1 上の PAD を Pascal に直し、2 の平方根や 3 の立方根を求めてみよ。 (そのためには f (x)を適当な計算式で置き換えて動かす)。なお、変数はすべて実数でないと意味がないことに注意。

5

a, b, e を入力
a+by = f( 2 ) を計算
二分探索による求根

while b-a > eb :=a+b2a :=

a+b2y > 0?
a+b を出力2

図 4: 根の 2 分探索の PAD

3

ループの中での入力と出力

これまでのところ、ループの本体には read も write も含まれていなかった。しかし、ループの本体に入出力があると次のようなことができる。

• ループ本体に入力があると、いくつものデータを次々に読み込んで処理することができる。
• ループ本体に出力があると、いくつものデータを次々に出力して、表のようなものを作り出すことができる。
実際見てみよう。まず次の問題を考えてみる。

a. 実数を次々に入力して、その合計を求めよ。ただし、0 が来たらそこでデータは終わりだとする。
sum := 0.0ｘを入力
sum := sum - x
任意個の数の合計

while x <> 0ｘを入力
sum を出力

図 5: ループ中に入力のある PAD 図
これを PAD にしたものを図 5 に示す。入力が 2 箇所にあるのがちょっと変わっていますね? これは、while ループの条件でデータが 0 かどうか調べるには、ループの前でまず 1 回データを読み込んでおかなければうまく行かないからである。 Pascal にしたものは次の通り。

program sam9a(input, output);var x, sum: real;
begin
sum := 0.0;
write(’x = ’); readln(x);while x <> 0.0 do begin
sum := sum + x;
write(’x = ’); readln(x)end;
6writeln(’sum = ’, sum:8:3)
end.
実行例は次の通り。

% pc sam9a.p% a.outx = 10.5
x = 2.3
x = 8.9x = 0
sum =21.700%
では次の問題も考えてみよう。

b. 貯金の元金 m、利率 r(%)、目標金額 g を入力し、1 年後つまり 1995 年から目標金額に達するまでの年と、現在高を出力せよ。
m, r, g を入力

y := 1994
利息の計算

rm := m + m()
100
y := y + 1

while m < gy, m を出力

図 6: ループ中に出力のある PAD 図
こんどは入力は 1 回だが、出力は現在高が目標に達するまで繰り返し行うことになる。その PADを図 6 に示す。Pascal では次の通り。年は「1 つずつ数える」から整数、他は実数の変数になることに注意。

program sam9b(input, output);var y: integer;m, r, g: real;
begin
write(’money amount = ’); readln(m);write(’interest rate = ’); readln(r);write(’goal amount =’); readln(g);y := 1994;
while m < g do begin
m := m + (m*r/100.0); y := y + 1;
writeln(’year ’, y:4, ’ amount = ’, m:8:4)
end
end.
% pc sam9b.p
7

% a.out
money amount = 100.0interest rate = 5
goal amount =150.0
year 1995 amount = 105.0000
year 1996 amount = 110.2500
year 1997 amount = 115.7625
year 1998 amount = 121.5506
year 1999 amount = 127.6282
year 2000 amount = 134.0096
year 2001 amount = 140.7100
year 2002 amount = 147.7455
year 2003 amount = 155.1328%
このように、ループの中に入出力がある場合には、「ある解が求まるまで繰り返す」というのとはだいぶ感じが違って、データ 1 個ごとに繰り返しながら入力や表示を行う、という感覚になる。慣れて頂きたい。
演習 2 a を改良して、でデータの合計だけでなく、平均も求めるようにせよ。
演習 3 b を修正して、目標金額までではなく、 2010 年までの各年の金額を打つようにせよ。

4for ループ—固定回数の繰り返し

さて、ごく非常に簡単な問題として、「整数 N を入力し、1 から N まで順に出力せよ」というのを考える。この PAD を図 7 に示す。これはこれでいいのだが、ｎを入力

i := 1１からｎまで
順に出力ｉを出力
while i <= ni := i + 1

図 7: 固定回数のループを while で
実は計算機のアルゴリズムでは「整数変数を、まずある決まった値 a にし、それから別の値 b に到達するまで 1 個ずつ増やしながら何かをする」というパターンは非常に多く現われる。そのため、このようなパターンの繰り返しには「for ループ」ないし「do ループ」という決まった名前がついていて、さらに多くのプログラム言語はそのための文が専用に用意されている。 Pascal でも

for

変数:=

atobdo文という形をした「for 文」が用意されている。(なお、「変数」は整数型でなければならない。またa や b の所には整数型の任意の「式」が書ける。) そして PAD でもこれに対応した書き方をする。
それを利用すれば、上の問題の PAD は図 8 のようになる。ひどく簡単でしょう?

8ｎを入力１からｎまで順に出力
for i := 1 to nｉを出力

図 8: 固定回数のループを for で
演習 4 上の 2 つの PAD をともに Pascal にして動かせ。
演習 5 次の問題に対する PAD を書き、また Pascal にして動かせ。

a. 0 が来るまで次々にデータを読み、最大と最小の値を打ち出す。
b. 整数 N を読み込み、x = 1 . . . N について、x、x2 、および x1 の表を打ち出す。
c. 整数 N を読み込み、値が N 未満のフィボナッチ数列を打ち出す。 15

電子ニュース

5.1

電子ニュースの概要

電子メールが個人から個人への「お手紙」だとすれば、電子ニュースは「新聞」に相当する。ただ、普通の新聞と違うのは、誰でも (あなたでも) 記事を書けることと、新聞の数がやたら多い (話題が細分化されている) ということである。電子ニュースの用語では各新聞のことを「ニュースグループ」と呼んでいる。
(Internet の) 電子ニュースには世界中の何万という計算機がつながっていて、そのどこから投稿した記事でも地球の反対側まで伝播して行って読めるようになっている。そんなことがどうしてできるのか不思議ですか? たとえば、あなたがここで投稿した記事を、ここから 2 箇所に伝達し、その 2 箇所がまたそれぞれ別の 2 箇所に伝達し…のようにしたとする。すると、それを 20 段繰り返しただけで百万箇所に伝達できることになるでしょう? 実際に起こっていることはこれとはちょっと違うが、原理はまあそんなものである。
さて、ニュースグループが沢山あるという話は上で出たが、それぞれのニュースグループの名前は例えばkomaba.lectures.jousho.kuno-1のように大分類→小分類の順で階層構造の形になっている。その一番上のカテゴリーの代表的なものとして次のものがある。

komabatecc
u-tokyotnn
fj
compalt--- 駒場地区ローカルなもの--- 教育用計算機センターのもの--- 東大全体--- IIJ というネットワーク提供会社主催--- 日本全体 (fj == From Japan)--- 世界中、計算機がらみの話題--- 世界中、一般の話題

ほかにも一杯あるが、とりあえずこれくらいで十分以上だろう。
フィボナッチ数列とは、1、1、2、3、5、8、13、…のように 3 番目以後の値がその前 2 個の和に等しいような数列のこと。
195.2

ニュースを読む

ごたくはそれくらいにしてニュースを見て頂こう。その前に! 例によって初期設定の調整のため、最初に 1 回だけ% ~kuno/setup

news[RET]を実行して欲しい (login し直す必要はない)。さて、ニュースを読むためのプログラム (ニュースリーダ) は「補遺」に説明されている gnus をはじめ多数あるが、ここでは比較的初心者むけのmnews というニュースリーダを使用する。mnews を動かすには Kterm の窓で「menws[RET]」と打つ。すると、図 9 のような初期画面が出てくるはずである。

図 9: mnews の初期画面
ここには、上で説明したようなカテゴリー (トップレベル) の一覧が出ている。その中でどの行へ進むかは、Mule と同様^N と^P のキーでカーソルを動かして選択する (やってみよ)。(あと、記事やグループ一覧などで 1 画面に入り切らない時は^F と^B で 1 画面ずつ前後に移動することもできる。リストの先頭と最後に行くにはそれぞれ [ESC]<と [ESC]>である。)
ところで、この状態で「l」(小文字のエル) を押すと画面が書き変わり、「U」の印のついたカテゴリーが沢山出てくる。「U」は「見るつもりないから表示しない」という意味を持っている。
カーソルをその行に持って行って「u」を押すと印が取れる。また印のないところで押すと印がつく。以下の課題等のため、「alt」を含め上に説明したカテゴリは印なしにしておいて欲しい。再度「l」を打つと「U」のついたものは表示されなくなる。
次に、「komaba」のところへカーソルを持って行って「i」を押すと画面が書き変わり、「komaba.
なんとか」を選ぶ一覧になる。ここで「komaba.forum」のところへカーソルを持って行って「i」を押すと、今度は図 10 のように記事のタイトル一覧になる。つまり、グループ名のところまで階層を降りてくると記事一覧、それより上の中間レベルではグループ名 (ないしカテゴリ) 一覧が表示され、カーソルでその中から選んで「i」を選ぶと階層を降りていくことができる。逆に「q」を打つと階層を上へ上がっていく。
記事一覧のところで「i」を打つと、その記事の内容が画面に表示されて読むことができるようになる。読み終わって戻るのもやはり「q」である。ところで、読み終わるとその記事のところに「R」の印がつくが、これは「この記事はもう読んだ」という意味である。そして、^N と^P の変
わりに「n」と「p」を使うと読んだ記事は飛ばして移動してくれるので、まだ読んでいない記事だけ効率よく読むことができる。あと、タイトルだけ見て「読むに値しない」と思った時は「d」

10

図 10: mnews の記事一覧画面
を打つとで読んだ印をつけられる。また、どこででも「c」を打つと、現在カーソルのあるカテゴ
リ/サブカテゴリ/グループの記事全部に印をつけられる。
mnews を終わらせるには、一番外側のカテゴリ一覧でさらに「q」を打つ。または、どこででも「Q」(大文字) を押すと一気に終わることができる。mnews は「どこまで読んだか」の情報を終わるときにファイル「.newsrc-mnews」に書くので、このどちらかの方法で正しく終わらせないと読んだものの情報が失われてしまう (つまり、次回 mnews を起動した時に読んだはずのものが「読んでいない」ことになってしまう。
演習 6 komaba カテゴリーの下にどんなグループがあるか探検し、記事をいくつか読んで見よ。

5.3

記事の投稿

さて、読み方が分かったところで、次は投稿である。記事を投稿するには、まず正しい (話題にふさわしい) グループを選ばなければならない。最初は投稿の練習をするのだから、komaba.test(駒場地区用練習グループ) を選ぶことにして、その記事一覧画面へ行く。この状態で「a」を押すと、mnews はまず投稿記事の Subject:(タイトル) を聞いてくる。この状態での漢字入力はできないので、とりあえず英字のみを使って英語かローマ字で書き、最後に [RET] を打つ。次に Distribution:(配布範囲) を聞いて来るが、 world[RET] と打つ。すると今度は Mule が起動され、本文を書くモードになる。
Mule の中では電子メールの comp と同様、記事の先頭部分も編集できるので、Subject:を漢字で書き換えたりしてもよい。肝心の本文は「text follows this line」より下に書く。ここにはもちろん漢字を使って良いが、alt など海外が中心のグループでは漢字を読めない人が大部分だからやめておいた方がよい。書き終わったらいつも通り^X^S で保存し、^X^C で終了する。すると、もし自分が.signature ファイルを持っている場合にはそれをつけ加えるかどうか聞かれるので「y」か「n」で答える。次に完成したメッセージを見るモードになるので、スペースキーを使って最後まで見て行き、最後で再度スペースを押すと「投稿してもいいか」と聞いてくるので、ここで「y」を押すと投稿される。投稿した記事は一担 mnews を終わらせて再度起動した時に見えるようになっているはずである。
演習 7 komaba.test の下に記事を投稿し、確かに投稿できたかどうか確認してみよ。

11

以上は新規投稿だったが、メールの返信と同様、既にある記事に対して「フォロー」を投稿することもできる。その場合には、記事一覧の画面でフォローしたい記事にカーソルを置いた状態で「F」(大文字) を打つ。すると、Subject:はもとの記事から作られ、また本文ももと記事からの引用がなされた状態で Mule が動き出すので、ここで余分な引用などは削除して本文を組み立てる。
(Mule でいらない行を消すには^K を連打する、というのを思い出しておくように。 )演習 8 komaba.test の下にある、自分以外の誰かが投稿した記事にフォローしてみよ。
だいぶ色々出たので、以下に mnews のコマンドキー一覧を載せておこう。

lUnsubscribe したものを表示するかどうか切り替えるu今いるカテゴリを Unsubscribe する、またはしていたのをやめる^N
1 つ下のカテゴリ/記事へ行く^P
1 つ上のカテゴリ/記事へ行く^F
1 画面先へいく^B
1 画面前へいく[ESC]< リストの先頭へいく[ESC]> リストの末尾へいく
i
そのカテゴリ/グループの中を表示
q
現在いるカテゴリ/グループから上へ戻る
Q
一気に mnews を終るa
現在一覧の出ているグループに新規投稿
F
現在カーソルのある記事にフォローアップ

12

A

本日の課題 7A

本日の課題は、アンケートのニュースへの投稿のみです。グループとしては、必ず「komaba.lectures.jousho.kuno-1」を使用し、また Subject: は「Report 7A」とすること。アンケートの内容は次の通りです。

• Q1. プログラムにおける反復 (ループ) について、どのように感じましたか?

• Q2. ニュースについて、どう思いましたか? メールや WWW との比較についても述べてください。どんな場合に特にニュースを使おうと思いますか?
• Q3. その他、感想、要望、質問があればどうぞ。

B

次回までの課題 7B

次回までの課題は、演習 2〜4 のうち好きなもの 1 つ、演習 5 の中から好きなもの 1 つ、および以下に述べる演習 9 です。
演習 9 alt、rec、soc、sci カテゴリの下には、雑多なテーマについての多数のグループがある。
どれでも自分がついて行けそうなテーマのグループを撰び、何か「気の利いた」記事を (もちろん英語で!) 投稿し、フォローを貰ってみよ。本当に気が利いていればフォローが来るはずである。ただし、グループがあまりに非活発だと (誰も読んでいないから) フォローは来ないから、既にある記事の日付を見て最近投稿があることを確認してからやった方がいい。また、駒場の誰かからのフォローはフォローとして数えない。あと、Distribultion:が「local」となっていると記事が外に出ていかないから、もしなっていたら「world」に変更すること。
レポートには、どのグループでどんな投稿をしたらどんな反応をもらったかの概要を書く。
レポート番号は 7B です。アンケートは次の通り。

• Q1. プログラムにおける反復 (ループ) について理解しましたか? しなかったとしたら、どの辺に問題がありますか? したとしたら、どの辺が「きも」だと思いましたか?
• Q2. ニュースについて、外部の様々なグループを眺めてみてどう思いましたか? 駒場グルー
プや東大内グループと外部との違いはどんなことだと思いましたか?
• Q3. その他、感想、要望、質問があればどうぞ。

13