## Saturday, 20 August 2016

### Chapter 6 Exercise 34, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

**6.34 (Print calendar) Programming Exercise 3.21 uses Zeller’s congruence to calculate the day of the week. Simplify Listing 6.12, PrintCalendar.java, using Zeller’s algorithm to get the start day of the month.

import java.util.Scanner;

public class ProgrammingExercise6_34 {
/** Main method */
public static void main(String[] args) {
Scanner input = new Scanner(System.in);

// Prompt the user to enter year
System.out.print("Enter full year (e.g., 2001): ");
int year = input.nextInt();

// Prompt the user to enter month
System.out.print("Enter month in number between 1 and 12: ");
int month = input.nextInt();

// Print calendar for the month of the year
printMonth(year, month);
}

/** Print the calendar for a month in a year */
public static void printMonth(int year, int month) {
// Print the headings of the calendar
printMonthTitle(year, month);

// Print the body of the calendar
printMonthBody(year, month);
}

/** Print the month title, e.g., May, 1999 */
public static void printMonthTitle(int year, int month) {
System.out.println("         " + getMonthName(month) + " " + year);
System.out.println("-----------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
}

/** Get the English name for the month */
public static String getMonthName(int month) {
String monthName = "";
switch (month) {
case 1:
monthName = "January";
break;
case 2:
monthName = "February";
break;
case 3:
monthName = "March";
break;
case 4:
monthName = "April";
break;
case 5:
monthName = "May";
break;
case 6:
monthName = "June";
break;
case 7:
monthName = "July";
break;
case 8:
monthName = "August";
break;
case 9:
monthName = "September";
break;
case 10:
monthName = "October";
break;
case 11:
monthName = "November";
break;
case 12:
monthName = "December";
}

return monthName;
}

/** Print month body */
public static void printMonthBody(int year, int month) {
// Get start day of the week for the first date in the month
int startDay = getStartDay(year, month);

// Get number of days in the month
int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);

// Pad space before the first day of the month
int i = 0;
for (i = 0; i < startDay; i++)
System.out.print("    ");

for (i = 1; i <= numberOfDaysInMonth; i++) {
System.out.printf("%4d", i);

if ((i + startDay) % 7 == 0)
System.out.println();
}

System.out.println();
}

/** Get the start day of month/1/year */
public static int getStartDay(int year, int month) {

int y = year;
int m = month;
int q = 1;

// dealing with Jan and Feb
if (m == 1 || m == 2) {
m = m + 12;
y = y - 1;
}

int j = y / 100;
int k = y % 100;
int h = (q + 26 * (m + 1) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;
String day = "";

switch (h) {

case 0:
h = 6;
break;
case 1:
h = 7;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
h--;

}

return h;

}

/** Get the total number of days since January 1, 1800 */
public static int getTotalNumberOfDays(int year, int month) {
int total = 0;

// Get the total days from 1800 to 1/1/year
for (int i = 1800; i < year; i++)
if (isLeapYear(i))
total = total + 366;
else
total = total + 365;

// Add days from Jan to the month prior to the calendar month
for (int i = 1; i < month; i++)
total = total + getNumberOfDaysInMonth(year, i);

}

/** Get the number of days in a month */
public static int getNumberOfDaysInMonth(int year, int month) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
|| month == 10 || month == 12)
return 31;

if (month == 4 || month == 6 || month == 9 || month == 11)
return 30;

if (month == 2)
return isLeapYear(year) ? 29 : 28;

return 0; // If month is incorrect
}

/** Determine if it is a leap year */
public static boolean isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
}