Lab 1 Feedback Marking scheme: -------------------- 1.7 / 2 -some unit tests failed; TAs, please check for errors -------------------- TA Comments: -in middleChar, the middle character is at index (s.length() / 2) for string of even and odd length -in yourAgeChecked, the address and birthYear are allowed to be equal to their respective minimum and maximum values; you are throwing an exception when they are equal to their minimum and maximum values -eclipse will fix the whitespace style errors for you -you should not include "throws" in the method header if the method throws an unchecked exception; you only do this when the method throws a checked exception -------------------- Style checker output: YOUR SUBMISSION FAILED SOME BASIC STYLE CHECKS Here is the style checker output: Starting audit... Lab1.java:135:41: '/' is not preceded with whitespace. Lab1.java:135:42: '/' is not followed by whitespace. Lab1.java:180:32: '!=' is not followed by whitespace. Lab1.java:198:19: 'if' is not followed by whitespace. Lab1.java:201:21: 'else' is not followed by whitespace. Lab1.java:201:21: '{' is not preceded with whitespace. Lab1.java:223:19: 'if' is not followed by whitespace. Lab1.java:232:19: 'if' is not followed by whitespace. Lab1.java:261:19: 'if' is not followed by whitespace. Lab1.java:264:19: 'if' is not followed by whitespace. Lab1.java:267:19: 'if' is not followed by whitespace. Lab1.java:270:19: 'if' is not followed by whitespace. Lab1.java:310:24: Unable to get class information for IllegalAddressException. Lab1.java:310:49: Redundant throws: 'IllegalBirthYearException' listed more then one time. Lab1.java:310:49: Unable to get class information for IllegalBirthYearException. Lab1.java:310:76: Redundant throws: 'IllegalBirthdaysException' listed more then one time. Lab1.java:310:76: Unable to get class information for IllegalBirthdaysException. Lab1.java:311:44: '{' is not preceded with whitespace. Lab1.java:314:24: 'if' is not followed by whitespace. Lab1.java:317:19: 'if' is not followed by whitespace. Lab1.java:320:24: 'if' is not followed by whitespace. Lab1.java:323:19: 'if' is not followed by whitespace. Lab1.java:323:47: '!=' is not preceded with whitespace. Lab1.java:417:56: Redundant throws: 'IllegalArgumentException' is unchecked exception. Lab1.java:421:52: '(' is preceded with whitespace. Lab1.java:448:58: Redundant throws: 'IllegalArgumentException' is unchecked exception. Audit done. -------------------- Unit tester output: YOUR SUMBISSION FAILED SOME UNIT TESTS Here is the test output: java -classpath .:/home/burton/work/teaching/2017F/2030/marking/lab1/_jar/* org.junit.runner.JUnitCore eecs2030.lab1.Lab1Suite JUnit version 4.12 ....................E......E.... Time: 0.338 There were 2 failures: 1) test19_1_yourAgeChecked(eecs2030.lab1.TestLab1) eecs2030.lab1.IllegalBirthYearException: Invalid Birth Year! 2) test24_middleChar(eecs2030.lab1.TestLab1) java.lang.AssertionError: middleChar(AR) failed with s = AR expected:<82> but was:<65> FAILURES!!! Tests run: 30, Failures: 2 -------------------- Your submission: package eecs2030.lab1; import java.util.List; /** * Short methods reviewing fundamental Java concepts covered in EECS1021, * EECS1022, and EECS1720 * * @author EECS2030 Fall 2017-18 * */ public class Lab1 { /** * The course name for EECS2030. */ public static final String COURSE_NAME = "Advanced Object Oriented Programming"; /** * The smallest address allowed by yourAgeChecked. */ public static final int MIN_ADDRESS = 1; /** * The greatest address allowed by yourAgeChecked. */ public static final int MAX_ADDRESS = 20000000; /** * The smallest birth year allowed by yourAgeChecked. */ public static final int MIN_BIRTH_YEAR = 1917; /** * The greatest birth year allowed by yourAgeChecked. */ public static final int MAX_BIRTH_YEAR = 2016; private Lab1() { // empty by design } /** * Returns the maximum (most positive) value that an <code>int</code> can * represent. * * @return the maximum (most positive) value that an int can represent */ public static int maxInt() { return Integer.MAX_VALUE; } /** * Returns the minimum positive value greater than zero that a * <code>double</code> can represent. * * @return the minimum positive value greater than zero that a double can * represent */ public static double minDouble() { return Double.MIN_VALUE; } /** * Removes the last two digits of a positive integer base 10 number that is * greater than <code>99</code>. * * @param n * a positive integer number greater than 99 * @return the integer produced by removing the last two digits of n */ public static int removeLastTwoDigits(int n) { return n / 100; } /** * Returns the last two digits of a positive integer base 10 number that is * greater than <code>99</code>. If the last two digits start with a * <code>0</code> then only the last digit is returned. * * @param n * a positive integer number greater than 99 * @return the last two digits of n */ public static int lastTwoDigits(int n) { return n % 100; } /** * Computes the age (in years) of a person using the following convoluted * algorithm: * * <p> * <ul> * <li>start with the person's street <code>address</code> * <li>double it * <li>add 42 to the result from the previous step * <li>multiply the previous step by 50 * <li>subtract the person's <code>birthYear</code> from the previous step * <li>subtract 50 from the previous step * <li>add the number of <code>birthdays</code> the person has had this year * to the previous step * <li>subtract 34 from the previous step * <li>the last two digits of the previous step is the age of the person * </ul> * * @param address * the person's street address number * @param birthYear * the person's birth year * @param birthdays * the number of birthdays the person has had this year (either 0 * or 1) * @return the age of the person * @pre. address is between MIN_ADDRESS and MAX_ADDRESS, * birthYear is between MIN_BIRTH_YEAR and MAX_BIRTH_YEAR, and * birthdays is 0 or 1 */ public static int yourAge(int address, int birthYear, int birthdays) { int x = ((address * 2 + 42) * 50) - birthYear - 50 + birthdays - 34; int y = Lab1.lastTwoDigits(x); return y; } /** * Compute the average of two values. * * @param a * a value * @param b * a second value * @return the average of the two values */ public static double avg(int a, int b) { double x = (0.0 + a + b)/2; return x; } /** * Returns the wind chill for air temperatures equal to or below 0 degrees * Celcius and wind velocities equal to or greater than 5 km/h. * * <p> * Wind chill is an index that indicates how cold the weather feels to the * average person when there is some wind. For example, if the air * temperature is -5 degrees Celcius and the wind chill is -15 then it means * that it feels similar to a windless day where the temperature is -15 * degrees Celcius. * * @param airTemp * the temperature in degrees Celcius * @param windSpeed * the wind speed in km/h * @return the wind chill index * @pre. airTemp is less than or equal to 0 degrees Celcius and * windSpeed is greater than or equal to 5 km/h * @see <a href="http://climate.weather.gc.ca/glossary_e.html#w"> * Environment and Climate Change Canada wind chill definition</a> */ public static double windChill(double airTemp, double windSpeed) { // "magic numbers (constants)" final double A = 13.12; final double B = 0.6215; final double C = 11.37; final double D = 0.3965; final double E = 0.16; double newSpeed = Math.pow(windSpeed, E); double windChill = (A + (B * airTemp) - (C * newSpeed) + (D * airTemp * newSpeed)); return windChill; } /** * Determine if an integer <code>x</code> is odd. * * @param x * a value * @return true if x is odd and false otherwise */ public static boolean isOdd(int x) { return x % 2 !=0; } /** * Determine if the point <code>(x, y)</code> is exactly on the perimeter of * a circle with center <code>(0, 0)</code> and having radius equal to * <code>1</code>. * * @param x * the x-coordinate of the point * @param y * the y-coordinate of the point * @return true if (x, y) is exactly on the perimeter of the unit circle, * and false otherwise */ public static boolean isOnUnitCircle(double x, double y) { //hypotenuse of x + y must = 1 double z = Math.hypot(x, y); if(z != 1) { return false; } else{ return true; } } /** * Determine if the point <code>(x, y)</code> is inside the unit square. The * unit square is the square whose sides have length 1, whose bottom left * corner has coordinates (0, 0), and whose top right corner has coordinates * (1, 1). A point on the perimeter of the unit square is considered to be * inside the square. * * @param x * the x-coordinate of the point * @param y * the y-coordinate of the point * @return true if (x, y) is inside the unit square, and false otherwise */ public static boolean isInsideUnitSquare(double x, double y) { boolean inX = false; boolean inY = false; if(x > 0 && x < 1) { inX = true; } else if (x == 1) { inX = true; } else if (x == 0) { inX = true; } if(y > 0 && y < 1) { inY = true; } else if (y == 0) { inY = true; } else if (y == 1) { inY = true; } return (inX && inY); } /** * Determine if the point <code>(x, y)</code> is outside the unit square. * The unit square is the square whose sides have length 1, whose bottom * left corner has coordinates (0, 0), and whose top right corner has * coordinates (1, 1). A point on the perimeter of the unit square is * considered to be inside the square. * * @param x * the x-coordinate of the point * @param y * the y-coordinate of the point * @return true if (x, y) is outside the unit square, and false otherwise */ public static boolean isOutsideUnitSquare(double x, double y) { boolean outX = false; boolean outY = false; if(x > 1) { outX = true; } if(x < 0) { outX = true; } if(y < 0) { outY = true; } if(y > 1) { outY = true; } return (outX && outY); } /** * A version of yourAge where the arguments are checked to ensure that * they have acceptable values. * * <p> * <code>address</code> must be greater than or equal * <code>MIN_ADDRESS</code> and less than * or equal to <code>MAX_ADDRESS</code>. * * <p> * <code>birthYear</code> must be greater than or equal * <code>MIN_BIRTH_YEAR</code> and less than * or equal to <code>MAX_BIRTH_YEAR</code>. * * <p> * <code>birthdays</code> must be equal to 0 or 1. * * @param address * the person's street address number * @param birthYear * the person's birth year * @param birthdays * the number of birthdays the person has had this year * @return the age of the person * @throws IllegalAddressException * if address is less than MIN_ADDRESS or greater than * MAX_ADDRESS * @throws IllegalBirthYearException * if birthYear is less than MIN_BIRTH_YEAR or greater * than MAX_BIRTH_YEAR * @throws IllegaBirthdaysException * if birthdays is not 0 or 1 */ public static int yourAgeChecked(int address, int birthYear, int birthdays) throws IllegalAddressException, IllegalBirthYearException, IllegalBirthdaysException { if (address <= MIN_ADDRESS){ throw new IllegalAddressException("Invalid Address"); } else if(address >= MAX_ADDRESS) { throw new IllegalAddressException("Invalid Address"); } if(birthYear <= MIN_BIRTH_YEAR) { throw new IllegalBirthYearException("Invalid Birth Year!"); } else if(birthYear >= MAX_BIRTH_YEAR) { throw new IllegalBirthYearException("Invalid Birth Year!"); } if(birthdays != 0 && birthdays!= 1) { throw new IllegalBirthdaysException("Invalid Birthdays!"); } return Lab1.yourAge(address, birthYear, birthdays); } /** * Determine if a value <code>x</code> is strictly inside the given * <code>Range</code>. A value exactly at the minimum or maximum of the * range is considered outside of the range. * * @param x * a value * @param range * a Range to check * @return the value 1 if x is strictly inside the given Range, and 0 * otherwise */ public static int contains(double x, Range range) { int result; double min = range.getMinimum(); double max = range.getMaximum(); if (x > min && x < max) { result = 1; } else { result = 0; } return result; } /** * Compares two <code>Range</code> instances by their widths. * The width of a range is equal to the maximum value of the * range minus the minimum value of the range. * * @param r1 * a Range * @param r2 * a second Range * @return the value 0 if both Range instances are equal; -1 if r1 is * narrower than r2; and 1 if r1 is wider than r2 */ public static int compareTo(Range r1, Range r2) { double w1 = r1.getMaximum() - r1.getMinimum(); double w2 = r2.getMaximum() - r2.getMinimum(); int result; if (w1 == w2) { result = 0; } else if (w1 < w2) { result = -1; } else { result = 1; } return result; } /** * Returns the course name as the string. * * @return the string equal to Lab1.COURSE_NAME */ public static String getCourseName() { return "Advanced Object Oriented Programming"; } /** * Returns a string representation of a <code>Range</code> that is different * than the one returned by <code>Range.toString</code>. * * <p> * The returned string has the form <code>"range from x to y"</code> where * x is the minimum value of the range and y is the maximum value of the * range. * * @param r * a Range instance * @return a string representation of the range */ public static String toString(Range r) { return "range from " + r.getMinimum() + " to " + r.getMaximum(); } /** * Returns the character located in the middle of the string. If * <code>s</code> has an even number of characters then the middle character * is taken to be the first character in the second half of the string * (i.e., the middle character of the string <code>"abcd"</code> is * <code>'c'</code>. * * @param s * a string of length 1 or greater * @return the middle character of s * @throws IllegalArgumentException * if s is empty */ public static char middleChar(String s) throws IllegalArgumentException { int position; int length; if (s.length() == 0) { throw new IllegalArgumentException ("Invalid String!"); } if (s.length() % 2 == 0) { position = s.length() / 2 - 1; length = 2; } else { position = s.length() / 2; length = 1; } String x = s.substring(position, position + length); char y = x.charAt(0); return y; // idk whats wrong } /** * Sorts a list of two integers so that the elements are in descending order * (largest to smallest). The size of the list remains unchanged. * * @param t * a list * @throws IllegalArgumentException * if the size of list is not equal to 2 */ public static void sort2(List<Integer> t) throws IllegalArgumentException { if (t.size() != 2) { throw new IllegalArgumentException("Invalid List Size! (Must not be 2)"); } int t0 = t.get(0); int t1 = t.get(1); if (t0 < t1) { t.set(0, t1); t.set(1, t0); } } /** * Returns the sum of the absolute value of the elements in a list. The sum * of an empty list is <code>0</code>. The method does not modify the list. * * @param t * a list * @return the sum of the absolute value of the elements in a list */ public static double sumAbsolute(List<Double> t) { double result = 0.0; for (Double elem : t) { result = result + Math.abs(elem); } return result; } /** * Replaces each string in a list with the uppercase version of the string. * The size of the list remains unchanged. For example, the method would * modify the list <code>["some", "random", "WoRdS"]"</code> to become * <code>["SOME", "RANDOM", "WORDS"]"</code>. * * @param t * a list of strings */ public static void toUpperCase(List<String> t) { String s = null; for (String elem : t) { s = elem.toUpperCase(); t.set(t.indexOf(elem), s); } } }