Skip to main content

第3部 アルゴリズムの記述方法

第3部 アルゴリズムの記述方法

このワークの目標

アルゴリズムは、同じ処理でも複数の方法で表せます。

このワークでは、次の3つの記述方法を練習します。

  1. 日本語で書く
  2. フローチャートで書く
  3. IPAの基本情報技術者試験で使われる疑似言語で書く

さらに、書かれたアルゴリズムを上から順にたどり、変数や配列の値がどのように変化するかをトレースします。


1.同じアルゴリズムを3通りで表す

記述方法が違っても、表している処理の内容は同じです。

記述方法 特徴
日本語 特別な記号を知らなくても読める
フローチャート 処理の分岐や繰り返しを図で確認できる
疑似言語 プログラムに近い形で、処理を正確に表せる

例として、変数 a と b の差を正の値で求め、変数 c に代入するアルゴリズムを見てみよう。

1-1.日本語による記述

1.aがbより大きいかを調べる。
2.aがbより大きい場合は、aからbを引いた値をcに代入する。
3.そうでない場合は、bからaを引いた値をcに代入する。

1-2.フローチャートによる記述

aとbの差を求める選択構造aとbの差を求める選択構造

図1 aとbの差を求めるフローチャート

1-3.疑似言語による記述

if (a > b)
    c ← a - b
else
    c ← b - a
endif

1-4.3つの記述をトレースする

a が3、b が8のとき、どのように処理が進むかを確認しよう。

確認する内容 結果
条件 a > b 3 > 8 なので偽
実行する処理 c ← b - a
計算 c ← 8 - 3
最後の c 5

日本語・フローチャート・疑似言語のどれを読んでも、同じ順番で処理をたどることが大切です。


2.日本語でアルゴリズムを書く

日本語で記述するときは、「何となく意味が伝わる文章」ではなく、実行する順番が一つに決まる手順を書きます。

2-1.日本語で書くときのポイント

  • 一つの番号には、一つの処理を書く
  • 処理を実行する順番に並べる
  • 使用する変数を明確にする
  • 値を入力する場所と、結果を出力する場所を書く
  • 選択では、条件が真の場合と偽の場合を書く
  • 反復では、繰り返す条件と処理を書く
  • 「適当に」「必要なら」「いい感じに」など、判断基準が決まらない表現を避ける

曖昧な記述

点数が高かったら合格と表示する。

「高い」が何点以上なのか決まっていないため、実行する人によって結果が変わってしまいます。

明確な記述

1.変数scoreの値が60以上かを調べる。
2.60以上なら「合格」と表示する。
3.60未満なら「不合格」と表示する。

練習1 手順を正しい順番に並べよう

3つの整数 a、b、c の合計を表示する手順になるように、次の処理を並べ替えよう。

  • 合計 sum を表示する
  • sum ← a + b + c とする
  • a、b、c に整数を入力する
  • sum を0で初期化する

解答:____ → ____ → ____ → ____

練習1の模範解答を見る
  1. sum を0で初期化する
  2. a、b、c に整数を入力する
  3. sum ← a + b + c とする
  4. 合計 sum を表示する

練習2 曖昧な部分を直そう

次の記述の問題点を見つけ、誰が実行しても同じ結果になるように書き直そう。

敵が近くにいたら攻撃する。

問題点:____________________________

書き直し:___________________________

練習2の解答例を見る

「近く」が具体的にどれくらいの距離なのか決まっていません。

1.プレイヤーと敵の距離を求める。
2.距離が2.0以下なら、敵を攻撃状態にする。
3.距離が2.0より大きければ、何もしない。

3.フローチャートでアルゴリズムを書く

フローチャートは、処理を記号で表し、流れ線でつないだ図です。

3-1.主な記号を確認しよう

フローチャート記号の一覧フローチャート記号の一覧

図2 フローチャートで使用する主な記号

特に、次の違いを確認しておこう。

