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

C/C++ Q/A
[87] Re:달력프로그램에 대해서 소스중에 의문이 있습니다.
남병철.레조 [lezo] 2190 읽음    2001-12-03 12:07

안녕하세요? 레조입니다.

전체적으로 모두 분석한건 아니지만 제가보기에 define처리한 이유는 2001년1월1일이
토요일이고 월요일을 0으로 잡았으니 토요일은 5가 되겠네요.
결국 위치상으로도 그렇고 초기화를 목적으로 사용한것 같습니다.
소스가 2001년1월1일부터 계산을 시작하는 달력은 아닐까요?
아니면 그 날짜를 기준으로 작성된듯 합니다.



임성곤 님이 쓰신 글 :
: 안녕하세요!
: 다름이 아니옵고, 달력프로그램을 만들고자 어디서 소스를 구했는데..그 소스조차 이해가 가지않는 부분이 있습니다. 힘빠지네요^^
: 정말 궁금합니다. 소스내용중에 "//왜 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:달력프로그램에 대해서 소스중에 의문이 있습니다. 남병철.레조 2190 2001/12/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.