Powered by SmartDoc

コンピュータ概論(2002/11/06)
Ver. 1.0

2002年11月6日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/index.html
コンピュータ概論2002/11/06 の資料

目次

お知らせ

  1. くどいようですが、講義時間にwindows updateを行うのは止めてください。Networkが混む原因になりますから。

    講義終了後(演習の時間)などに、空いている教室などを利用して実行してください。

    僕は、必ず行っています。環境の統一という観点からも、受講者全員がwindows updateを行っていることが望ましいと思います。

演習

Home Page の公開

皆さんの Home Page

皆さんのHome Page (前回の演習の結果)は、ここに公開されていますので、参照してみましょう。

なお、公開されている皆さんのPageのURLは、

http://www.media.cst.nihon-u.ac.jp/comp/g13xxxx/yyyyy.html

といった形ですxxxxは学籍番号、yyyyyはhtmlファイルの名前。

特に、yyyyyがindex (つまり、ファイル名がindex.html )の場合のURLは、

http://www.media.cst.nihon-u.ac.jp/comp/g13xxxx/

でも、参照可能となりますので、お確かめください。

絵への Link ( IMG Tag )

先週Home Pageの公開方法について学んだわけですが、この方法では画像が公開できないという問題があります(2)

そこで、今回は「他のPageで公開されている画像を自分のHome Pageで利用する」といこと(3)を説明します。

  1. この問題に関しては、他の方法を用意する予定ですが、今回は以下のような「逃げ」ということで..。
  2. 繰り返すようですが、以下の手法は、いわゆる「無料素材」を利用する場合に限ることに注意してください。

    他の人が一般に公開している画像データを自分のPageで「無断流用」することは、「マナー違反」と理解されています。

絶対 URL と相対 URL

URL ( a tagのhrefや、img tag srcの後ろに記述)は、大きく言って二つの形式があります。

絶対URL

http://?のようにhttp:の後ろに//で始まる場合。

この場合は、Internet上の一意な場所を意味しており、この形式であれば、どこからでも同じ意味で利用できる。

相対URL

絶対形式でない場合で、これは、その記述( aやimg tag )のあるpageからの相対的な位置で表現する。

相対表現の場合、そのpageのURLの最後の/より後ろを削除し、更にその相対表現のhttp:以前を削除したもの(特になければ、そのままでよい)をつなげれば、その相対URLが指しているものの絶対URLを得ることができる。

例: hpのURLは、http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/hp.html (絶対表現)であるが、この中にあるimg tag <img src="kkao01.gif" (相対表現)の絶対表現は、http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/kkao01.gifとなる。

自分のHome Pageでも、

<img src="http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/kkao01.gif"></img>

と書けば、このを参照表示させることができる。

一般に、自分の管理下にある情報は、相対表現で、そうでない場合は絶対表現が推奨されています。また、絵や図は、自分の管理下にあるものを利用することが望まれるので、結果的に相対表現になるものが多いようです。

しかし、今回の様に絵が置けない場合は、このような絶対表現による絵の参照でも構わないでしょう。

Lisp (2)

プログラミングとは

先週から始まったLispの演習の目標は、「プログラミングの初歩を学ぶ」ことです。

プログラミングというのは、「計算機に対して、自分の思い通りの振る舞いをさせるための命令の並びを記述すること」です(4)

例えば、Lispで、「(+ 3 (* 4 5))」と記述して入力することは、(Lispを通じて..)計算機に対して、「3 + 4 × 5を計算しなさい」と命令していることになるわけです。

このように、計算機への命令を書くために使う言葉(この場合はLisp )のことをプログラミング言語と呼び、プログラミング言語で記述された命令列(この場合は「(+ 3 (* 4 5))」)をプログラムと呼ぶわけです。

