情報処理演習II
 1年生前期
 目標：プログラム作成の基本的な実践力– プログラミング論 I と連携

情報処理演習II 使用プログラミング言語：Scheme (後述)
 単位取得：– 講義時の平常点– 全レポート提出– 必要に応じて試験を行うことがある

なぜプログラミングを学習するか 今やコンピュータは社会基盤の一部– コンピュータソフトウェアに関する素養は必須
 コンピュータはデータを形式的(機械的)に処理– 特定の言語によらず、データおよびその処理手順(プログラム)を論理的に記述する能力は重要
 テクニックよりまず基本的な考え方を重視– 問題分析、問題解決の技術

ソフトウェア開発と言語
 ソフトウェア開発(抽象レベルでは言語非依存)：– 物理システムの開発と同様に、きちんとした抽象化、設計法– 物理法則のような制約はない → 論理的正しさが特に重要
 具体的実現：目的に適した言語(モデル)を選択– モデル： 式、関数 ／ 手続き、副作用 ／ オブジェクト指向 等– 目的：科学技術計算、事務処理、システムソフト、DB など

 本演習：基本的 「式、関数」 をベースとした言語– Scheme という言語を使うプログラム設計法(レシピ)プログラム設計レシピ：問題解決過程のガイド
1. 問題の解析とデータの定義
2. 規約、目的、結果の記述とヘッダ作成
3. 例題を用いた振舞の例示
4. プログラムテンプレート、レイアウトの作成
5. テンプレートを完全な定義に変換
6. テストを通してエラーの発見

各ステップで中間生成物をチェック

Scheme の特徴
 関数型： 数学体系λ計算が基礎– 式(関数)でプログラムを構成、式の簡約で計算が進む• 紙と鉛筆(頭の中)でもプログラム実行過程が追える インタプリタ型処理系– 初学者にも優しい(本質が埋もれがちな作業が少ない) 見た目としては演算子が前置され、括弧が多い– プログラムの基本単位である式を括弧で囲む– 式の構成要素にまた式を持ち得る(括弧の入れ子)
例 4×2 + 4÷2 の表記とその計算過程：(+ (* 4 2 ) (/ 4 2))→(+ 8 (/ 4 2))→(+ 8 2)→10

Scheme についての参考資料
 参考書– [この講義] M. Felleisen et al., “How to DesignPrograms”, MIT Press (Web版
http://www.htdp.org/ )– [Scheme言語仕様] ケント ディヴィグ (村上雅章訳), "プログラミング言語SCHEME", ピアソン・エデュケーション– [言語として Scheme を用いる他の著名な講義用テキスト] サスマン他 (和田英一訳), "計算機プログ
ラムの構造と解釈", ピアソン・エデュケーション

情報処理基礎演習（リテラシも含め合計約13回程度の予定）
 前半：データに着目したプログラム開発の基本• 数と数式、プログラムと実行過程、エラー• 変数と関数、条件、プログラム設計法によるプログラム作成• 様々なデータ• 任意長データと処理(リストと再帰処理プログラム)
 後半：プログラミングに関するより高度な話題• 設計の抽象化• 値としての関数を使った抽象化• 再帰のバリエーション• 知識の蓄積(アキュムレータ)
 コンピュータリテラシ(メイル、ワープロ...)他のプログラミング関連科目との関係– 1年前期• プログラミング論 Ｉ (必修、箱崎開講)– プログラム設計の基本：講義中心• 情報処理基礎演習(必修、六本松開講)– 端末を利用した演習中心

連携
内容的には言語非依存だが便宜上Schemeを使用– 1年後期

第1回（リテラシ）
インターネット、電子メール、WWW• プログラミング演習 Ｉ (必修、箱崎開講)– C言語(手続型言語)でのプログラミング• (高度プログラミング演習 (選択、六本松開講))– C言語の演習– 2 年以降 → 各課程ごとの内容

今日の内容

インターネット

IX（InterneteXchange)

1. インターネットとは？
2. 電子メールの利用
3. World Wide Web（WWW）
4. 検索エンジン
5. 今日の課題

IX
ISP

IX

ISP

ISP
ISP

携帯電話、PHS

ISP
ISP
ISP
ISP

LAN

ISP
ISP

ISP
ISP

ISP

ISP

ISP

ISP

ISP（Internet ServiceProvider)

CATV

ダイアル
IPアドレスの割り当て
アップ FTTH
ADSL
データの配送(光通信)ドメインネームシステム（DNS）

IPアドレス インターネット上に接続している機器を識別す

DNSサーバるためのもの

