Menu
Coddy logo textTech

擬似コードの例

Cambridge IGCSEとA-Levelの擬似コードで書いた15の例を、最初の OUTPUT からバブルソートまで順に解説します。どの例にも出力が付いていて、下のエディタで実行できます。

例の読み方

擬似コードは、実際のプログラミング言語の厳密な規則を使わずに、プログラムの手順を構造化した英語で表したものです。以下の例はすべて、IGCSEとA-Levelの試験で使われるCambridgeの書き方に従っています。変数には DECLARE、代入には ←、表示には OUTPUT を使い、ブロックは ENDIF、NEXT、ENDWHILE で閉じます。

各例では、問題、擬似コード、その出力、動きの説明を示します。「エディタで実行する」を押すと、その例がページ上部のエディタに読み込まれ、1行ずつ進めながら変数の変化を確認できます。構文が初めてなら、擬似コードエディタにすべての構文をクリックで挿入できるライブラリがあります。

1. Hello, World

画面にメッセージを表示する。

擬似コード
OUTPUT "Hello, World!"
出力
Hello, World!

OUTPUT はそのあとに続くものを表示し、文字列はダブルクォートで囲みます。この1行だけで完全なプログラムです。擬似コードにはmain関数もインポートも必要ありません。

2. 2つの数を足す

2つの整数を記憶し、足して合計を表示する。

擬似コード
DECLARE a : INTEGER
DECLARE b : INTEGER
DECLARE total : INTEGER
a ← 12
b ← 30
total ← a + b
OUTPUT "The total is ", total
出力
The total is 42

変数は使う前に、名前と型を付けて宣言します。矢印 ← は値を記憶するので、total ← a + b は「totalはa足すbになる」と読みます。OUTPUT の中のカンマは、文字列と値を1行につなげます。

3. 偶数か奇数か

ある数が偶数か奇数かを判定する。

擬似コード
DECLARE n : INTEGER
n ← 17
IF n MOD 2 = 0 THEN
    OUTPUT n, " is even"
ELSE
    OUTPUT n, " is odd"
ENDIF
出力
17 is odd

MOD は割り算の余りを返します。偶数は2で割っても余りが出ないので、n MOD 2 = 0 が判定の条件になります。IF は2つの分岐のどちらかを選び、ENDIF でブロックを閉じます。擬似コードでは1つの = は2つの値を比較するもので、代入には使いません。

4. テストの点数を評価する

100点満点の点数を評価に変える:80点以上はA、60〜79点はB、60点未満はC。

擬似コード
DECLARE score : INTEGER
DECLARE grade : CHAR
score ← 74
IF score >= 80 THEN
    grade ← 'A'
ELSE
    IF score >= 60 THEN
        grade ← 'B'
    ELSE
        grade ← 'C'
    ENDIF
ENDIF
OUTPUT "Score ", score, " gets grade ", grade
出力
Score 74 gets grade B

判定は高い境界から順に行うので、74点は最初の条件で外れ、2つ目の条件を満たします。ある IF の ELSE の中に別の IF を入れるのが、Cambridgeの擬似コードでのelse-ifの書き方です。CHAR はシングルクォートで囲んだ1文字を保持します。

5. 1から10までの合計

1から10までのすべての整数を足し合わせる。

擬似コード
DECLARE total : INTEGER
DECLARE i : INTEGER
total ← 0
FOR i ← 1 TO 10
    total ← total + i
NEXT i
OUTPUT "Sum of 1 to 10 is ", total
出力
Sum of 1 to 10 is 55

FOR ループは決まった回数だけ実行されます。i は1、2、3と順に10までの値をとり、NEXT i がループ本体の終わりを示します。合計は0から始まり、1周ごとに増えていきます。答えの55は、公式 n(n + 1) / 2 と一致します。

6. 九九の段を表示する

7の段の最初の5行を表示する。

擬似コード
DECLARE i : INTEGER
FOR i ← 1 TO 5
    OUTPUT "7 x ", i, " = ", 7 * i
NEXT i
出力
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35

ループカウンタの i を計算の中で使っているので、1周ごとに違う行が表示されます。OUTPUT はカンマで区切って、複数の文字列と複数の値をつなげられます。

7. WHILEループでカウントダウン

5から1までカウントダウンし、最後にメッセージを表示する。

擬似コード
DECLARE count : INTEGER
count ← 5
WHILE count > 0 DO
    OUTPUT count
    count ← count - 1
ENDWHILE
OUTPUT "Liftoff!"
出力
5
4
3
2
1
Liftoff!

