Exam Strategy: Paper 2 is about reading code, not just writing it

The Chief Examiner's report highlights that Paper 2 tests your ability to read, analyse and refine code. You will be asked to fix errors, rearrange code, fill in blanks, complete trace tables, and design full programs. Practice each skill below.

0 / 46 marks Total: 0 / 46

Question 1: Error Correction

8 marks

The following Python program is intended to convert a temperature from Celsius to Fahrenheit. However, it contains 4 errors (a mix of syntax and logic errors). For each error, identify the line and type the corrected version of that line.

temperature_converter.py
 1celsius = float(input("Enter temperature in Celsius: "))
 2fahrenheit = (celsius * 9/5) + 32
 3print("Result: " + farenheit + " degrees F")
 4if celsius > 30
 5    print("That is hot!")
 6elif celsius > 20:
 7    print("That is warm.")
 8elif celsius = 20:
 9    print("That is exactly 20 degrees.")
10else:
11    print("That is cool.")

Identify and correct each error:

Type the corrected version of line 3:

Type the corrected version of line 3 (fix both issues on this line):

Type the corrected version of line 4:

Type the corrected version of line 8:

Mark Scheme - Question 1
  • Error 1 - Misspelled variable: farenheit should be fahrenheit [1 mark] for identifying, [1 mark] for correction
  • Error 2 - Missing str(): Need str(fahrenheit) to concatenate with string [1 mark] for identifying, [1 mark] for correction
  • Error 3 - Missing colon: if celsius > 30: requires a colon [1 mark] for identifying, [1 mark] for correction
  • Error 4 - Wrong operator: = should be == for comparison [1 mark] for identifying, [1 mark] for correction

Corrected line 3: print("Result: " + str(fahrenheit) + " degrees F")

Corrected line 4: if celsius > 30:

Corrected line 8: elif celsius == 20:

Question 2: Code Rearrangement

6 marks

The following lines of code should form a working password checker program. The program asks the user for a password, gives them 3 attempts, and tells them whether they got it right or ran out of tries. Drag the lines into the correct order.

Available Code Blocks:

Build Your Program (drag lines here):

Mark Scheme - Question 2

Correct order (1 mark per correctly placed line, up to 6 marks):

  • password = "secret123" [1 mark]
  • attempts = 0 [1 mark]
  • while attempts < 3: [1 mark]
  •     guess = input("Enter password: ") [1 mark]
  •     if guess == password: [1 mark]
  •         print("Access granted!") [0 marks - free, part of structure]
  •     attempts = attempts + 1 [1 mark]
  • print("No attempts remaining.") [0 marks - free, closing statement]

Question 3: Complete the Code

6 marks

The program below is a shopping list manager. It allows the user to keep adding items until they type "done", then displays the complete list. Some lines are incomplete. Select the correct Python statement from each dropdown to complete the program.

shopping_list.py
shopping_list = []
item = ""


    item = input("Enter an item (or 'done' to finish): ")
    if item != "done":
        


    print("Your shopping list:")
    for i in range(len(shopping_list)):
        print(str(i + 1) + ". " + shopping_list[i])
else:
    print("Your shopping list is empty.")
Mark Scheme - Question 3
  • Blank 1: while item != "done": — a while loop is needed because we do not know how many items the user will enter [2 marks]
  • Blank 2: shopping_list.append(item) — append adds a single item to the end of a list. insert requires an index. add is for sets. extend is for adding multiple items. [2 marks]
  • Blank 3: if len(shopping_list) > 0: — checks if the list has any items before displaying [2 marks]

Question 4: Trace Table

8 marks

The program below calculates the factorial of 5 (i.e. 5! = 5 × 4 × 3 × 2 × 1 = 120). Complete the trace table by filling in the values of each variable after each iteration of the loop.

factorial.py
1number = 5
2result = 1
3counter = 1
4while counter <= number:
5    result = result * counter
6    counter = counter + 1
7print(result)

Complete the trace table (fill in the blank cells):

Iteration counter (start) counter <= number result (after line 5) counter (after line 6)
1 1 True
2 2 True
3 3 True
4 4 True
5 5 True
6 6 Loop ends — print(result) outputs 120
Mark Scheme - Question 4

1 mark per correct cell (allowing for follow-through errors):

  • Iteration 1: result = 1 (1*1), counter = 2
  • Iteration 2: result = 2 (1*2), counter = 3
  • Iteration 3: result = 6 (2*3), counter = 4
  • Iteration 4: result = 24 (6*4), counter = 5
  • Iteration 5: result = 120 (24*5), counter = 6
  • Iteration 6: condition = False (6 <= 5 is False, so loop ends)

