FRQs
2019 FRQ 1 - Methods and Control Structures
I used the website Link to run my code and check if it passed. This website has good resources for APCSA prompts
- The APCalendar class contains methods used to calculate information about a calendar. You will write two
methods of the class.
public class APCalendar
{
/ Returns true if year is a leap year and false otherwise. /
private static boolean isLeapYear(int year)
{ / implementation not shown */ }
/ Returns the number of leap years between year1 and year2, inclusive.
- Precondition: 0 <= year1 <= year2 / public static int numberOfLeapYears(int year1, int year2) { / to be implemented in part (a) */ } /** Returns the value representing the day of the week for the first day of year,
- where 0 denotes Sunday, 1 denotes Monday, ..., and 6 denotes Saturday. / private static int firstDayOfYear(int year) { / implementation not shown */ } /** Returns n, where month, day, and year specify the nth day of the year.
- Returns 1 for January 1 (month = 1, day = 1) of any year.
- Precondition: The date represented by month, day, year is a valid date. / private static int dayOfYear(int month, int day, int year) { / implementation not shown */ } /** Returns the value representing the day of the week for the given date
- (month, day, year), where 0 denotes Sunday, 1 denotes Monday, ...,
- and 6 denotes Saturday.
- Precondition: The date represented by month, day, year is a valid date. / public static int dayOfWeek(int month, int day, int year) { / to be implemented in part (b) */ } // There may be instance variables, constructors, and other methods not shown. }
Part A
Write the static method numberOfLeapYears, which returns the number of leap years between year1 and year2, inclusive.
In order to calculate this value, a helper method is provided for you.
- isLeapYear(year) returns true if year is a leap year and false otherwise.
Complete method numberOfLeapYears below. You must use isLeapYear appropriately to receive full credit.
/** Returns the number of leap years between year1 and year2, inclusive.
Precondition: 0 <= year1 <= year2 */
public static int numberOfLeapYears(int year1, int year2)
//PART A
import java.util.Calendar;
import java.util.GregorianCalendar;
public class APCalendar
{
/** Returns the number of leap years between year1 and year2, inclusive.
* Precondition: 0 <= year1 <= year2
*/
public static int numberOfLeapYears(int year1, int year2)
{
int numLeapYears = 0;
for(int i =year1 ; i <= year2; i++ ){ //loops while i (year1) <= year2
if (isLeapYear(i)){
numLeapYears = numLeapYears + 1; //adds one every time there is a leap year
}
else { //else does nothing
}
}
return numLeapYears;
}
/** Returns true if year is a leap year and false otherwise. */
private static boolean isLeapYear(int year)
{
return new GregorianCalendar().isLeapYear(year);
}
public static void main(String[] args)
{
int answer = APCalendar.numberOfLeapYears(2000, 2050);
System.out.println("Your answer should be 13: " + answer);
}
}
Part B
Write the static method dayOfWeek, which returns the integer value representing the day of the week for the given date (month, day, year), where 0 denotes Sunday, 1 denotes Monday, ..., and 6 denotes Saturday. For example, 2019 began on a Tuesday, and January 5 is the fifth day of 2019. As a result, January 5, 2019, fell on a Saturday, and the method call dayOfWeek(1, 5, 2019) returns 6.
As another example, January 10 is the tenth day of 2019. As a result, January 10, 2019, fell on a Thursday, and the method call dayOfWeek(1, 10, 2019) returns 4.
In order to calculate this value, two helper methods are provided for you.
- firstDayOfYear(year) returns the integer value representing the day of the week for the first day of year, where 0 denotes Sunday, 1 denotes Monday, ..., and 6 denotes Saturday. For example, since 2019 began on a Tuesday firstDayOfYear(2019) returns 2.
- dayOfYear(month, day, year) returns n, where month, day, and year specify the nth day of the year. For the first day of the year, January 1 (month = 1, day = 1), the value 1 is returned. This method accounts for whether year is a leap year. For example, dayOfYear(3, 1, 2017) returns 60, since 2017 is not a leap year, while dayOfYear(3, 1, 2016) returns 61, since 2016 is a leap year.
import java.util.Calendar;
import java.util.GregorianCalendar;
public class APCalendar
{
/** Returns the value representing the day of the week for the given date
* (month, day, year), where 0 denotes Sunday, 1 denotes Monday, ...,
* and 6 denotes Saturday.
* Precondition: The date represented by month, day, year is a valid date.
*/
public static int dayOfWeek(int month, int day, int year)
{
int divisor = 7;
/*
divides by seven and uses remainder to determine what day of the week it is
int day1 = 7; //sunday
int day2 = 8; //monday
int day3 = 9; //tuesday
*/
int daysIntoYear = firstDayOfYear(year) + dayOfYear(month, day, year) -1;
/*
Adds the first day of the year, and then how many days its been in the year.
Then, you must subtract 1 since day of year includes the first day, so it would be an extra day
*/
int dayOfWeek = daysIntoYear % divisor;
return dayOfWeek;
}
public static void main(String[] args)
{
int answer = APCalendar.dayOfWeek(1, 8, 2019);
System.out.println("Your answer should be 2: " + answer);
}
/** Returns the value representing the day of the week for the first day of year,
* where 0 denotes Sunday, 1 denotes Monday, ..., and 6 denotes Saturday.
*/
private static int firstDayOfYear(int year)
{
GregorianCalendar gc = new GregorianCalendar(year, Calendar.JANUARY, 1);
return gc.get(Calendar.DAY_OF_WEEK) - 1;
}
/** Returns n, where month, day, and year specify the nth day of the year.
* Returns 1 for January 1 (month = 1, day = 1) of any year.
* Precondition: The date represented by month, day, year is a valid date.
*/
private static int dayOfYear(int month, int day, int year)
{
GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
return gc.get(Calendar.DAY_OF_YEAR);
}
}
/*
* Should return 13.
*/