윤년? |
윤년은 보통 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년도 윤년이 되겠군요.
'C Programming > 예제 프로그램' 카테고리의 다른 글
[C Console] 시그마 팩토리얼 수식 계산 프로그램(재귀, 이중 for문, 단일 for문) (0) | 2019.05.21 |
---|---|
[C Console] 실수의 소수점 이하 2자리를 정수로 출력하는 프로그램 (2) | 2019.05.18 |
[C Console] 문자열을 입력받아 대문자는 소문자로, 소문자는 대문자로 변환하는 프로그램 (4) | 2019.04.24 |
[C Console]Function Key(확장 키), 특수 키, 일반 문자 입력 코드를 받아오는 프로그램 (0) | 2019.04.08 |
[C Console] 피보나치 수열을 구하는 프로그램 (0) | 2018.12.11 |