Reference no: EM132385034
Topic- object oriented programming with java
Assessment Objectives:
to design programs that conform to given specifications
to practise combining multiple classes and methods into a whole program
to implement programs in Java.
Access Modifiers in objects
Unless stated, all attributes must have private as their access modifier. Any classes that have any non-private object attributes will result in the whole assignment mark being heavily reduced, up to and including, being awarded 0, regardless of the correctness of the program. This includes omitting access modifiers, which means that the object attributes have the java default access modifier package.
Task 1: Vector
In mathematics and physics, a vector is an element of a vector space. If the space is N dimensional, such a vector consists of N scalars. For example, the vector (0, 0) represents the origin point of a two-dimensional Euclidean space.
Task 1 requires you to write a Java class for a simplified vector that handle integer scalars. To enable rapid development of the program, the following Java file is provided:
Vector.java
An object of Vector class has the following attributes:
• values This is an integer array that stores a collection of input integers passed in a constructor. Note its access mode is protected.
• size This is an integer that represents the size of values attribute, i.e. the number of input integers. Note its access mode is protected.
Vector class has the following two overloaded constructors:
• The first constructor has two parameters: an integer array that stores input integers passed by users, and an integer that represents a default value. It takes following actions:
1. If the integer array parameter is null or contains less than two elements, values attribute is initialised of length 2, and both elements inside are set to the default value parameter; otherwise, values attribute is initialised of the same length as the integer array parameter, and all elements in the integer array parameter are copied to values attribute. Note it is NOT allowed to assign the value of the integer array parameter to values attribute. (Recall that an array is an object, and its corresponding object variable holds a memory address)
2. size attribute is set to the actual length of integer attribute.
• The second constructor has any number of integers as parameters for values attribute. It takes similar actions to what the first constructor does, with the default value parameter of zero (0). Note the second constructor is required to reuse the first constructor. (Recall what you have learned on the this keyword and varargs)
Vector class has the following four methods:
• toString
This is a public overrided method, which has no parameters but returns a String to represent the information about the current object’s values attribute. For example, if the values attribute has elements {2, 2, 2, 2}, the returned String is “[ 2 2 2 2 ]”.
• getValues
This is a public method, which has no parameters but returns an integer array. Specially, it returns a copy of all elements in values attribute. Note it is NOT allowed to return values attribute here. (Recall private leakage)
• getSize
This is a public method, which has no parameters but returns an integer. Specially, it returns the value of size attribute.
• main
This is a public static method to test the class and has been provided already. Note it is NOT allowed to make any change on this method. If the class is correctly written, it is supposed to output following information:
[ 0 0 ]
[ 0 0 ]
[ 1 2 ]
[ 1 1 ]
[ 4 5 6 ]
[ 4 5 6 ]
[ 4 5 6 ]
Task 2: RangedVector
Task 2 requires you to write a Java class for a more complicated vector compared to the previous one. It ensures all elements in values attribute in a specific range. To enable rapid development of the program, the following Java file and test data are provided:
RangedVector.java v1.dat
v2.dat v3.dat
RangedVector class inherits Vector class in Task 1. (Recall the lectures on inheritance in Week 10, especially the extends keyword)
Beside the attributes inherited from Vector class, an object of RangedVector class has the following attributes:
• lowerbound This is an integer that specifies the smallest value stored in values attribute.
i.e. any element in values attribute is larger than or equal to it.
• upperbound This is an integer that specifies the largest value stored in values attribute.
i.e. any element in values attribute is smaller than or equal to it.
RangedVector class has one constructor. It has three parameters: an integer array that stores input integers passed by users, an integer that represents the lowerbound, and another integer that represents the upperbound. The constructor takes following actions:
1. It calls the first constructor of bass class, i.e. Vector class, and pass the integer array parameter and the lowerbound integer parameter (as the default value) to that constructor. (Recall the lectures on inheritance in Week 10, especially the super keyword)
2. It sets upperbound and lowerbound attributes to the corresponding parameters. It is assumed that lowerbound parameter is always smaller than or equal to upperbound parameter.
3. It checks each element in values attirbute to ensure if it is in the range of [lowerbound, upperbound] (inclusive). Specifically, if an element is smaller than lowerbound attribute, it is set to lowerbound attribute; if an element is larger than upperbound attribute, it is set to upperbound attribute.
RangedVector class has the following four methods:
• getDistance
This is a public method that has one parameter, i.e. another object of RangedVector class, and returns the Euclidean distance between the current vector and the parameter vector in double. Specifically, it takes the following actions,
1. If the parameter object is null or has a difference size of values from the current one, it returns -1.0.
2. Otherwise, as mentioned above, it calculates the Euclidean distance between the two vector objects. Suppose the current object’s values is x = {x1, x2, …, xn} and the other’s values is y = {y1, y2, …, yn}, it returns a double d as follows:
?? = 2√(??1 − ??1)2 + (??2 − ??2)2 + ? + (???? − ????)2
• add
This is a public method that has one parameter, i.e. another object of RangedVector class, and returns an object of Vector class. Specifically, it takes following actions:
1. If the parameter object is null or has a different size to the current object, it returns a null.
2. Otherwise, it adds the values attributes of the current object and the parameter object and returns an object of Vector class by using its first constructor with the added integer array and the default value of 0 as parameters. For example, if the two RangedArray objects have values attributes {1, 2, 3} and {4, 5, 6}, the method creates an object of Vector class with an integer array {5, 7, 9} and 0 as the constructor’s parameters and then returns it.
• toString
This is a public overrided method, which has no parameters but returns a String to represent the information about the current object. Specifically, it takes following actions:
1. If lowerbound and upperbound attributes are same, it calls toString method of base class.
2. Otherwise, it returns a String about the values attribute, e.g. {1, 2, 3, 4}, the lowerbound attribute, e.g. 1, and the upperbound attribute, e.g. 4, as
“[ 1 2 3 4 ] in range of [ 1, 4 ]”
• main
This is a public static method to test the class and has been provided already. Regarding change on main method, you are ONLY allowed to add code between the two following comments:
//---CHANGE ON main METHOD STARTS HERE
//---CHANGE ON main METHOD ENDS HERE
You are required to add code in the abovementioned area to enable the following actions:
1. The program takes as command line arguments the paths to three .dat files as command arguments. For example:
java RangedVector v1.dat v2.dat v3.dat
2. If command line arguments are less than or more than three, it prints the following information:
Error: The program requires as input 3 .dat files.
3. Otherwise, it creates an object of RangedVector class for data read from each .dat file and stores all objects in an RangedVector array named rv.
4. Each .dat file, no matter the one provided for testing or marking, consists one line of integers separated by white space. The first integer is lowerbound, the second is upperbound, and the rest are used as values in an object of RangedVector class. For example, v1.dat contains the following line:
3 7 1 3 5 7 9
Hence, the program takes 3 as lowerbound parameter, 7 as upperbound parameter, and {1, 3, 5, 7, 9} as the interger array parameter to the constructor and then creates an object of RangedVector class.
Any .dat test file for this assignment contains at most 16 integers.
5. If the class is correctly written, it is supposed to output following information with v1.dat, v2.dat and v3.dat as command line arguments:
RV 0: [ 3 3 5 7 7 ] in the range of [ 3, 7 ]
RV 1: [ 4 4 6 8 8 ] in the range of [ 4, 8 ]
RV 2: [ 2 2 2 2 ] --->
Euclidean distance between RV 0 and RV 1: 2.24
Addition of RV 0 and RV 1: [ 7 7 11 15 15 ]
Euclidean distance between RV 0 and RV 2: -1.00 Addition of RV 0 and RV 2: Invalid!
Euclidean distance between RV 1 and RV 2: -1.00 Addition of RV 1 and RV 2: Invalid!