Sc283(1) 情報科学応用演習I 資料 (Part 3) 

[解説] 仕事手順の典型的パターン(その1: 順次処理)

コンピュータにさせる仕事は,基本的には情報処理 (≒計算) である. その手順には,いくつかの典型的なパターンがある. 最も単純なものは,いくつかの作業を順に実行していくものである. このような処理は 順次処理 (あるいは 逐次処理) と呼ばれる. 典型的な例としては,入力 - 計算 - 出力 を順に行なうものがある. この 入力 - 計算 - 出力 のパターンは, 例えば料理になぞらえるとわかりやすい.

  1. 入力 - 「材料を揃える」

    情報処理(計算)に必要な情報(データ)を集めて用意するのがこの段階. データは,ユーザに問い合わせて得られるもの, コンピュータのファイル中に収められているもの, 環境(ハードウェアやオペレーティングシステムなど)に問い合わせて得られるもの, プログラム中にあらかじめ埋め込まれているものなど,さまざまな出所を持ち, その種類にも,数値や文字列など,さまざまなものがある.

  2. 計算 - 「調理する」

    前段階で揃えたデータを元に情報処理をして必要な結果を得る. 単純な計算なら1行で済む場合もあれば, 複雑な情報処理なら何十行,何百行に及ぶこともありうる.

  3. 出力 - 「盛り付けて食卓に出す」

    前段階で得られた結果を出力する. 出力先とその方法も,入力元とその方法と同じようにさまざまな種類がある.

 (BMIプログラム)

Part 2. のタスク「BMIプログラム」 の仕事手順を図式的に表わすと,おおむね下のようになる. (なお,このような図式は流れ図(フローチャート)と呼ばれる)

flow01

このように「BMIプログラム」では,全体が大きく 入力 - 計算 - 出力 の順次処理のパターンになっており, また,入力部分のように,部分が更に(代入などのステートメントの)順次処理となることもある.

ブロック

JavaScript においては,単にステートメントを並べれば,並べた順に実行されるので, 順次処理を表す特別な表現はないが, 複数のステートメントを {} でくくって一つにまとめる表現はあり,それが順次処理を表す表現だと言えなくもない. このような表現を,ブロック と呼ぶ. 厳密に言えば,ブロックもまた一つのステートメントである. つまり,ステートメントが「入れ子」になる.

先の「BMIプログラム」は,このブロックを用いて以下のように書いても差し支えない. (通常はこのような書き方はしないが)

<!DOCTYPE html>
<title>JavaScript Sample 2-2 (modified)</title>
<body>
<script type="text/javascript">
<!--
// 変数の宣言
var height, weight, bmi;

{
  { // 入力
    height = Number(prompt("身長をcmで入力してください."));
    weight = Number(prompt("体重をkgで入力してください."));
  }

  { // 計算
    bmi = 10000 * weight / (height * height);
  }

  { // 出力
    alert("BMI は " + bmi + " です.");
  }
}
// -->
</script>
</body>

[タスク] 標準体重プログラム (1)

概要

身長と体重を入力し,標準体重と肥満度を計算するプログラムを作成する.

なお,身長(cm)に対して,標準体重(kg)は以下の式で表わされるものとする.

標準体重 身長2 × 22
------------
10000

また,肥満度(%)は,以下の式で表わされるものとする.

肥満度 体重 − 標準体重
----------------
標準体重
× 100

方法

WZ Editor で,適切なプログラムを考えて作成し, マイドキュメントsc283 の下に js03-1.html という名前で保存する.

入力には prompt(…); を, 出力には document.writeln(…); を用いる. 変数は,内容を表すような名前を付けるとわかりやすいので,下表のように名づけるものとする

変数名内容
height 身長 (cm)
weight 体重 (kg)
standard標準体重 (kg)
factor 肥満度 (%)

雛形を以下に示す.

<!DOCTYPE html>
<title>JavaScript Sample 3-1</title>
<body>
<script type="text/javascript">
<!--
// 変数の宣言
var height, weight, standard, factor;

// 入力
//   prompt(…) を2回使って身長と体重を入力させ,
//   変数 height, weight に代入する.
//   prompt(…) の値は文字列なので,Number関数で数値に変換する方が無難.

// 計算
//   変数 height, weight に入っている身長と体重から標準体重と肥満度を計算し,
//   結果をそれぞれ変数 standard, factor に代入する.

//出力
//   変数 standard, factor に入っている標準体重と肥満度を,
//   document.writeln(…); を用いてページに表示する.
// -->
</script>
</body>

備考

例を以下に示す.リンクをクリックすれば実行できる.(別ウィンドウで実行される)

js03-1a.html (例のコードと流れ図)


[解説] 仕事手順の典型的パターン(その2: 分岐処理)

プログラムが行なう仕事において,場合分けの必要がある時など, 状況に応じて異なる処理をしたい場合がある. このような処理は,状況によって処理が枝分かれすることから 分岐処理 と呼ばれる. 複数ある処理のうちの一つを選ぶことより 選択処理 と呼ばれることもある.

