2013-03-14 15 views
1

该方案的指导原则遵循helper方法,并使用for循环正确

问题B:新年日期。目标:了解Switch结构,帮助器方法以及使用具有标记值的While循环。

您将设置一个名为Year2012的类来处理给定月份(mm)或一个月加一天(dd)作为整数值的日期。它具有以下get方法:1)MonthName返回一个字符串值,即本月的名称,例如9月,6月,5月等2)DaysInMonth返回当月的天数。 3)DayOfTheYear返回序号年份日期(数字在1-365之间,通常称为Julian日期)。提示,使用for循环添加每个前一个月的日期,然后添加当前月份的日期。 4)DayOfWeek,它返回一个字符串值,它是当天的名字,例如星期一,星期二等。

其中一些方法可以用作其他方法的'帮手'方法。所有方法将直接或间接使用switch语句。每种方法都会根据发送给它的值来计算返回值,因此不存在类属性,只有默认的构造函数。所有的逻辑必须包含在你自己的方法中。 (也就是说,你不会为你的逻辑使用现有的API类)。 设计一个测试应用程序,询问用户一个月和一天,然后显示月份的名称,月份的天数,这一天的这一周,以及这一天的朱利安日期。编写程序以使用While循环处理日期,直到输入标记值。多次运行程序以测试不同日期,但使用以下五个日期进行最终运行:Jan.1,Apr.18,Aug.2,Nov.28,& Dec.15。

我遇到了这个程序的某些部分的麻烦。具体使用Julian日期方法和dayofTheWeek方法。 Julian日期不断打印出1(我还没有测试过很多日期),并且是dayofTheWeek方法的辅助方法,您可以查看我的代码并查看我的问题是什么?

public String monthName(int month) 
    { 
     String mon = null; 
     switch (month) 
     { 
      case 1: 
       mon = "January"; 
       break; 
      case 2: 
       mon = "February"; 
       break; 
      case 3: 
       mon = "March"; 
       break; 
      case 4: 
       mon = "April"; 
       break; 
      case 5: 
       mon = "May"; 
       break; 
      case 6: 
       mon = "June"; 
       break; 
      case 7: 
       mon = "July"; 
       break; 
      case 8: 
       mon = "August"; 
       break; 
      case 9: 
       mon = "September"; 
       break; 
      case 10: 
       mon = "October"; 
       break; 
      case 11: 
       mon = "November"; 
       break; 
      case 12: 
       mon = "December"; 
       break; 
      default: 
       mon = "Inccorect entry"; 
       break; 
     } 
     return mon; 
    } 

    public int daysInMonth(int month) 
    { 
     int days = 0; 
     switch (month) 
     { 
      case 1: 
       days = 31; 
       break; 
      case 2: 
       days = 28; 
       break; 
      case 3: 
       days = 31; 
       break; 
      case 4: 
       days = 30; 
       break; 
      case 5: 
       days = 31; 
       break; 
      case 6: 
       days = 30; 
       break; 
      case 7: 
       days = 31; 
       break; 
      case 8: 
       days = 31; 
       break; 
      case 9: 
       days = 30; 
       break; 
      case 10: 
       days = 31; 
       break; 
      case 11: 
       days = 30; 
       break; 
      case 12: 
       days = 31; 
       break; 
      default: 
       days = 0; 
     } 
     return days; 
    } 

    public int dayOfTheYear(int month, int day) 
    { 
     int julian = 0; 
     for (int count = 1; count == month; count++) 
     { 
      julian += daysInMonth(count); 
     } 
     return julian; 
    } 

    public String dayOfWeek(int month, int day) 
    { 
     int daysSoFar = dayOfTheYear(month, day); 
     int weekDay = daysSoFar % 7; 
     String dayName = null; 

     switch (weekDay) 
     { 
      case 1: 
       dayName = "Sunday"; 
       break; 
      case 2: 
       dayName = "Monday"; 
       break; 
      case 3: 
       dayName = "Tuesday"; 
       break; 
      case 4: 
       dayName = "Wednesday"; 
       break; 
      case 5: 
       dayName = "Thursday"; 
       break; 
      case 6: 
       dayName = "Friday"; 
       break; 
      case 7: 
       dayName = "Saturday"; 
       break; 
      default: 
       dayName = "Incorrect entry"; 
     } 
     return dayName;  
    } 

    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     Year2012 year = new Year2012(); 
     System.out.println("Please enter a month using integers (Jan = 1): "); 
     int month = keyboard.nextInt(); 
     System.out.println("Please enter a day within that month: "); 
     int day = keyboard.nextInt(); 

     System.out.println("Month: " + year.monthName(month)); 
     System.out.println("Number of days in month: " + year.daysInMonth(month)); 
     System.out.println("Day of the week: " + year.dayOfWeek(month, day)); 
     System.out.println("Julian date: " + year.dayOfTheYear(month, day)); 

    } 
} 
+0

@jzworkman:请不要将标签“作业”添加到问题中;它已经过时并正在被删除。 – geoffspear 2013-03-14 18:46:53

+0

@Wooble我不知道,直到它被删除我怎么知道这一点?有没有讨论为什么这是在某个地方完成的?我知道社区不愿直接为人做功课,所以我很好奇这将如何进行下去。 – jzworkman 2013-03-18 15:11:25

+0

@jzworkman:http://meta.stackexchange.com/questions/147100/trogdor-ate-my-homework-tag(它也在标签的wiki标签中)。当你去添加标签时,它应该弹出提到它已经过时的描述。 – geoffspear 2013-03-18 15:13:29

回答

3

你在设置茱莉安值的for循环中弄错了。试试这个:

int julian = 0; 
for (int count = 1; count < month; count++) 
{ 
julian += daysInMonth(count); 
} 
return julian + day; 

这个循环使用<个月而不是计数==月计数。它还会返回朱连+日

2

你的循环条件是count == month

public int dayOfTheYear(int month, int day) 
{ 
    int julian = 0; 
    for (int count = 1; count == month; count++) 
    { 
     julian += daysInMonth(count); 
    } 
    return julian; 
} 

这意味着当month输入为1,然后只有一次循环体将只执行。你的意思是count < month

+1

不要忘记添加当前月份的天数。 – Marvo 2013-03-14 17:40:53

+0

是的,这正是我的意思,比尔,谢谢!和马尔沃,只是在我找出循环部分后再添加该部分,谢谢提醒。愚蠢的错误... – Matt 2013-03-14 17:43:25

+0

@ user2089277是的,Marvo是对的。如果您从当前月份开始添加日期,那么我认为您要使用'<而不是'<='。 – 2013-03-14 17:44:38

3

您在朱利安值计算中有几个问题。试试这个:

public int dayOfTheYear(int month, int day) 
{ 
    int julian = 0; 
    for (int count = 1; count < month; count++) //note this loop will not run for Jan(as the logic below will cover that 
    { 
     julian += daysInMonth(count); 
    } 
    julian += day; 
    return julian; 
} 

这个循环使用计数<个月,而不是数月==,然后返回答案之前增加了天从输入。

请注意,此循环将不会运行于Jan,因为在这种情况下,您只需添加输入的日期。

+0

刚刚纠正了一月份,谢谢! – Matt 2013-03-14 17:44:39