Note: Accept "false" (case insensitive) for the final condition. The printed output is 120.

Question 5: Code Improvement

6 marks

The program below works correctly but is poorly written. A good programmer would refactor it to be more readable, efficient, and maintainable. Read the code and answer the questions below.

area_calculator.py
 1x = float(input("Enter rectangle length: "))
 2y = float(input("Enter rectangle width: "))
 3a = x * y
 4print("Rectangle area: " + str(a))
 5
 6x2 = float(input("Enter triangle base: "))
 7y2 = float(input("Enter triangle height: "))
 8a2 = x2 * y2 * 0.5
 9print("Triangle area: " + str(a2))
10
11x3 = float(input("Enter circle radius: "))
12a3 = x3 * x3 * 3.14159
13print("Circle area: " + str(a3))

Identify 3 improvements that should be made:

Improvement 1: How should the repetitive structure be improved?

Correct: B. Using functions avoids repeating the input-calculate-output pattern. Each shape's area calculation can be its own function, making the code easier to test, reuse, and modify.

Improvement 2: What should be done about the value 3.14159 on line 12?

Correct: C. Magic numbers (unnamed numeric values) should be defined as named constants. This makes the code more readable, and if the value ever needs to change, you only update it in one place. Using import math and math.pi is even better.

Improvement 3: What is wrong with the variable names?

Correct: B. Variable names should be meaningful and describe what data they hold. x, y, a tell us nothing about the purpose. Names like length, width, and rectangle_area make the code self-documenting and much easier for another programmer to understand.
Mark Scheme - Question 5
  • Improvement 1 (Functions): Use subroutines/functions to avoid repetitive code [1 mark] identification + [1 mark] explanation of why
  • Improvement 2 (Constants): Use named constants or import math.pi instead of magic numbers [1 mark] identification + [1 mark] explanation of why
  • Improvement 3 (Variable names): Use meaningful, descriptive variable names [1 mark] identification + [1 mark] explanation of why

Question 6: Program Design

12 marks

Scenario: A teacher wants a program that stores student names and their test scores. The program should allow the teacher to enter names and scores for the class, then calculate the average score and find the student with the highest score.

Your program must:

  • Ask how many students are in the class
  • Use a loop to collect each student's name and score
  • Store the data in appropriate data structures (lists)
  • Calculate and display the average score
  • Find and display the student with the highest score
  • Include appropriate input validation (score must be 0–100)

Write your solution in the editor below. Comment scaffolding has been provided to guide your structure.

student_scores.py
# Student Score Tracker
# --------------------

# Step 1: Set up empty lists for names and scores
names = []
scores = []

# Step 2: Ask how many students are in the class
num_students = int(input("How many students? "))

# Step 3: Use a loop to collect each student's name and score
for i in range(num_students):
    name = input("Enter student name: ")
    # Add input validation for score (must be 0-100)
    score = int(input("Enter score for " + name + ": "))
    while score < 0 or score > 100:
        print("Score must be between 0 and 100.")
        score = int(input("Enter score for " + name + ": "))
    # Store the data in the lists
    names.append(name)
    scores.append(score)

# Step 4: Calculate the average score
total = 0
for s in scores:
    total = total + s
average = total / num_students
print("Average score: " + str(average))

# Step 5: Find the student with the highest score
highest = scores[0]
best_student = names[0]
for i in range(len(scores)):
    if scores[i] > highest:
        highest = scores[i]
        best_student = names[i]
print("Highest score: " + best_student + " with " + str(highest))
(click "Run Code" to see output)
Mark Scheme - Question 6 (12 marks)

Award marks as follows:

  • Creating two lists (names and scores) [1 mark]
  • Asking for the number of students [1 mark]
  • Using a loop to collect names and scores [2 marks]
  • Appending name and score to the correct lists [1 mark]
  • Input validation: checking score is between 0 and 100 [2 marks]
  • Calculating the total and average of scores [2 marks]
  • Finding the highest score and corresponding student name [2 marks]
  • Displaying results with appropriate messages [1 mark]

Note: Accept alternative valid approaches (e.g. using sum(), max(), dictionaries, etc.). The scaffolded code above is a model answer.

Exam Tip: Program Design Questions

In the real exam, program design questions carry the most marks. Plan your answer before you write. Use comments to show the examiner your thinking even if your code has small errors. Marks are awarded for structure and logic, not just syntax.