JavaScript では,この分岐処理のためのステートメントとして, if ステートメントswitch ステートメント が用意されている. 他に,条件演算子 (? :) というものもある. これは,論理式 ? 式 1 : 式 2 のように書かれる3項の演算子で, 論理式 の値に応じて 式 1式 2 のいずれか (論理式 が真 (true) であれば 式 1, 偽 (false) であれば 式 2) の値を全体の値とする. (参考: 条件演算子 in とほほのJavaScriptリファレンス)

通常は,プログラム全体の構造というよりも, 計算部分の中などで部分的に現われることが多い.

if ステートメント

if ステートメントは,真 (true) か偽 (false) を値として取るような式を計算し, その値によって実行する処理を変えるものである. JavaScript に限らず,多くのプログラミング言語に取り入れられている. 言語によって構文が多少異なるが,JavaScript は C言語と同様の書き方になっている.

JavaScript の if ステートメントの基本的な書き方は以下の通りである.

flow of if-else
if (論理式) trueパート else falseパート

このうち,論理式 は, 値として真理値 (true か false)を取る式で, trueパートfalseパート は各々単一のステートメントである(ブロックでもよい).

この if ステートメントが実行される時は, まず 論理式 が計算され,その結果が真 (true) であれば trueパート が,偽 (false) であれば falseパート が実行される. 右に流れ図を示す.

例)   if (age < 20) m = "飲酒不可"; else m = "飲酒可";

なお,途中で改行しても構わないので,以下のように書いても意味は変わらない.

if (論理式) trueパート
else falseパート
flow of if

else 以降の部分は省略される場合もある. この場合,書き方は以下のようになる.また,流れ図を右に示す.

if (論理式) trueパート

さらに,より複雑な形として,falseパート を if ステートメントにすることで,if ステートメントの入れ子を構成することもできる. この場合,書き方は一般的には以下のようになる.

if (論理式 1) パート 1
else if (論理式 2) パート 2

else if (論理式 n) パート n
else パート n+1

この場合の流れ図を下に示す.

flow of multi if

なお,trueパートfalseパート 等のパートは, ブロック を用いて複数のステートメントをまとめることが多い. 先に述べた通り, プログラム中の空白や改行は比較的自由に入れることができるので,見やすくするために, 例えば以下のような,インデンテーション (字下げ) を用いた書き方をすることも多い.

