Question 120 marks
Question
A program stores positive integers in a circular queue. The queue is stored as a global 1D array of 20 integers with the identifier Queue. Each index is initialised with the data –1 The global variable HeadPointer, initialised to –1, points to the first element in the queue. The global variable TailPointer, initialised to –1, points to the last element in the queue. The global variable NumberItems, initialised to 0, stores the number of items in the queue. (a) Write program code to declare and initialise Queue, HeadPointer, TailPointer and NumberItems Save your program as Question1_J25. Copy and paste the program code into part 1(a) in the evidence document. [2] (b) The function Enqueue(): • takes an integer as a parameter • checks if the queue is full • returns FALSE if the queue is full • stores the parameter in the next position in the queue and returns TRUE if the queue is not full • updates the appropriate pointers and NumberItems Write program code for Enqueue() Save your program. Copy and paste the program code into part 1(b) in the evidence document. [6] (c) The main program: • attempts to store each of the integers 1 to 25 (inclusive) in the queue in ascending numerical order using Enqueue() • outputs the integer that was passed to Enqueue() and "Successful" if it was stored in the queue, or "Unsuccessful" if it was not stored in the queue. For example: if the integer 5 is passed to Enqueue() and is stored in the queue, the output will be: "5 Successful" if the integer 23 is passed to Enqueue() and is not stored in the queue, the output will be: "23 Unsuccessful" Write program code for the main program. Save your program. Copy and paste the program code into part 1(c) in the evidence document. [3] (d) The function Dequeue() returns –1 if the queue is empty. If the queue is not empty, the function returns the next item in the queue, updates the appropriate pointers and updates NumberItems Write program code for Dequeue() Save your program. Copy and paste the program code into part 1(d) in the evidence document. [6] (e) (i) Write program code to extend the main program to call Dequeue() twice and output the return value each time. Save your program. Copy and paste the program code into part 1(e)(i) in the evidence document. [2] (ii) Test your program. Take a screenshot of the output(s). Save your program. Copy and paste the screenshot into part 1(e)(ii) in the evidence document. [1]
Mark scheme
1(a) 1 mark each 2 • (global) Declaration of 1D array Queue, 20 elements initialised with –1 • (global) HeadPointer and TailPointer initialised to –1, NumberItems initialised with 0 Example program code: Python Queue = [-1 for x in range(20)] HeadPointer = -1 TailPointer = -1 NumberItems = 0 VB.NET Dim Queue(20) As Integer Dim HeadPointer As Integer Dim TailPointer As Integer Dim NumberItems As Integer For x = 0 To 19 Queue(x) = -1 Next HeadPointer = -1 TailPointer = -1 NumberItems = 0 Java public static Integer[] Queue = new Integer[20]; public static Integer HeadPointer; public static Integer TailPointer; public static Integer NumberItems; public static void main(String args[]){ for(Integer X = 0; X < 20; X++){ Queue[X] = -1; } HeadPointer = -1; TailPointer = -1; NumberItems = 0; } 1(b) 1 mark each 6 • Function header (and close) taking 1 (integer) parameter and returning a Boolean value in all cases • Checking if queue is full (NumberItems = 20) and returning FALSE • Checking if queue is empty (NumberItems = 0) then and updating TailPointer and HeadPointer appropriately • Incrementing TailPointer and NumberItems in appropriate place … • … looping back to 0 for TailPointer if at end of structure • Storing parameter in Queue[TailPointer] (after increment) and returning TRUE Example program code: Python def Enqueue(InputData): global Queue global HeadPointer global TailPointer global NumberItems if NumberItems >= 20: return False if TailPointer <= -1: TailPointer = 0 HeadPointer = 0 Queue[TailPointer] = InputData else: TailPointer = TailPointer + 1 if TailPointer == 20: TailPointer = 0 Queue[TailPointer] = InputData NumberItems +=1 return True VB.NET Function Enqueue(InputData) If NumberItems >= 20 Then Return False End If If TailPointer <= -1 Then TailPointer = 0 HeadPointer = 0 Queue(TailPointer) = InputData Else TailPointer = TailPointer + 1 If TailPointer = 20 Then TailPointer = 0 End If Queue(TailPointer) = InputData End If NumberItems = NumberItems + 1 Return True End Function Java public static Boolean Enqueue(Integer InputData){ if(NumberItems >= 20){ return false; } if(TailPointer <= -1){ TailPointer = 0; HeadPointer = 0; Queue[TailPointer] = InputData; }else{ TailPointer++; if(TailPointer == 20){ TailPointer = 0; } Queue[TailPointer] = InputData; } NumberItems++; return true; } 1(c) 1 mark each 3 • Calling Enqueue() with 1 to 25 (inclusive) in order • … storing/using return value in selection …outputting Successful with integer and outputting Unsuccessful with integer correctly Example program code: Python for X in range(1, 26): ReturnValue = Enqueue(X) if ReturnValue == True: print(x,"Successful") else: print(x,"Unsuccessful") VB.NET Dim ReturnValue As Boolean For x = 1 To 25 ReturnValue = Enqueue(x) If ReturnValue = True Then Console.WriteLine(x & "Successful " ) Else Console.WriteLine(x & "Unsuccessful ") End If Next x Java Boolean ReturnValue; for(Integer X = 1; X < 26; X++){ ReturnValue = Enqueue(X); if(ReturnValue == true){ System.out.println(X + "Successful "); }else{ System.out.println(X + "Unsuccessful "); } } 1(d) 1 mark each 6 • Dequeue() header (and close) and checking if queue is empty (NumberItems = 0) and returning –1 • Returning data at HeadPointer • Incrementing HeadPointer … • … and catching if = 20 to return to 0 • Decrementing NumberItems • Resetting HeadPointer and TailPointer when queue is empty Example program code: Python def Dequeue(): global Queue global HeadPointer global TailPointer global NumberItems if NumberItems <= 0: return -1 else: ReturnValue = Queue[HeadPointer] HeadPointer +=1 if HeadPointer >= 20: HeadPointer = 0 NumberItems -=1 if NumberItems == 0: HeadPointer = -1 TailPointer = -1 return ReturnValue VB.NET Function Dequeue() Dim ReturnValue As Integer If NumberItems <= 0 Then Return -1 Else ReturnValue = Queue(HeadPointer) HeadPointer = HeadPointer + 1 If HeadPointer >= 20 Then HeadPointer = 0 End If NumberItems = NumberItems – 1 If NumberItems = 0 Then HeadPointer = -1 TailPointer = -1 End If Return ReturnValue End If End Function Java public static Integer Dequeue(){ Integer ReturnValue; if(NumberItems <= 0){ return -1; }else{ ReturnValue = Queue[HeadPointer]; HeadPointer++; if(HeadPointer >= 20){ HeadPointer = 0; } NumberItems--; if(NumberItems == 0){ HeadPointer = -1; TailPointer = -1; } return ReturnValue; } } 1(e)(i) 1 mark each 2 • Calling Dequeue() twice • … outputting return value from both calls Example program code: Python NextValue = Dequeue() print(NextValue) NextValue = Dequeue() print(NextValue) VB.NET Dim NextValue As Integer NextValue = Dequeue() Console.WriteLine(NextValue) NextValue = Dequeue() Console.WriteLine(NextValue) Java System.out.println(Dequeue()); System.out.println(Dequeue()); 1(e)(ii) 1 mark for output showing: 1 • 1 to 20 with Successful 21 to 25 with Unsuccessful 1 and 2 output e.g.