コンテンツへスキップ

アルゴリズム設計と問題解決

IGCSE コンピュータ科学 · トピック 7

查看幻灯片 練習する
このトピックのビデオレッスン 動画ページを開く
9:17

プログラム開発ライフサイクル

スマホのすべてのアプリは、このような人が書いたものです。しかし彼らはコードを書くことから始めました。最初の行の前に、問題は研究され、解決策…

英語ナレーション・英語+中文字幕 burning-in

シラバス
受験者は以下的能力を備えているべきである: メモおよびガイドライン
1 プログラム開発ライフサイクルを理解する(以下に限定:分析、設計、コーディング、テスト) • 各段階を特定し、各段階で以下のタスクを実行することを含む: – 分析:抽象化、問題の分解、問題と要件の特定 – 設計:分解、構造図、フローチャート、擬似コード – コーディング:プログラムコードの記述と反復テスト – テスト:テストデータの活用によるプログラムコードのテスト
2 (a) すべてのコンピュータシステムはサブシステムで構成され、さらにサブシステムからなることを理解する (b) 問題を構成要素に分解する方法を理解する • 以下を含む: – 入力 – プロセス – 出力 – ストレージ
(c) 問題に対する解決策の設計と構築に異なる手法を用いる • 以下を含む: – 構造図 – フローチャート – 擬似コード
3 指定されたアルゴリズムの目的を説明する • 以下を含む: – アルゴリズムの目的を述べる – アルゴリズムに関わるプロセスを説明する
4 標準的な解決方法を理解する • 以下に限定: – 線形探索 – バブルソート – 総和計算 – カウント – 最大値、最小値、平均値の検索
5 (a) 入力データに対して検証チェックを行う必要性と、検証チェックの異なる種類を理解する • 以下を含む: – レンジチェック – 長さチェック – タイプチェック – 存在チェック – フォーマットチェック – チェックディジット
(b) 入力データに対して確認チェックを行う必要性と、確認チェックの異なる種類を理解する • 以下を含む: – 視覚チェック – 二重入力チェック
6 適切なテストデータを提案して適用する • 以下に限定: – 通常 – 異常 – 極端 – 境界 • 極端データは許容される最大値/最小値である • 境界データは許容される最大値/最小値と、対応する最小値/最大値の拒否値である
7 アルゴリズムのドライランを記録するためにトレース表を完成させる • アルゴリズムの各ステップにおいて、以下を含む: – 変数 – 出力 – ユーザープロンプト
8 指定されたアルゴリズムの誤りを特定し、修正方法を提案する
9 指定された問題やシナリオに対して、アルゴリズムを記述・修正する(擬似コード、プログラムコード、フローチャートを使用する) • アルゴリズムを記述する際は正確性が求められる。例:x > y は許容されるが、x is greater than y は許容されない • フローチャートの記号については4節を参照 • 擬似コードについては4節を参照

出典: Cambridge International シラバス

7.1

プログラム開発ライフサイクル

プログラム開発ライフサイクルとは、プログラムを作成するために用いられる一連の工程のことである。4つの工程がある。

コンピュータでコードを入力しているプログラマー
ソフトウェアはプログラマによって書かれ、彼らは開発ライフサイクルに従う
工程 行うこと
分析 問題を研究し、必要なものを決定する
設計 プログラムがどのように動作するかを計画する
コーディング プログラムコードを書き、進めながらテストする
テスト 完成したプログラムにテストデータを与えて実行し、エラーを見つける
一列に並ぶ4つの工程—分析、設計、コーディング、テスト—テストから設計へ戻る矢印付き
プログラム開発の4つの工程;テストは設計を修正・改善するためにフィードバックされる
プロセスボックスと判断ダイヤモンドを含むプログラムのフローチャート
プログラムのフローチャートは、設計工程におけるプログラムの手順と判断を示す

分析

