擬似コードの例
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 ", totalThe 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"
ENDIF17 is oddMOD は割り算の余りを返します。偶数は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 ", gradeScore 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 ", totalSum of 1 to 10 is 55FOR ループは決まった回数だけ実行されます。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 i7 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 ", largestThe largest number is 27ARRAY[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 / 4Average mark: 77.5ループで配列の要素をすべて total に足し、そのあと点数の個数で割ります。/ 演算子は小数の結果を返すので、出力は77.5になります。整数の割り算にしたいときは代わりに DIV を使います。
10. 線形探索
名前のリストからDaraの位置を見つける。
DECLARE names : ARRAY[1:5] OF STRING
DECLARE i : INTEGER
DECLARE found : BOOLEAN
names[1] ← "Ana"
names[2] ← "Ben"
names[3] ← "Chen"
names[4] ← "Dara"
names[5] ← "Eli"
found ← FALSE
i ← 1
WHILE i <= 5 AND found = FALSE DO
IF names[i] = "Dara" THEN
found ← TRUE
ELSE
i ← i + 1
ENDIF
ENDWHILE
IF found = TRUE THEN
OUTPUT "Dara is at position ", i
ELSE
OUTPUT "Not found"
ENDIFDara is at position 4線形探索は、先頭から1つずつ要素を確認します。WHILE の条件は、名前が見つかったとき、またはすべての要素を確認し終えたときにループを止め、フラグ found がそのどちらだったかを記録します。並べ替えていないデータにも使えますが、長いリストでは要素1つにつき1回の比較が必要になることがあります。
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 i1
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! = 120FUNCTION は引数を受け取って処理を行い、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 vowelsLENGTH は文字列の文字数を返し、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 i1
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"
ENDIFTry 1: hunter1
Try 2: letmein
Try 3: open sesame
Access grantedREPEAT ... 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などほかの書き方では宣言を省きます。変数を宣言すると、その変数がどの型の値を持つかも読み手に伝わります。