送信先(133.5.11.102)
送信元(133.5.11.101)
サイズ等
データ(今日、暇？)

PC2.s.kyushu-u.ac.jpのアドレスは？

ホスト名（人間にとって、わかりやすくするためにつけられた名前）
ah.s.kyushu-u.ac.jp
ドメイン名

133.5.11.102
IPパケット

計算機名

対応付けられている。
IPアドレス 133.5.11.180

電子メールの利用
 クライアント (Mailer) メールサーバ– POP, IMAP (受信用プロトコル)– SMTP(送信用プロトコル)

PC2.s.kyushu-u.ac.jp
133.5.11.102

PC1.s.kyushu-u.ac.jp
133.5.11.101

電子メールの送受信
プロトコル：あるサービスを実現するための、決められた手続き

送信

メール
サーバA

SMTP

DNSサーバ
メールサーバB 受信サーバBのアドレス

 DNSサーバPOP IMAP– ドメイン名 → IPアドレス （変換）– ah.s.kyushu-u.ac.jp → 133.5.11.180– s.kyushu-u.ac.jp

Q子へのメッセージ

メッセージの受け取り・閲覧

メッセージのチェック• (Mail eXchanger) -> vwall.nc.kyushu-u.ac.jp
Q太郎

メール
送信サーバー

SMTP

メール
受信サーバーQ子

SMTPで送信されるメッセージは？
 メッセージは平文（そのままの表現）で送られる。
 文字以外のデータを添付ファイルなどで送る場

Mail From : Taro@s.kyushu-u.ac.jp
OKRCPT: Hana@s.kyushu-u.ac.jp

From: Taro@s.kyushu-u.ac.jp
To : Hana@s.kyushu-u.ac.jp
Subject: Hello!
--------こんにちは、お元気ですか？
今度の水曜日に、遊びに行きますね。
--Q太郎

OKDATA
Start mail input; end with <CRLF>.<CRLF>
From: Taro@s.kyushu-u.ac.jp
To : Hana@s.kyushu-u.ac.jp
Subject: Hello!
こんにちは、お元気ですか？
今度の水曜日に、遊びに行きますね。
--Q太郎<CRLF>.<CRLF>
OK

合は、MIME (Multipurpose Internet MailExtension)という規格に従ってコード化して送る。
 暗号化しない限り、大事な情報（クレジットカードの番号、暗証番号など）は、メールで送らない。

POP

POPもメッセージは暗号化されていない

USER taro

 POP

OK taroPASS Nai-sho
OK taro’s maildrop has 2 messages

Q太郎

PC1
taro

メールはPC側に送られてきてPC側にメッセージが残る。

特別にサーバーに残す設定をQ太郎
しない限りメールは別のPCからでは残らない。
前に読んだメールは読めない。
PC２– USER taro
– PASS Nai-Sho!
は暗号化されていない。
APOPを利用すると、USERとPASSは暗号化– USER taro
→ kd3xqaP)– PASS Nai-Sho! → %Qk8#4qxkp1
しかし、メッセージは暗号化されていない。

経路の暗号化IMAP

SSL （Secure Socket Layer)
PC1
taro

http (Webのプロトコル) + SSL = https
Grace Mailのページのアドレスはhttps://secure.s.kyushu-u.ac.jp/mail/
この手法はメーラとメールサーバ間の通信を暗号化するだけで、すべての通信が暗号化されるわけではないので注意!!

World Wide Web（WWW）

特別に保存の操作をしない限りPCには残らない。

PC２

サーバーにメールは残っている。

別のPCからでも前に読んだメールが読める。

World Wide Webの特徴

 1989. 3– Tim Berners-Leeが最初のプロジェクトプロポーザルを書く。
 1990. 11– WWWの最初のプロトタイプ作成
 1991. 3– Line mode browserの最初のリリース
 1993. 1– Midas, Viola, Mosaicなどのbrowserがリリース– サーバ数は50

