📚Study Note/JAVA

[ JAVA ] 배열을 활용한 만능달력

칠칠라 2021. 3. 27. 22:57

 ● 다음과 같은 프로그램을 구현한다. 

실행 예)
『연도』 를 입력하세요 : 2021
『월』 을 입력하세요  : 7

 
 

 

 

 

 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.IOException;

 
 public class Test100
 {
	 public static void main(String[] args) throws IOException
	 {
		 //BufferedReader 클래스 인스턴스 생성
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		 // 배열 선언 및 초기화
		 // 각 달이 담고있는 마지막 날짜 (매 월의 최대 날짜)

		 int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31 };
		 //System.out.println(days.length);  //12출력됨.


		 //주요 변수 선언
		 int nalsu, y, m, w; //날수, 년, 월, 요일 

		 

		 do
		 {
				System.out.print("『연도』 를 입력하세요 : ");
				y = Integer.parseInt(br.readLine());
		 }
		 while (y < 1);

		 
		 do
		 {
			  System.out.print("『월』 을 입력하세요 : ");
		      m = Integer.parseInt(br.readLine());

		 }
		 while (m<1 || m>12);


		 // 입력받은 년도에 해당하는 2월의 마지막 날 계산

		 if ((y%4==0) && (y%100!=0) || (y%400)==0) //윤년이라면
		 {
			 days[1] = 29;
		 }
		 else
		 {
			days[1] = 28;

		 }

		 // -- else 구문은 현재 days 배열의 1번째 요소가 기본적으로 28로 입력되어잇는 상태이기 때문에 생략이 가능한 구문이 된다.
		 //1년 1월 1일 ~ 입력받은년도 이전년도의 12월 31일 까지의 
		 //날 수 계산

		 nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400;

		 // 입력받은 년 월의 이전 월까지의 날 수 누적 연산


		 for (int i=0; i<m-1; i++)
		 {
			 nalsu += days[i];

		 }

		 // 확인 
		 // System.out.println(nalsu);

		 //입력받은 월의 1일

		 nalsu +=1; //++nalsu;

		 // System.out.println(nalsu);

		 // 요일 산출

		 // : 입력 받은 월의 1일이 무슨 요일인지 확인하기 위한 연산

		 w = nalsu % 7;  // 0 : 일요일  1: 월요일  2:화요일  3: 수요일 .... 6: 월요일

		 //System.out.println(w);

		 // 출력 (달력그리기)


		 System.out.println();

		 System.out.printf("\t [%5d년 %2d월 ]\n", y, m);
		 System.out.println();
		 System.out.println("  일  월  화  수  목  금  토");
		 System.out.println("=============================");

		 // 특정 요일부터 1일이 출발할 수 있도록 공백 발생(지정)
		
			
 

		 for (int i=1; i<=w; i++)
			 System.out.print("    ");

		 


		 for (int i=1; i<=days[m-1]; i++)
		 {
			 System.out.printf("%4d",i);
			 w++;

			 if (w%7==0)
			 {
				 System.out.println(); //개행
			 }

		 }

		 //달의 마지막 날짜가 출력 형식을 모두 채웠을 경우 이미 일요일 개행이 
		 //이뤄졌기 때문에 이 경우에는 추가 개행을 하지 않도록 처리


		 if(w%7!=0) System.out.println();
		

		 
		 System.out.println("=============================");

		
	 }
 }