JAVA

Test107.java / 만년달력 구현 / 연도와 월을 입력하여 해당 연도와 월을 출력하는 달력 프로그램 만들기

universedevelope 2022. 10. 22. 21:36
/*==========================
   ■■■ 만년달력 ■■■
===========================*/

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

// 실행 예)
// 『연도』를 입력하세요 : 2022
// 『월』을 입력하세요   : 6
/*
	[ 2020년 6월 ]
  일  월  화  수  목  금  토
 ===========================
               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
 ===========================
 계속하려면 아무 키나 누르세요...
*/ 


// 상상력 : 1 2 3 4 5 6 7 8 9 10 ~ 31
//          (루프하면서 (공백수 + 1 + i)가 7의 배수가 되면 개행을 해야한다는 상상)

//          (해당 월의 마지막날이 되면 개행을 해야된다는 상상)
import java.util.Scanner;

public class Test107
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int year, month;
		int alldays=0;
		int date;  // 무슨요일부터 담을지
		int [] days; // 해당 월에 며칠이 있는지
		int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		int n = 1;

		String [] dates = {"일", "월", "화", "수", "목", "금", "토"};


		// 사용자 입력 연, 월
		do
		{
			System.out.print("『연도』를 입력하세요 : ");
			year = sc.nextInt();
		}
		while (year<1);

		do
		{
			System.out.print("『월』을 입력하세요   : ");
			month = sc.nextInt();
		}
		while (month < 1 || month >12);
		

	
		// 연산
		if (year % 4==0 && year % 100 !=0 || year % 400 ==0)
		{
			months[1] = 29;
		}


		// 1년1월1일 ~ 입력받은 년도의 이전년도 12.31 까지의 날 수 연산
		alldays = (year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400;


		// 입력받은 연도(해당연도) 1월 1일 ~ 입력한 월의 이전 월까지의 날 수 누적 연산
		for (int i = 0;i<month-1 ;i++ )
		{
			alldays += months[i];
		}
		
		date = months[month-1];    // 입력한 월에 대한 숫자가 언제끝날지

		days = new int[date];
		


		for (int i = 0;i < days.length ;i++ )
		{
			days[i] = i+1;
		}

		date = alldays%7+1;			// 총 날 수를 7로 나눈 나머지가 0이면 일요일, 1이면 월요일
		                            // ~ 6이면 토요일
	
						
		// 결과 출력
		System.out.println();

		System.out.printf("     [ %d년 %d월 ]%n", year, month);
		for (int i =0;i<dates.length ;i++ )
		{
			System.out.printf("%3s", dates[i]);
		}
		System.out.println();
		System.out.println("===============================");
		for (int i =0;i < date ;i++ )		// 공백4칸발생 date 만큼 == 언제부터 시작할지..
		{
			System.out.print("    ");
		}

		for (int i =0;i<days.length ;i++ )
		{
			System.out.printf("%4d", days[i]);
			if ((date+i+1)%7 == 0 && i != days.length-1)
			{
				System.out.println();
			}
		}
		// 달의 마지막 날짜가 출력 형식을 모두 채웠을 경우(토요일까지 라인 출력)
		// 이미 일요일 개행이 이루어졌기 때문에
		// 이 경우에는 추가 개행을 하지 않도록 처리
		System.out.println();	// 마지막 날짜 찍고 개행
		System.out.println("===============================");
	}
}

// 실행 결과

/*
『연도』를 입력하세요 : 2022
『월』을 입력하세요   : 1
      [2022년 1월]
  일  월  화  수  목  금  토
===============================
                           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
===============================
계속하려면 아무 키나 누르십시오 . . .
*/
728x90