diff --git a/src/ca/bcit/comp1510/assignment3/q1/Address.java b/src/ca/bcit/comp1510/assignment3/q1/Address.java new file mode 100644 index 0000000..8441ddd --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q1/Address.java @@ -0,0 +1,31 @@ +package ca.bcit.comp1510.assignment3.q1; + +/** + * Represents a street address. + * + * @author Lewis & Loftus 9e + * @author BCIT + * @version 2017 + * @param streetAddress Street address. + * @param city city. + * @param state state or province. + * @param postalCode postal code, zip code. + */ +public record Address(String streetAddress, String city, + String state, String postalCode) { + + /** + * Returns a description of this Address object. + * + * @return formatted value of streetAddress, city, state, zipCode + */ + public String toString() { + String result; + + result = streetAddress + "\n"; + result += city + ", " + state + " " + postalCode; + + return result; + } +} + diff --git a/src/ca/bcit/comp1510/assignment3/q1/Course.java b/src/ca/bcit/comp1510/assignment3/q1/Course.java new file mode 100644 index 0000000..5b879c2 --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q1/Course.java @@ -0,0 +1,66 @@ +package ca.bcit.comp1510.assignment3.q1; + +import java.util.List; +import java.util.ArrayList; +import java.text.DecimalFormat; + +/** + * Course contains course related information + * including Stutdent classes. + * @author Braeden Sowinski + * @version 1.0.0 + */ +public class Course { + + /** MAX number of students. */ + public static final int MAX = 5; + + /** name of course. */ + private String name; + + /** students array. */ + private List students; + + /** + * Course constructor. + * @param name of course + */ + public Course(String name) { + this.name = name; + this.students = new ArrayList(); + } + + /** + * addStudent to students array. + * @param s student to add + */ + public void addStudent(Student s) { + if (this.students.size() < MAX) { + students.add(s); + } + } + + /** + * average of all students averages. + * @return average of all students. + */ + public double average() { + double a = 0; + for (int i = 0; i < this.students.size(); i++) { + a += this.students.get(i).average(); + } + DecimalFormat format = new DecimalFormat("#0.00"); + return Double.parseDouble(format.format(a / this.students.size())); + } + + /** + * role prints all students. + */ + public void role() { + System.out.println("Course: " + this.name); + for (int i = 0; i < this.students.size(); i++) { + System.out.println(this.students.get(i).toString()); + } + } + +} diff --git a/src/ca/bcit/comp1510/assignment3/q1/Student.java b/src/ca/bcit/comp1510/assignment3/q1/Student.java new file mode 100644 index 0000000..d951c7f --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q1/Student.java @@ -0,0 +1,136 @@ +package ca.bcit.comp1510.assignment3.q1; + +/** + * Represents a BCIT student. + * + * @author Lewis & Loftus 9e + * @author BCIT + * @version 2017 + */ +public class Student { + /** First name of this student. */ + private String firstName; + + /** Last name of this student. */ + private String lastName; + + /** Home address of this student. */ + private Address homeAddress; + + /** School address of this student. Can be shared by other students */ + private Address schoolAddress; + + /** testScore1. */ + private double testScore1; + + /** testScore2. */ + private double testScore2; + + /** testScore3. */ + private double testScore3; + + /** + * Constructs a Student object that contains the specified values. + * @param first a String representing the first name + * @param last a String representing the last name + * @param home an Address object containing the home address + * @param school an Address object containing the school address + */ + public Student( + String first, + String last, + Address home, + Address school + ) { + firstName = first; + lastName = last; + homeAddress = home; + schoolAddress = school; + + } + + /** + * Constructs a Student object that contains the specified values. + * @param first a String representing the first name + * @param last a String representing the last name + * @param home an Address object containing the home address + * @param school an Address object containing the school address + * @param testScore1 is a double of their first test score + * @param testScore2 is a double of their seccond test score + * @param testScore3 is a double of their third test score + */ + public Student( + String first, + String last, + Address home, + Address school, + double testScore1, + double testScore2, + double testScore3 + ) { + firstName = first; + lastName = last; + homeAddress = home; + schoolAddress = school; + this.testScore1 = testScore1; + this.testScore2 = testScore2; + this.testScore3 = testScore3; + } + + /** + * setTestScore updates a selected test to + * a new score. + * @param test to select + * @param score to update test to + */ + public void setTestScore(int test, double score) { + switch (test) { + case 1 -> this.testScore1 = score; + case 2 -> this.testScore2 = score; + default -> this.testScore3 = score; + } + } + + /** + * getTestScore of a given test. + * @param test to get score of + * @return score of test + */ + public double getTestScore(int test) { + double score; + switch (test) { + case 1 -> score = this.testScore1; + case 2 -> score = this.testScore2; + default -> score = this.testScore3; + } + return score; + } + + /** + * average calculation of all 3 test scores. + * @return average + */ + public double average() { + final int tests = 3; + return (this.testScore1 + this.testScore2 + this.testScore3) / tests; + } + + /** + * Returns a String description of this Student object. + * @return description a String + */ + public String toString() { + String result; + + result = firstName + " " + lastName + "\n"; + result += "Home Address:\n" + homeAddress + "\n"; + result += "School Address:\n" + schoolAddress + "\n"; + result += "Test Score 1:\n" + testScore1 + "\n"; + result += "Test Score 2:\n" + testScore2 + "\n"; + result += "Test Score 3:\n" + testScore3 + "\n"; + result += "Average Score:\n" + average(); + + return result; + } +} + diff --git a/src/ca/bcit/comp1510/assignment3/q1/TestCourse.java b/src/ca/bcit/comp1510/assignment3/q1/TestCourse.java new file mode 100644 index 0000000..bd08885 --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q1/TestCourse.java @@ -0,0 +1,58 @@ +package ca.bcit.comp1510.assignment3.q1; + +/** + * TestCourse tests Course class. + * @author Braeden Sowinski + * @version 1.0.0 + */ +public class TestCourse { + + /** + * main program entry. + * @param args unused + */ + public static void main(String[] args) { + Course comp1510 = new Course("Programming Methods"); + + final double perfect = 100.0; + comp1510.addStudent(new Student( + "Braeden", + "Sowinski", + new Address("123 ABC St.", "Surrey", "BC", "A1B 2C3"), + new Address("3700 Willington Ave.", "Burnaby", "BC", "V5G 3H2"), + perfect, + perfect, + perfect + )); + + final double bad1 = 73.7; + final double bad2 = 69.69; + final double okay = 84.5; + comp1510.addStudent(new Student( + "Joker", + "Student", + new Address("321 ABC St.", "Vancouver", "BC", "X1Y 2Z3"), + new Address("3700 Willington Ave.", "Burnaby", "BC", "V5G 3H2"), + bad1, + bad2, + okay + )); + + + final double mid1 = 83.21; + final double mid2 = 79.97; + comp1510.addStudent(new Student( + "Joker", + "Student", + new Address("987 XYZ St.", "Toronto", "Quebec", "ABC 123"), + new Address("3700 Willington Ave.", "Burnaby", "BC", "V5G 3H2"), + mid1, + mid2, + okay + )); + + comp1510.role(); + System.out.println("Programming Methods Average: " + + comp1510.average()); + } +} diff --git a/src/ca/bcit/comp1510/assignment3/q2/TimeSheet.java b/src/ca/bcit/comp1510/assignment3/q2/TimeSheet.java new file mode 100644 index 0000000..83563c2 --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q2/TimeSheet.java @@ -0,0 +1,107 @@ +package ca.bcit.comp1510.assignment3.q2; + +import java.time.LocalDate; +import java.time.DayOfWeek; +import java.util.List; +import java.util.ArrayList; + +/** + * TimeSheet data. + * @author Braeden Sowinski + * @version 1.0.0 + */ +public class TimeSheet { + + /** empNum is employee number. */ + private String empNum; + + /** endDate of week, must be Friday. */ + private LocalDate endWeek; + + /** details of TimeSheetRows. */ + private List details; + + /** + * TimeSheet no-argument constructor. + */ + public TimeSheet() { + this.empNum = ""; + this.endWeek = null; + this.details = new ArrayList(); + } + + /** + * TimeSheet constructor. + * @param empNum string of employee number + * @param endWeek date + */ + public TimeSheet(String empNum, LocalDate endWeek) { + this.empNum = empNum; + this.endWeek = endWeek; + this.details = new ArrayList(); + } + + /** + * getEmpNum. + * @return empNum String employee number + */ + public String getEmpNum() { + return this.empNum; + } + + /** + * getEndWeek. + * @return endWeek LocalDate + */ + public LocalDate getEndWeek() { + return this.endWeek; + } + + /** + * getDetails. + * @return details List of TimeSheetRow + */ + public List getDetails() { + return this.details; + } + + /** + * setEmpNum to update employee number. + * @param empNum String to update + */ + public void setEmpNum(String empNum) { + this.empNum = empNum; + } + + /** + * setEndWeek to update endWeek. + * @param endDate to update + * @throws IllegalArgumentException if not Friday + */ + public void setEndWeek(LocalDate endDate) throws IllegalArgumentException { + if (endDate.getDayOfWeek() != DayOfWeek.FRIDAY) { + throw new IllegalArgumentException( + "End date must be set to a Friday." + ); + } + this.endWeek = endDate; + } + + /** + * toString. + * @return TimeSheet representation + */ + public String toString() { + return ""; + } + + /** + * addRow to details array. + * @param row TimeSheetRow + */ + public void addRow(TimeSheetRow row) { + this.details.add(row); + } + + +} diff --git a/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRow.java b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRow.java new file mode 100644 index 0000000..ddff3db --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRow.java @@ -0,0 +1,174 @@ +package ca.bcit.comp1510.assignment3.q2; + +/** + * TimeSheetRow is a row of TimeSheet. + * @author Braeden Sowinski + * @version 1.0.0 + */ +public class TimeSheetRow { + + /** MASK of bits for days of week represented inside hours long. */ + private static final long[] MASK = { + 0xFFL, 0xFF00L, 0xFF0000L, + 0xFF000000L, 0xFF00000000L, + 0xFF0000000000L, 0xFF000000000000L + }; + + /** UMASK to unmask stuff. */ + private static final long[] UMASK = { + 0xFFFFFFFFFFFFFF00L, + 0xFFFFFFFFFFFF00FFL, + 0xFFFFFFFFFF00FFFFL, + 0xFFFFFFFF00FFFFFFL, + 0xFFFFFF00FFFFFFFFL, + 0xFFFF00FFFFFFFFFFL, + 0xFF00FFFFFFFFFFFFL + }; + + /** DECI to convert hours. */ + private static final float DECI = 10; + + /** baseHex to convert hexidecimal */ + private static final int HEX_BASE = 16; + + /** SHIFT by bits */ + private static final int SHIFT = 8; + + /** project number as int. */ + private int project; + + /** workPackage string. */ + private String workPackage; + + /** hours worked long. */ + private long hours; + + /** + * TimeSheetRow no-argument constructor. + */ + public TimeSheetRow() { + this.project = 0; + this.workPackage = ""; + this.hours = 0; + } + + /**4 + * TimeSheetRow constructor. + * @param projectNumber int + * @param workPackage String + * @param hours float... + */ + public TimeSheetRow(int projectNumber, String workPackage, float... hours) { + this.project = projectNumber; + this.workPackage = workPackage; + + String encoded = ""; + for (int i = hours.length - 1; i >= 0; i--) { + String hex = Integer.toHexString((int) (hours[i] * DECI)); + hex = hex.length() == 1 ? "0" + hex : hex; + encoded += hex; + } + + this.hours = Long.parseLong(encoded, HEX_BASE); + } + + /** + * getProject number. + * @return project int + */ + public int getProject() { + return this.project; + } + + /** + * getWorkPackage name. + * @return workPackage string + */ + public String getWorkPackage() { + return this.workPackage; + } + + /** + * getHours worked. + * @return hours long. + */ + public long getHours() { + return this.hours; + } + + /** + * setProject number. + * @param project int + */ + public void setProject(int project) { + this.project = project; + } + + /** + * setProject name. + * @param newWorkPackage string + */ + public void setProject(String newWorkPackage) { + this.workPackage = newWorkPackage; + } + + /** + * setProject worked. + * @param newHours long. + */ + public void setProject(long newHours) { + this.hours = newHours; + } + + /** + * toString string representation. + * @return string + */ + public String toString() { + return ""; + } + + /** + * getHour of day. + * @param day as int + * @return hours float + */ + public float getHour(int day) { + return ((this.hours >> (day * SHIFT)) & MASK[0]) / DECI; + } + + /** + * setHour of a given day of week. + * @param day as int + * @param hour float + */ + public void setHour(int day, float hour) { +// long encoded = ((long) (hour * DECI) | MASK[day + 1]) << day * SHIFT; +// this.hours = (this.hours & UMASK[day]) | encoded; + String hex = Integer.toHexString((int) (hour * DECI)); + long encoded = Long.parseLong(hex, HEX_BASE) << (day * SHIFT); + this.hours = (this.hours & UMASK[day]) | encoded; + } + + /** + * main test encode decode. + * @param args unused + */ + public static void main(String[] args) { + final Long n = 0X321420372d0b20L; + + TimeSheetRow t = new TimeSheetRow( + 0, + "Test", + 3.2f, 1.1f, 4.5f, 5.5f, 3.2f, 2.0f, 5.0f + ); + + System.out.println(Long.toHexString(t.getHours())); +// t.setHour(2, 3.2f); +// t.setHour(4, 5.5f); + for (int i = 0; i < 7; i++) { + t.setHour(i, 3.0f); + System.out.print(t.getHour(i) + " "); + } + } +} diff --git a/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRowTest.java b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRowTest.java new file mode 100644 index 0000000..95126a6 --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetRowTest.java @@ -0,0 +1,14 @@ +package ca.bcit.comp1510.assignment3.q2; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class TimeSheetRowTest { + + @Test + void test() { + fail("Not yet implemented"); + } + +} diff --git a/src/ca/bcit/comp1510/assignment3/q2/TimeSheetTest.java b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetTest.java new file mode 100644 index 0000000..a0a05bb --- /dev/null +++ b/src/ca/bcit/comp1510/assignment3/q2/TimeSheetTest.java @@ -0,0 +1,14 @@ +package ca.bcit.comp1510.assignment3.q2; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class TimeSheetTest { + + @Test + void test() { + fail("Not yet implemented"); + } + +}