記号 書く内容
端子 開始、終了、または一つのまとまった処理の入口と出口
処理 計算、代入、入力、表示など、その場所で実行する処理
判断 真か偽かを判定できる条件式
定義済み処理 すでに定義されている関数やサブルーチンの呼出し
繰り返し記号 対になる入口と出口で、繰り返す範囲を示す
流れ線 処理が進む順番を示す

定義済み処理の記号は、単に複数の処理を大きく囲むための記号ではありません。別に定義されている関数やサブルーチンを呼び出す場所に使います。

3-2.流れ線の読み方

  • 基本の流れは、上から下へ進む
  • 判断記号には、真または偽になる条件式を書く
  • 判断から分かれる流れには、Yes と No を付ける
  • 分岐した流れは、必要に応じて後で一つに合流する
  • 逆方向へ戻る場所や、向きが分かりにくい場所には矢印を付ける
  • 記号の途中や、意味のない位置から流れ線を出さない

3-3.複雑なフローチャートを読んでみよう

外出先を決めるフローチャート外出先を決めるフローチャート

図3 選択と反復を組み合わせたフローチャート

この図には、順次・選択・反復が組み合わされています。START から流れ線をたどり、条件に応じて進む道を選びます。


練習3 フローチャートをトレースしよう

図3について、次の条件のときに通る処理を順番に書こう。同じ処理を繰り返す場合は、そのことも書こう。

(1)天気は晴れで、スケボーを2回した後に疲れた

START
  ↓
________________________________
  ↓
END

(2)天気は晴れではなく、財布に800円入っている

START
  ↓
________________________________
  ↓
END

(3)天気は晴れではなく、財布に1500円入っている。メダルを2回投入した後、メダルがなくなった

START
  ↓
________________________________
  ↓
END
練習3の模範解答を見る

(1)

START
→ お布団から出る
→ 「天気は晴れ?」Yes
→ 公園へ行く
→ 「疲れた?」No
→ スケボーする
→ 「疲れた?」No
→ スケボーする
→ 「疲れた?」Yes
→ おうちに帰る
→ END

(2)

START
→ お布団から出る
→ 「天気は晴れ?」No
→ ゲーセンに行く
→ 「財布に1000円以上ある?」No
→ おうちに帰る
→ END

(3)

START
→ お布団から出る
→ 「天気は晴れ?」No
→ ゲーセンに行く
→ 「財布に1000円以上ある?」Yes
→ メダルを購入(500円)
→ 「メダルは残ってる?」Yes
→ メダルゲームに投入
→ 「メダルは残ってる?」Yes
→ メダルゲームに投入
→ 「メダルは残ってる?」No
→ おうちに帰る
→ END

練習4 使う記号を選ぼう

次の内容を書くときに使う記号を答えよう。

書く内容 使用する記号
アルゴリズムの開始 ______
x ← x + 1 ______
x ≧ 60 ______
定義済みの関数 Update() の呼出し ______
処理が進む順番 ______
練習4の模範解答を見る
書く内容 使用する記号
アルゴリズムの開始 端子
x ← x + 1 処理
x ≧ 60 判断
定義済みの関数 Update() の呼出し 定義済み処理
処理が進む順番 流れ線

4.IPA疑似言語でアルゴリズムを書く

疑似言語は、特定のプログラミング言語に依存せず、プログラムに近い形でアルゴリズムを表す記述方法です。

このワークでは、IPAの基本情報技術者試験で使われる記述形式に合わせます。ただし、配列の要素番号は授業に合わせて 0から始めます。

4-1.基本の表記

内容 疑似言語の例
変数の宣言 整数型: count
配列の宣言 整数型の配列: data
初期化 整数型: sum ← 0
代入 sum ← sum + value
配列要素の参照 data[i]
関数・手続の呼出し Update()
コメント /* 合計を求める */ または // 合計を求める

