2015-10-16 3 views
0

Мне нужно создать программу, чтобы я мог ввести 3 буквы плюс год, например «jan1999» и отобразить календарь.Может кто-нибудь помочь мне исправить эту программу

Программа должна:

  1. Подскажи пользователь за определенный месяц с содержательным сообщением.

  2. Если входное значение является допустимой датой (т. Е. 3 символа, обозначающие нужный месяц (т.е. JAN, FEB, ...) в любой комбинации нижних и букв верхнего регистра, за которыми следует пробел и целое число между 1900 и 2099), то должен быть отображен календарь на указанную дату.

  3. (или 2BIS) Если входное значение не является допустимой датой, пользователь должен быть проинформирован о том, что дата не была приемлемой, а затем запрашивается снова для . Если более трех последовательных ошибочных дат указаны в , программа должна быть прервана с соответствующей ошибкой .

package assignment.pkg2; 

import java.util.Scanner; 

public class Assignment2 { 
    public static int getMonthNumber(String s) { 
     if (s.equalsIgnoreCase("jan")) { 
      return 1; 
     } 
     if (s.equalsIgnoreCase("feb")) { 
      return 2; 
     } 
     if (s.equalsIgnoreCase("mar")) { 
      return 3; 
     } 
     if (s.equalsIgnoreCase("apr")) { 
      return 4; 
     } 
     if (s.equalsIgnoreCase("may")) { 
      return 5; 
     } 
     if (s.equalsIgnoreCase("jun")) { 
      return 6; 
     } 
     if (s.equalsIgnoreCase("jul")) { 
      return 7; 
     } 
     if (s.equalsIgnoreCase("aug")) { 
      return 8; 
     } 
     if (s.equalsIgnoreCase("sep")) { 
      return 9; 
     } 
     if (s.equalsIgnoreCase("oct")) { 
      return 10; 
     } 
     if (s.equalsIgnoreCase("nov")) { 
      return 11; 
     } 
     if (s.equalsIgnoreCase("dec")) { 
      return 12; 
     } else { 
      System.out.println("Not valid month!"); 
     } 
     return 0; 
    } 

    public static boolean isLeapYear(int year) { 
     int month = 0; 
     int s = getDaysIn(month, year); 
     return year % 4 == 0 && (year % 100 != 0) || (year % 400 == 0); 
    } 

    public static int getDaysIn(int month, int year) { 
     switch (month) { 
      case 1: 
       return 31; 
      case 2: 
       if (isLeapYear(month)) { 
        return 29; 
       } else { 
        return 28; 
       } 
      case 3: 
       return 31; 
      case 4: 
       return 30; 
      case 5: 
       return 31; 
      case 6: 
       return 30; 
      case 7: 
       return 31; 
      case 8: 
       return 31; 
      case 9: 
       return 30; 
      case 10: 
       return 31; 
      case 11: 
       return 30; 
      case 12: 
       return 31; 
      default: 
       return -1; 
     } 
    } 

    public static String getMonthName(int month) { 
     switch (month) { 
      case 1: 
       return "January"; 
      case 2: 
       return "February"; 
      case 3: 
       return "March"; 
      case 4: 
       return "April"; 
      case 5: 
       return "May"; 
      case 6: 
       return "June"; 
      case 7: 
       return "July"; 
      case 8: 
       return "August"; 
      case 9: 
       return "September"; 
      case 10: 
       return "October"; 
      case 11: 
       return "November"; 
      case 12: 
       return "December"; 
      default: 
       return "Invalid month."; 
     } 
    } 

    public static int getStartDay(int month, int year) { 
     int days = 0; 
     for (int i = 1900; i < year; i++) { 
      days = days + 365; 
      if (isLeapYear(i)) { 
       days = days + 1; 
      } 
     } 
     for (int i = 1; i < month; i++) { 
      days = days + getDaysIn(month, year); 
     } 
     int startday = (days + 1) % 7 + 1; 
     return startday; 
    } 

    public static void displayCalendar(int month, int year) { 
     String monthName = getMonthName(month); 
     int startDay = getStartDay(month, year); 
     int monthDays = getDaysIn(month, year); 

     System.out.println(" Sun Mon Tue Wed Thu Fri Sat"); 
     int weekDay = startDay - 1; 
     for (int i = 1; i <= startDay; i = i + 1) { 
      System.out.print(" "); 
     } 
     for (int x = 1; x <= monthDays; x++) { 
      weekDay = weekDay + 1; 
      if (weekDay > 7) { 
       System.out.println(); 
       weekDay = 1; 
      } 
      System.out.format(" %3d", x); 
     } 
     if (weekDay > 7) { 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args) { 
     Scanner c = new Scanner(System.in); 
     System.out.print("Give the first three letters of a month and enter the year: "); 
     String month, year; 
     month = c.next(); 
     year = c.next(); 
     int yearno = Integer.parseInt(year); 
     int monthno = getMonthNumber(month); 
     displayCalendar(monthno, yearno); 
     System.out.println(); 
     System.out.println("Do you want to continue? y/n "); 
    } 
} 
+0

Вы можете прочитать на DateFormat/SimpleDateFormat –

+0

что вы имеете в виду? – hhhh

+0

Это уменьшит размер вашего кода, так как он может подтвердить ваш jan1999 для действительности. Функции даты/времени содержат более интересные вещи, такие как класс Calendar .... –

ответ

1

Большая часть кода легко, трюк заключается в проверке ввода действительной датой в указанном формате. Вы можете сделать это с помощью класса YearMonth. Затем вы можете создать класс Calendar.

Если вы используете Java 8, попробуйте следующее:

String myInputString = null; 

