U E D R , A S I H C RSS

만년달력/강�경,Leonardong

�블스 캠프 넷째날 만년달력 코드

~cpp 
#include <iostream>
#include <climits>
using namespace std;
void output(int , int);
int deter_date(int, int);
int lastdays(int, int);
int how_much_days(int, int);
int main()
{
	int year, month;
	while (true)
	{
		cout << "연�를 입력하세요 : ";
		cin >> year;
		cout << "월� 입력하세요 : ";
		cin >> month;
		if ( !year || !month )
			break;
		if ( year <= 0 || year >INT_MAX || month <=0 || month>12)
		{
			cout << "잘못 입력하셨습니다." << endl;
			continue;
		}
		output(year, month);
	}

	return 0;
}

void output(int year, int month)
{
	int days = how_much_days(year, month);
	
	int date;
	if (year%400 != 0)
		date = deter_date(year%400, month);
	//삽질(?) year%400 대신 year� 쓰면 �러...스� 오버플로우?
	//400년주기로 달력� 같으므로 year%400로 해서 해결.
	else
		date = deter_date(400, month);
	cout << "====================================================" << endl
		 << "�\t월\t화\t수\t목\t금\t토" << endl;
	for ( int j=0 ; j<date ; j++)	//숫�를 �기 전� 요�만� 빈칸� �어줌
			cout << "\t";
	for ( int i=0 ; i<days ; i++)	//1�서 days까지 출력
	{
		if ( date > 6 ){			//토요�� 넘어가면 
			cout << endl;			//다�줄로 가고 
			date=0;					//요�� �요�으로
		}
		cout << i+1 << "\t";
		date++;						//보통때는 요�� �가
	}
	cout << endl << "====================================================" << endl;
}

int deter_date(int year, int month )//요�� 정하는 함수(0� �요�, 6� 토요�)
{
	if ( month == 0 ){				
		year--;
		month = 12;
	}
	else if ( year == 1 && month == 1)
		return 1; // 1ë…„ 1ì›”ì—�는 월요ì�¼ë€í„° 시작

	return (lastdays(year,month) + deter_date(year, month-1)) % 7;//핵심 코드
	/*
	지난 달� 며칠�지를 알고 거기� 지난달� 시작하는 요�� 알면 
	�번달� 무슨 요��서 시작하는지 알 수 있다. 예를 들어 1년 2월 같� 경우
	1ë…„ 1ì›”ì�´ 31ì�¼ì�´ê³  월요ì�¼ë€í„° 시작하므로 (31 + 1) % 7 == 4 로
	목요ì�¼ë€í„° 시작함ì�„ 알 수 있다.
	*/
}

int lastdays(int year, int month)//지난 달 날수를 계산
{
	int last;
	switch(month)
	{
		case 3:
			if ( year%4 == 0)
			{
				last = 29;
				if ( year%400 == 0 )
					last = 29;//윤달
				if ( year%4000 == 0 )
					last = 28;//�달
				else if ( year%100 == 0 )
					last = 28;//�달
			}
			else
				last = 28;
			break;
		case 5:	case 7:	case 10: case 12:
			last = 30;
			break;
		case 1:	case 8:	case 2:
			last = 31;
			break;
		case 4:	case 6:	case 9:	case 11:
			last = 31;
			break;
	}
	return last;
}

int how_much_days(int year, int month)
{
	int days;
	switch(month)//한 달 날짜를 정해줌
	{
		case 1:	case 3:	case 5:	case 7:	case 8:	case 10: case 12:
			days = 31;
			break;

		case 2:
			if ( year%4 == 0)
			{
				days = 29;
				if ( year%400 == 0 )
					days = 29;//윤달�경우
				if ( year%4000 == 0)
					days = 28;//�달� 경우
				else if ( year%100 == 0 )
					days = 28;//�달�경우
			}
			else//�달� 경우
				days = 28;
			break;
		case 4:	case 6:	case 9:	case 11:
			days = 30;
			break;
	}
	return days;
}
네�버�서 만년달력 검색하다가 들어오게� 페�지. 하하하 - �승한

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:25
Processing time 0.1915 sec