Computer Science 9618/21 May/June 2025: question paper and mark scheme
Cambridge AS & A Level Computer Science (9618), Paper 2 Fundamental Problem-solving and Programming Skills, May/June 2025. Read both free below, or download them. Done the paper? Get it marked by AI against this mark scheme.
A program is being developed to help the manager of a shop control the stock.
(a) An identifier table has been used during the design stage.
Complete the identifier table:
Example value Explanation Variable name Data type a category of stock
"Fruit" that is sold in the shop when an item was
20/02/2025 sold
12.67 the cost of an item
to indicate if an item is
TRUE in stock
[4]
(b) A module Sales() is part of the stock control program.
The table contains pseudocode extracts from the module Sales()
Each extract may include all or part of:
• assignment
• selection
• iteration (repetition).
Complete the table by placing one or more ticks (✓) in each row:
Pseudocode extract Assignment Selection Iteration
Result CalculateTotal()
WHILE IsClosed
REPEAT
INPUT Value
UNTIL Sales[4] > Value
IF Sales[Current] <= 150 THEN
Discount TRUE
ENDIF
CASE OF Option
[5]
(c) Decomposition has been used to design the program to help the shop manager control the stock.
Describe decomposition.
…… [3]
Mark scheme
1(a) 4
Example Explanation Variable name Data type
value
"Fruit" a category of stock that is Category STRING
sold in the shop
20/02/2025 when an item was sold DateSold DATE
12.67 the cost of an item (Item)Cost/Price REAL
TRUE to indicate if an item is in (Item)InStock BOOLEAN
stock
Mark as follows:
1 mark per row for each variable name and data type
1(b) 5
Pseudocode extract Assignment Selection Iteration
Result ← CalculateTotal() ✓
WHILE IsClosed ✓
REPEAT ✓ ✓
INPUT Value
UNTIL Sales[4] > Value
IF Sales[Current] <= 150 THEN ✓ ✓
Discount ← TRUE
ENDIF
CASE OF Option ✓
Mark as follows:
One mark for each correct row
1(c) Decomposition involves: 3
MP1 Breaking down a problem into sub problems
MP2 In order to explain / understand the process/task of how a (stock control)
can be managed in more detail
MP3 Leading to the concept of the program designed as a series of modules
/ procedures / functions
// or by example of different stock control modules
MP4 Makes the program easier to test / debug
Max 3
Max 2 if no mention of stock control
A program is being developed to calculate the pay of employees working for a company.
A function CalculateBonus() calculates bonus pay based on the value of sales.
Bonus pay is calculated as shown in the table.
Value of sales Bonus pay
(in dollars) (in dollars) below 2000 0
between 2000 and 4000 inclusive 10 above 4000 100
A flowchart for the function CalculateBonus() has been designed.
START
Set BonusPay to 0
INPUT
ValueOfSales
Is
NO
ValueOfSales
> 4000 ?
YES
Is
NO
Set BonusPay to 10 ValueOfSales
>= 2000 ?
YES
Set BonusPay to 100
RETURN BonusPay
END
(a) The flowchart contains logic errors.
One logic error is that BonusPay will not be set to 10 although the ValueOfSales input is between 2000 and 4000 inclusive.
(i) Explain why this error occurs.
…… [1]
(ii) Explain how this error could be corrected.
…… [1]
(b) There are different ways to reduce the risk of errors when developing the new program, such as the use of constants.
(i) State a value that could be replaced by a constant in the function CalculateBonus()
…… [1]
(ii) Explain how the use of constants helps to reduce the risk of programming errors.
…… [2]
(iii) One other way that can reduce the risk of errors when writing the program is the use of library routines.
Explain how library routines can reduce the risk of programming errors.
…… [1]
(c) All the logic errors have been corrected, and the program has been coded.
Identify and describe two other types of error that the program could contain.
Type of error ……
Description ……
Type of error ……
Description ……
[4]
Mark scheme
2(a)(i) MP1 The two decision boxes are in the wrong order // 1
The first decision symbol is wrong
MP2 The first decision should check for values greater than or equal to 2000
Max 1
2(a)(ii) Explaining how to correct the flowchart. 1
MP1 Swap around the two decision boxes
MP2 The first decision box should check for values greater than or equal to 2000
and the second decision box should check for values above 4000
Max 1
2(b)(i) 2000 / 4000 / 10 / 100 1
2(b)(ii) MP1 The value cannot be changed // avoids being different in two places 2
MP2 Makes the program easier to understand
MP3 Avoids repeatedly writing the same value throughout the program
MP4 A change to the value requires a change in only one statement
Max 2
2(b)(iii) MP1 (The code is) tried and tested so error free 1
MP2 Provides functionality / code that the programmer may find difficult to code
themselves
Max 1
2(c) MP1 Syntax (error) 4
MP2 Rules of programming language // the language grammar was not followed
MP3 Run-time (error)
MP4 The program performs an illegal operation
Mark as follows:
One mark for naming each type of error and one mark for the description
A student has been asked to create a simple guessing game program. This program will generate a random integer value between 1 and 100. It will then repeatedly prompt the user to input an integer value until they input the randomly generated value.
The student has written a structured English description:
step 1 – randomly generate an integer value between 1 and 100 inclusive step 2 – prompt the user to input an integer value step 3 – output an appropriate message if the value input was too high; then repeat from step 2 step 4 – output an appropriate message if the value input was too low; then repeat from step 2 step 5 – output an appropriate message if the value input was the same value that was randomly
generated; then end the program.
Write a pseudocode algorithm from this structured English description.
Assume no input validation is needed.
…… [8]
Mark scheme
3 Example solution: 8
DECLARE GeneratedValue : INTEGER
DECLARE Guess : INTEGER
GeneratedValue ← INT(RAND(100)) + 1
REPEAT
OUTPUT "Enter a guess between 1 and 100: "
INPUT Guess
IF Guess > GeneratedValue THEN
OUTPUT "Guess was too high"
ENDIF
IF Guess < GeneratedValue THEN
OUTPUT "Guess was too low"
ENDIF
UNTIL Guess = GeneratedValue
OUTPUT "Number guessed correctly"
MP1 Declare all variables used
MP2 Uses RAND() function
MP3 Uses INT() function
MP4 Correct syntax for random number between 1 and 100
MP5 Conditional loop until correct number guessed
MP6 Prompt and input a guess in a loop
MP7 Check if guess is too high in a loop
MP8 Check if guess is too low in a loop
MP9 Output appropriate message (x2) when the number is not guessed correctly
(in the loop) and output correct guess message
Max 8
Study the algorithm:
DECLARE Chars : ARRAY[1:4] OF CHAR
DECLARE I, J : INTEGER
DECLARE Key : CHAR
I 2
Chars[1] 'D'
Chars[2] 'T'
Chars[3] 'H'
Chars[4] 'R'
WHILE I <= 4 //Outer loop
Key Chars[I]
J I – 1
WHILE J >= 0 AND Chars[J] > Key //Inner loop
Chars[J + 1] Chars[J]
J J – 1
ENDWHILE
Chars[J + 1] Key
I I + 1
ENDWHILE
(a) The outer loop structure used in the algorithm is not the most appropriate one to use.
State the type of loop structure that would be the most appropriate to use and justify why it is the most appropriate.
Loop structure ……
Justification ……
[2]
(b) Complete the trace table by dry running the algorithm.
The first row has been completed.
Chars
I Key J Chars[J]
[1] [2] [3] [4]
2 'D' 'T' 'H' 'R'
[6]
Mark scheme
4(a) MP1 Count-controlled 2
MP2 The number of iterations required is known
4(b) I Key J Chars[J]
Chars 6
[1] [2] [3] [4]
2 'D' 'T' 'H' 'R'
'T' 1 'D'
MP1
3
'H' 2 'T' 'T'
MP2
1 'D'
MP3 'H'
4
'R' 3 'T' 'T'
2 'H' (‘R’)
MP4
'R'
5
MP5
Chars array final values
MP6
'D' 'H' 'R' 'T'
Mark as follows:
MP1, MP2, MP3, MP4, MP5
1 mark per enclosure
Stacks and queues are both abstract data types.
A stack uses a top-of-stack pointer to indicate the location of the last item added to the stack.
A queue uses two pointers:
• a front pointer to indicate the location of the next item to be removed from the queue
• a rear pointer to indicate the location of the next item to be added to the queue.
A queue can be used to reverse the items stored on a stack.
For example, if a stack contains six items:
Initial state of the stack:
top-of-stack pointer item 6 item 5 item 4 item 3 item 2
item 1
Final state of the stack when the items have been reversed:
top-of-stack pointer item 1 item 2 item 3 item 4 item 5
item 6
Describe how the queue could be used to reverse the items that are currently stored on the stack.
Your description must include how the pointers are used in both the stack and queue.
Assume:
• The stack initially contains an unknown number of items.
• The queue can store all the items currently stored on the stack.
• The queue is initially empty.
…… [7]
Mark scheme
5 MP1 Pop an item off the stack 7
MP2 Update Stack pointer
MP3 Add it to the queue
MP4 Update Rear pointer
MP5 Repeat until the stack is empty
MP6 Remove an item from the queue
MP7 Update Front pointer
MP8 Push it onto the stack
MP9 Update the Stack pointer
MP10 Repeat until the queue is empty
Max 7
A program monitors the speed of vehicles as they move around a large building site.
Each vehicle contains a sensor which reads an integer value that represents the speed of the vehicle. The value is expected to be in the range 0 to 60 inclusive.
The sensors cannot read values less than 0.
A program module has been written to validate the values read by the sensors.
(a) A test plan is needed to fully test the module.
Complete the table. The first line has been completed for you.
Assume the sensors generate only integer values.
Type of test data Test data value Expected outcome
normal 36 data item is accepted
[4]
(b) Each sensor used in the system has a unique sensor ID number in the range 1 to 50.
The program that is used to monitor the speed of each vehicle reads each sensor value every second and stores this value along with the sensor’s unique ID into a global 2D array
Reading
The global array Reading has been declared as follows:
DECLARE Reading : ARRAY[1:2000, 1:2] OF INTEGER
The array contains 4000 elements organised as 2000 rows and 2 columns.
Column 1 contains the sensor value, and column 2 contains the sensor ID.
When 2000 sensor readings have been taken, the array is full and the system stops taking any more sensor readings until the array has been processed.
A procedure Sort() is needed to sort the array into ascending order of sensor value using
an efficient bubble sort algorithm.
Write efficient pseudocode for the procedure Sort()
…… [8]
Mark scheme
6(a) 4
Type of test data Test data value Expected outcome
normal 36 data item is accepted
boundary/ 0/1 data item is accepted
extreme/
normal
boundary/ 59 / 60 data item is accepted
extreme/
normal
abnormal >= 61 data item is rejected
normal 15 data item is accepted
Mark as follows:
1 mark for each row with (Type and Value and Outcome)
6(b) Example solution: 8
PROCEDURE Sort()
DECLARE Temp, J, Boundary : INTEGER
DECLARE NoSwaps : BOOLEAN
Boundary ← 1999
REPEAT
NoSwaps ← TRUE
FOR J ← 1 TO Boundary
IF Reading[J, 1] > Reading[J+1, 1] THEN
//first swap sensor value
Temp ← Reading[J, 1]
Reading[J, 1] ← Reading[J+1, 1]
Reading[J+1, 1] ← Temp
//now swap corresponding ID
Temp ← Reading[J, 2]
Reading[J, 2] ← Reading[J+1, 2]
Reading[J+1, 2] ← Temp
NoSwaps ← FALSE
ENDIF
NEXT J
Boundary ← Boundary - 1
UNTIL NoSwaps = TRUE
ENDPROCEDURE
MP1 Procedure heading and ending
MP2 Conditional loop correctly formed including Boolean flag declared and
initialised
MP3 An inner loop
MP4 Correct range 1 to 1999 for inner loop
MP5 Comparison of element J with J+1 in a loop
MP6 Declare Temp variable and swap elements in a loop
MP7 Both SensorID and Speed values were swapped in a loop
MP8 'No-Swap' mechanism:
• Conditional outer loop including flag reset
• Flag set in inner loop to indicate swap
MP9 Reducing Boundary in the outer loop
A program is being developed to implement a customer loyalty scheme for a coffee shop.
The programmer has decided that the following data items need to be stored for each customer:
Data item Description customer ID a unique six-digit string an integer value that is increased by one for every cup of coffee the points customer orders
When a customer visits the shop and orders coffee, the scheme operates as follows:
• The total number of points is increased by the number of coffees ordered.
• If just one cup of coffee is ordered and the number of points goes above 10, then:
◦ the cup of coffee they have just ordered is given to them free of charge
◦ the number of points is reduced by 11.
• If the order is for multiple coffees and the number of points goes above 10, then:
◦ they get one coffee free of charge for every 11 points
◦ the number of points is reduced by 11 for each free coffee.
For example, the:
• customer currently has 9 points
• customer orders 16 cups of coffee
• total number of points now becomes 25
• customer gets 2 free coffees and now has 3 points left.
The programmer has defined a program module that is called every time a customer places an order:
Module Description
• called with two integer parameters:
◦ the number of coffees ordered
CustomerOrder() ◦ the current number of points
• output a suitable message giving the number of free coffees
• return a value for the new points total.
(a) Write pseudocode for module CustomerOrder()
…… [6]
(b) A text file Loyalty.txt will be used to store the data items for the loyalty scheme. The data items for each customer will be stored on a separate line of the text file where each data item is separated by a comma:
<CustomerID>,<Points>
The contents of the text file Loyalty.txt will always be stored in ascending order by customer ID.
When the data items are read from or written to the text file Loyalty.txt, they may need to be converted to the appropriate data type.
Each customer has a unique customer ID starting at "100001" with this value increasing by one each time a new customer joins the loyalty scheme.
When a customer joins the loyalty scheme, they are assigned the next customer ID and value of points is set to 0.
For example, if the loyalty scheme has 204 customers and a new customer joins the loyalty scheme, the following line is added to the text file Loyalty.txt:
"100205,0"
You can assume that the number of customers in the loyalty scheme will never be more than
9000.
The programmer has defined a program module as follows:
Module Description
• called with an integer parameter representing the number of new customers to be added to the loyalty scheme
AddNewCustomers()
• adds a new line, containing the required information, to the text file Loyalty.txt for each customer added to the loyalty scheme
• outputs each new customer ID added to the loyalty scheme
(i) Write pseudocode for module AddNewCustomers()
Assume that there is at least one customer already in the loyalty scheme.
…… [8]
(ii) The requirements for AddNewCustomers() are changed. There may be no existing customers in the loyalty scheme.
Explain the changes that will need to be made to the module AddNewCustomers()
…… [4]
Mark scheme
7(a) Example solution: 6
FUNCTION CustomerOrder(Number, Points : INTEGER) RETURNS
INTEGER
DECLARE NewPoints, NumberFree: INTEGER
NewPoints ← Points + Number
NumberFree ← 0
WHILE NewPoints >= 11 AND Number > 0
NumberFree ← NumberFree + 1
NewPoints ← NewPoints -11
Number ← Number - 1
END WHILE
OUTPUT "Number of free coffees is: ", NumberFree
RETURN NewPoints
ENDFUNCTION
MP1 Function header and ending and parameters and return type
MP2 Number of coffees ordered added to points
MP3 Correct calculation of one free coffee
MP4 Attempted calculation of multiple free coffees and reduced NewPoints
MP5 Output number of free drinks with suitable message
MP6 Return of NewPoints
7(b)(i) Example solution: 8
PROCEDURE AddNewCustomers(NumToAdd : INTEGER)
DECLARE CustomerID : INTEGER
DECLARE Count : INTEGER
DECLARE Line : STRING
DECLARE NewLine : STRING
OPENFILE "Loyalty.txt" FOR READ
WHILE NOT EOF("Loyalty.txt")
READFILE "Loyalty.txt", Line
ENDWHILE
CLOSEFILE "Loyalty.txt"
OPENFILE "Loyalty.txt" FOR APPEND
CustomerID ← STR_TO_NUM((LEFT(Line, 6))
FOR Count ← 1 TO NumToAdd
CustomerID ← CustomerID + 1
OUTPUT CustomerID
NewLine ← NUM_TO_STR(CustomerID) & ",0"
WRITEFILE "Loyalty.txt", NewLine
NEXT Count
CLOSEFILE "Loyalty.txt"
ENDPROCEDURE
Mark as follows:
MP1 All variables used are declared using the correct type including a string and
an integer
MP2 Open file in read mode and close (before opening in append mode)
MP3 Conditional loop with EOF("Loyalty.txt")
MP4 Read Line from file // Count number of records in the file
MP5 Open the file in append mode and subsequently close
MP6 Extract CustomerID from Line and convert to integer // use count from
MP4 to generate last CustomerID stored
MP7 A (count controlled) loop for the number of customers to add
MP8 Increment CustomerID and output the new CustomerID in loop
MP9 Create string for new CustomerID and write to file in loop
Max 8
7(b)(ii) MP1 Check if the text file loyalty.txt exists / is empty 4
MP2 If file does not exist it must be created (using write mode)
MP3 If the file has to be created / is empty then set the first CustomerID to
100001
MP4 Write "100001,0" to loyalty.txt (using write mode)
MP5 For all but the first customer (to be added to the empty file) use the existing
code / module
Max 4
Checked your answers against these? Let AI mark the whole paper, on your own working.
Examiners follow the generic marking principles at the front of the scheme, then each question's points: method (M), accuracy (A) and independent (B) marks, error carried forward where the scheme allows it, and positive marking, so you're credited for what you got right.
Check your answers against it
Done this paper? Upload your script and CIE Buddy's AI marker marks it question by question against this exact scheme, puts the ticks on your own working and says what each lost mark needed.
Where can I find the 9618/21 May/June 2025 mark scheme?+
On this page, free: the mark scheme for AS & A Level Computer Science 9618/21, May/June 2025 (9618_s25_ms_21), and the question paper (9618_s25_qp_21), to read or download, with each question's marking points written out underneath.
How many marks is 9618/21 out of?+
Computer Science 9618/21 for May/June 2025 is out of 75 marks, with 2 hours to answer it.
Can I get my 9618/21 answers marked?+
Yes. Upload your answers to 9618/21/M/J/25 as a PDF or photos, and CIE Buddy marks every question against this paper's official mark scheme, using Cambridge's marking rules. You get your score, each lost mark explained on your own script, and the topics to revise. It's a guide, not an official Cambridge grade.