アンカー
ネーム（リンク到達点 ） 2005.11– サーバー数: 74,572,794 (http://news.netcraft.com/より)– Google: ページ数は87億以上、Yahoo: ページ数は113億以上

リンク
リンク先のアドレス＝URL

ファイル

Webサーバーとブラウザ

URL(Uniform Resource Locator)とディレクトリ・ファイル（九州大学情報基盤センターのシステムの場合）

Webサーバhttp://www.s.kyushu-u.ac.jp/~te100000/index.html

ブラウザ
公開
公開
作成

te100000さんのindex.html (ホームページ)
http://www.s.kyushu-u.ac.jp/~te100000/index.html

HTML
画像

Z:ドライブ（ネットワークドライブ）

画像作成

サーバの名前スケジュールのページへのアクセス手段

検索エンジン

CrawlerがWebを巡回

１．Scheme の式とプログラム
数、式、プログラムと実行過程、エラー

QueryEngine

索引の作成 検索キーの受付
単語→文書、出現数

例題１．簡単な式
 次の Scheme の式を DrScheme の実行用ウインドウに入力し、実行する

例題(2 + 2) *(3+ 5) *(30/10)
2

 Scheme で書くと：(* (+ 2 2)(/ (* (+ 3 5)(/ 30 10))2))

Scheme の式
演算子を前に置く（前置記法）

「例題１．簡単な式」の結果 (1/2)

「例題１．簡単な式」の結果 (2/2)

Scheme 式を実行用ウインドウに入力して、Enter キーを押すと実行結果が表示される

よくある間違い 「スペース（空白文字）」に意味がある

例題２．簡単な式
 次の Scheme の式を DrScheme の実行用ウインドウに入力し、実行する
間違いの例 １

間違いの例 ２(* (+2 2)(/ (* (+ 3 5)(/ 30 10))2))(*(+ 2 2)(/ (* (+ 3 5)(/ 30 10))2))＋の後にスペースが無い＊の後にスペースが無い

5 + 5-5 + 53 * 4
8 / 123 + 4.5

簡単な式の実行例(2 + 2) * (((3 + 5) * (30 / 10)) / 2)

例題３．円の面積
 円の半径 r から面積を求める関数
area-of-disk を定義し、実行する
例） 5 → 78.5

6の上の線は 0.6666666… と6が続くことを意味する–関数の名前： area-of-disk–パラメータ： r「例題２．円の面積」の結果(1/4)

「例題２．円の面積」の結果(2/4)

Run ボタンを押すと、定義用ウインドウに書いた関数定義が、コンピュータに読み込まれる

まず、定義用ウインドウで関数を定義している

このとき、実行用ウインドウの中身はクリアされる「例題２．円の面積」の結果(3/4)

実行用ウインドウで、(area-of-disk 5)と入力して、Enter キーを押す（これは、r の値 を 5 に設定しての実行）

別の半径を与えて実行
今度は、(area-of-disk 10)と書いて、r の値 を 10 に設定して実行。

実行結果である「314」が表示される（確かに 10×10×3.14 = 314）

「例題２．円の面積」の結果(4/4)

実行結果である「78.5」が表示される（確かに 5×5×3.14 = 78.5）

Scheme プログラミングの手順

Scheme の関数を定義し、インタプリタ(DrScheme)に読み込ませる作った関数を実行して、実行結果を得る

Scheme の関数の定義

Scheme の式の実行

プログラム実行までの手順① 関数を定義し、インタプリタ（DrScheme）に読み込ませる例(define (area-of-disk r)(* 3.14(* r r)))(area-of-disk 10)⇒ このことを「関数適用」という例： (area-of-disk 5) ←これも Schemeの式② 読み込ませた関数を使った式を実行(area-of-disk 5)

 式の中に「関数名」 を書く

Scheme の関数定義

円の面積を求める関数定義

例

プログラムでの関数定義の利用

関数（定義した関数)を使ったScheme
式の実行

実際に、半径 5の円の面積を求める

実際に、半径 5、 半径 10の円の面積を求めるコンピュータが行っていること
例えば、関数定義

Scheme のプログラム（関数）コンピュータが行っていること
Scheme の式

例えば：(area-of-disk 5)を入力すると・・・(define (area-of-disk r)(* 3.14(* r r)))を読み込ませるとインタプリタ(DrScheme)

インタプリタ(DrScheme)

いったん、内部に記憶される式の実行結果78.5が表示される

DrScheme の２つのウインドウ

実習

定義用ウインドウ

実行用ウインドウDrScheme の２つのウインドウ

DrScheme の Runボタン

関数を定義し、コンピュータに読み込ませている

Run ボタン・定義を行ったら「Run ボタン」を押す→ 関数定義の内容をコンピュータが読み込む

読み込んだ関数を実行させている→ 「実行用ウインドウ」の中身はクリアされる

DrScheme の２つのウインドウ

実習の進め方 資料を見ながら、「実習」を行ってみる

関数
定義用ウインドウ

 その後、各自「課題」に挑戦する– 各自で自習 ＋ 巡回指導

式

実行結果
DrScheme

実行用ウインドウ

実行用ウインドウ

DrScheme の使用– 遠慮なく質問してください 自分のペースで先に進んで構いません「Intermediate Student」に設定

 DrScheme の起動