分析では問題を理解する。2つの重要なスキルが役立つ:

  • 抽象化 — 重要な詳細のみを残し、他は無視する;
  • 分解 — 大きな問題をより小さく扱いやすい部分に分割する。

設計

設計では、しばしば分解を用いて解決策を計画する。構造図(システムを小さなボックスに分割するチャート)において、サブシステムとして各部品を表すことができる。

コーディングとテスト

コーディングではプログラムコードを書く。反復テストを用いる—構築しながら小さな部分を繰り返しテストする。テストでは、テストデータを用いて全体プログラムを実行し、正しく動作するかを確認する。

English 日本語
program development life cycle/ˈprəʊɡræm dɪˈveləpmənt laɪf ˈsaɪkl/ プログラム開発ライフサイクル
analysis/əˈnæləsɪs/ 分析
design/dɪˈzaɪn/ 設計
coding/ˈkəʊdɪŋ/ コーディング
testing/ˈtestɪŋ/ テスト
abstraction/əbˈstrækʃn/ 抽象化
decomposition/ˌdiːkɒmpəˈzɪʃn/ 分解
sub-systems/sʌb ˈsɪstəmz/ サブシステム
structure diagram/ˈstrʌktʃə ˈdaɪəɡræm/ 構造図
iterative testing/ˈɪtərətɪv ˈtestɪŋ/ 反復テスト
test data/test ˈdeɪtə/ テストデータ
flowchart/ˈfləʊtʃɑːt/ フローチャート
7.2

設計ツール

解決策を計画する方法には3つの主要な方法がある。

  • 構造図 — システムの部品とそれらがどう組み合わさるかを示す;
  • フローチャート — ボックスと矢印を用いて順序立てて手順を示す図;
  • 擬似コード — コードのような単純な英語で記述された手順(本物の言語ではない)。
数1からnまでの加算のためのフローチャート。開始/終了、入出力、プロセス、判断の記号が含まれ、各形状の名前を示す凡例あり
標準記号(開始/終了、入出力、プロセス、判断)を使用した和アルゴリズムのフローチャート
7.3

アルゴリズム

バブルソート、パスごとに

アルゴリズムとは、正しい順序で並んだ問題解決の一連の手順である。すべてのアルゴリズムは3つの部分に分割できる:

  • 入力 — 入力されるデータ;
  • 処理 — データに対する作業;
  • 出力 — 出力される結果。

これを「入力、処理、出力への分解」と呼ぶ。例えば「3つの得点の平均を求める」場合:入力は3つの得点、処理は足して3で割り算すること、出力は平均である。

3つのボックス—INPUT(3つの得点)、PROCESS(足して3で割る)、OUTPUT(平均)—矢印で接続
すべてのアルゴリズムは入力、処理、出力に分解される—ここでは3つの得点の平均を求める例
English 日本語
input/ˈɪnpʊt/ 入力
processing/ˈprəʊsesɪŋ/ 処理
output/ˈaʊtpʊt/ 出力
bubble sort/ˈbʌbl sɔːt/ バブルソート
totalling/ˈtəʊtəlɪŋ/ 累加
counting/ˈkaʊntɪŋ/ 数
7.4

検証と確認

データが入力された際、ミスを減らすために内容を確認する。

検証(Validation)は、データが合理的であり、ルールに従っているかを確認します。データが真実かどうかをチェックすることはできませんが、許容範囲内であるかどうかは確認できます。

検証チェック 確認すること
範囲チェック(range check) 値が最小と最大许容値の間に含まれているか
長さチェック(length check) 文字数が許容されているか(例:パスワード ≥ 8)
型チェック(type check) データの型が正しいか(例:数字であり、文字列ではないか)
存在チェック(presence check) 何らかの入力が実際にされているか(空白になっていないか)
フォーマットチェック(format check) データが正しいパターンで入力されているか(例:日付が dd/mm/yyyy の形式か)
チェックディジット 数値を入力する際にエラーを検出するための追加の計算済み数字