自然言語(日本語や、英語.. )などと同様、プログラミング言語も様々存在( 2年次に設置されている「ソフトウェア概論」で学ぶFortran 90や、C言語、最近の流行では、JavaやC#など.. )します。

そして、特定のプログラミング言語で書かれたプログラムを与えると、それから計算機に何らかの動作をさせるための特別なプログラム(今回のlispを利用するためにはxlispを入手しました)を「プログラム処理系」と呼んでいます。

  1. 実際は、「どうようにして、命令を並べれば、自分の思い通りになるか?」を考えること(アルゴリズムの設計)や、(実に良くあることなのですが..)自分の命令並びによって、計算機が思う通りに振舞わない場合、どこに誤りがあるかを探し、訂正すること(デバッグと呼びます)等、実際に記述を行うこと以上に様々な知的行為を含んでいます。

プログラミングは難しいか ?

「プログラミングを学ぶ」ことは、結構大変です。なぜなら、一般に、「プログラミングを学ぶ」には、次のような三つのしかも比較的独立した内容を同時に学ぶ必要があるからです。

アルゴリズム:プログラムの組み立て方
どのような手順で命令を出せば、計算機が思い通りに動くかという、最も本質的な内容。ただし、計算機は、融通が利かないので、こちらで、噛み砕いて命令しなければならないし、ちょっとした誤りも許されないので、結構面倒なことが多い。
プログラミング言語:プログラムの表現方法

頭の中に描いた手順を計算機に伝えるには、何らかの形で、表現する(5)必要があります。

その表現方法は、予め、決められた規則に従っている必要があるわけで、その規則(一般の「言語」を学ぶのと同様)を学び、使いこなせる必要があります。

計算機の操作

これはプログラミングとは直接関係ないのですが、計算機に対して、プログラムを与えたり、あるいは、プログラムの作成そのものも、計算機上で行うため、計算機が操作できなければなりません。

特に、プログラミングを行うには、それ固有の操作(例えば、処理系の操作方法)が必要なので、その操作方法も学ぶ必要があります。

つまり、「アルゴリズムを考える( =プログラミングの本質)」のほかに、多くの垣根が存在し、それが「プログラミングは難しい」という誤解(6)を招くわけです。

しかし、逆に、上記のような構造が分かれば、ある程度「手抜き」も可能です。つまり、本質的でない部分(プログラミング言語の習熟と、操作方法の習熟)は、サボっても良い(良く分からなくても、まあ、「できれば」良い)ということです。

そして、本質的なこと(アルゴリズムを考える=問題を解くための手順を考える)に、多少の時間を費やすべき(7)だということです。

  1. 好きな人に自分の思いを伝えるには、告白するなり、ラブレターを書くなり、ウインクするなり、まあ、何でも構わないのですが、「表現する」必要があるわけです。
  2. 実際は、本当に難しいのですが、本当の難しさに突き当たる前に、前々異なった問題に引っかかってしまうということが言いたいのです。
  3. とはいっても、「コンピュータ概論」では、この部分も「さわり」しか説明しないのですが..

プログラミング作業の流れ

プログラミングを行う流れは、以下のようになっています。

  1. プログラムの設計:問題を解く手順を考える(頭を使う)
  2. プログラムの作成:上記の手順をプログラミング言語で記述する(メモ張を使う)
  3. プログラムの実行:プログラムを実際に実行( run )してその結果を確認する( xlispを使う)
  4. 結果の確認:思い通りに動けばよいがそうでなければ、先頭に戻る。

まずは、自分の作業が、上記の流れのどの部分に当たるか、また、その部分では何をすべきかを学ぶと良いでしょう。

設計の基本

プログラムの設計の基本は、「還元」です。つまり、「与えられた問題を解くには、どのような操作を行えばよいか」を考えるわけですが、いきなり「詳細」までを考えるのではなく、「数個のある程度まとまった操作に分解」します。

もし、その各操作が十分に計算機が実行できる操作ならそれで御仕舞ですが、そうでなければ、「更に、その操作を還元する」ということを繰り返すことによって、それが「最終的に計算機が実行できる形まで詳細化」するということです。

問題は、「何を基準に分割するか」です(8)

考え方は色々ありますが、一つは、操作の組み合わせ方を考え、全体の構成が、「何をどう組み合わせるか?」と考える方法です。

具体的には、基本的な動作の組み合わせ方法が、以下の三つあるので、与えられた課題が、この三つのパターンのいずれかに当てはまるように考えると、結果的にその問題が「パターン」+「パターン成す部品」に分解されるということです。

前者の「パターン」は固定的(三つのうち一つ)なので、残りの「パターンを成す部品」を再度考えればよいわけです。

  1. 逐次(重ね合わせ) :異なる操作を順次実行し重ね合わせます。
  2. 分岐(場合わけ) :状況に応じて異なる操作をします。
  3. 繰り返し:同じ操作を、求める状況になるまで繰り返します。

例えば、例として、nに12を掛けることを考えて見ましょう。逐次を使うのであれば、たとえばn × 12は、n × 3 × 4なので、最初に、3を掛ける、次に4を掛けるという二つの問題の逐次に分解されます。

分岐を利用するのであれば、nが偶数か奇数かで分けてみましょう。偶数の場合は、n/2 * 24を計算します。奇数の場合は、(n-1)/2 * 24 + 12を計算すればよいでしょう。

繰り返しであれば、まず、

n * 12 = n * 12 + 0

と考え、更に、これを

( n - 1 + 1 ) * 12 + ( 0 +  0 )

とし、これを

( n - 1 )     * 12 + ( 0 + 12 )

と考えます。

以下、「nから1を引きながら、そのたびに0に12を加える」という作業をn回繰り返せば、掛け算が実行できます。

同じ問題を解くにしても、解き方が異なるわけですが、いずれにせよ都合が良い方法で分解を行えばよいわけです。

  1. ケーキを縦に切るか横に切るか、はたまた中心から外に向かって扇形に切るかによって、ケーキの一片の形は異なります。

    その結果によって、切られた一片が更に、扱いやすくなるかどうかが決まります。

    家では、もちろん、扇形に切りますが、そうしないと、子供たちがけんかをするからです。

xlisp の演習

lispを参照して、先週に引き続き、1章の演習問題( [演習問題1.x.y]とある問題)を全て解いてみてください。

課題提出

今回もありません。

ただし、次週は、「lispの演習問題の結果」を提出していただく予定なので、そのつもりでいてください。