Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[80] 달력프로그램에 대해서 소스중에 의문이 있습니다.
임성곤 [] 2285 읽음    2001-12-01 13:43
안녕하세요!
다름이 아니옵고, 달력프로그램을 만들고자 어디서 소스를 구했는데..그 소스조차 이해가 가지않는 부분이 있습니다. 힘빠지네요^^
정말 궁금합니다. 소스내용중에 "//왜 refWeek==5라고 define처리를 한거죠? [질문의 요점]" 주석처리 해 두엇습니다.

왜 refWeek가 5인지 왜 ?5가 되어야 하는지가 이해가 안갑니다.왜 5를 넣어야 하느지가 제가 궁금해하는 요점입니다.

그럼 고수님들 수고하십시요^^

#include <stdio.h>
#include <conio.h>
#include<process.h>

/* 기준일 2000년 1월 1일 토요일 */
#define YEAR 2000
#define MONTH 1
#define DAY 1
#define WEEK 5 /* 0 : Monday, ... , 5 : Saturday */

/* 윤년이면 2월의 마지막 날짜가 29일, 아니면 28일 */
#define YUN(y) (((y)%400 == 0 || ((y)%4 == 0 && (y)%100 != 0)) ? 29 : 28)

void main()
{
char control = '0'; /* 이전, 다음 달[연도] */
char *paWeek[] = {"Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"};
int aMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day;
int year;
int month;
int inputYear;
int inputMonth;
int refYear = YEAR;
int refMonth = MONTH;
int refWeek = WEEK;
int firstWeek; /* 매달 1일의 요일 */
int i, j; /* i, j : for 문에서 */
long totalDay; /* 기준일과의 차이 */

//clrscr();

while (1)
{
//clrscr();

/* Input */
printf("\n\n\t ================= << The Calendar >> =================\n\n");
printf("\t\t *** 원하는 연도를 입력하세요 (종료 = 0) : ");
scanf("%d", &inputYear);
if (inputYear == 0)
exit(1);
printf("\t\t *** 원하는 달을 입력하세요 (종료 = 0) : ");
scanf("%d", &inputMonth);
if (inputMonth == 0)
exit(1);

year = inputYear;
month = inputMonth;

while (1)
{
//clrscr();

/* 초기화 */
day = 0;
totalDay = 0L;

/* contorl */
switch (control)
{
case 'z': /* 지난 해 */
year -= 1;
break;
case 'x': /* 지난 달 */
if (month == 1)
{
month = 12;
year -= 1;
}
else
month -= 1;
break;
case 'c': /* 처음 입력한 연도와 달 */
month = inputMonth;
year = inputYear;
break;
case 'v': /* 다음 달 */
if (month == 12)
{
month = 1;
year += 1;
}
else
month += 1;
break;
case 'b': /* 다음 해 */
year += 1;
break;
default:;
}

/* << 매달 1일의 요일 결정하기 >> */
/* 기준일과의 차를 7로 나눈 나머지 이용 */
/* 1. 기준일 이후 */
if (year >= refYear)
{
for (i = year; i >= refYear; --i)
{
if (i > refYear)
{
aMonth[1] = YUN(i - 1);
/* 윤년이면 366일, 아니면 365일 */
totalDay += 337L + (long)aMonth[1];
}
else
{
aMonth[1] = YUN(year);
for (j = month; j > refMonth; --j)
totalDay += (long)aMonth[j - 2];
}
}
}

/* 2. 기준일 이전 */
else
{
for (i = year; i < refYear; ++i)
{
if (i < refYear - 1)
{
aMonth[1] = YUN(i + 1);
totalDay += 337L + (long)aMonth[1];
}
else
{
aMonth[1] = YUN(year);
for (j = month; j <= 12; ++j)
totalDay += (long)aMonth[j - 1];
}
}
}

//왜 refWeek==5라고 define처리를 한거죠? [질문의 요점]
/* 3. 7로 나누어 나머지가 0 이면 기준일과 같은 요일 */
if (year >= refYear)
firstWeek = (int)(refWeek + totalDay % 7L) % 7;
else
firstWeek = (int)(refWeek - totalDay % 7L) % 7;
if (firstWeek < 0) /* firstWeek가 음수면 */
firstWeek = refWeek - firstWeek; /* 그 수만큼 더한다. */

/* Output */
printf("\n\n\t ================= << The Calendar >> =================");
printf("\n\n\t --------- *** %4d 년 *** ---------", year);
printf("\n\n\t *** %2d 월 ***", month);
printf("\n\n\t\t ");
aMonth[1] = YUN(year);
for (i = 0; i < 7; ++i)
printf("%s ", paWeek[i]);
for (i = 0; i < aMonth[month - 1] + firstWeek; ++i)
{
if (i % 7 == 0)
printf("\n\n\t\t ");
if (i >= firstWeek)
printf("%3d ", ++day);
else
printf(" ");
}

/* control */
printf("\n\n\t ------------------------------------------------------------");
printf("\n\t z ( << ), x ( < ), c ( . ), v ( > ), b ( >> ), 0 (quit) ");
control = getchar();
if (control == '0')
break;
}
}
}

+ -

관련 글 리스트
80 달력프로그램에 대해서 소스중에 의문이 있습니다. 임성곤 2285 2001/12/01
92     Re:달력프로그램에 대해서 소스중에 의문이 있습니다. [만해] 2325 2001/12/04
87     Re:달력프로그램에 대해서 소스중에 의문이 있습니다. 남병철.레조 2191 2001/12/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.