プログラム → PLT Scheme → DrScheme 今日の実習では「Intermediate Student」に設定
Language→ Choose Language→ Intermediate Student→ OK ボタン

Language→ Choose Language

Intermediate Studentを選択し、「OK」をクリック

最後に Runボタン

実習１．簡単なプログラム
 次の関数を書き、実行する

f1: x と N から 「ｘN／N」を求める
f2: x と y から 「x、y のうち大きいほう」を求める
f3: x から 「x を１００で割った余り」を求める
f4: x から 「x を１００で割った商」を求める「実習１．簡単なプログラム」の手順
1. 次を「定義用ウインドウ」で、実行しなさい• 入力した後に、Run ボタンを押す(define (f1 x N)(/ (expt x N) N))(define (f2 x y)(max x y))(define (f3 x)(remainder x 100))(define (f4 x)(quotient x 100))
2. その後、次を「実行用ウインドウ」で実行しなさい(f1 2 5)
(f2 3 4)
(f3 123)(f4 123)☆ 次は、課題に進んでください

実習１の実行例(1/2)

実習１の実行例(2/2)
確かに 25/5 = 6.4
確かに 3、4 の大きい方は 4

まず、関数定義をDrSchemeに読み込ませている

確かに 123 を 100 で割った余りは 23
確かに 123 を 100 で割った商は 1

Scheme の式の例 (変数が登場するもの)
関数の本体には「変数を含む式」を書くことになる ｘN／N(/ (expt x N) N)・・・ ２変数の式

 x、 y のうち大きいほう(max x y)・・・ ２変数の式

 x を１００で割った余り(remainder x 100)

・・・ １変数の式

 ｘを１００で割った商(quotient x 100)

・・・ １変数の式

課題

DrScheme でのプログラム保存法

プログラムのファイルへの保存(1/2)

 何日かかけてプログラム作成したいとき→ プログラムを保存する必要あり
 DrScheme の「Save 機能」を活用すること– ファイル名は「英語」で付けることを勧める
 九州大学のパソコンでは、「Ｚドライブ」に保存するのがよい

保存では、「File」→「Save Definitions」 を行う– 「Dドライブ」に保存することもできるが、ログアウトする前に「Zドライブ」にコピーするのを忘れないこと。

プログラムのファイルへの保存(2/2)

課題1. ドルから円への変換
ドル d から円を求める関数 d2y を定義し、実行例を示しなさい– 関数定義には define を使う

保存する場所は、Ｚドライブがよい– 1ドルは106.53円とする

ファイル名は自由に付ける（英語がよい）

課題のヒント(解答例)

課題のヒントx から「10 × x + 30」 を求める関数 fooを定義し、実行例を示しなさい ここにあるのは「間違い」の例です。同じ間違い

解答の例：(define (foo x)(+ (* 10 x) 30))
実行例は次の通り(foo 10) は 130(foo 20) は 230
実際に、DrScheme で実行して確認した（あくまでも例です。各自、工夫を試みなさい。
独自の工夫を高く評価します）

をしないこと
1. 「かっこ」の間違い

3. 関数の書き方の間違い

define (d2y d)(* 106.53 dollar)(define (d2y)(* 106.53 d))⇒ 全体をかっこで囲むこと⇒ d2y の後に d が必要

2. 変数名の対応の間違い(define (d2y dollar)(* 106.53 d))⇒ 変数名dとdollarはどちらかに統一すること（どちらでも可）4. 関数名の付け方の間違い(define (d 2 y d)(* 106.53 d))⇒ 「d 2 y」でなく 「d2y」と書くこと

課題2. 摂氏から華氏への変換

課題3. 元利の計算

摂氏（Celsius）表現の温度 c から華氏（Fahrenheit）表現の温度 f を求める関数
c2f を定義し、実行例を示しなさい 元金と年利と年数を受け取り、元利を求める関– 関数定義には define を使う– 摂氏と華氏の変換式： c＝5 ×(f - 32) / 9

数 interest を定義し、実行例を示しなさい– 関数定義には define を使う– 元利の計算式：「元利 = 元金 × (1＋年利)年数」– 作成した関数を実行し、元金1000円、年利2%とし、50年後の元利を報告しなさい– x の y 乗の計算には expt を使う(expt x y)

今日の課題（リテラシ編）
 電子メールのガイドライン

http://www.cgh.ed.jp/netiquette/rfc1855j.htmlの中の電子メールのガイドラインを読んで、注意すべきことをまとめましょう。
 また、わからないことがあれば、その説明をWebから探してみましょう。
– 検索エンジン（Google、MSNサーチ、Yahoo、gooなど）