[구조] 자바 달력소스 - 고객문의



고객문의

[구조] 자바 달력소스

페이지 정보

작성자 최고관리자 작성일17-12-04 15:13 조회58회 댓글0건

본문

package preparation;

import java.util.Scanner;

import javax.swing.plaf.synth.SynthToggleButtonUI;

// X년 X월의 달력 출력하기

// 달력의 시작은 1년 1일. 1년 1일은 월요일이다.
// 달력을 출력하는 원리는 다음과 같다
// 2017년 1월의 달력을 출력하려면
// 먼저 그 전달까지의 일수의 합을 구해야 한다. 
// 즉 2016년 12월 31일까지의 모든 날수를 구한다.
// 단 윤년의 경우 1년이 366일이다. 
// 2016년까지의 모든 날수가 X라고 하면 
// X % 7 이  2016년 12월 31일의 요일이다. 
// (0 일요일, 1 월요일, 2 화요일, 3 수요일...6 토요일) 
// 예) 2017년 1월 출력해보기
// 2016년 12월 31일 까지의 날수 736329   736329 % 7 = 6  
// 즉 2016년 12월 31일은 토요일 , 따라서 2017년 1월 1일은 일요일
// 결과 
// SU  MO  TU  WE  TH  FR  SA
//  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월    2월     3월     4월     5월    6월     7월     8월    9월    10월    11월     12월
//31   28   31   30   31   30   31   31   30   31    30    31   [평년]
//31   29   31   30   31   30   31   31   30   31    30    31   [윤년]
//위 정보를 고려하여 X년 X월의 달력 출력하기


public class PrintCalendar {

 private static Scanner scan;
 public static void main(String[] args) {  
  int yearResult;
  int i,j;
  int sum = 0; //1년 일수의 모든합.  
  int inputYear = setYear(); //년도를 받아오는 메소드
  int inputMonth = setMonth(); //달을 받아오는 메소드
  
  //입력받은 일수보다 한해 적은 년도로 계산시작
  for(i = 1; i <= inputYear-1; i++){
   
   boolean result = leepYearResult(i); //윤년인지 아닌지 체크
   if(result){
    yearResult = 366; //윤년은 366일
   }
   else{
    yearResult = 365; //윤년은 365일
   }
   sum = sum + yearResult; //1~n-1 년까지의 일수
  }
  
  int lastWeek = sum % 7; //마지막 요일 구함
  
  //이제 달력 루프 시작
  System.out.printf(" ");
  //요일 부터 출력.
  for(i = 0; i < 7; i++){
   String week = weekResult(i);
   System.out.printf("%4s ",week); 
  }
  System.out.printf("\n");
  
  boolean result = leepYearResult(inputYear); //입력받은 년도의 윤년계산.
  int leepInt = 0;
  
  if(result){
   leepInt = 29;
  }
  else{
   leepInt = 28;   
  }
  //윤년은 2월달에 1하루가 더생김 //달마다의 일수를 배열에 넣어줌.
  int setMonthArr[] = {31,leepInt,31,30,31,30,31,31,30,31,30,31};  
  int setMonth = inputMonth; //달
  
  for(i = 0; i < setMonth-1; i++){
   sum = sum + setMonthArr[i]; //1월 달만 입력받는게 아니기때문에 다음달로 넘길시 마지막 요일을 다시구함.  
  }
  
  lastWeek =  sum % 7; //마지막달의 요일계산
  int firstWeek = lastWeek;
  
  //마지막 요일이 토요일일 경우엔 공백이 필요없음.
  //ex) 0:일 / 1:월 / 2:화 / 3:수 / 4:목 / 5:금 / 6:토 
  if(firstWeek < 6){ 
   for(i = 0; i <= firstWeek; i++){   
    System.out.printf("    ");   
   }
  }
  
  firstWeek++; //시작하는 달의 첫번째 요일을 구하기위해 하루더해줌.
  //2월달은 3이기때문에 수요일부터
  //2월달은 수요일부터 시작함.
  for(j = 1; j <= setMonthArr[setMonth-1]; j++){    
   System.out.printf("%4d",j);
   
   firstWeek++; 
   //첫번째 요일의 숫자만큼 plus 시켜주며 7의 배수가 됫을때 줄바꿈을 해줌
   
   if(firstWeek%7 == 0){    
    System.out.println();    
   }
  }  
  
  System.out.println();
  
 }
 
 public static boolean leepYearResult(int year) //윤년을 구하는 메소드.
 {
  
  boolean result = false;    
  boolean year_4 = year % 4 == 0; //나머지가 0이면 윤년임..  
  boolean year_400 = year % 400 == 0; //400으로 나누어지는해 값이 0이면 윤년  
  boolean year_100 = year % 100 == 0; //100의 배수  
  
  if(year_4 && !year_100 || year_400){   
   result = true;      
  }   
  
  return result;
  
 }
 
 public static String weekResult(int lastweek) // 요일을 구해주는 메소드.

 {
  String week = null;
  //SU  MO  TU  WE  TH  FR  SA
  switch(lastweek){
   case 0: week = "일"; break;
   case 1: week = "월"; break;
   case 2: week = "화"; break;
   case 3: week = "수"; break;
   case 4: week = "목"; break;
   case 5: week = "금"; break;
   case 6: week = "토"; break; 
  }
  return week;
  
 }
 
 public static int setYear() 
 {
  scan = new Scanner(System.in);
  System.out.print("년도를 입력해주세요.: ");
  
  int year = scan.nextInt();
  
  if(year <= 2016){
   System.out.println("2016년도는 입력하실수 없습니다.");
   setYear();   
  } 
  
  return year;  
 }
 public static int setMonth()
 {
  scan = new Scanner(System.in);  
  System.out.print("달을 입력해주세요.: ");
  
  int month = scan.nextInt();
  
  return month;
 }
}

 

댓글목록

등록된 댓글이 없습니다.


아웅-_-
회사소개 개인정보취급방침 서비스이용약관 관리자
모바일 버전으로 보기