본문 바로가기
C Programming/예제 프로그램

[C Console] 윤년을 고려하여, 내일의 날짜를 출력하는 프로그램

by 희품 2019. 6. 3.
반응형

내일의 날짜를 표출하는 프로그램

윤년?

윤년은 보통 4년에 한 번씩 찾아옵니다. 2월이 29일까지 있는 날짜라고 생각하시면 될 것 같습니다. 정확한 윤년의 공식은 4로 나누어 떨어지지만, 100으로는 나누어 떨어지지 않는 년도입니다. 1900년도는 4로 나누어 떨어지지만, 100으로도 나누어 떨어지기 때문에 윤년이 아니죠.

 

룩업테이블(LUT, Look-Up Table)

날짜를 계산하는 API, 라이브러리, 알고리즘은 다양하게 있습니다. 그중에서 룩업테이블을 만들어 프로그램을 작성해보려고 합니다.

 

순 한글로는 순람표, 대조 테이블이라고도 하는 룩업 테이블(LUT)은 자료를 다른 형태로 변환시키기 위해 컴퓨터 프로그램이 빠른 시간 내에 접근이 가능하도록 만든 자료의 대역으로 볼 수 있습니다. 특정 값을 대응시키는 키와 그에 관한 정보를 갖고 있는 표라고 보실 수 있습니다. 내일 날짜를 구하는 프로그램에서는 1월부터 12월까지의 일 수를 룩업테이블로 작성할 수 있습니다.

 

예제 프로그램 코드

내일 날짜를 표출하는 기능을 하는 PrintTomorrow() 함수를 구현하고, main 함수에서 오늘 날짜의 연도, 달, 일을 입력받아 사용하였습니다.

PrintTomorrow() 함수에서 사용된 부분 중

static int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

 

초기화 부분이 룩업테이블이라고 보시면 될 것 같습니다. 일반적으로 2월의 값이 28이지만, 윤년에는 2월의 값을 29로 바꾸어주어야 합니다.

//=============================================
/**
* @file		main.c
* @brief	내일의 날짜를 계산해서 표출하는 프로그램

* @remark	년도까지 계산에 포함하면 윤년을 고려하여 작성

* @author	fosterahope.tistory.com
*///===========================================

#include<stdio.h>

int PrintTomorrow(int y, int m, int d); ///< 오늘 날짜정보로 내일 날짜를 표출하는 함수

//==========================================================================
/**
* @brief	main 함수
* @return	int
*///========================================================================
int main(void)
{
	// 윤년이란 4로 나누어 떨어지되 100으로는 나누어 떨어지지 않는 년도이다.
	// 1904년은 윤년이지만 1900년은 윤년이 아니다.
	// 윤년에는 2월달이 29일까지 있으므로 룩업 테이블에서 읽은 값 중
	// 2월의 값을 수정한 후 사용해야 한다.
	// 년, 월, 일 정보를 모두 입력받아 윤년까지 고려해서
	// 내일 날짜를 출력하는 예제를 작성하라.

	int year = 0, mon = 0, day = 0;

	printf("오늘 날짜(년, 월, 일)을 공백으로 구분하여 입력 : ");
	scanf_s("%d %d %d", &year, &mon, &day);

	PrintTomorrow(year, mon, day);

	return 0;
}

//==========================================================================
/**
* @brief	오늘 날짜정보로 내일 날짜를 표출하는 함수

* @param	int y : [IN] 오늘 날짜의 년도
* @param	int m : [IN] 오늘 날짜의 월
* @param	int d : [IN] 오늘 날짜의 일

* @return	int : -1 - 에러, 0 - 정상
*///========================================================================
int PrintTomorrow(int y, int m, int d)
{
	static int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	// 4로 나누어 떨어지고, 100으로는 나누어 떨어지지 않는
	// 조건 검사 후 윤년을 판단하여, 룩업 테이블을 변경한다.
	if (y % 4 == 0 && y % 100 != 0)
	{
		days[2] = 29;
	}
	else if (y % 400 == 0)
	{
		days[2] = 29;
	}

	if (d > days[m] || m < 1 || m > 12 || y < 0)
	{
		printf("날짜 입력 오류 !\n");
		return -1;
	}

	d++; // 내일의 날짜이므로 1증가
	if (d > days[m]) // 마지막날보다 크면, 1일 이다.
	{
		d = 1;
		m++; // 달 증가
		if (m == 13)
		{
			m = 1;
			y++; // 마지막 달이면 년도 증가
		}
	}
	printf("내일은 %d년 %d월 %d일 입니다\n", y, m, d);
	if (days[2] == 29)
	{
		// 출력 후 룩업테이블 초기화
		days[2] = 28;
	}

	return 0;
}

참고로 2016년이 윤년 이었습니다. 2020년도 윤년이 되겠군요.

2016 2 29 입력 정상적으로 다음날 출력
2016 2 28 입력 정상적으로 다음날 출력
2017 2 28 입력 - 정상적으로 다음달 출력
2019 12 31 입력 - 정상적으로 내년 출력

 

 

반응형