Write a program to display the sign of the Zodiac corresponding to a birth date entered through the keyboard.
Output of Above Java Program
January 17, 2012
Enter the year: 1990
Enter the month number January is 1, December is 12: 8
Enter the day in the month: 23
August 23, 1990 is in the sign of Virgo
Do you want to try another date(Enter Y or N)?
y
Enter the year: 1992
Enter the month number January is 1, December is 12: 3
Enter the day in the month: 30
March 30, 1992 is in the sign of Aries
Do you want to try another date(Enter Y or N)?
n
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.GregorianCalendar; import java.text.DateFormat; public class ZodiacSigns { public static void main(String[] args) { System.out.println(df.format(calendar.getTime())); int day = 0; int month = 0; int year = 0; while(true) { // Read in a date System.out.print("Enter the year: "); year = readInt(); while(true){ System.out.print("Enter the month number January is 1, December is 12: "); month = readInt(); if(validMonth(--month)) // Change month to zero-based and validate break; } while(true) { System.out.print("Enter the day in the month: "); day = readInt(); if(validDay(day, month, year)) { // Verify date is valid for month and year break; } } // determine the sign calendar.set(year, month,day); // Set the calendar to the date entered // Match the year for the sign start dates for(int i = 0 ; i < signStartDates.length ; ++i) signStartDates[i].set(GregorianCalendar.YEAR, year); for(int i = 0 ; i < signStartDates.length ; ++i) if(calendar.after(signStartDates[i]) && calendar.before(signStartDates[(i+1)%signStartDates.length])) { System.out.println(df.format(calendar.getTime()) + " is in the sign of " + signs[i]); break; } // Try another date? System.out.println("Do you want to try another date(Enter Y or N)?"); if(!yes()) { break; } } } // Validate the month value private static boolean validMonth(int month) { if(month >= 0 && month <= 11) return true; else System.out.println("The month value must be from 1 to 12. Try again."); return false; } // Validate the day value for the month and year private static boolean validDay(int day, int month, int year) { /* A valid day must be: - between 1 and 31 - less than 31 when the month is April, June, September, or November - less than 29 when the month is February and it is not a leap year - less than 30 when the month is February and it is a leap year */ if (day < 0 || day > 31) { System.out.println("Day values must be between 1 and 31. Try again."); return false; } if(day > 30 && (month == 3 || month == 5 || month == 8 || month == 10)) { System.out.println("Day values must be less than 31 when the month" + " is " + MONTH_NAMES[month] + ". Try again."); return false; } if(day > 28 && month == 1 && !calendar.isLeapYear(year)) { System.out.println(year + " is not a leap year so day values must be less than 29. Try again."); return false; } if(day > 29 && month == 1 && calendar.isLeapYear(year)) { return false; } return true; } // Reads an integer from the keyboard private static int readInt() { int value = 0; while(true) { try { value = Integer.parseInt(in.readLine().trim()); return value; }catch(NumberFormatException e) { System.out.println("Invalid input. Try again."); } catch(IOException e){ System.out.println("Error reading for the keyboard." + e.getMessage()); } } } private static boolean yes() { String str = null; while(true) { try { str = in.readLine().trim(); } catch(IOException e) { System.out.println("Error reading for the keyboard." + e.getMessage()); } if(str.equalsIgnoreCase("Y")) { return true; } else if(str.equalsIgnoreCase("N")) { break; } else { System.out.print("Invalid input. Try again. Enter Y or N: "); } } return false; } private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // Keyboard input // Names for Zodiac signs and start dates. Remember - months start at zero. private static String[] signs = {"Aquarius", "Pisces", "Aries" , "Taurus", "Gemini" , "Cancer", "Leo" , "Virgo", "Libra" ,"Scorpio", "Sagittarius", "Capricorn" }; private static GregorianCalendar[] signStartDates = { new GregorianCalendar(2002, 0, 20), // Aquarius start date new GregorianCalendar(2002, 1, 19), // Pisces start date new GregorianCalendar(2002, 2, 21), // Aries start date new GregorianCalendar(2002, 3, 20), // Taurus start date new GregorianCalendar(2002, 4, 21), // Gemini start date new GregorianCalendar(2002, 5, 21), // Cancer start date new GregorianCalendar(2002, 6, 23), // Leo start date new GregorianCalendar(2002, 7, 23), // Virgo start date new GregorianCalendar(2002, 8, 23), // Libra start date new GregorianCalendar(2002, 9, 23), // Scorpio start date new GregorianCalendar(2002, 10, 22), // Sagittarius start date new GregorianCalendar(2002, 11, 22), // Capricorn start date }; private static GregorianCalendar calendar = new GregorianCalendar(); // Array defining the names of the months. // Note that DateFormatSymbols class defines an instance method, getMonths(), // that will return exactly this array of String objects. private static final String[] MONTH_NAMES = { "January" , "February", "March" , "April", "May" , "June" , "July" , "August", "September", "October" , "November", "December" }; // Date formatter for displaying dates private static DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); }
Output of Above Java Program
January 17, 2012
Enter the year: 1990
Enter the month number January is 1, December is 12: 8
Enter the day in the month: 23
August 23, 1990 is in the sign of Virgo
Do you want to try another date(Enter Y or N)?
y
Enter the year: 1992
Enter the month number January is 1, December is 12: 3
Enter the day in the month: 30
March 30, 1992 is in the sign of Aries
Do you want to try another date(Enter Y or N)?
n