WHILE ループは毎回の実行前に条件を確認し、条件が偽になった時点で止まります。ここでの条件は count > 0 で、本体は毎回 count を1ずつ減らします。減らす行を書き忘れると、ループは終わりません。何回繰り返すか前もってわからないときは WHILE を使います。

8. 配列の中の最大値を見つける

6つの数のリストから最大の値を見つける。

擬似コード
DECLARE nums : ARRAY[1:6] OF INTEGER
DECLARE i : INTEGER
DECLARE largest : INTEGER
nums[1] ← 14
nums[2] ← 3
nums[3] ← 27
nums[4] ← 9
nums[5] ← 21
nums[6] ← 6
largest ← nums[1]
FOR i ← 2 TO 6
    IF nums[i] > largest THEN
        largest ← nums[i]
    ENDIF
NEXT i
OUTPUT "The largest number is ", largest
出力
The largest number is 27

ARRAY[1:6] は1〜6の番号が付いた6つの要素を宣言します。Cambridgeの配列はふつう1から始まるからです。プログラムは最初の要素を最大と仮定し、ほかの要素を1つずつ比べて、大きいほうを残します。配列を1回たどり終えると、largest に答えが入っています。

9. 平均を計算する

4つのテストの点数の平均を求める。

擬似コード
DECLARE marks : ARRAY[1:4] OF INTEGER
DECLARE i : INTEGER
DECLARE total : INTEGER
marks[1] ← 70
marks[2] ← 85
marks[3] ← 64
marks[4] ← 91
total ← 0
FOR i ← 1 TO 4
    total ← total + marks[i]
NEXT i
OUTPUT "Average mark: ", total / 4
出力
Average mark: 77.5

ループで配列の要素をすべて total に足し、そのあと点数の個数で割ります。/ 演算子は小数の結果を返すので、出力は77.5になります。整数の割り算にしたいときは代わりに DIV を使います。

11. バブルソート

5つの数を昇順に並べ替える。

擬似コード
DECLARE nums : ARRAY[1:5] OF INTEGER
DECLARE i : INTEGER
DECLARE j : INTEGER
DECLARE temp : INTEGER
nums[1] ← 5
nums[2] ← 1
nums[3] ← 4
nums[4] ← 2
nums[5] ← 8
FOR i ← 1 TO 4
    FOR j ← 1 TO 5 - i
        IF nums[j] > nums[j + 1] THEN
            temp ← nums[j]
            nums[j] ← nums[j + 1]
            nums[j + 1] ← temp
        ENDIF
    NEXT j
NEXT i
FOR i ← 1 TO 5
    OUTPUT nums[i]
NEXT i
出力
1
2
4
5
8

バブルソートは隣り合う2つの要素を比べ、順番が逆なら入れ替えます。外側のループが1周するたびに、残っている中で最大の値が末尾へ移動するので、内側のループは毎回1つ手前で止められます。入れ替えには3つ目の変数 temp が必要で、一方の値をコピーしている間、もう一方の値をそこに保持します。

このアルゴリズムをアニメーションで見る

12. 関数で階乗を求める

nの階乗(n!)を返す関数を書き、それを使って5!を計算する。

擬似コード
FUNCTION Factorial(n : INTEGER) RETURNS INTEGER
    DECLARE result : INTEGER
    DECLARE i : INTEGER
    result ← 1
    FOR i ← 2 TO n
        result ← result * i
    NEXT i
    RETURN result
ENDFUNCTION

OUTPUT "5! = ", Factorial(5)
出力
5! = 120

FUNCTION は引数を受け取って処理を行い、RETURN で値を返します。ヘッダーには返す値の型を書きます。関数の中で宣言した変数は、関数の実行中だけ存在します。5!は 5 × 4 × 3 × 2 × 1 で、120です。

13. 単語の母音を数える

PSEUDOCODEという単語に母音がいくつ含まれるかを数える。

擬似コード
DECLARE word : STRING
DECLARE letter : CHAR
DECLARE vowels : INTEGER
DECLARE i : INTEGER
word ← "PSEUDOCODE"
vowels ← 0
FOR i ← 1 TO LENGTH(word)
    letter ← SUBSTRING(word, i, 1)
    IF letter = 'A' OR letter = 'E' OR letter = 'I' OR letter = 'O' OR letter = 'U' THEN
        vowels ← vowels + 1
    ENDIF
NEXT i
OUTPUT word, " has ", vowels, " vowels"
出力
PSEUDOCODE has 5 vowels

