[C언어 소스] 년도 입력하면 달력 출력하기

윤년 계산하기

4로 나누어 떨어지는 해는 대부분 윤년입니다.

이 중에 100으로 나누어 떨어지는 해는 대부분 평년입니다.

이 중에 400으로 나누어 떠러지면 윤년입니다.

윤년(년도)

….(년도는 4의 배수 and 년도는 100의 배수가 아님) or 년도는 400의 배수

1월 1일의 첫 번째 요일 찾기

평년은 365일로 요일이 하나 증가합니다.

윤년은 366일로 요일이 하나 더 증가합니다.

따라서 특정 년도는 “년도 + 윤년 개수”만큼 증가합니다.

달 출력하기

월 출력(m,시작 요일)

….월 출력

….반복(w:1->시작 요일)

……..공백 출력

….반복(d:1->월별 날짜[월])

……..시작 요일 1 증가

……..조건(시작 요일 is equal 7)

…………시작 요일:= 0

…………개행 출력

….시작 요일 반환

#include <stdio.h> 

int find_first_weekday(int year);//1월 1일 요일 찾기
int DrawMonth(int month, int start);//달 출력(달(0~11), 시작요일:0~6), 반환값은 다음 달 시작요일 

int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
const char* wname[7] = { "일","월","화","수","목","금","토" };
const char* bars[2] = //데코레이션 바 
{
    "=====================================================\n",
    "-----------------------------------------------------\n"
};

int main(void)
{
    int year, start;
    int i = 0;

    printf("년도:");
    scanf_s("%d", &year);
    start = find_first_weekday(year);

    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))//윤년 판단 
    {
        days[1] = 29;//2월달의 날 수를 29로 설정 
    }

    printf("[ %d년 ]\n", year);

    for (i = 0; i < 12; i++)
    {
        start = DrawMonth(i, start);
    }
    return 0;
}
int find_first_weekday(int year)
{
    //평년은 365일로 요일이 하나 증가합니다.
    //윤년은 366일로 요일이 하나 더 증가합니다.
    //따라서 년도만큼 요일이 증가하고 추가로 윤년 횟수만큼 더 증가합니다.
    //증가한 값을 7로 나눠주면 1월 1일의 요일을 찾을 수 있어요.(일요일:0)
    return (year+(year / 4 - year / 100 + year / 400))%7;
}


int DrawMonth(int month, int start)
{
    int i = 0;
    printf(" << %d 월>>\n", month + 1);//달 출력
    printf(bars[0]);//데코레이션 바 출력
    for (i = 0; i < 7; i++)//요일 출력
    {
        printf("%7s", wname[i]);//폭을 7로 설정
    }
    printf("\n");
    printf(bars[1]);//데코레이션 바 출력
    for (i = 0; i < start; i++)//첫 주 시작일까지 공백 출력
    {
        printf("%7s", " ");//폭을 7로 설정
    }
    for (i = 0; i < days[month]; i++)//일 출력
    {
        printf("%7d", i + 1);//폭을 7로 설정
        start++;
        if (start == 7)//요일이 7이면
        {
            start = 0;//0으로 변경
            printf("\n");//개행 출력
        }
    }
    printf("\n");//개행 출력
    printf(bars[0]);//데코레이션
    return start;//다음 달 시작 요일 반환
}
년도 입력하면 달력 출력하는 프로그램 실행 화면
실행 화면