← は代入です。右側の式を先に計算し、その結果を左側の変数へ入れます。

x ← x + 1

これは、「現在の x に1を足し、その結果を新しい x の値にする」という意味です。

4-2.主な演算子

種類 演算子
加減 +、-
乗除 ×、÷、mod
比較 <、≦、=、≠、≧、>
論理 and、or、not

mod は、割り算の余りを求める演算子です。

7 mod 3 = 1

4-3.選択

if (条件式)
    条件式が真のときの処理
elseif (別の条件式)
    別の条件式が真のときの処理
else
    どの条件式も偽のときの処理
endif

上から条件を調べ、最初に真になった条件に対応する処理だけを実行します。不要な elseif や else は省略できます。

4-4.前判定の反復

while (条件式)
    繰り返す処理
endwhile

条件式が真の間、処理を繰り返します。最初から条件式が偽なら、繰り返す処理は一度も実行されません。

4-5.回数を指定する反復

for (i を 0 から 4 まで 1 ずつ増やす)
    繰り返す処理
endfor

この例では、i は0、1、2、3、4の順に変化し、処理を5回実行します。

4-6.後判定の反復

do
    繰り返す処理
while (条件式)

先に処理を実行してから条件を調べるため、処理は必ず一度は実行されます。

4-7.関数と手続

○整数型: max2(整数型: a, 整数型: b)
    if (a > b)
        return a
    else
        return b
    endif

先頭の ○ は、関数または手続の宣言を表します。この例では、2つの整数のうち大きい値を返します。

C言語のソースコードではありません。波括弧 { } や行末のセミコロンは使わず、if は endif、while は endwhile、for は endfor で閉じます。


練習5 疑似言語の穴を埋めよう

変数 score が60以上なら「合格」、60未満なら「不合格」と出力する疑似言語を完成させよう。

if (__________)
    "合格"を出力する
____
    "不合格"を出力する
____
練習5の模範解答を見る
if (score ≧ 60)
    "合格"を出力する
else
    "不合格"を出力する
endif

5.疑似言語をトレースする

トレースでは、プログラムを頭の中だけで動かさず、変数の値を表に書きます。

5-1.変数を使った反復のトレース

次の疑似言語を実行したとき、最後に出力される値を答えよう。

整数型: i ← 1
整数型: total ← 0

while (i ≦ 4)
    total ← total + i
    i ← i + 1
endwhile

totalを出力する
回 処理前の i 条件 i ≦ 4 処理前の total 処理後の total
1 __ __ __ __
2 __ __ __ __
3 __ __ __ __
4 __ __ __ __
終了判定 __ __ __ -

出力:______

5-1の模範解答を見る
回 処理前の i 条件 i ≦ 4 処理前の total 処理後の total
1 1 真 0 1
2 2 真 1 3
3 3 真 3 6
4 4 真 6 10
終了判定 5 偽 10 -

出力は 10 です。


5-2.配列を使ったアルゴリズムのトレース

次の疑似言語は、配列の中にある偶数だけを合計します。

整数型の配列: data ← {5, 2, 8, 4}
整数型: i
整数型: sum ← 0

for (i を 0 から 3 まで 1 ずつ増やす)
    if (data[i] mod 2 = 0)
        sum ← sum + data[i]
    endif
endfor

sumを出力する
i data[i] 偶数か 処理前の sum 処理後の sum
0 __ __ __ __
1 __ __ __ __
2 __ __ __ __
3 __ __ __ __

出力:______

5-2の模範解答を見る
i data[i] 偶数か 処理前の sum 処理後の sum
0 5 偽 0 0
1 2 真 0 2
2 8 真 2 10
3 4 真 10 14

出力は 14 です。


6.3つの記述方法を変換する

練習6 日本語から疑似言語へ変換しよう

次の日本語によるアルゴリズムを、疑似言語に直そう。

