如果错误,如何让程序多次询问输入日期

时间:2016-02-26 01:44:13

标签: java loops calendar

我试图修复这个程序,

编写一个Java程序,显示1900年到2099年之间任何一年中任何一个月的日历。

该计划必须:
1.使用有意义的消息提示用户特定月份。

  1. 如果输入值是有效日期(即指定所需月份的3个字符(即JAN,FEB,...,以大写和小写字母组合的任意组合,后跟空格和1900到2099之间的整数) ),然后必须显示给定日期的日历
  2. 2.1。如果输入值不是有效日期,则必须通知用户日期不可接受,然后再次提示其他日期。如果给出超过三个连续的错误日期,则必须以适当的错误消息终止程序。

    2.2。显示日历后,程序必须询问用户是否想要输入另一个日期(是否要继续?)

    2.3。用户必须以小写和大写字母的任意组合回答是,否,y或n

    2.4。如果给出无效答案,则必须通知用户答案不可接受,然后再次提示其他答案。如果给出超过三个连续的错误答案,则必须使用适当的错误消息终止程序

    2.5。如果步骤2.2中的答案是“是”(以任何允许的形式),则程序必须从步骤1继续。如果答案为“否”(以任何允许的形式),程序必须以一条消息终止,通知程序正常终止。

    1. 所有输入必须使用扫描仪对象完成,即扫描仪kb = new Scanner(System.in);

    2. 所有输出都应使用System.out.print或System.out.println

    3. 完成

      到目前为止,我已经达到2.1我的程序中的if语句告诉用户日期是错误的但是我正在努力如何向用户询问另一个日期,以及用户是否一直在做错误的日期在终止程序之前这3次,如果用户输入正确的日期,则继续打印日历。

      这是我到目前为止所拥有的

      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 int getDaysIn(int month, int year) {
          switch (month) {
              case 1:
                  return 31;
              case 2:
                  if (isLeapYear(month)) {
                      return 28;
                  } else {
                      return 29;
                  }
              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 boolean isLeapYear(int year) {
          int month = 0;
          int s = getDaysIn(month, year);
          return year % 4 == 0 && (year % 100 != 0) || (year % 400 == 0);
      }
      
          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(i, year);
          }
          int startday = (days % 7) + 2;
          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 scan = null;
          Scanner kb = new Scanner(System.in);
          System.out.print("Give the first three letters of a month and enter the year: ");
          System.out.print(" ");
          String month;
          int year;
          month = kb.next();
          year = kb.nextInt();
          int yearno = year;
          int monthno = getMonthNumber(month);
          if (year > 2099) 
              System.out.println("                 Invalid Year!");
      
          if (year < 1900);
              System.out.println("                 Invalid Year!"); 
      
      
      
           System.out.println();
          displayCalendar(monthno, yearno);
          System.out.println();
          System.out.println();
          System.out.println("Do you want to continue? y/n ");
      

      如果年份错误则打印无效年份,但现在如果用户在3次尝试之一中输入正确的日期,那么在结束程序/继续之前如何再次询问3个关系。到目前为止,对于我的程序,如果用户输入有效日期,则打印正确的日历

1 个答案:

答案 0 :(得分:0)

你需要做的是循环

  int monthno = 0;
  while (monthno == 0) {
     System.out.print("Give the first three letters of a month");
     month = kb.next();
     monthno = getMonthNumber(month);          
 }

并为其他输入做同样的事情

顺便说一下,如果你在months中保留了ArrayList之旅,那么你的代码会很干净,然后只需要get来获取值。它会存在与否。