w w ap eP m e tr .X w CAMBRIDGE INTERNATIONAL EXAMINATIONS 9691 COMPUTING 9691/21 Paper 2 (Written Paper), maximum raw mark 75 This mark scheme is published as an aid to teachers and candidates, to indicate the requirements of the examination. It shows the basis on which Examiners were instructed to award marks. It does not indicate the details of the discussions that took place at an Examiners’ meeting before marking began, which would have considered the acceptability of alternative answers. Mark schemes should be read in conjunction with the question paper and the Principal Examiner Report for Teachers. Cambridge will not enter into discussions about these mark schemes. Cambridge is publishing the mark schemes for the May/June 2014 series for most IGCSE, GCE Advanced Level and Advanced Subsidiary Level components and some Ordinary Level components. om .c MARK SCHEME for the May/June 2014 series s er GCE Advanced Subsidiary Level and GCE Advanced Level Page 2 1 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 (a) (i) Mark as follows: 1 mark for heading/introduction 1 mark for method of displaying numbers 1 – 10 e.g. dropdown box/radio buttons/grid of numbers) 1 mark for method to move to next screen (ignore exit/cancel) (accept next/ok/enter) e.g. button // a label telling child what to do [3] (ii) 1 mark for explanation that fits design of (a)(i) e.g. clicking on/touching/pressing button/box/number/icon [1] (b) Mark as follows: • 1 mark for each box correctly translated into chosen programming language • Identifiers must be the same as given in flowchart • Give 1 mark for loop header and end correctly coded (must be a FOR loop) • Ignore any declarations • If candidate only says “Visual Basic” (no version number) use the mark scheme that best fits the answer • If language given is “Pseudocode”, give no marks [max 6] VB6 – accept console mode answers Number = InputBox("") Msg = Number & " Times Table" & vbCrLf For i = 1 To 10 Result = i * Number Msg = Msg & i & "x" & Number & "=" & Result & vbCrLf Next i Msg = Msg & "Press any key" MsgBox(Msg) VB.NET/VB 2005 etc. Number = Console.ReadLine(); Console.WriteLine(Number & " Times Table"); For i = 1 To 10 Result = i * Number Console.WriteLine(i & "x" & Number & "=" & Result) Next i Console.WriteLine("Press any key") © Cambridge International Examinations 2014 Page 3 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 QBASIC INPUT Number; PRINT Number; " Times Table" FOR i = 1 TO 10 Result = i * Number PRINT i; "x"; Number; "="; Result NEXT i PRINT "Press any key" PASCAL ReadLn(Number); WriteLn(Number, ' Times Table'); For i := 1 To 10 Do Begin Result := i * Number; WriteLn(i, 'x', Number, '=', Result); // semicolon optional here End; // Begin End are part of the loop structure WriteLn('Press any key'); PYTHON Number = int(input()) print(Number, "Times Table") for i in range(1,11) : Result = i * Number print(i, "x", Number, "=", Result) print("Press any key") (c) PROCEDURE ShowMultiplicationGrid (Number1, Number2) 1 mark if Number1 and FOR Row 1 TO Number1 // 1 mark Number2 switched round FOR Column 1 TO Number2 // 1 mark OUTPUT '*' // 1 mark – accept '*' or "*" ENDFOR // 1 mark – accept NEXT column OUTPUT NewLine // 1 mark – must be in outer loop ENDFOR ENDPROCEDURE [5] © Cambridge International Examinations 2014 Page 4 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 (d) 1 mark for each correctly labelled shape (accept full text instead of number) FUNCTION CheckAnswerCorrect(Number1, Number2) R ← Number1 * Number 2 INPUT AnswerString No Yes Convert AnswerString to AnswerNumber No No Yes Yes Return TRUE ENDFUNCTION [10] © Cambridge International Examinations 2014 Page 5 Mark Scheme GCE AS/A LEVEL – May/June 2014 (2) (a) FUNCTION TestScoreTotal RETURNS INTEGER DECLARE AnswerCorrect, Finish : BOOLEAN DECLARE Number1, Number2, Score : INTEGER Score 0 Syllabus 9691 Paper 21 // 1 mark // 1 mark // 1 mark // 1 mark Finish FALSE REPEAT Number1 Random(10) // accept X instead of 10 Number2 Random(10) // 1 mark Display(Number1, Number2) AnswerCorrect CheckAnswerCorrect(Number1, Number2) IF AnswerCorrect = TRUE // 1 mark THEN Score Score + 1 ELSE Finish TRUE // 1 mark ENDIF // accept = instead of UNTIL Finish = TRUE // 1 mark RETURN Score // 1 mark ENDFUNCTION [9] • • • If candidate only says “Visual Basic” (no version number) use the mark scheme that best fits the answer If language given is “Pseudocode”, give no marks Identifiers must be as given in the question Mark as follows: (b) (i) 2 marks • Correct dimension 1 mark • Correct data types 1 mark [2] (ii) 2 marks • 1 mark for structure • 1 mark for correct fields (Name, BestScore) listed [2] (iii) 2 marks • 1 mark for correct name (Student) and size • 1 mark for correct record type (StudentScore) [2] (iv) 3 marks • 1 mark for correctly addressed array elements (Student(3)) • 1 mark for correct reference to individual fields (.Name, .BestScore) • 1 mark for correct assignment of values [3] © Cambridge International Examinations 2014 Page 6 Mark Scheme GCE AS/A LEVEL – May/June 2014 VB6 QUESTION 2(b)(i) Dim Name(30) As String Dim BestScore(30) As Integer QUESTION 2(b)(ii) Type StudentScore Name As String BestScore As Integer End Type QUESTION 2(b)(iii) Dim Student(30) As StudentScore QUESTION 2(b)(iv) Student(3).Name = "Anji" Student(3).BestScore = 15 VB.NET/VB 2005 etc. QUESTION 2(b)(i) Dim Name(30) As String Dim BestScore(30) As Integer QUESTION 2(b)(ii) Structure StudentScore Dim Name As String Dim BestScore As Integer End Structure QUESTION 2(b)(iii) Dim Student(30) As StudentScore QUESTION 2(b)(iv) Student(3).Name = "Anji" Student(3).BestScore = 15 QBASIC QUESTION 2(b)(i) DIM Name(30) AS STRING * 15 DIM BestScore(30) AS INTEGER © Cambridge International Examinations 2014 Syllabus 9691 Paper 21 Page 7 Mark Scheme GCE AS/A LEVEL – May/June 2014 QUESTION 2(b)(ii) TYPE StudentScore Name AS STRING * 15 BestScore AS INTEGER END TYPE QUESTION 2(b)(iii) DIM Student(30) AS StudentScore QUESTION 2(b)(iv) Student(3).Name = "Anji" Student(3).BestScore = 15 PASCAL QUESTION 2(b)(i) Name : Array[1..30] Of String; BestScore : Array[1..30] Of Integer; QUESTION 2(b)(ii) Type StudentScore = Record Name : String[15]; BestScore : Integer; End; QUESTION 2(b)(iii) Student : Array[1..30] Of StudentScore; QUESTION 2(b)(iv) Student[3].Name := 'Anji'; Student[3].BestScore := 15; © Cambridge International Examinations 2014 Syllabus 9691 Paper 21 Page 8 Mark Scheme GCE AS/A LEVEL – May/June 2014 PYTHON QUESTION 2(b)(i) Name = ["" for i in range(30)] BestScore = [0 for i in range(30)] or Name = [] BestScore = [] for i in range(30) : Name.append("") BestScore.append(0) QUESTION 2(b)(ii) class StudentScore : def __init__(self) : Name = "" BestScore = 0 QUESTION 2(b)(iii) Student = [StudentScore() for i in range(30)] or Student = [] for i in range(30) : Student.append(StudentScore()) QUESTION 2(b)(iv) Student[2].Name = "Anji" Student[2].BestScore = 15 Mark as follows: • • • • • • Procedure/sub SaveToFile Open (for writing) StudentFile Initialise index value correctly Loop through student array Write record to file StudentFile Close file StudentFile © Cambridge International Examinations 2014 Syllabus 9691 Paper 21 Page 9 (c) Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 VB6 Sub SaveToFile() Dim i as Integer Open "StudentFile" For Output As #1 For i = 1 To 30 Write#1, Student(i).Name, Student(i).BestScore Next i Close#1 End Sub VB.NET/VB 2005 etc. Sub SaveToFile() Dim Writer As BinaryWriter Writer = new BinaryWriter(File.Open("StudentFile", FileMode.Create)) For i = 1 To 30 Writer.Write(Student(i).Name) Writer.Write(Student(i).BestScore) Next i Writer.Close() End Sub QBASIC SUB SaveToFile(Student() AS StudentScore) OPEN "StudentFile" FOR OUTPUT AS #1 FOR i = 1 TO 30 WRITE #1, Student(i).Name, Student(i).BestScore NEXT i CLOSE #1 END SUB PASCAL Var Students : File Of StudentScore; Procedure SaveToFile; Var i : Integer; Begin Assign(Students, 'StudentFile'); Rewrite(Students); For i := 1 To 30 Do Write(Students, Student[i]); Close(Students); End; © Cambridge International Examinations 2014 Page 10 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 PYTHON import pickle def SaveToFile() : Students = open("StudentFile", "wb") for i in range(30) : pickle.dump(Student[i], Students) Students.close() or (as a text file) def SaveToFile() : Students = open("StudentFile", "w") for i in range(30) : Students.write(Student[i].Name + "\n") Students.write(str(Student[i].BestScore) + "\n") Students.close() [6] © Cambridge International Examinations 2014 Page 11 3 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 (a) (i) FUNCTION FindArrayIndex(ChildName : STRING) RETURNS INTEGER i 0 REPEAT i i + 1 UNTIL Student[i].Name = ChildName RETURN i Another method: FUNCTION FindArrayIndex(ChildName : STRING) RETURNS INTEGER Found FALSE i 1 WHILE NOT (Found = TRUE) IF Student[i].Name = ChildName THEN Found TRUE ELSE i i + 1 ENDIF ENDWHILE RETURN i [max 5] (ii) suggestion of checking for end of array // checking whole array and setting flag if not found Special value/error code/number returned if name doesn’t exist (e.g. –1) [2] (b) e.g. – turn all characters into lower/upper case – before saving/searching // on input [2] © Cambridge International Examinations 2014 Page 12 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 (4) (i) – it calls itself [1] (ii) Call Function Number call s x RIGHT (s,x - 1) 1 Y('BYTE') 'BYTE' 4 'YTE' 2 Y('YTE') 'YTE' 3 'TE' 3 Y('TE') 'TE' 2 'E' 4 Y('E') 'E' 1 LEFT(s,1) Return value 'E' (3) 'T' 'ET' (2) 'Y' 'ETY' (1) 'B' 'ETYB' 1 mark per correct column (iii) reverses the string [7] [1] (iv) – indentation comment/annotation/remarks (v) – identifiers not meaningful/sensible // identifiers are just single characters (vi) if answer is recursive, no marks There are many different ways of solving this. The following are examples: n '' /empty string REPEAT x LENGTH(s) z LEFT(s,1) s RIGHT(s, x - 1) n z + n // y concat(z,n) UNTIL s = '' RETURN n © Cambridge International Examinations 2014 [2] [1] Page 13 Mark Scheme GCE AS/A LEVEL – May/June 2014 Syllabus 9691 Paper 21 Or n '' /empty string x LENGTH(s) FOR i 1 TO x z LEFT(s,1) s RIGHT(s, x - i) n z + n // n concat(z,n) ENDFOR RETURN n n '' /empty string x LENGTH(s) FOR i 1 TO x z MID(s,i,1) n z + n ENDFOR RETURN n // n concat(z,n) Mark as follows: – start with empty string – correct loop structure – correct loop count/termination – pick single character (from string s) consecutively – concatenate single character to correct end of new string – return newly formed string [5] © Cambridge International Examinations 2014