Programming/C

C언어) 달력 만들기(1/2) 기본

쫑드기 2020. 3. 23. 01:03

달력을 만들기 위해선 윤년윤일을 알아야 합니다!

 

윤년이란?

태양의 주기가 365일이 아니라 365.2422이라고 합니다. 이 작은 숫자가 몇 백 년 쌓이게 된다면 날짜가 밀리게 됩니다. 그래서 4년에 한 번씩 '윤일'을 둬서 1년을 366일로 만든 것입니다. 그게 바로 '윤일'이 들어간 '윤년'입니다.

 

윤일이란?

윤일이 들어가면 2월 28일에 하루를 더한 2월 29일이 됩니다.

 

윤달이란?

양력과 음력 사이에 날짜 차이 조정을 위해 음력에 추가시킨 달입니다. 음력 표기가 되어 있는 달력을 보면 4월 23일에 (음) 4월1일 이라고 표시되어 있는데, 5월 23일에는 (윤) 4월 1일이라고 되어 있습니다. 이게 바로 윤달입니다.

(2020년 양력 기준 5월 23일 ~ 6월 21일) 

 

< 윤년을 구하는 방법 > 

 

4년으로 나누어떨어지는 해는 윤년으로 한다.

② 그중에서 100으로 나누어떨어지는 해는 평년으로 한다.

다만 400으로 나누어떨어지는 해는 다시 윤년으로 정한다.

 

이걸 종합해보면

(year % 4 == 0&& (year % 100 != 0|| (year % 400 == 0) 이런 식을 구할 수 있습니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdbool.h>
 
bool Leap_year(int year); // Leap_month() 윤년 확인 함수
 
int main(void)
{
    int year,month;        //년도, 월
    int sum = 365;         //총 날짜 수
    int start_date = 0;    //1일이 어디서부터 시작될지 결정하는 변수
    int i;                 //for문 반복용 변수
    int total_days[12= { 31,28,31,30,31,30,31,31,30,31,30,31 };  //달마다 총 날짜 수
//2월은 28일, 7,8월은 날짜 수 같음 주의!
    
    printf("Please enter the desired year : ");  //원하는 년도를 입력해주시오.
    scanf("%d",&year);
    printf("Please enter the desired month : "); //원하는 달을 입력해주시오.
    scanf("%d",&month);
 
    if (Leap_year(year))
    {
        total_days[1]++;   //윤년이므로 2월에 총 날짜 수를 1더해줌
    }
 
    for (i = 1; i < year; i++)   //0년부터 입력한 년도까지 날짜를 모두 더함
    {
        if (Leap_year(i))
        {
            sum += 366;
        }
        else
        {
            sum += 365;  
         }
    }
 
    for (i = 0; i < month - 1; i++)
    {
        sum += total_days[i];
    }                                      
 
    start_date = sum % 7;   //모두 더한 날짜를 7일단위로 나누어 나머지를 구함
    
 
                  
    printf("\nSUN\tMON\tTUS\tWED\tTHU\tFRI\tSAT\n");
 
    printf("===================================================\n");
 
    for (i = 0; i < start_date; i++)   //어디서부터 1일을 시작할지 결정
    {
        printf("\t");                       
    }
 
    for (i = 1; i <= total_days[month - 1]; i++)   //날짜 나열
    {
 
        printf("%d\t",i);
 
        if (start_date == 6
        {
            printf("\n");     //start_date가 6이 되면 7일이 한 줄에 모두 채워지기 때문에 그다음 줄로 개행시켜줘야 함
            start_date = 0;   // 0으로 초기화해서 다음 줄부터 다시 시작
 
        }
        else
        {
            start_date++;
        }
    }
printf("\n");  
    return 0;
}
 
 
 
bool Leap_year(int year)
{
    if ((year % 4 == 0&& (year % 100 != 0|| (year % 400 == 0))  // 본문에서 설명.
    {
        return true;
    }
 
    else
    {
        return false;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

출력 결과

앞으로 추가해 볼 기능

1) 달력 넘기기

2) 커서 위치 옮겨서 달력 중앙으로 보내기

3) 영어로 무슨 달인지 나타내기

 

아직 초보라 오류도 많이 나고 제가 느끼기엔 복잡했지만 천천히 하다 보니까 해결하게 됐습니다.

간단한 프로그래밍이지만 뿌듯합니다. 

 

보완할 점이나 틀린 부분 있으면 피드백 부탁드립니다. 좋은 하루 보내세요!