试图在java中为日历类编写月份课程。

时间:2011-06-19 23:31:21

标签: java

好的,对于一个大型实验室,我必须要做的第一部分是写一个日历类,就像我在这里写的那样。这非常简单,因为我们直接指示了如何执行此操作。我将展示它,以防有问题:

import java.util.Scanner;

public class Calendar 
{ 
    static final int FEBRUARY        = 2;
    static final int MONTHS_PER_YEAR = 12;

    static int [] daysPerMonth = 
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    static String [] months =  
        {"", "  Januray", "February", "   March", "   April",
             "      May", "    June", "    July", "  August", 
            "September", " October", "November", "December"};

    public static void main(String[] args) 
    { 
        Scanner in = new Scanner(System.in); 
        System.out.print("Enter the year? (yyyy): "); 
        int year = in.nextInt(); 

        int firstDay = firstDayOfYear(year);

        // February: Check for leap year    
        daysPerMonth [FEBRUARY] = isLeapYear(year) ? 29 : 28; 

        for (int i=1; i <= MONTHS_PER_YEAR; i++) {
            Month month = new Month(daysPerMonth[i], firstDay);
            System.out.println("\n\n      "+months[i]+" "+year);
            month.printMonth();
            firstDay = month.getFirstDayOfNextMonth(); 
        }
    }

    private static boolean isLeapYear(int year) {
        return ((year%4 == 0) && (year%100 != 0)) || (year%400 == 0);
    }

    private static int firstDayOfYear(int year) {
        return (2 * (13) + (3 * (13+1)/5) + (year-1) + ((year-1)/4) 
                - ((year-1)/100) + ((year-1)/400) + 2) % 7;
    }
}

好的,这是第一堂课。我甚至开始时遇到麻烦的部分是写一个“月”课。我已经创建了这个类,并且我一直在尝试开始设置不同的方法并做类似的事情但是我真的似乎无法理解如何在一个类中设置一些东西,以便它适用于另一个类类。

以下是Month类必须要做的事情:您必须定义的Month类必须包含以下状态和行为:

STATE
月中的天数(28-31之间的整数)
月份的第一天(0-6之间的整数,太阳= 0,周一= 1,周二= 2,周三= 3,周四= 4,周五= 5,周六= 6)

行为
一个带有两个参数的标准构造函数,用于直接设置Month的状态 返回NEXT月份开始日期的方法 一种使用循环打印该月份日历的方法。也就是说,您不应该只有28组不同的println()语句直接打印日历。

我很难在java中做一些事情,因为我只是在学习语言。请不要建议我去读一本java书或类似的东西,因为我已经这样做了,这对我来说仍然只是一门外语。我非常感谢任何对此的帮助,我不是说以任何方式回答它,只是给我一些关于如何做的建议。

到目前为止,这是我的月课程

import java.util.*;
public class Month {
    Scanner sc = new Scanner(System.in);
    public static void Month(int daysPerMonth, int firstDay) {
        daysPerMonth = MONTHS_PER_YEAR
    }
}

这完全错了。我一直在尝试不同的东西,比如静态int,没有静态,内部有不同的东西,但没有什么能让我得到一个非常令人沮丧的错误。有时java很烦人,因为我的教授很糟糕,实际上并没有教授如何编写代码,只是关于计算机如何工作的事情。

2 个答案:

答案 0 :(得分:2)

以下是类布局的示例,在本例中为Month Class

月&lt; --------------- Class

daysPerMonth&lt; ----国家
firstDay&lt; ------------- State

月&lt; --------------行为
startDay&lt; ------------行为
printCal&lt; ------------行为

所以从我们需要的定义来看,

  • 两个州
  • 三种行为(包括构造函数)

这是本课程所见和所知的全部内容。所以你必须告诉班级需要知道什么。

目前您有以下

月&lt; ----------- Class

sc&lt; - State

月&lt; -----------行为

您创建了一个扫描程序对象sc,因为它没有任何行为。我们现在就把它留下来,所以删除它。我们需要的状态在图中。让我们尝试添加状态

public int daysPerMonth;

您可以尝试添加下一个。想一想上面的内容(它应该是静态的还是不是?)

现在你的构造函数不需要是静态的,它是一个修饰符,但我们现在不需要它

方法上的static修饰符意味着我们想要在不实例化对象的情况下访问方法。但你不想做对吗?我们想要实例化一个对象。所以我们删除这些标识符。现在,让我们说所有构造函数只需要以下

public CLASSNAME,其中CLASSNAME是包含此方法/构造函数的类。所以请记住,构造函数在创建时初始化一个对象,它所需要的只是与类相同并且是公共的。所以这就是构造函数的外观。

public Month(){
}

我们尝试添加他们要求的参数怎么样?

public Month(int numDaysPerMonth, int firstDay){
}

好的,现在我们需要设置我们之前制作的变量,左侧分配值,右侧分配

public Month(int daysPerMonth, int firstDay){
    this.daysPerMonth = daysPerMonth;
    // I will let you do the next one
    // Hmm what does the "this" do here?
}

这应该让你在第一行的正确开始

Month month = new Month(daysPerMonth[i], firstDay);

现在休息一下,回顾一下本节你应该知道如何使用以下

  • 构造
  • staticfinalpublic标识符
  • this

进入下一阶段,第一个与此对象的方法匹配的行为

month.printMonth();

需要注意的事项,

  1. 这是month实例的方法,因此它不应该是static方法
  2. 它不接受任何参数,因此类中的行为也应该没有参数
  3. 它未分配给任何内容,因此类中的行为应返回void
  4. 了解这些信息应该是什么样子

    public void printMonth() {
    }
    

    很空,所以由你来填补内心。这种方法的一些提示。

    帮助变量

     static String [] day = {"Sun","Mon","Tues","Wed","Thurs","Fri","Sat"};
     int nextDay;
    

    循环
    你的循环应该从1开始并以daysPerMonth

    结束

    更改日期
    只需添加1以遍历上面的帮助变量,您应该使用本地变量而不是firstDay来跟踪当前日期

    重置日期
    有很多方法可以做到这一点,我只是使用一个条件来检查当前检查日是否达到“星期六”然后重置为“太阳”

    现在当你完成整个循环时,最后一天应该是你下个月的第二天,是的!我们用一个人杀了两个行为。将值分配给nextDay

    因此,您的下一个方法只需返回nextDay,因为需要将其分配给int(在Calendar类中注明),我们需要在课程内将其匹配为井

    public int getFirstDayOfNextMonth() {
        return nextDay;
    }
    

    然后你去了,Java神秘化了。

答案 1 :(得分:0)

这是让你入门的东西。特别注意构造函数的2个参数(如指定的那样)。我也试图遵循现有Calendar课程的风格。

public class Month {

    int numDays, startDay;
    String[] days {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

    public Month(int numDays, int startDay) {
        this.numDays = numDays;
        this.startDay = startDays;
    }

    //There will likely be a quicker way of doing this (and I haven't tested it, so this might not even work. But then again, I shouldn't do everything for you!
    public int getStartDayOfNextMonth() {
        int nextDay = startDay;
        for(int i = 0; i < numDays; i++) {
            if(nextDay + 1 > days.getLength() - 1) nextDay = 0;
            else nextDay++;
        }
        return nextDay;
    }    
}