2017-02-28 4 views
0

나는 1 년 동안 주어진 달력을 인쇄하려고합니다. 코드는 매월 정확한 날짜에 시작되지만 7 개의 숫자를 계속해서 계산하고 동일한 시작 열로 다음 줄을 반환합니다. 이 문제를 어떻게 해결할 수 있습니까?캘린더 프린터 - 각 새 줄을 반환하는 방법

여기에 내 현재 출력 :

  2017 

      January 
Sun Mon Tue Wed Thu Fri Sat 
    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 
      February 
Sun Mon Tue Wed Thu Fri Sat 
       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 

그리고 년 동안 계속됩니다. 오류가 printCalendar 메서드에 있다고 생각하지만 무엇을해야할지 모르겠다. 요일이 인쇄 된 데이터를 엉망으로 무엇을 사용하는

import java.util.Scanner; 
import java.io.*; 

public class CalendarPrinter{ 

    public static void main(String[]args)throws IOException{ 
    Scanner kbd = new Scanner(System.in); 
    System.out.println("Calendar Printer\n"); 
    System.out.print("Enter the year? "); 
    int year = kbd.nextInt(); 

    printCalendar(year); 

    System.out.println("\n" + year + ".txt generated."); 
} 

public static void printCalendar(int year) throws IOException { 
    PrintWriter outputFile = new PrintWriter(year + ".txt"); 
    outputFile.println("   " + year); 

    for(int month = 1; month <=12; month++) { 
     outputFile.println("\n   " + getMonthName(month)); 
     outputFile.println("Sun Mon Tue Wed Thu Fri Sat"); 
     int numDays = getNumberofDays(month, year); 

     for(int day = 1; day <= numDays; day++){ 
      int dayWeek = getDayofTheWeek(day, month, year); 
      for(int k = 0; k < dayWeek; k++) 
       outputFile.print(" "); 
      outputFile.printf("%3d ", day); 
      if(day % 7 == 0) { 
       outputFile.println(""); 
       dayWeek = 0; 
      } 
     } 
    } 
    outputFile.close(); 
} 

public static String getMonthName(int month){ 

    String name; 
    switch(month){ 
    case 1: name = "January"; 
    break; 
    case 2: name = "February"; 
    break; 
    case 3: name = "March"; 
    break; 
    case 4: name = "April"; 
    break; 
    case 5: name = "May"; 
    break; 
    case 6: name = "June"; 
    break; 
    case 7: name = "July"; 
    break; 
    case 8: name = "August"; 
    break; 
    case 9: name = "September"; 
    break; 
    case 10: name = "October"; 
    break; 
    case 11: name = "November"; 
    break; 
    case 12: name = "December"; 
    break; 
    default: name = "Unknown"; 
    break; 
    } 
    return name; 
    }//method 

public static int getNumberofDays(int month, int year){ 

    int numDays; 
    switch(month){ 
    case 1: 
    case 3: 
    case 5: 
    case 7: 
    case 8: 
    case 10: 
    case 12: 
     numDays = 31; 
     break; 
    case 4: 
    case 6: 
    case 9: 
    case 11: 
     numDays = 30; 
     break; 
    case 2: 
     numDays = isLeap(year)? 29:28; 
     break; 
    default: 
     numDays = 0; 
    break; 
     } 
    return numDays; 
    }//method 

public static boolean isLeap(int year){ 
    if(((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) 
     return true; 
    else 
     return false; 
    } 


public static int getDayofTheWeek(int day, int month, int year){ 

    int y = year - (14-month)/12; 
    int x = y+y/4 - y/100 + y/400; 
    int m = month + 12 * ((14-month)/12) -2; 
    int d = (day + x + (31*m)/12)%7; 
    return d; 

    }//method 

}//class 

답변

0

당신의 접근 방식 : 다음은 내 코드입니다. 이 예제에서는 임시 배열을 사용하여 일 행 (일주일에 하나의 인쇄 된 행)을 저장합니다. 한 주일의 7 일이 배열에 저장되면 전체 주를 인쇄합니다. 월 마지막 날에 이르면이 문제가 발생합니다.

for (int month = 1; month <= 12; month++) { 
     outputFile.println("\n   " + getMonthName(month)); 
     outputFile.println("Sun Mon Tue Wed Thu Fri Sat"); 
     int numDays = getNumberofDays(month, year); 

     int[] week = new int[7]; 
     for (int day = 1; day <= numDays; day++) { 
      int dayWeek = getDayofTheWeek(day, month, year); 
      week[dayWeek] = day; 

      // did we reach the 7th day of the week or the last day of the month? 
      if ((dayWeek + 1) % 7 == 0 || day == numDays) { 
       // print the week as one row 
       for (int d : week) { 
        // don't print 0 values 
        outputFile.printf("%3s ", d == 0 ? "" : d); 
       } 
       outputFile.println(""); 
       // reset the array to store a new row in the next loop iteration 
       week = new int[7]; 
      } 
     } 
     outputFile.println(""); 
    } 
관련 문제