LENGTH は文字列の文字数を返し、SUBSTRING(word, i, 1) は位置 i から1文字を取り出します。ループはすべての文字を順に調べ、A、E、I、O、Uのどれかであればカウンタに1を足します。

14. FizzBuzz

1から15までの数を表示する。ただし3の倍数ではFizz、5の倍数ではBuzz、両方の倍数ではFizzBuzzと表示する。

擬似コード
DECLARE i : INTEGER
FOR i ← 1 TO 15
    IF i MOD 15 = 0 THEN
        OUTPUT "FizzBuzz"
    ELSE
        IF i MOD 3 = 0 THEN
            OUTPUT "Fizz"
        ELSE
            IF i MOD 5 = 0 THEN
                OUTPUT "Buzz"
            ELSE
                OUTPUT i
            ENDIF
        ENDIF
    ENDIF
NEXT i
出力
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

判定の順番が重要です。15は3の倍数でも5の倍数でもあるので、15の判定を最初に置く必要があります。そうしないと、プログラムはFizzと表示してFizzBuzzにたどり着きません。まさにこの種の考え方を試すので、面接の準備運動として定番の問題です。

15. REPEAT UNTILでパスワードを試す

最大3つのパスワードを順に試し、どれかが正しければアクセスを許可する。

擬似コード
DECLARE attempts : ARRAY[1:3] OF STRING
DECLARE tries : INTEGER
DECLARE guess : STRING
attempts[1] ← "hunter1"
attempts[2] ← "letmein"
attempts[3] ← "open sesame"
tries ← 0
REPEAT
    tries ← tries + 1
    guess ← attempts[tries]
    OUTPUT "Try ", tries, ": ", guess
UNTIL guess = "open sesame" OR tries = 3
IF guess = "open sesame" THEN
    OUTPUT "Access granted"
ELSE
    OUTPUT "Locked out"
ENDIF
出力
Try 1: hunter1
Try 2: letmein
Try 3: open sesame
Access granted

REPEAT ... UNTIL ループは最後に条件を確認するので、本体は必ず1回は実行されます。パスワードが一致するか、3回目を試した時点で止まります。入力しなくても例が動くよう候補は配列から取っていますが、試験の解答ではふつう INPUT で1つずつ読み込みます。

擬似コードの例:よくある質問

擬似コードの例を教えてください。

短い例として、テストに合格したかを判定するものがあります:IF score >= 50 THEN OUTPUT "Pass" ELSE OUTPUT "Fail" ENDIF。ほとんど英語のように読めますが決まった規則に従うので、1行ずつPythonやJavaなどの言語に書き換えられます。このページの15のプログラムは、1行だけのものから探索とソートまでそろっています。

擬似コードはどうやって書くの?

まずプログラムが何をすべきかを決め、少数のキーワードで手順を順番に書きます。変数には DECLARE、代入には ←、判断には IF、繰り返しには FOR か WHILE、結果には OUTPUT を使います。ブロックの本体はインデントし、対応する終了キーワードで閉じ、1行には1つの処理だけを書きます。

擬似コードはどの試験でも同じ?

違います。Cambridge(IGCSEとA-Level)は DECLARE と矢印 ← を使い、AQAは宣言なしで ← を使います。OCRのExam Reference LanguageはPythonに似ていて、Edexcelは SET ... TO と書きます。ここの例はCambridgeの書き方です。擬似コードエディタでは4つの書き方を切り替えられます。

擬似コードは実行できますか?

はい、このページで実行できます。擬似コードは本物のプログラミング言語ではないので公式のコンパイラはありませんが、ここのエディタはCambridgeの擬似コードをブラウザで実行し、出力を表示して1行ずつ進められます。どの例でも下にある「エディタで実行する」を押してください。

擬似コードとフローチャートの違いは?

どちらもコードを書く前にアルゴリズムを表すものです。フローチャートは手順を箱と矢印で描くので、判断が少ない短い処理に向いています。擬似コードは構造化したテキストで書くので、長いプログラムにも対応でき、実際のコードにより直接書き換えられます。

擬似コードでは変数を宣言しないといけない?

Cambridgeの擬似コードでは必要です。採点基準では、変数を使う前に DECLARE name : TYPE と書くことが求められます。AQAなどほかの書き方では宣言を省きます。変数を宣言すると、その変数がどの型の値を持つかも読み手に伝わります。

Coddyのプログラミング言語のイラスト

Coddyで擬似コードから本物のコードへ

始める