/* 単一のifステートメントの場合 */
if (論理式) {
    trueパートの複数ステートメント
        〜
} else {
    falseパートの複数ステートメント
        〜
}
/* ifステートメントの入れ子の場合 */
if (論理式 1)  {
    パート 1の複数ステートメント
       〜
} else if (論理式 2)  {
    パート 2の複数ステートメント
       〜
  
} else if (論理式 n)  {
    パート nの複数ステートメント
       〜
} else {
    パート n+1の複数ステートメント
       〜
}
例)(コード部分のみを示す.→ ファイルの全体と流れ図
  if (signal == "R") {
      document.writeln("<p>止まれ</p>");
  } else if (signal == "B") {
      document.writeln("<p>進め</p>");
  } else if (signal == "Y") {
      document.writeln("<p>注意</p>");
  } else {
      document.writeln("<p>故障</p>");
  }

(参考: 条件分岐(if) in とほほのJavaScriptリファレンス)

switch ステートメント

(論理式に限らない) 通常の式の値に応じて, 複数の選択肢から一つを選んで実行する形式のステートメントもある. JavaScript の switch ステートメントはそのような多重分岐のステートメントで, C言語のものと同様の書き方になっている.

JavaScript の switch ステートメントの基本的な書き方と流れ図を下に示す.

flow of switch
switch () {
case 値 1: パート 1
case 値 2: パート 2

case 値 n: パート n
default: パート n+1
}

このうちの パート 1パート n+1 は, if ステートメントとは異なり, 各々複数のステートメントを ({} でくくらずに) 並べたものである case 値:」も含めて, switch の { } 全体を一つのブロックとみなすこともできる.. また各 値 i は,本来は適当な値を取る式であるが, 一般的には 定数値 を用いることが多く, また,処理系によっては定数値以外では誤動作を起こすことがあるので, 定数値を用いる習慣にしておく方がよい.

流れ図からわかるように, を計算した値が 値 i に一致した場合, パート iパート n+1 が,この順に全て実行されることになる. これでは不便な場合が多いので,switch ステートメントを脱出する break ステートメント (break;) を各パートの末尾につけて,以下のように書くことが多い. (各パートの直前で改行して字下げしてある.右に流れ図を示す)

flow of switch+break
switch () {
case 値 1:
    パート 1
    break;
case 値 2:
    パート 2
    break;

case 値 n:
    パート n
    break;
default:
    パート n+1
}
例)(コード部分のみを示す.→ ファイルの全体と流れ図
  switch (signal) {
  case "R":
      document.writeln("<p>止まれ</p>");
      break;
  case "B":
      document.writeln("<p>進め</p>");
      break;
  case "Y":
      document.writeln("<p>注意</p>");
      break;
  default:
      document.writeln("<p>故障</p>");
  }

(参考: 条件分岐(switch) in とほほのJavaScriptリファレンス)


[タスク] 最大値プログラム (1)

概要

2つの数値 x, y を入力し,その中の最大の値を答えるプログラム.

方法

WZ Editor で,適切なプログラムを考えて作成し, マイドキュメントsc283 の下に js03-2.html という名前で保存する.

入力には prompt() を, 出力には document.writeln() を用いる.

<!DOCTYPE html>
<title>JavaScript Sample 3-2</title>
<body>
<pre><script type="text/javascript">
<!--
// 変数の宣言
var x, y, m;

// 入力
x = Number(prompt("x = ?")); // 正しい比較(数値としての比較)ができるように
y = Number(prompt("y = ?")); // 入力データを陽に数値に変換しておく

// 計算
//   ここは自分で考えよう.流れ図も考えてみよう.
//   x と y のどちらが大きいかを表す論理式を作ってifと組み合わせ,
//   大きい(小さくない)方を m に代入する.

// 出力
document.writeln(x + "" + y + " の大きいほうは");
document.writeln(m + " です.");

// -->
</script></pre>
</body>

備考

比較演算子(><など)は,数値に対しては通常の大小関係, 文字列に対しては辞書順の順序関係 辞書順の順序関係では,まず1文字目を比較して大小(文字コードの大小≒アルファベット順/50音順)を定め, 1文字目が同じ文字で大小が決められないときには2文字目,2文字目まで共通なら3文字目,というように, 最初の異なる文字で大小(文字コードの大小≒アルファベット順/50音順)を定める.を表す. したがって,11 < 100"11" > "100" は共に正しい. prompt(…) で入力されるデータは文字列なので, このプログラムでは,正しい比較(数値としての比較)ができるように, 入力データを Number(…) を使って陽に数値に変換してから比較する.

また,表示を簡略化するために,<script …> ~ </script> の外側に <pre> ~ </pre> を置いているので注意すること.(上のコードの下線部,参考

例を以下に示す.リンクをクリックすれば実行できる.(別ウィンドウで実行される)

js03-2a.html (例のコードと流れ図)

※ 余裕があれば,3つの数値 x, y, z (あるいは,4つ以上の数値)の最大値を答えるプログラムも考えてみよう.
ヒント: if ステートメントを2つ(または3つ)組み合わせればできるはず. (組み合わせ方はいくつかある)参考

[タスク] 序数プログラム

概要

1〜20 の自然数を入力し, その数に対応する序数を表わす,英語の略記表現を返すプログラム.
たとえば:

1 → 1st (first の略記)
2 → 2nd (second の略記)
3 → 3rd (third の略記)
4 → 4th (fourth の略記)

なお,(半角の)1〜20の自然数以外の入力はないものと考えてよい.

※ ヒント: 1, 2, 3 とそれ以外に分けると良い.

方法

WZ Editor で,適切なプログラムを考えて作成し, マイドキュメントsc283 の下に js03-3.html という名前で保存する.

入力には prompt() を, 出力には document.writeln() を用いる.

<!DOCTYPE html>
<title>JavaScript Sample 3-3</title>
<body>
<pre><script type="text/javascript">
<!--
// 変数の宣言
var n, ord;     // n:   入力した自然数,
                // ord: 出力する文字列(n を序数に直したもの)
// 入力
n = prompt("n = ?");    // n は文字列

// 計算
//   ここは自分で考えよう.流れ図も考えてみよう.
//   if や switch を使って,n の値に応じて場合分けし,
//   出力する文字列を ord に代入する.

// 出力
document.writeln(n + " の序数の表記は " + ord + " です.");

// -->
</script></pre>
</body>

備考

先のタスクと同様に,表示を簡略化するために,<script …> ~ </script> の外側に <pre> ~ </pre> を置いている.(参考

例を以下に示す.リンクをクリックすれば実行できる.(別ウィンドウで実行される)

js03-3a.htmljs03-3b.html
(各例のコードと流れ図)

※ 余裕があれば,(半角の)1〜20の自然数以外に対してエラーメッセージを出すような処理を考えてみよう.


[課題] 分岐処理

課題番号: 3-1,3-2
課題名: 分岐処理
ファイル名:task03-1.html, task03-2.html

概要

下記の各々のプログラムを作成すること.

  1. (課題3-1: 血液型占い (if))
    A, B, O, AB の血液型を入力し, それぞれに対応したメッセージを返すプログラムを, ifステートメントを使用して(switchステートメントを使用しないで)作成する. 返されるメッセージはどんなものでよい.適当なものを考えること.
  2. (課題3-2: 血液型占い (switch))
    同様のプログラムを, switchステートメントを使用して(ifステートメントを使用しないで)作成する.

方法

入力には prompt() を, 出力には document.writeln() を用いる.

報告について

Moodle の各々の課題ページからファイルを提出すること.ファイル名は各々指定どおり (task03-1.html, task03-2.html) とし,すべて半角文字とすること.