리그캣의 개발놀이터

만년 달력 만들기[c++] 본문

프로그래밍 언어/C++

만년 달력 만들기[c++]

리그캣 2018. 1. 21. 17:55

■ 만년달력 프로그램


년도와 월의 입력으로 그 년도의 월이 출력되는 프로그램


■ Calendar


   -Ex :

 


■ Hint

-오늘이 목요일이면, 내년 오늘은 무슨요일?

· 365 % 7 = 1

· 일반적으로 1년 후엔 요일이 하루씩 밀려감

· 즉, 0년 1/1이 일요일이면 1400년 1/1일은 일요일?

· 윤년, 윤달 고려

- 4로 나누어지는 해는 윤년으로 2월이 29일 -> 1년:366일

- 100으로 나누어지는 해는 윤년이 아님.

- 400으로 나누어지는 해는 윤년.

-0년 1월 1일: 일요일?

-(0년 1월 1일 ~ 2004년 4월 1일까지 날수)%7=?


■ 알고리즘

·각 월의 최대 날짜를 담을 수 있는 배열 선언

1월:31 2월:28or29 3월:31일 4월:30일 5월:31일 6월:30일 7월:31 8월:31 9월:30 10월:31

11월:30 12월:31

int endday[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

if(year==윤년){

endday[1]=29;}// 만약 윤년이면 2월은 29일 설정

 

 

·년도와 월을 받을 수 있는 변수 선언

int year, month;

 

·while문 작성(answer 값이 N이면 프로그램 종료)

do{ }while(answer!='N')

·year의 기준일은 2000년도 1월 1일 토요일

 

·month의 값은 month>=1&&month<=12 어야 함.

if(month>=1&&month<=12)

{for(i=0;i<7;i++) cout << week[i] << "\t"}

 

*만약 month가 1에서 12사이가 아니면 어떻게 표현하나 고민을 하다가 else인 경우는 다시 년도와

moth를 입력하게끔 프로그램 짜기로 하였음.

 

·윤년 구하는 방법

-4로 나누어지는 해는 윤년으로 2월이 29일

-100으로 나누어지는 해는 윤년이아님

-400으로 나누어지는 해는 윤년

(year%4==0&&year%100!=0||year%400==0)

메인함수에서 year가 윤년이면 endday[1]//2월 = 29로 설정

프로그램 구현상 윤년이 많이 쓰임으로 윤년이면 참 윤년이 아니면 거짓을 출력하는 함수를 사용

bool yoonyear(int year)

{ if(x%4 != 0) // 만약 y의 값을 4로 나누어서 나머지가 0이 되지않으면 거짓반환

return false

if(x%100!=0) // 만약 y의 값을 100으로 나누어서 나머지가 0이되지 않으면 참을반환

return true;

if(y%400==0) // 만약 y의 값을 400으로 나누어서 나머지가 0이되면 참을 반환한다

return true;

return false; } //나머지는 거짓으로 반환한다

 

 

 

 

 

 

 

·달력 출력 함수

달력출력함수 void printcalendar(int year,int month) 설정

출력하여 시작년도와 시작월를 2000년도 01월 01일로 기준일로 잡음

startday를 1로 설정 endday를 마지막 일수로 하여 for문출력

for(startday=1;startday<=endday[month-1];startday++)

cout << " " << startday << " ";

 

int enter를 선언 enter는 토요일이 넘어가면 다음줄 생성

enter=0부터 enter==6이되는순간 cout << endl; 출력

if(enter == 6)

{ cout <<endl; enter =0;// 초기화 필요}그다음 enter++; for문 실행도중에

enter 값 증가연산

*여기서 문제가 발생한다 만약 연도에 따라서 그리고 월에 따라서 시작 일수가

달라진다. 그래서 firstMonth, firstyear 함수를 선언하기로 했다.

space=(firstyear(year)+firstMonth(year,month))%7

 

 

·firstyear();

int firstyear(int year)

{ int basic=4 // 2000년 1월 1일 : 토요일을 기준으로 정수형 함수 basic =4를 설정

for(int y = 2000; y >= year; y--)

//정수형 함수 y의값으로 2000을 넣고 y가 year보다 크거나 같으면 y값을 1씩감소시킴

그와동시에 basic값 = +6씩 증가 // 만약 윤년이면 +6더증가 그후 basic%7의값을

basic에 저장시킴

 

·firstMonth();

 

int basic=0; //basic 0으로 초기화

for(int I=1;i<month;i++)basic+=endday[i-1]%7;

endday[i-1]를 나눈 값의 나머지를 basic와 함한후 basic에 넣는다.

만약 month의 값이 2보다 크고 윤년이면 basic값을 1증가시킴

basic값을 7로 나눈 나머지 반환


■ 실행화면


■ 소스 코드

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
 
using namespace std;
 
void printcalendar(int year,int month);
bool yoonyear(int year);
int firstMonth(int year,int month);
int firstyear(int year);    
int endday[] = {312831303130313130313031};
 
int main()
{
    int year, month, i;
    char answer;
    char week[7][4= {{"Sun"},{"Mon"},{"Tue"},{"Wed"},{"Thu"},{"Fri"},{"Sat"}};
        //[0]="Sun,"[1]="Mon"[2]="Tue".....
 
    do
    {
        cout << "Input year & month: ";    //기준일 2000년 1월 1일
        cin >> year >> month;
        if(yoonyear(year))
            endday[1]=29;
        else endday[1]=28;
 
        cout << "\n------------------------------\n" << endl;
        if(month>=1&&month<=12)
        {
            for(i=0;i<7;i++)
                cout << week[i] << " ";
        }
 
        cout << endl;
        printcalendar(year,month);        //calendar 출력함수
        cout << "\n------------------------------\n" << endl;
        cout << "다시 입력하시겠습니까??(Y/N): ";
        cin >> answer ;
    }while(answer!='N'||answer!='n');
    return 0;
}
 
void printcalendar(int year, int month)
{
    int startday, enter;
    int space = (firstyear(year) + firstMonth(year,month)) % 7;
    enter = space;                        // enter 변수의 값은 space 변수의 값이다
    for (startday = 0 ; startday < space ; startday++)    
    // 정수 startday에 0을 넣고 startday가 curMonthDay의 값보다 작으면 startday는 1씩 증가
    
        cout << "    ";                        // "        "을 출력
 
    for (startday = 1 ; startday <= endday[month-1] ; startday++)
    // startday=1 일때 startday가 endday[month-1]의 값보다 작거나 같으면 startday는 1씩 증가
    {
        cout << " " << startday << " " ;            
        if (startday < 10)                    
            cout << " ";                
        if (enter == 6){cout << endl;                        
            enter = 0;                            
        }
        else                                
            enter++;                        
    }
}
int firstyear(int year)                            
{
    int basic = 4;
    // 2000년 1월 1일 : 토요일을 기준으로 정수형 함수 basic = 4을 선언
 
    for (int y = 2000; y >= year; y--)
    {
        basic += 6;                                
        if (yoonyear(y))                        
            basic += 6;                            
    }    basic %= 7;                
 
    return basic;    
}
int firstMonth(int year,int month)
{
    int basic = 0;                            
    for (int i = 1; i < month; i++)
        basic += endday[i-1] % 7;
    if (month > 2 && yoonyear(year))                
        // 만약 month의 값이 2보다 크고 yoonyear()값이 true이면
        basic++;                                // basic의 값 1증가시킨다
 
    return basic % 7;                            // basic의 값을 7로 나눈 나머지 값을 반환한다
}
bool yoonyear(int y)                            // 부울 함수 yoonyear(int y) 의 내용
{
    if (y % 4 != 0)
        // 만약 y의 값을 4로 나누어서 나머지가 0이 되지 않으면
        return false;                            // 거짓을 반환한다
 
    if (y % 100 != 0)
        // 만약 y의 값을 100으로 나누어서 나머지가 0이 되지 않으면
        return true;                            // 참을 반환한다
 
    if (y % 400 == 0)
        // 만약 y의 값을 400으로 나누어서 나머지가 0이 되면
        return true;                            // 참을 반환한다
 
    return false;                                // 나머지들은 거짓을 반환한다
}
cs


'프로그래밍 언어 > C++' 카테고리의 다른 글

c++ 문법 공부하기 5  (0) 2018.01.21
c++ 문법 공부하기 4  (0) 2018.01.21
c++ 문법 공부하기 3  (0) 2018.01.21
c++ 문법 공부하기 2  (0) 2018.01.21
c++ 문법 공부하기 1  (0) 2018.01.21
Comments