1.変数xが0より大きいかを調べる。
2.0より大きい場合は「正」と出力する。
3.そうでない場合に、xが0と等しければ「0」と出力する。
4.どちらでもない場合は「負」と出力する。
if (__________)
    __________
elseif (__________)
    __________
else
    __________
endif
練習6の模範解答を見る
if (x > 0)
    "正"を出力する
elseif (x = 0)
    "0"を出力する
else
    "負"を出力する
endif

練習7 日本語からフローチャートへ変換しよう

次の処理を、紙にフローチャートで書こう。

1.変数scoreの値が60以上かを調べる。
2.60以上なら「合格」と表示する。
3.60未満なら「不合格」と表示する。
4.表示後に処理を終了する。

使用する記号:端子、判断、処理、流れ線

練習7の構成を確認する
  1. 端子に「開始」と書く
  2. 判断に score ≧ 60 と書く
  3. Yes 側を「合格と表示する」へつなぐ
  4. No 側を「不合格と表示する」へつなぐ
  5. 2つの流れを合流させる
  6. 端子の「終了」へつなぐ

scoreが60以上かを判定するフローチャートscoreが60以上かを判定するフローチャート

図4 scoreが60以上かを判定するフローチャート


7.総合練習

配列 data の最大値を求めるアルゴリズムを完成させよう。配列の内容は {4, 9, 2, 7, 5} とします。

7-1.日本語の穴埋め

1.maxにdata[__]の値を代入する。
2.iを__から__まで1ずつ増やしながら、3と4を繰り返す。
3.data[i]が__より大きいかを調べる。
4.大きい場合は、__の値をmaxに代入する。
5.maxを出力する。

7-2.疑似言語の穴埋め

整数型の配列: data ← {4, 9, 2, 7, 5}
整数型: i
整数型: max ← data[__]

for (i を __ から __ まで 1 ずつ増やす)
    if (__________)
        max ← ______
    endif
endfor

maxを出力する

7-3.トレース表

i data[i] 比較前の max 条件の結果 比較後の max
1 __ __ __ __
2 __ __ __ __
3 __ __ __ __
4 __ __ __ __

出力:______

7-4.フローチャート

7-2の疑似言語と同じ処理になるように、紙にフローチャートを書こう。

総合練習の模範解答を見る

日本語

1.maxにdata[0]の値を代入する。
2.iを1から4まで1ずつ増やしながら、3と4を繰り返す。
3.data[i]がmaxより大きいかを調べる。
4.大きい場合は、data[i]の値をmaxに代入する。
5.maxを出力する。

疑似言語

整数型の配列: data ← {4, 9, 2, 7, 5}
整数型: i
整数型: max ← data[0]

for (i を 1 から 4 まで 1 ずつ増やす)
    if (data[i] > max)
        max ← data[i]
    endif
endfor

maxを出力する

トレース表

i data[i] 比較前の max 条件の結果 比較後の max
1 9 4 真 9
2 2 9 偽 9
3 7 9 偽 9
4 5 9 偽 9

出力は 9 です。

フローチャートの構成

  1. max ← data[0] を実行する
  2. i を1から4まで変化させる反復を作る
  3. 反復の中で data[i] > max を判断する
  4. Yes の場合だけ max ← data[i] を実行する
  5. 反復終了後に max を出力して終了する

配列の最大値を求めるフローチャート配列の最大値を求めるフローチャート

図5 配列の最大値を求めるフローチャート


8.まとめ

  • 日本語では、処理の順番と条件を曖昧にせず書く
  • フローチャートでは、記号と流れ線をたどって処理を読む
  • 判断から分かれる流れには、Yes と No を付ける
  • 定義済み処理は、すでに定義された関数やサブルーチンの呼出しに使う
  • 疑似言語では、代入を ← で表す
  • if、while、for は、それぞれ対応する終了語で閉じる
  • トレースするときは、変数や配列の値を表に書く
  • 記述方法が変わっても、表しているアルゴリズムは同じである

参考