照合(Verification)は、データが正確にコピーまたは入力されたか(入力中に誤りがなかったか)を確認します。2つの方法があります:

  • 視覚的照合(visual check) — 人が入力したデータを元データと比較する;
  • 二重入力(double entry) — データを2回入力し、両方のコピーを比較する。
English 日本語
validation/ˌvælɪˈdeɪʃn/ 検証
range check/reɪndʒ tʃek/ 範囲チェック
length check/leŋθ tʃek/ 長さチェック
type check/taɪp tʃek/ 型チェック
presence check/ˈprezəns tʃek/ 存在性チェック
format check/ˈfɔːmæt tʃek/ 形式チェック
check digit/tʃek ˈdɪdʒɪt/ チェックディジット
verification/ˌverɪfɪˈkeɪʃn/ 確認
visual check/ˈvɪʒuːəl tʃek/ 視覚チェック
double entry/ˈdʌbl ˈentri/ 二重入力
7.5

トレース表

トレース表は、アルゴリズムを実行する際、ステップごとに各変数の値を記録するものです。これにより以下が行えます:

count, total, outputのカラムを持つトレース表
トレース表はプログラム実行中に各変数の値を記録します
  • アルゴリズムが正しく動作しているかを確認する;
  • 与えられたデータを使ってアルゴリズムを追跡することで、アルゴリズムが何を処理するかを把握する。

例:入力値5对于这个アルゴリズムをトレースしてください。

INPUT N
Total ← 0
FOR I ← 1 TO N
    Total ← Total + I
NEXT I
OUTPUT Total
i total OUTPUT
1 1
2 3
3 6
4 10
5 15 15

このトレースから、アルゴリズムは1からnまでの和を計算していることがわかります。入力が5の場合、出力は15です。

** worked example.** このアルゴリズムをトレースして、出力を与えてください。

X ← 20
Count ← 0
WHILE X > 1
    X ← DIV(X, 2)
    Count ← Count + 1
ENDWHILE
OUTPUT Count

DIV は除算の整数部分のみを返します。各パスにつき1行ずつ書きます:x は10(カウント1)、次に5(カウント2)、次に2(カウント3)、次に1(カウント4)となります。ここで x > 1 が false となるためループは停止し、出力は 4 となります。これらの得点を確保するための習慣として、パスの後に条件をチェックするのではなく、各パスの前に条件をチェックすること、そしてすべてのパスに対して新しい行を書くことが挙げられます。値を頭の中で記憶しようとすると、トレースが間違える原因になります。

探索

トレース表

ループをステップごとに実行し、各反復に対して1行ずつ トレース表 を埋めてください。

English 日本語
pseudocode/ˈsuːdəʊkəʊd/ 擬似コード
algorithm/ˈælɡərɪθəm/ アルゴリズム
trace table/treɪs ˈteɪbl/ トレース表
7.6

テストデータ

テストデータとは、プログラムを検証するために使用するデータのことです。知っておくべき4つのタイプがあります。

タイプ 意味 例(年齢0–120が許容される場合)
通常(normal) 受理されるべき合理的なデータ 25
異常(abnormal) 拒否されるべき誤ったデータ -4 や "cat"
極端値(extreme) 依然として許容される最大値および最小値 0 と 120
境界値(boundary) 制限値の両側にある値(片方は許容、片方は非許容) 120 と 121
English 日本語
normal/ˈnɔːml/ 通常データ
abnormal/əbˈnɔːml/ 異常データ
extreme/ekˈstriːm/ 極端データ
boundary/ˈbaʊndəri/ 境界値
7.7

標準的な解法

これらの一般的なアルゴリズムを知っている必要があります。

線形探索

線形探索 は、先頭から開始して各項目をターゲットと比較する。値が見つかるかリストの終わりまで達するまで停止する。リストはソートされている必要はない。以下の例では位置1から4を使用する。

DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, SearchValue : INTEGER
DECLARE Found : BOOLEAN
List[1] ← 8
List[2] ← 3
List[3] ← 5
List[4] ← 1
INPUT SearchValue
Found ← FALSE
I ← 1
WHILE I <= 4 AND NOT Found
    IF List[I] = SearchValue
      THEN
        Found ← TRUE
    ENDIF
    I ← I + 1
ENDWHILE
OUTPUT Found

解答例の比較。 5 を検索する場合、8、3、5 を順に比較します:3回の比較を行い、Found が TRUE になります。4番目の項目はチェックされません。9 を検索する場合、4つの値すべてを比較します;Found は FALSE のままです。配列の外側にある位置 5 を読み込もうとする前に停止してください。

左から右へスキャンされている8つの数値のリストで、5を探しています;最初の4つは一致せず、5番目で発見されました
別の例:線形探索は、見つかって値が値を始点から順に各項目をチェックします

バブルソート

バブルソートはリストを整列させます。隣り合う値を比較し、左の値が大きい場合に交換します。通常、一度のパスでは不十分です。この完全なバージョンは、あるパスで交換が行われないまでパスを繰り返します。

DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, Temp : INTEGER
DECLARE Swapped : BOOLEAN
List[1] ← 8
List[2] ← 3
List[3] ← 5
List[4] ← 1
REPEAT
    Swapped ← FALSE
    FOR I ← 1 TO 3
        IF List[I] > List[I + 1]
          THEN
            Temp ← List[I]
            List[I] ← List[I + 1]
            List[I + 1] ← Temp
            Swapped ← TRUE
        ENDIF
    NEXT I
UNTIL NOT Swapped
OUTPUT List[1], ", ", List[2], ", ", List[3], ", ", List[4]

解答例のパス。 8, 3, 5, 1 から始めます。1回目のパスでリストは 3, 8, 5, 1 に、次は 3, 5, 8, 1 に、さらに 3, 5, 1, 8 になります。これにより最大値が最後になりますが、残りは未ソートのままです。2回目のパスは 3, 1, 5, 8 で終わり、3回目のパスは 1, 3, 5, 8 で終わります。4回目のパスでは交换が行われず、このバージョンで停止できることが確認されます。各パスの開始時に Swapped を FALSE にリセットし、交换发生时に TRUE に設定します。

最初のペアである5と2が順序が逆であり、2と5に交换されている様子を示すリストで、各ペアについて繰り返すよう注釈が付いています
別の例での1回の比較:バブルソートは順序が逆になっている隣り合う値を交換し、パスを通じて続けます

合計とカウント

総和計算は必要な値をすべて合計に加算します:Total ← Total + Value。カウントは必要なアイテムごとに 1 を加算します:Count ← Count + 1。値を処理する前に両方をゼロに初期化します。

** worked example.** 4つの試行入力は −20, 4, 50, 6 です。値が −20 より大きく、かつ 50 より小さい場合にのみ受け入れます。この例では4つの試行を処理しますが、4つの受け入れ値ではありません。

DECLARE I, Count : INTEGER
DECLARE Value, Total : REAL
Total ← 0
Count ← 0
FOR I ← 1 TO 4
    INPUT Value
    IF Value > -20 AND Value < 50
      THEN
        Total ← Total + Value
        Count ← Count + 1
    ENDIF
NEXT I
IF Count > 0
  THEN
    OUTPUT Total, ", ", Count, ", ", Total / Count
  ELSE
    OUTPUT "No accepted values"
ENDIF
試行値 試行後の合計 試行後のカウント
−20 0 0
4 4 1
50 4 1
6 10 2

厳密な境界値は −20 と 50 を除外します。両方の更新は受け入れテスト内にあるため、除外された試行は合計やカウントを変えません。受け入れ値の平均は以下の通りです:

