Psuedo code Tutorial

疑似コードの読み方と書き方

公開日: 2021-01-09

  概要
目的 疑似コードの読み方と書き方
参考 - Pseudo codeTutorialand Exercises–Teacher’s Version

1. 今回のスコープ

やりたいこと

  • 疑似コードの書き方の読み方と書き方の指針のまとめ

注意点

疑似コード(Pseudo code)は、特定のプログラミング言語の知識を持たない人でもアルゴリズムが理解できるように自然言語に近い形で記述するコードです。疑似コードには厳格なルールがあるわけではなく、書く人によって様々な書き方があります。

2. Pseudo-codeとは

Pseudo-codeは、アルゴリズムを記述するための一種の構造化された文章です。これにより、実装者はプログラミング特有のSyntaxに気を取られることなく、アルゴリズムのロジックに集中することができます。同時に、疑似コードはアルゴリズムを他人に伝えるためのツールなので、疑似コードはアルゴリズムのロジック全体を記述する必要があります。

Pseudo-codeを書くにあたって気をつけるべき点

  • Pseudo-codeで使用する語彙は、implementation domainの語彙ではなく、problem domainの語彙でなければなりません。
  • アルゴリズムのロジックは、単一のループまたは決定のレベルに分解されなければなりません。

例えば「顧客名簿の中から一年間で最も購買したお客様を探す」という文章は曖昧すぎてだめです。Problem domainの共通認識として購買チャネルと購買期間が明確だったとしても、「最も購買したお客様」を探すためには一人ひとりの1年間の購買金額を知った上で、比較して、「最も購買したお客様」を決定する必要があるので、「アルゴリズムのロジックは、単一のループまたは決定のレベルに分解されなければなりません。」という要件を満たしていません。

Pseudo codeでよく見るスタイル

ロジックの流れを表現するにあたってよく見るconstructs(構造を表現するもの)を紹介します。

constructs 説明
SEQUENCE 1つのタスクが別のタスクの後に順次実行される直線的な進行のことです
WHILE 単純な条件テストが上部に付いているループのこと
IF-THEN-ELSE 2つの代替行動の間で選択を行うこと
REPEAT-UNTIL 下部に単純な条件付きテストを持つループです
CASE 式の値に基づく多元分岐(決定)です。CASEはIF-THEN-ELSEの一般化です
FOR カウントループのこと

次に、input, output, and processing operationに関係するキーワードを紹介します。

処理 Pseudo codeで使われる表現
Input READ, OBTAIN, GET
Output PRINT, DISPLAY, SHOW
Compute COMPUTE, CALCULATE, DETERMINE
Initialize SET, INIT
Add one INCREMENT, BUMP

Sequenceの例

Example

    READ height of rectangle
    READ width of rectangle
    COMPUTE area as height times width

IF-THEN-ELSEの例

一般的な構文は以下のような形となります。

IF condition THEN

    sequence 1

ELSE

    sequence 2

ENDIF

一例として、

    IF HoursWorked > NormalMax THEN

        Display overtime message

    ELSE

        Display regular time message

    ENDIF

WHILEの例

WHILE condition

    sequence

ENDWHILE

という構造を取ります。

    WHILE Population < Limit

        Compute Population as Population + Births - Deaths

    ENDWHILE

CASEの例

CASE expression OF

    condition 1 : sequence 1
    condition 2 : sequence 2
    ...
    condition n : sequence n
    OTHERS:
    default sequence

ENDCASE 
CASE  grade  OF
        A       : points = 4
        B       : points = 3
        C       : points = 2
        D       : points = 1
        F       : points = 0
ENDCASE

REPEAT-UNTILの例

REPEAT

    sequence

UNTIL condition

FORの例

FOR iteration bounds

    sequence

ENDFOR

一例として

FOR each month of the year (good)
FOR month = 1 to 12 (ok)

FOR each employee in the list (good)
FOR empno = 1 to listsize (ok)

NESTED CONSTRUCTSの例

    SET total to zero
    REPEAT

        READ Temperature
        IF Temperature > Freezing THEN
            INCREMENT total
        END IF

    UNTIL Temperature < zero
    Print total

INVOKING SUBPROCEDURESの例

    CALL AvgAge with StudentAges
    CALL Swap with CurrentItem and TargetItem
    CALL Account.debit with CheckAmount
    CALL getBalance RETURNING aBalance
    CALL SquareRoot with orbitHeight RETURNING nominalOrbit

EXCEPTION HANDLINGの例

    BEGIN
        statements
    EXCEPTION
        WHEN exception type
            statements to handle exception
        WHEN another exception type
            statements to handle exception
    END

良いPseudo Codeの例

Adequate

FOR X = 1 to 10
    FOR Y = 1 to 10
        IF gameBoard[X][Y] = 0
            Do nothing
        ELSE
            CALL theCall(X, Y) (recursive method)
            increment counter                 
        END IF
    END FOR
END FOR

Better

Set moveCount to 1
FOR each row on the board
    FOR each column on the board
        IF gameBoard position (row, column) is occupied THEN
            CALL findAdjacentTiles with row, column
            INCREMENT moveCount
        END IF
    END FOR
END FOR

Not So Good

FOR all the number at the back of the array
    SET Temp equal the addition of each number
    IF > 9 THEN
        get the remainder of the number divided by 10 to that index
        and carry the "1"
    Decrement one
Do it again for numbers before the decimal

Better

SET Carry to 0
FOR each DigitPosition in Number from least significant to most significant

    COMPUTE Total as sum of FirstNum[DigitPosition] and SecondNum[DigitPosition] and Carry  

    IF Total > 10 THEN
        SET Carry to 1
        SUBTRACT 10 from Total
    ELSE
        SET Carry to 0
    END IF

    STORE Total in Result[DigitPosition]

END LOOP  

IF Carry = 1 THEN
    RAISE Overflow exception
END IF

良いPseudo codeとソースコードの関係の例

Pseudo code

public boolean moveRobot (Robot aRobot)
{
    //IF robot has no obstacle in front THEN
        // Call Move robot
        // Add the move command to the command history
        // RETURN true
    //ELSE
        // RETURN false without moving the robot
    //END IF
} 

Java source code

public boolean moveRobot (Robot aRobot)
{
    //IF robot has no obstacle in front THEN
    if (aRobot.isFrontClear())
    {
        // Call Move robot
        aRobot.move();
        // Add the move command to the command history
        cmdHistory.add(RobotAction.MOVE);
        return true;
    }
    else // don't move the robot
    {
        return false;
    }//END IF
}

3. Pseudo-code Examples

習うより慣れろという方針で、各アルゴリズムについてC言語で記述したバージョンと擬似言語で記述した場合の2つを以下比較していきます。

Bubble sort アルゴリズム

バブルソートは、「配列の後ろから先頭に向かってスキャンしていき、もし隣り合う2つの要素の大小関係がぎゃくであったら入れ替える」という作業を繰り返して配列をソートするアルゴリズムです。

C implementation

#include<stdio.h>

void bubble_sort(int array[], int size)
{
    int i, j, tmp;

    for (i = 0; i < size; i++)
        for (j = size - 1; j > i; j--)
            if (array[j-1] > array[j])
            {
                tmp = array[j];
                array[j] = array[j-1];
                array[j-1] = tmp;
            }
}

Pseudo codeでの表現

procedure bubble_sort

  Set array: array to be sorted
  Set size : array size

  repeat
  for i = 0 to size-1 do;
    for j = size - 1 to i do;
      if array[j - 1] > array[j] then
        swap array[j - 1] and array[j]
      end if
    end do
  end do 

end procedure


Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)