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

C/C++ Q/A
[92] Re:달력프로그램에 대해서 소스중에 의문이 있습니다.
[만해] [] 2325 읽음    2001-12-04 12:35
임성곤 님이 쓰신 글 :
: 안녕하세요!
: 다름이 아니옵고, 달력프로그램을 만들고자 어디서 소스를 구했는데..그 소스조차 이해가 가지않는 부분이 있습니다. 힘빠지네요^^
: 정말 궁금합니다. 소스내용중에 "//왜 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;
: }
: }
: }

안녕하세요 만해입니다.

제가 보기에도 래죠님과 같은 의견인데요

다만 한가지 더 추가 하자면

월 화 수 목 금 토 일
0  1  2  3  4  5  6

위와 같은 식으로 테이블을 구성해 놓고,

기준 날짜를 2000년 1월 1일을 토요일로 구성해 놨을때

이걸 조금 응용하게 되면 어느해 어느달 어느일이 무슨 요일이란걸 바로 알수 있습니다.

조금 설명을 드리자면

2000년 2월 13이 무슨 요일인가 알려고 한다면

2000년 2월 13일에서 2000년 1월 1일 까지의 날수를 구한후 7로 나눈 나머지를 가져와서

그 나머지에 5를 더한후 다시 7로 나눈 나머지를 가져오면 그 숫자가

위에 있는 일주일을 나타내는 값을 가지게 되겠지요

간단히 계산해 보면

1월은 31일 이고, 2월에서 13일을 더한후 1을 빼고 7로 나누고,
               그 나머지에서 5를 더한후 7로 나눈 결과값은
((31 + 13 -1)%7 +5) % 7 ->1.  43%7 -> 6*7 + 1 즉 1가 되고요
                           2. (1+5) % 7 -> 당연히 6 이 되지요

6은 위의 테이블에서 일요일을 나타냅니다.

이것은 만년력에서 어느해 어느달을 출력할때 그달의 1일이 무슨요일인지 계산한후

그 요일에 맞춰서 그달의 달력을 출력해 낼수 있는 거지요

간단히 조금더 설명 드리면

2001년 4월 1일이 수요일이라고 가정하면

4월의 달력은

일 월 화 수 목 금 토
           1  2  3  4
5 ~      중략   ~ 25
26 27 28 29 30

이렇게 출력이 되야 하고

1일이 무슨 요일인지 알아 낸후 1 번째 라인에 몇개의 날짜가 출력되야 하는지,
 
그리고 마지막 라인에 몇개의 날짜가 출력 되야 하는지 알아 내서 그릴수 있겠지요

구현은 간단하니깐 그냥 넘어 가겠습니다.

그럼 이만~

ps. 설명이 넘 장황 한가요?

+ -

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