$$\text{Average}=\frac{\text{Total}}{\text{Count}}=\frac{10}{2}=5$$

4で割らないでください:追加されたのは2つの値だけです。どの値も受け入れられない場合、カウントはゼロであり、平均を計算することはできません;代わりにゼロ除算を避けるメッセージを出力します。

** 固定数の受け入れ値への転送。** タスクが 50 個の受け入れ値を求める場合、4の試行ではなく、固定の FOR ループを WHILE Count < 50 に置き、ENDWHILE で閉じます。内部には同じ入力と受け入れテストを保持します。除外された入力は Count を変化させないため、次の入力が求められます。完了時、Count は 50 ですが、試行数はそれ以上である可能性があります。合計を出力し、平均を Total / Count として計算します。

最大値、最小値、平均値

最大値は最大の値、最小値は最小の値です。平均は合計を値の数で割ったものです。非空リストの場合、最初の要素から両方を初期化します。残りの各要素について、新しい値が大きい場合は最大値を更新し、小さい場合は最小値を更新します。

** worked example.** リストは −8, −3, −12, −5 です。最大値をゼロから始めると失敗します:リストの要素はいずれもゼロより大きくないため、アルゴリズムはリストに含まれない数を出力します。−8 から始めれば、データが正であるという仮定なしに機能します。

直前に考慮した値 これまでの最大値 これまでの最小値
−8 (初期化) −8 −8
−3 −3 −8
−12 −3 −12
−5 −3 −12
DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, Maximum, Minimum, Total : INTEGER
List[1] ← -8
List[2] ← -3
List[3] ← -12
List[4] ← -5
Maximum ← List[1]
Minimum ← List[1]
Total ← List[1]
FOR I ← 2 TO 4
    IF List[I] > Maximum
      THEN
        Maximum ← List[I]
    ENDIF
    IF List[I] < Minimum
      THEN
        Minimum ← List[I]
    ENDIF
    Total ← Total + List[I]
NEXT I
OUTPUT Maximum, ", ", Minimum, ", ", Total / 4

最大値は −3、最小値は −12 です。平均はすべての4つの値を使用します:

$$\text{Total}=\sum \text{Value}=(-8)+(-3)+(-12)+(-5)=-28$$
$$\text{Average}=\frac{\text{Total}}{\text{Count}}=\frac{-28}{4}=-7$$

平均は最小値と最大値の間にあります;これは計算が正しいことの証明ではなく、有用なチェックです。最初の要素から初期化するには、非空リストが必要です。その要素を読む前に、空のリストは別扱いしてください。

English 日本語
linear search/ˈlɪnɪə sɜːtʃ/ 線形探索
maximum/ˈmæksɪməm/ 最大値
minimum/ˈmɪnɪməm/ 最小値
average/ˈævrɪdʒ/ 平均値
7.8

試験対策

  • 4つのライフサイクル段階:分析 → 設計 → コーディング → テスト。抽象化は重要な要素のみを残し、分解は問題を部分に分割します。
  • **検証(Validation)**はデータが合理的か(範囲、長さ、型、存在、フォーマットのチェック)を確認し、**照合(verification)**は正確にコピーされたか(視覚的照合または二重入力)を確認します。
  • 4つのテストデータタイプを覚えます:通常(受け入れられる)、異常(拒否される)、極端(最大/最小でも許容される値)、境界(制限値の両側)。
  • トレース表(各ステップにおける各変数の値)は、アルゴリズムが何を行うかを示す。
  • 標準アルゴリズムを知っています:線形探索(各項目を順に確認)とバブルソート(交換が必要なくなるまで隣り合うペアを交换)。

このトピックのインタラクティブ授業

一歩ずつ進め、即時チェック付きの問題で学習します。

過去問

IGCSE コンピュータ科学 の他のトピック

ログインまたはアカウント作成

IGCSE, A-Level & AP