> **DRAFT** — under teacher review.

# VCAA Pseudocode — Write Structured English, Not Python

The Hamilton and Alexandra College · Year 12 · 2026

If you can already code in Python, pseudocode feels like a step backwards — why write `count ← 5` when `count = 5` is right there? The answer: VCAA assessors are checking whether you can express an algorithm clearly and independently of any language. Python-flavoured pseudocode loses marks. This page maps every construct you need.

---

## 🎬 What is pseudocode?

**🎯 Watch for:** the core idea — pseudocode describes *what the algorithm does* in plain, structured steps, without committing to any one programming language.

{{Video|src=https://www.youtube.com/watch?v=wKe31Xi2Ck8}}

**✍️ While you watch:** write down the one sentence that best explains *why* we bother with pseudocode instead of going straight to code.

---

## The two rules that actually matter

Before the big table, pin these two rules — they matter more than any single symbol:

1. **Be consistent.** If you open a block with `BEGIN`, close it with `END` throughout. If you use `WHILE … ENDWHILE`, don't switch to `WHILE … END_WHILE` two lines later.

2. **Write at a clear high level.** You do not need to encode every trivial detail. "Load `data.csv` into an array of records" is perfectly acceptable pseudocode when it is self-explanatory.

---

## Pseudocode ↔ Python comparison

### Program structure and basics

| Pseudocode | Python | Notes |
|---|---|---|
| `START` … `STOP` or `BEGIN` … `END` | *(not required)* | Brackets a whole program or subprogram. Pick one style and stick to it. |
| `count ← 5` | `count = 5` | Assignment uses a **left-arrow `←`**, not `=` or `:=`. |
| `// comment` or `# comment` | `# comment` | Comments work in pseudocode too — use them. |

### Selection

| Pseudocode | Python | Notes |
|---|---|---|
| `IF condition THEN`<br>&nbsp;&nbsp;`action_1`<br>`ELSE`<br>&nbsp;&nbsp;`action_2`<br>`ENDIF` | `if condition:`<br>&nbsp;&nbsp;`action_1`<br>`else:`<br>&nbsp;&nbsp;`action_2` | Must close with `ENDIF`. Chained: use `ELSE IF … THEN`. |
| `CASE OF variable`<br>&nbsp;&nbsp;`value1: action_1`<br>&nbsp;&nbsp;`value2 TO value3: action_2`<br>&nbsp;&nbsp;`OTHERWISE action_3`<br>`ENDCASE` | `if variable == value1:`<br>&nbsp;&nbsp;`action_1`<br>`elif value2 <= variable <= value3:`<br>&nbsp;&nbsp;`action_2`<br>`else:`<br>&nbsp;&nbsp;`action_3` | CASE has no direct Python equivalent; use it when there are many branches. |

### Iteration

| Pseudocode | Python | Notes |
|---|---|---|
| `WHILE condition DO`<br>&nbsp;&nbsp;`action_1`<br>`ENDWHILE` | `while condition:`<br>&nbsp;&nbsp;`action_1` | Pre-test loop. Must close with `ENDWHILE`. |
| `REPEAT`<br>&nbsp;&nbsp;`action_1`<br>`UNTIL condition` | `while True:`<br>&nbsp;&nbsp;`action_1`<br>&nbsp;&nbsp;`if condition: break` | Post-test loop — body always runs at least once. |
| `FOR count ← a TO b STEP 1`<br>&nbsp;&nbsp;`action_1`<br>`ENDFOR` | `for count in range(a, b+1, 1):`<br>&nbsp;&nbsp;`action_1` | Count-controlled. Must close with `ENDFOR`. |
| `FOREACH item IN seq`<br>&nbsp;&nbsp;`action_1`<br>`NEXT item` | `for item in seq:`<br>&nbsp;&nbsp;`action_1` | Iterates over a sequence. Close with `NEXT item`. |

### Operators

| Pseudocode | Python | Notes |
|---|---|---|
| `=` | `==` | **Equality test** in pseudocode is `=`, not `==`. |
| `<>` | `!=` | **Not-equals** in pseudocode is `<>`. Never use `!=` in pseudocode. |
| `>, <, <=, >=` | `>, <, <=, >=` | Same symbols in both. |
| `AND, OR, NOT` | `and, or, not` | Uppercase in pseudocode. |
| `+, -, *, /, ^` | `+, -, *, /, **` | Pseudocode uses `^` for exponentiation; Python uses `**`. |
| `MOD` or `%` | `%` | Integer remainder. |
| `DIV` | `//` | Integer division. |

### Subprograms (methods / functions / procedures)

| Pseudocode | Python | Notes |
|---|---|---|
| `BEGIN fun(arg1, arg2)`<br>&nbsp;&nbsp;`action_1`<br>&nbsp;&nbsp;`RETURN expression`<br>`END` | `def fun(arg1, arg2):`<br>&nbsp;&nbsp;`action_1`<br>&nbsp;&nbsp;`return expression` | `BEGIN`/`END` bracket the subprogram. `RETURN` ends a function; omit it for a procedure. |

---

## Worked example 1 — a method inside a class

This is the Level-9 OOP pseudocode skill. You are writing a method, not a standalone program, so you use `BEGIN`/`END` rather than `START`/`STOP`.

**Scenario:** a `ScoreTracker` class has a method `is_passing` that returns whether a student's average score meets a threshold.

```
BEGIN is_passing(scores, threshold)
    total ← 0
    FOREACH score IN scores
        total ← total + score
    NEXT score
    average ← total / length(scores)
    IF average >= threshold THEN
        RETURN True
    ELSE
        RETURN False
    ENDIF
END
```

Notice:
- Assignment is `←` throughout — never `=` or `==`.
- Not-equals would be `<>` if needed (e.g. `IF count <> 0 THEN`).
- `FOREACH … NEXT item` closes the loop.
- `IF … THEN … ELSE … ENDIF` closes the selection.
- Indentation is consistent.

> [!TIP]
> You do not need to write out every getter and setter in full. If a step is clear — "retrieve the current user record from the database" — that single line is enough. Save detailed pseudocode for the logic that actually matters in your design.

---

## Worked example 2 — one algorithm, any machine

Pseudocode's superpower is that it is **language- and machine-independent**. Here is a complete algorithm — the **wall-follower**, or *right-hand rule*, for escaping a maze — written once and able to run anywhere: in your head, in a software simulation, or on a Lego robot.

The rule is simple: **keep your right hand on the wall and never lift it.** In any maze whose walls are all connected, following it will always bring you to the exit.

![A maze with an entrance at the top-left and an exit at the bottom-right](VCAA%20Pseudocode%20Not%20Python/maze-right-hand-rule.png)

*Trace it yourself: start at the top-left entrance and keep your right hand on the wall. Where do you come out? (Background reading: [Wikipedia — Maze-solving algorithm](https://en.wikipedia.org/wiki/Maze-solving_algorithm).)*

The same idea in VCAA pseudocode:

```
START at the maze entrance

WHILE not at the exit DO
    IF the right-hand side is open THEN
        // an opening — follow the wall around the corner
        turn right
        step forward
    ELSE IF the way ahead is clear THEN
        // keep moving, right hand sliding along the wall
        step forward
    ELSE IF only the left is open THEN
        // wall ahead and on the right
        turn left
        step forward
    ELSE
        // dead end — walls on three sides
        turn around
    ENDIF
ENDWHILE

OUTPUT "Hooray! I escaped the maze!"
```

There is no Python and no Java here — nothing tied to one language. That is exactly what makes it pseudocode.

Now watch the *same rule* run on two completely different machines:

**🎯 Watch for:** the right-hand rule as a software simulation — the logic is identical to the pseudocode above.

{{Video|src=https://www.youtube.com/watch?v=mFOSd44_NfA}}

**🎯 Watch for:** the very same rule driving a physical Lego EV3 robot through a real maze — same algorithm, different machine.

{{Video|src=https://www.youtube.com/watch?v=AdOLnKFzBoM}}

> [!NOTE]
> **Activity — why does the right-hand rule work?** Write two or three sentences. Hint: picture a wall that is connected to the outer boundary of the maze. If you trace its edge without ever letting go, can you ever get stuck in a loop — or must you eventually walk the whole of that wall, including the stretch that contains the exit?

---

## Common mistakes

### Mistake 1 — Using `=` or `==` for assignment

> ~~`count = 5`~~ or ~~`count == 5`~~

Correct: `count ← 5`. The left-arrow shows data flowing *into* the variable. Using `=` is Python; using `==` is a comparison, not assignment.

### Mistake 2 — Using `!=` for not-equals

> ~~`IF count != 0 THEN`~~

Correct: `IF count <> 0 THEN`. The `!=` operator belongs only in Python code.

### Mistake 3 — Python-only constructs leaking in

> ~~`for item in list:`~~ or ~~`elif`~~ or ~~`print(x)`~~

Use `FOREACH item IN list … NEXT item`, `ELSE IF … THEN`, and `OUTPUT x` instead.

### Mistake 4 — Forgetting closing keywords

Every block that opens must close. Missing `ENDIF`, `ENDWHILE`, `ENDFOR`, or `ENDCASE` is a consistency error. Markers notice immediately.

### Mistake 5 — Inconsistent block keywords

> ~~Opening with `BEGIN` but closing with `STOP`~~

Pick `BEGIN`/`END` or `START`/`STOP` and use it everywhere in the same document.

---

## Check Your Understanding

1. Rewrite this Python line as valid VCAA pseudocode: `score = score + 1`

>| **Answer:** `score ← score + 1` — assignment uses `←`, not `=`.

2. A classmate writes `IF x != 0 THEN … ENDIF`. Name the mistake and write the corrected line.

>| **Answer:** `!=` is Python syntax, not pseudocode. Correct: `IF x <> 0 THEN … ENDIF`. The not-equals operator in VCAA pseudocode is always `<>`.

3. You have a `WHILE` loop and an `IF` statement nested inside it. List the two closing keywords you need and the order they must appear.

>| **Answer:** `ENDIF` closes the inner `IF` first, then `ENDWHILE` closes the outer loop. Inner blocks always close before outer blocks.

---

## Credits

- Maze diagram — [Grufo](https://commons.wikimedia.org/wiki/User:Grufo), via Wikimedia Commons, licensed GPLv3.

---

## See also

- [IPO Charts — Process Means Steps](/sd/C05/IPO%20Charts%20-%20Process%20Means%20Steps) — turn an IPO Process column into formal pseudocode
- [Object Descriptions and Class Diagrams](/sd/C05/Object%20Descriptions%20and%20Class%20Diagrams) — the methods you write pseudocode for come from here
- [C05 Resources](/sd/Resources/C05-Resources)

---

← Back to [C05 Home](/sd/C05/C05-home) · [VCE Software Development Hub](/sd/VCE%20Software%20Development%20Hub)
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9