Question
A computer program is designed to simulate horses doing show jumping. In show jumping, horses jump over obstacles called fences. A horse successfully jumps a fence if it does not knock the fence down.
The program is written using Object-Oriented Programming (OOP).
The class Horse stores data about the horses.
Horse
Name : STRING stores the name given to the horse
MaxFenceHeight : INTEGER stores the maximum height in cm that the horse can jump, for example 132
PercentageSuccess : INTEGER stores the percentage chance of a horse not knocking down a fence, for example 70 represents a 70% chance of jumping a fence successfully
Constructor() initialises Name, MaxFenceHeight and
PercentageSuccess to its parameter values
GetName() returns the name of the horse
GetMaxFenceHeight() returns the maximum height the horse can jump
Success() calculates and returns the percentage chance of a horse successfully jumping a specific fence
(a) (i) Write program code to declare the class Horse and its constructor.
Do not declare the other methods.
Use your programming language’s appropriate constructor.
All attributes must be private. If you are writing in Python, include attribute declarations using comments.
Save your program as Question2_N24.
Copy and paste the program code into part 2(a)(i) in the evidence document.
[4]
(ii) The get methods GetName() and GetMaxFenceHeight() each return the relevant attribute.
Write program code for the get methods.
Save your program.
Copy and paste the program code into part 2(a)(ii) in the evidence document.
[3]
(b) The array Horses stores objects of type Horse.
(i) The program has two horses:
• The horse named ‘Beauty’ can jump a maximum height of 150 cm and has a success percentage rate of 72%.
• The horse named ‘Jet’ can jump a maximum height of 160 cm and has a success percentage rate of 65%.
Write program code to:
• declare the array, Horses, local to the main program with space for two Horse objects
• store the two horses described in the array
• output the name of both Horse objects from the array.
Save your program.
Copy and paste the program code into part 2(b)(i) in the evidence document.
[5]
(ii) Test your program.
Take a screenshot of the output.
Save your program.
Copy and paste the screenshot into part 2(b)(ii) in the evidence document.
[1]
(c) The class Fence stores data about the fences. Each fence has a height in cm and a risk number.
The risk is a whole number between 1 and 5 inclusive. A risk of 1 means the fence is the easiest type to jump. A risk of 5 means the fence is the hardest type to jump.
Fence
Height : INTEGER stores the height of the fence in cm the height is between 70 and 180 inclusive
Risk : INTEGER stores the risk as a whole number between 1 and 5 inclusive
Constructor() initialises Height and Risk to its parameter values
GetHeight() returns the height of the fence
GetRisk() returns the risk of the fence
(i) Write program code to declare the class Fence, its constructor and get methods.
Use your programming language’s appropriate constructor.
All attributes must be private.
If you are writing in Python, include attribute declarations using comments.
Save your program.
Copy and paste the program code into part 2(c)(i) in the evidence document.
[4]
(ii) The array Course stores four Fence objects. The user inputs the height and risk for each fence, and these are validated before each fence is created.
Amend the main program to:
• declare the local array Course
• take as input the data for four fences from the user
• loop the input until both the height and risk are valid for each fence
• create an instance of Fence for each of the four valid fences and store each instance in the array.
Save your program.
Copy and paste the program code into part 2(c)(ii) in the evidence document.
[5]
(d) The chance of a horse jumping a fence without knocking it down is calculated as follows.
If the height of the fence is more than the maximum height a horse can jump, the success percentage is 20% of the horse’s PercentageSuccess. The risk does not affect this value.
If the height of the fence is less than or equal to the maximum height a horse can jump, the risk gives a modifier value to multiply with the horse’s PercentageSuccess.
The risk values and their modifiers are given in this table:
Risk Modifier
5 0.6
4 0.7
3 0.8
2 0.9
1 1.0
For example:
• The horse Jet has PercentageSuccess of 65 and MaxFenceHeight of 160.
• A fence has a height of 140 and a risk of 3.
• The height of the fence is less than the horse’s MaxFenceHeight, therefore the risk is used.
• The risk of 3 gives the modifier 0.8.
• The modifier 0.8 is multiplied by the horse’s PercentageSuccess of 65, which gives 52.
• The chance of the horse successfully jumping this fence is 52%.
The method Success() in the Horse class:
• takes the height and risk of a fence as parameters
• calculates the percentage chance of success for that horse jumping the fence without knocking it down
• returns the calculated percentage chance of success as a real number.
Write program code for Success().
Save your program.
Copy and paste the program code into part 2(d) in the evidence document.
[5]
(e) (i) Write program code to amend the main program to:
• calculate and output the chance of the first horse jumping each of the four fences without knocking each fence down
• calculate and output the chance of the second horse jumping each of the four fences without knocking each fence down.
All outputs must have appropriate messages including the name of the horse and the fence number.
An example output for one horse jumping two fences is:
"The horse Fox at fence 1 has a 68% chance of success
The horse Fox at fence 2 has a 72% chance of success"
Save your program.
Copy and paste the program code into part 2(e)(i) in the evidence document.
[3]
(ii) Write program code to amend the main program to:
• calculate and output the average chance of success for each horse jumping over all four fences without knocking each fence down (the average is the total of values divided by the quantity of values). An example output for one horse jumping all of the fences is:
"The horse Fox has an average 70% chance of jumping over all four fences"
• output the name of the horse that has the highest average chance of success.
You can assume that each average will be different.
All outputs must have appropriate messages.
Save your program.
Copy and paste the program code into part 2(e)(ii) in the evidence document.
[2]
(iii) Test your program with the following input data for four fences:
Height Risk
152 5
121 1
130 3
145 4
Take a screenshot of the output.
Save your program.
Copy and paste the screenshot into part 2(e)(iii) in the evidence document.
[2]
Mark scheme
2(a)(i) 1 mark each 4
• Class Horse declaration (and end where appropriate)
• All 3 attributes declared as private with appropriate data types (declaration or comment)
• Constructor header (and end) taking 3 parameters (constructor must be within class) …
• … constructor assigns parameters to attributes
e.g.
Python
class Horse:
def __init__(self, PName, PMaxFenceHeight, PPercentageSuccess):
self.__Name = PName #String
self.__MaxFenceHeight = PMaxFenceHeight #Integer
self.__PercentageSuccess = PPercentageSuccess #Integer
VB.NET
Class Horse
Private Name As String
Private MaxFenceHeight As Integer
Private PercentageSuccess As Integer
Sub New(PName, PMaxFenceHeight, PPercentageSuccess)
Name = PName
MaxFenceHeight = PMaxFenceHeight
PercentageSuccess = PPercentageSuccess
End Sub
End Class
2(a)(i) Java
class Horse{
private static String Name;
private static Integer MaxFenceHeight;
private static Integer PercentageSuccess;
public Horse(String PName, Integer PMaxFenceHeight, Integer PPercentageSuccess){
Name = PName;
MaxFenceHeight = PMaxFenceHeight;
PercentageSuccess = PPercentageSuccess;
}
}
2(a)(ii) 1 mark each 3
• 1 get method header with no parameter …
• … returning correct attribute (without change)
• 2nd get method correct
e.g.
Python
def GetName(self):
return self.__Name
def GetMaxFenceHeight(self):
return self.__MaxFenceHeight
VB.NET
Function GetName()
Return Name
End Function
2(a)(ii) Function GetMaxFenceHeight()
Return MaxFenceHeight
End Function
Java
public String GetName(){
return Name;
}
public Integer GetMaxFenceHeight(){
return MaxFenceHeight;
}
2(b)(i) 1 mark each 5
• Instantiating one object of type Horse with correct data …
• … and storing in first element of a 1D array Horses
• Instantiating second object of type Horse with correct data and storing in second index of the array
• Outputting name of both horse objects from array …
• … using GetName()
e.g.
Python
Horses = []
Horses.append(Horse("Beauty", 150, 72))
Horses.append(Horse("Jet", 160, 65))
print(Horses[0].GetName())
print(Horses[1].GetName())
VB.NET
Dim Horses(2) As Horse
Horses(0) = New Horse("Beauty", 150, 72)
Horses(1) = New Horse("Jet", 160, 65)
Console.WriteLine(Horses(0).GetName())
Console.WriteLine(Horses(1).GetName())
2(b)(i) Java
Horse[] Horses = new Horse[2];
Horses[0] = new Horse("Beauty", 150, 72);
Horses[1] = new Horse("Jet", 160, 65);
System.out.println(Horses[0].GetName());
System.out.println(Horses[1].GetName());
2(b)(ii) 1 mark for both names output: 1
2(c)(i) 1 mark each 4
• Class Fence header (and end where appropriate) with no inheritance
• Height and Risk private with integer data type
• Constructor taking 2 parameters and storing in attributes (constructor must be within class)
• 2 get methods (no parameter) returning correct attributes (within class)
e.g.
Python
class Fence:
def __init__(self, PHeight, PRisk):
self.__Height = PHeight #integer
self.__Risk = PRisk #integer
def GetHeight(self):
return self.__Height
def GetRisk(self):
return self.__Risk
2(c)(i) VB.NET
Class Fence
Dim Height As Integer
Dim Risk As Integer
Sub New(PHeight, PRisk)
Height = PHeight
Risk = PRisk
End Sub
Function GetHeight()
Return Height
End Function
Function GetRisk()
Return Risk
End Function
End Class
Java
class Fence{
private Integer Height;
private Integer Risk;
public Fence (Integer PHeight, Integer PRisk){
Height = PHeight;
Risk = PRisk;
}
2(c)(i) public Integer GetHeight(){
return Height;
}
public Integer GetRisk(){
return Risk;
}
}
2(c)(ii) 1 mark each to max 5 5
• Declaration/use of array Course of type Fence (with at least 4 elements)
• Taking Height and Risk as input four times and store/use
• Instantiating a Fence object for each set of valid input values and storing in array
• Taking each height as input until it is between 70 and 180 (inclusive)
• Taking each risk as input until it is between 1 and 5 (inclusive)
e.g.
Python
Course = []
for x in range(0, 4):
Valid = False
while Valid == False:
Height = int(input("Enter the height in cm"))
if(Height >= 70 and Height <= 180):
Valid = True
Valid = False
while Valid == False:
Risk = int(input("Enter the risk between 1 (easy) and 5 (hard)"))
if(Risk >= 1 and Risk <= 5):
Valid = True
Course.append(Fence(Height, Risk))
2(c)(ii) VB.NET
Dim Course(5) As Fence
Dim Height As Integer
Dim Risk As Integer
For x = 0 To 3
Do
Console.WriteLine("Enter the height in cm")
Height = Console.ReadLine()
Loop Until Height >= 70 And Height <= 180
Do
Console.WriteLine("Enter the risk between 1 (easy) and 5 (hard)")
Risk = Console.ReadLine()
Loop Until Risk >= 1 And Risk <= 5
Course(x) = New Fence(Height, Risk)
Next
Java
Fence [] Course = new Fence [4];
for(Integer x = 0; x < 4; x++){
do {
System.out.println("Enter the height in cm");
Height = Integer.parseInt(scanner.nextLine());
} while(Height <70 || Height > 180);
do{
System.out.println("Enter the risk between 1 (easy) and 5 (hard)");
Risk = Integer.parseInt(scanner.nextLine());
}while(Risk <1 || Risk > 5);
Course[x] = new Fence(Height, Risk);
}
2(d) 1 mark each 5
• Method header taking 2 parameters (and end where appropriate, returning real)
• Checking if fence height parameter is more than max attribute for that horse, if true multiplying percentage success by
0.2
• (Otherwise) selection checking risk value parameter between 1 and 5, multiplying modifier by percentage success
• Returning correct value as a real number in all instances
• Correct use of attributes and parameters throughout
e.g.
Python
def Success(self, Height, Risk):
if Height > self.__MaxFenceHeight:
return self.__PercentageSuccess * 0.2
else:
if Risk == 1:
return self.__PercentageSuccess
elif Risk == 2:
return self.__PercentageSuccess * 0.9
elif Risk == 3:
return self.__PercentageSuccess * 0.8
elif Risk == 4:
return self.__PercentageSuccess * 0.7
else:
return self.__PercentageSuccess * 0.6
VB.NET
Function Success(Height, Risk)
If Height > MaxFenceHeight Then
Return PercentageSuccess * 0.2
Else
2(d) If Risk = 1 Then
Return PercentageSuccess
ElseIf Risk = 2 Then
Return PercentageSuccess * 0.9
ElseIf Risk = 3 Then
Return PercentageSuccess * 0.8
ElseIf Risk = 4 Then
Return PercentageSuccess * 0.7
Else
Return PercentageSuccess * 0.6
End If
End If
End Function
Java
public static Double Success(Integer Height, Integer Risk){
if(Height > MaxFenceHeight){
return Double.valueOf(PercentageSuccess) * 0.2;
}else{
if(Risk == 1){
return Double.valueOf(PercentageSuccess);
}else if (Risk == 2){
return Double.valueOf(PercentageSuccess) * 0.9;
}else if (Risk == 3){
return Double.valueOf(PercentageSuccess) * 0.8;
}else if (Risk == 4){
return Double.valueOf(PercentageSuccess) * 0.7;
}else{
return Double.valueOf(PercentageSuccess) * 0.6;
}
}
}
2(e)(i) 1 mark each 3
• Calling Success() for each horse with the height and risk of all 4 fences …
• … using get methods for height and risk of each fence
• … outputting the horse name, fence number and calculated success at fence in appropriate message
e.g.
Python
for y in range(0, 2):
for x in range(0, 4):
Chance = Horses[y].Success(Course[x].GetHeight(), Course[x].GetRisk())
print(Horses[y].GetName(), "Fence", x + 1, "chance of success is", Chance, "%")
VB.NET
Dim Chance As Single
For y = 0 To 1
For x = 0 To 3
Chance = Horses(y).Success(Course(x).GetHeight(), Course(x).GetRisk())
Console.WriteLine(Horses(y).GetName() & " Fence " & x + 1 & " chance of
success is " & Chance & "%")
Next
Next
Java
Double Chance = 0.0;
for(Integer y = 0; y < 2; y ++){
for(Integer x = 0; x < 4; x++){
Chance = Horses[y].Success(Course[x].GetHeight(), Course[x].GetRisk());
System.out.println(Horses[y].GetName() + " Fence " + (x + 1) + " chance of
success is " + Chance + "%");
}
}
2(e)(ii) 1 mark each 2
• Calculating average of all 4 fences for each horse and outputting in suitable message
• Identifying the highest percentage of success and outputting the horse's name in an appropriate message
e.g.
Python
AverageSuccess = []
for y in range(0, 2):
Total = 0
for x in range(0, 4):
Chance = Horses[y].Success(Course[x].GetHeight(), Course[x].GetRisk())
print(Horses[y].GetName(), "Fence", x + 1, "chance of success is", Chance, "%")
Total = Total + Chance
Average = Total / 4
AverageSuccess.append(Average)
print(Horses[y].GetName(), "average success rate is", Average, "%")
Highest = AverageSuccess[0]
Winner = -1
for x in range(1,2):
if Highest < AverageSuccess[x]:
Winner = x
Highest = AverageSuccess[x]
print(Horses[Winner].GetName(), " has the highest average chance of success ")
2(e)(ii) VB.NET
Dim Total As Integer
Dim Chance As Single
Dim Average As Single
For y = 0 To 1
Total = 0
For x = 0 To 3
Chance = Horses(y).Success(Course(x).GetHeight(), Course(x).GetRisk())
Console.WriteLine(Horses(y).GetName() & " Fence " & x + 1 & " chance of success is
" & Chance & "%")
Total = Total + Chance
Average = Total / 4
AverageSuccess(y) = Average
Console.WriteLine(Horses(y).GetName() & " average success rate is " & Average &
"%")
Next
Next
Dim Highest As Single
Dim Winner As Integer
Highest = AverageSuccess(0)
Winner = -1
For x = 1 To 1
If Highest < AverageSuccess(x) Then
Winner = x
Highest = AverageSuccess(x)
End If
Next x
Console.WriteLine(Horses(Winner).GetName() & " has the highest average chance of success ")
2(e)(ii) Java
Double Total = 0.0;
Double Chance = 0.0;
Double Average = 0.0;
for(Integer y = 0; y < 2; y ++){
Total = 0.0;
for(Integer x = 0; x < 4; x++){
Chance = Horses[y].Success(Course[x].GetHeight(), Course[y].GetRisk());
System.out.println(Horses[y].GetName() + " Fence " + (x + 1) + " chance of
success is " + Chance + "%");
Total = Total + Chance;
}
Average = Total / 4;
AverageSuccess[y] = Average;
System.out.println(Horses[y].GetName() + " average success rate is " + Average +
"%");
}
Double Highest = AverageSuccess[0];
Integer Winner = 0;
for(Integer x = 1; x < 2; x++){
if(Highest < AverageSuccess[x]){
Winner = x;
Highest = AverageSuccess[x];
}
}
System.out.println(Horses[Winner].GetName() + " has the highest average chance of
success");
2(e)(iii) 1 mark each 2
• Outputting showing correct input values for all fences, and correct chance for each horse on each jump
• Outputs of average chance of each horse and horse name with highest average
e.g.