📚 Study/Java

JAVA :: Test105_만년 달력 프로그램 구현

bono-hye 2023. 9. 13. 17:45

○ 실습

 

다음과 같은 기능의 프로그램을 구현한다.

 

실행 예)

『연도』 를 입력하세요 : 2023

『월』을 입력하세요 : 9

 

[ 2023 9월 ]

일   월   화   수   목   금   토

=======================

                                  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

=======================

 

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

public class Test105
{
	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};
		// 배열인덱스 0   1   2   3   4   5   6    7   8   9   10  11
		// 월         1   2   3   4   5   6   7   8   9    10  11 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);


		//-- 입력받은 월이 1보다 적거나 12보다 큰 경우 다시 입력받기~~!!!

		//-------------------------------- 여기까지 수행하면 유효한 연도와 월을 사용자로부터 입력받은 상태

		// 입력받은 연도에 해당하는 2월의 마지막 날 계산
		if ((y%4==0 && y%100!=0 || y%400==0))		//-- 윤년이라면...
		{
			days[1] = 29;
		}
		// else 구문은
		// 현재 days 배열의 1번째 요소(2월)가 28일로 구성되어 있는 상태이기 때문에
		// 생략이 가능한 구문이 된다.

		// 1년 1월 1일 ~ 입력받은 연도의 이전 년도 12월 31일 까지의 날 수 계산
		nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400;

		// 입력받은 연도(해당 연도) 1월 1일 ~ 입력한 월의 이전 월까지의 날 수 계산
		for (int i=0; i<(m-1); i++)
		{
			nalsu += days[i];
		}

		// 입력받은 월의 1일을 날 수 누적 연산
		nalsu += 1;			// ++nalsu;

		//-------------------------------- 여기까지 수행하면 모든 날 수에 대한 종합 처리 완료

		// 요일 확인
		//-- 입력받은 연의 입력 월의 1일이 무슨 요일인지 확인하기 위한 연산
		w = nalsu % 7;
		//-- w:0	→ 일요일
		//-- w:1	→ 월요일
		//-- w:3	→ 화요일
		//        :

		// 확인
		//System.out.println("w : " + w);
		//--==>> 『연도』를 입력하세요 : 2024
		//		 『월』을 입력하세요 : 5
		//		  w : 3
		//		  2024년 5월 1일은 수요일(3)이라는 의미

		//-------------------------------- 여기까지 수행하면 해당 연도 해당 월의 1일이 무슨 요일인지 확인 완료

		// 출력(달력 그리기)
			
		System.out.println();											//-- 개행
		System.out.printf("\t[ %d년 %d월 ]\n", y, m);
		System.out.println();											//-- 개행
		System.out.println("  일  월  화  수  목  금  토");
		System.out.println("============================");

		// 특정 요일부터 1일이 출발할 수 있도록 공백 발생(지정)
		for (int i=1; i<=w; i++)
		{
			System.out.print("    ");				//-- 공백 4칸 지정
		}

		// 확인
		//System.out.printf("%4d", 1);

		// 해당 월(입력한 월)의 날짜만 출력될 수 있도록 반복문 구성
		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.print("============================\n");
	}
}