java中必需的日历程序辅助

时间:2016-03-19 16:17:26

标签: java loops for-loop calendar

以下是我的日历程序,如下所示:

public class calendar
{
    public static void main (String args[])
    {
        new calendar ();
    }


    public calendar ()
    {
    int day = IBIO.inputInt ("Enter day: ");
    int numOfDays = IBIO.inputInt ("Enter the number of days in the month: ");

    System.out.println ("S  M  T  W  T  F  S");
    if (day==1)
     {
      for (int i=1; i<=7; i++)
       {
        System.out.print (i + "  ");
       }
       }
    else if (day==2)
     {
      System.out.print ("   ");
      for (int i = 1; i <=6; i++)
      {
       System.out.print (i+"  ");
      }
      }
    else if (day==3)
     {
      System.out.print ("      ");
      for (int i = 1; i <=5; i++)
      {
       System.out.print (i+"  ");
      }
      }
    else if (day==4)
     {
      System.out.print ("         ");
      for (int i = 1; i <=4; i++)
      {
       System.out.print (i+ "  ");
      }
      }
    else if (day==5)
     {
      System.out.print ("            ");
      for (int i = 1; i <=3; i++)
      {    
       System.out.print (i+"  ");
      }
      }
    else if (day==6)
     {
      System.out.print ("               ");
      for (int i = 1; i <=1; i++)
     {
      System.out.print (i + "  ");
     }
     }
    else
     {
      System.out.print ("                  ");
      for (int i = 1; i <= 1; i++)
      {
       System.out.print (i+ "  ");
      }
     }
    }
   }

现在我要做的是扩展到这个程序,因为只输出第一行。我想要整个月输出,这必须与用户通过变量numOfDays输入的天数相对应。顺便说一句,IBIO.input是用户存储输入的方式。

3 个答案:

答案 0 :(得分:0)

根据我的理解,您试图通过将天数和开始日作为用户的输入来打印日历。

根据您编写的逻辑,它只会打印第一行,因为没有looprecursion。您应该做的是使用loop打印所有行。

以下是代码段:

public class calendar
{
    public static void main (String args[])
    {
        new calendar ();
    }

    public calendar ()
    {
        int day = IBIO.inputInt ("Enter Day (Number): ");
        int numOfDays = IBIO.inputInt ("Enter the number of days in the month: ");
        StringBuilder sb = new StringBuilder();

        System.out.println("S  M  T  W  T  F  S");
        char[] spaces = new char[(day - 1) * 3];
        Arrays.fill(spaces,' ');

        sb.append(spaces);      
        for(int i = 1; i <= numOfDays; i++) {
            if(sb.length() > 19) {
                System.out.println(sb.toString());
                sb = new StringBuilder();
            }

            sb.append(i);
            if(i / 10 < 1) {
                sb.append("  ");
            } else {
                sb.append(" ");
            }
        }
        System.out.println(sb.toString());
    }
}

输入:

Enter Day (Number): 2
Enter the number of days in the month: 31

输出:

S  M  T  W  T  F  S
   1  2  3  4  5  6  
7  8  9  10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 31 

答案 1 :(得分:0)

您的代码非常复杂。我不认为我的也是最好的,但现在是:

public calendar() {
    int day = 2;
    int numOfDays = 28;

    System.out.println("S  M  T  W  T  F  S");
    for(int i = 1; i < day; i++){
        System.out.print("   ");
    }
    for(int i = 1; i <= numOfDays; i++){
        System.out.print(addSpaces(i + "", 3));
        if((i + day - 1) % 7 == 0){
            System.out.print("\n");
        }
    }
}

public String addSpaces(String s, int length){
    while(s.length() < length){
        s+= " ";
    }
    return s;
}

尝试理解这一点,首先打印一些空格以跳过第一天,然后打印出所有日期和每第七天,它开始一个新行。

输出结果为:

S  M  T  W  T  F  S
   1  2  3  4  5  6  
7  8  9  10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 

答案 2 :(得分:0)

这是另一种变体。

static void cal( int day, int numOfDays ){
    System.out.println(" S  M  T  W  T  F  S");
    for( int d = 2 - day; d <= numOfDays; ++d ){
        System.out.print( (d <= 0 ? "  " : d <= 9 ? " " + d : d)
                          + " " );
        if( d%7 == (8-day)%7 ) System.out.println();
    }
    System.out.println();
}

这个想法有点奇闻趣事:将月份的日期延长到非积极因素以避免最初的缩进。计算打印位置并触发打印位置可以避免使用两个模运算的棘手条件。

(在构造函数中执行此类操作并不是一种好的编码习惯。)