    try 
    { 
     BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in)); 
     myInputString = bufferRead.readLine(); 
    } 
    catch(Exception e) 
    { 
     System.out.print(e); 
    } 

    YearMonth myYM = null; 
    Calendar calendar = null; 

    try 
    { 
     DateTimeFormatterBuilder fmb = new DateTimeFormatterBuilder(); 
     fmb.parseCaseInsensitive(); 
     fmb.append(DateTimeFormatter.ofPattern("MMM yyyy")); 

     DateTimeFormatter formatter = fmb.toFormatter(); 

     myYM = YearMonth.parse(myInputString.trim(), formatter); 
     calendar = new GregorianCalendar(); 
     calendar.clear(); 
     calendar.set(myYM.getYear(), myYM.getMonthValue(), 1); 
    } 
    catch(DateTimeParseException e) 
    { 
     // Invalid date format 
     System.out.println(e); 
    } 
} 
1

Вы можете использовать Java Calendar.

public void display(int year, int month){ 
    Calendar car = Calendar.getInstance(); 
    car.set(Calendar.YEAR, year); 
    car.set(Calendar.MONTH, month); 
    car.set(Calendar.DAY_OF_MONTH, 1);  
    print(String.format("%" + 23 + "s", new SimpleDateFormat("MMM/yyyy").format(car.getTime()))+"\n"); 
    print(String.format("%" + 5 + "s", "Su")); 
    print(String.format("%" + 5 + "s", "Mo")); 
    print(String.format("%" + 5 + "s", "Tu")); 
    print(String.format("%" + 5 + "s", "We")); 
    print(String.format("%" + 5 + "s", "Th")); 
    print(String.format("%" + 5 + "s", "Fr")); 
    print(String.format("%" + 6 + "s", "Sa\n")); 
    for(int i=1;i<car.get(Calendar.DAY_OF_WEEK);i++){ 
     print(String.format("%" + 5 + "s", "")); 
    } 
    for(int i = 1;i<=LastDayOfMonth(month, year);i++){ 
     if(car.get(Calendar.DAY_OF_WEEK)==7){ 
      print(String.format("%" + 6 + "s", i+"\n")); 
     }else{ 
      print(String.format("%" + 5 + "s", i)); 
     } 
     car.set(Calendar.DAY_OF_YEAR, car.get(Calendar.DAY_OF_YEAR)+1); 
    } 
} 

public void print(String s){ 
    System.out.print(s); 
} 
public boolean isLeapYear(int year){ 
    return ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)); 
} 
public int LastDayOfMonth(int month, int year){ 
    if(month == 1){//February 
     if(this.isLeapYear(year))return 29; 
     else return 28; 
    }else if(month==0||month==2||month==4||month==6||month==7||month==9||month==11){ 
     return 31; 
    }else{ 
     return 30; 
    } 
}</p> 

Примечание: первый месяц года в ява календарей января, который равен 0. Eg календарь на январь 2015 display(2015, 0)

Если вы хотите, чтобы подтвердить дату, вы можете сделать это перед вызовом функция отображения.

Result

+0

это отлично работает, но я думаю, что это вне спецификации.эти методы, мы должны включать в себя: государственный статической силе displayCalendar (интермедиат месяц, внутр год) открытых статические INT getMonthNumber (String S) открытого статических INT getDaysIn (интермедиат месяца, внутр года) общественности статической булевых ISLEAPYEAR (интермедиат год) общественности статической строки getMonthName (интермедиат месяц) открытые статические INT getStartDay (интермедиат месяц, внутр год) – hhhh

+0

на данный момент, Se песни, и я дал вам много информации, которую вы можете использовать, чтобы закончить это проект. Вам нужно немного переделать наши примеры, чтобы они соответствовали вашим потребностям. Попробуйте. Если у вас есть проблемы, вы не можете решить пост. –

+0

Спасибо Джим Арчер, я видел, что ваш код работает над проверкой даты. Итак, я просто написал способ отображения календаря. Мария Андреа Эррамус благодарит за ваши отзывы, если вам нужно подтвердить дату, которую вы можете проверить на примере Джима Арчера. Я закончу это, если я достаточно свободен. –

Смежные вопросы