티스토리 뷰

C++ 문법을 연습할 겸 두 날짜가 주어졌을 때 며칠이 차이 나는지를 계산할 수 있는 코드를 구현해보려 한다. 해당 조건에 맞춰 구현해 보자.
 
1. 당해 연도에서만, 그러므로 윤년 또한 고려해주지 않는다.
2. 월을 나타내는 enum class를 선언한다.
3. 해당 enum class와 날짜를 요소로 하는 struct를 선언한다.
4. 해당 월에 해당하는 날짜(28, 30, 31)를 반환하는 함수를 작성한다.
5. 해당 struct에 대한 메모리 주소를 인자로 받는 함수를 작성한다.
 
 

enum class

enum class month { jan, fab, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };

enum class와 enum의 대표적인 차이는 예기치 못한 값이 할당될 수 있는 enum과 달리 enum class는 열거형 상수를 강력하게 타입화한다는 점이다. 그렇기에 어쩌면 enum class를 활용하는 데에는 switch 문이 따라 쓰이기 마련이다.
 

struct

struct date { month m; int d; };

날짜를 담을 구조체이다. month형과 int형으로 구성되어 있다.
 

월별 말일

int last_day(month m) {
	switch(m) {
	default:
    case month::jan:
    case month::mar:
    case month::may:
    case month::jul:
    case month::aug:
    case month::oct:
    case month::dec:
    	return 31;
    case month::apr:
    case month::jun:
    case month::sep:
    case month::nov:
    	return 30;
    case month::fab:
    	return 28;
    }
}

날짜의 차이를 계산하려면 해당 월에 맞는 말일의 날짜를 알아야 한다. switch문을 활용해 월별 말일의 정수값을 반환한다.
 

D - day

int d_day(date* d1, date* d2) {
	if (d1->m == d2->m) {
    	return d2->day - d1->day;
    }
    
    int dif = last_day(d1->m) - d1->day + d2->day;
    for (month n = (month)((int)d1->m + 1); n != d2->m; n = (month)((int)n + 1)) {
    	dif += last_day(n);
    }
    return dif;
}

두 날짜의 월이 같으면 단순히 일수의 차이만 구한다.
 
다르다면 먼저 앞선 날의 남은 일수 + D - day의 일수로 차이를 초기화해 주고, 사이에 위치한 월별 말일 날짜를 모두 더해준다.
 
구조체의 메모리 주소를 안다면 해당 구조체의 요소에 접근하기 위해 화살표(->)를 쓴다.
위와 같은 코드에서 주목할 만한 부분은 for문의 조건이다. enum class의 열거형 변수 또한 정수형 상수로 취급되기에 메모리에 순차적으로 할당된다. 따라서 int형으로 변환 >> + 1 >> month형으로 변환을 해주면 익월이 나오는 것이다.
 

struct 초기화

int main()
{
    using namespace std;
    date june6 = {month::jun, 6};
    date aug30 = {month::aug, 30};
    cout << date_diff(&june6, &aug30) << endl;
    return 0;
}

enum class를 선언할 때는 '::'를 사용하여 열거형 변수를 지정해 주면 된다.
 
해당 코드를 이해하고, 이를 바탕으로 년/월/일을 모두 포함하는 구조체를 선언, 구현해보면 좋은 연습이 될 것이다.
 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함