Prosto
1년 달력 계산 (윤년) 본문
저번에 1년 중 1월1일을 구하고 그 1월 달만 구하는 달력을 만들어 보았는데요. (달력 계산)
이번에는 1년 전체 달력을 출력 해주는 프로그램을 만들어보겠습니다. (입력년도의 1월~12월 달력 계산 출력 프로그램.)
필요 : for문, if문, 사용자 정의 함수, 함수, 변수, 배열 (3차원 배열) .... 등을 사용하였습니다.
(포인터 사용 안했음.)
예를 들어
달력이 궁금한 년도를 입력하면
그 해의 달력을 출력해주는 것 입니다.
2011년을 입력하면 2011년 달력 (1월, 2월, 3월 ....)
2년을 입력하면 2년...
그리고 달력의 출력형태로는
--------1월--------
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
--------2월--------
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
--------3월--------
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
--------4월--------
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
......
이런 형태와
--------1월-------- --------2월-------- --------3월--------
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
8 9 10 11 12 13 14 8 9 10 11 12 13 14 8 9 10 11 12 13 14
15 16 17 18 19 20 21 15 16 17 18 19 20 21 15 16 17 18 19 20 21
22 23 24 25 26 27 28 22 23 24 25 26 27 28 22 23 24 25 26 27 28
29 30 31 29 29 30 31
--------4월-------- --------5월-------- --------6월--------
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
8 9 10 11 12 13 14 8 9 10 11 12 13 14 8 9 10 11 12 13 14
15 16 17 18 19 20 21 15 16 17 18 19 20 21 15 16 17 18 19 20 21
22 23 24 25 26 27 28 22 23 24 25 26 27 28 22 23 24 25 26 27 28
29 30 29 30 31 29 30
. . .
. . .
. . .
이런 형태로 만들어 보겠습니다.
(3달씩~ 1~12월까지. )
(달력의 빈칸이 생길 경우는 공란으로! )
(폼만 만들었습니다. (월, 일의 위치가) 실제와 차이가 있습니다.)
그럼 만들어 보세요!
...
먼저 몇 가지 힌트를 드리자면..
1. 그 입력 년도가 되기까지의 윤년을 계산하여 해당 년도의 1월 1일을 구합니다.
2. 1월 달만 출력하던 저번번 포스트와 유사하게 시작하시면 됩니다.
(단, 사용하기 좋게 바꿔 사용하기를 바람..)
3. 1월의 마지막 일이 끝나는 위치를 잘 받아와 2월은 그 곳 부터 시작되어야 합니다!
4. 2월의 경우 윤년인 경우는 그에 맞는 처리를 해주어야 합니다.
(윤년이 아닌 경우 28일, 윤년인 경우 29일 .. )
5. 출력 형태를 바꾸는 것은 먼저 각 달마다 해당 값에 입력이 제대로 되어있다면
별다른 문제 없이 형태를 바꿀 수 있습니다.
그럼 먼저
1
2
3
4
5월 ... 이런식으로 일렬로 나오는 달력을 만들어 보겠습니다.
(소스코드는 사람마다 각각 다를 수 있습니다~)
소스 :
#include<stdio.h>
int LeapYear (int a);
void Calendar (int year);
int main(void)
{
int year;
while (1)
{
printf("년도 입력시 해당연도의 달력 출력 \n");
printf("년도 입력 : ");
scanf("%d", &year);
Calendar(year);
}
return 0;
}
///////////////////////////////윤년 계산/////////////////////////
int LeapYear(int a)
{
if( (0==a%4 && 0!=a%100) || 0==a%400 )
{
return 1;
}
return 0;
}
///////////////////////////////실질적 달력 입력, 출력/////////////////////////
void Calendar(int year)
{
int i, j, k;
int dayCnt, leapYearCnt=0;
int lastMonth, thisMonth=31;
int month[12][6][7];
for(i=1; i<year; i++)
{
leapYearCnt+=LeapYear(i);
}
lastMonth = (year*365 + leapYearCnt)%7; //1월1일 구하기.
for(k=0; k<12; k++)
{
dayCnt=0;
if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
{
thisMonth= 31;
}
else if( (k==3) | (k==5) | (k==8) | (k==10) )
{
thisMonth= 30;
}
else if(k==1)
{
if(LeapYear(year))
{
thisMonth= 29;
}
else {
thisMonth= 28;
}
}
for(i=0; i<6; i++)
{
for(j=0; j<7; j++)
{
dayCnt++;
month[k][i][j]= dayCnt-lastMonth;
if(month[k][i][j]<1 || month[k][i][j]>thisMonth)
month[k][i][j]=0;
}
}
if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
{
lastMonth= (lastMonth+31)%7;
}
else if( (k==3) | (k==5) | (k==8) | (k==10) )
{
lastMonth= (lastMonth+30)%7;
}
else if(k==1)
{
if(LeapYear(year))
{
lastMonth= (lastMonth+29)%7;
}
else {
lastMonth= (lastMonth+28)%7;
}
}
}
{
printf("--------%d 월-------- \n", k+1);
printf("일 월 화 수 목 금 토 \n");
for(i=0;i<6;i++)
{
for(j=0;j<7;j++)
{
if (0==month[k][i][j])
{
printf(" ");
continue;
}
printf("%2d ", month[k][i][j]);
}
printf("\n");
}
printf("\n");
printf("\n");
}
}
실행 결과 :
이러한 결과를 볼 수 있습니다.
(길어서 아래쪽을 짤렸군요. )
(while문으로 무한루프를 해뒀으니 계속 입력 가능합니다. )
그리고 다음은
--------1월-------- --------2월-------- --------3월--------
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
8 9 10 11 12 13 14 8 9 10 11 12 13 14 8 9 10 11 12 13 14
15 16 17 18 19 20 21 15 16 17 18 19 20 21 15 16 17 18 19 20 21
22 23 24 25 26 27 28 22 23 24 25 26 27 28 22 23 24 25 26 27 28
29 30 31 29 29 30 31
--------4월-------- --------5월-------- --------6월--------
1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
8 9 10 11 12 13 14 8 9 10 11 12 13 14 8 9 10 11 12 13 14
15 16 17 18 19 20 21 15 16 17 18 19 20 21 15 16 17 18 19 20 21
22 23 24 25 26 27 28 22 23 24 25 26 27 28 22 23 24 25 26 27 28
29 30 29 30 31 29 30
. . .
. . .
. . .
형태의 출력입니다.
(소스를 보기 전 먼저 한 번 바꿔서 해보시기 바랍니다! )
소스 :
#include<stdio.h>
int LeapYear (int a);
void Calendar (int year);
int main(void)
{
int year;
while (1)
{
printf("년도 입력시 해당연도의 달력 출력 \n");
printf("년도 입력 : ");
scanf("%d", &year);
Calendar(year);
}
return 0;
}
///////////////////////////////윤년 계산/////////////////////////
int LeapYear(int a)
{
if( (0==a%4 && 0!=a%100) || 0==a%400 )
{
return 1;
}
return 0;
}
///////////////////////////////실질적 달력 입력, 출력/////////////////////////
void Calendar(int year)
{
int i, j, k, l;
int dayCnt, leapYearCnt=0;
int lastMonth, thisMonth=31;
int month[12][6][7];
for(i=1; i<year; i++)
{
leapYearCnt+=LeapYear(i);
}
lastMonth = (year*365 + leapYearCnt)%7; //1월1일 구하기.
for(k=0; k<12; k++)
{
dayCnt=0;
if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
{
thisMonth= 31;
}
else if( (k==3) | (k==5) | (k==8) | (k==10) )
{
thisMonth= 30;
}
else if(k==1)
{
if(LeapYear(year))
{
thisMonth= 29;
}
else {
thisMonth= 28;
}
}
for(i=0; i<6; i++)
{
for(j=0; j<7; j++)
{
dayCnt++;
month[k][i][j]= dayCnt-lastMonth;
if(month[k][i][j]<1 || month[k][i][j]>thisMonth)
month[k][i][j]=0;
}
}
if( (k==0) | (k==2) | (k==4) | (k==6) | (k==7) | (k==9) | (k==11) )
{
lastMonth= (lastMonth+31)%7;
}
else if( (k==3) | (k==5) | (k==8) | (k==10) )
{
lastMonth= (lastMonth+30)%7;
}
else if(k==1)
{
if(LeapYear(year))
{
lastMonth= (lastMonth+29)%7;
}
else {
lastMonth= (lastMonth+28)%7;
}
}
}
for(l=0; l<4; l++) //4번(3달씩)
{
printf("--------%d 월-------- \t--------%d 월-------- \t--------%d 월-------- \n", l*3+1, l*3+2, l*3+3);
printf("일 월 화 수 목 금 토 \t일 월 화 수 목 금 토 \t일 월 화 수 목 금 토 \n");
for(k=0; k<6; k++) // 6번(한주를 여섯번)
{
for(j=0; j<3; j++) //3달씩
{
for(i=0; i<7; i++) //한주(하루 하루~)
{
if(month[(l*3)+j][k][i]==0) {
printf(" ");
continue;
}
printf("%2d ", month[(l*3)+j][k][i]);
}
printf("\t");
}
printf("\n");
}
printf("\n\n");
}
}
자! 아시겠나요?
위쪽은 모두 똑같고. 출력하는 부분(굵은부분)만 바뀌었습니다.
실행 결과 :
위와 같은 출력을 받았습니다.
훨씬 보기 좋죠!?
이번에 한 해를 입력하면 그 해의 달력을 구하는 프로그램을 만들어 봤습니다.
궁금한 점 있으시거나, 좋은 도움말 주실 분은 댓글로 남겨주세요! ^^
긴 글 읽으시느라 고생하셨습니다.
감사합니다~^^
'Programing > C Programing' 카테고리의 다른 글
난수 발생 시키기. (0) | 2011.09.25 |
---|---|
포인터 (Pointer) - 기초2 (2) | 2011.05.17 |
포인터 (Pointer) - 기초 (2) | 2011.05.13 |
프로그래밍 시 유의사항 (팁) (2) | 2011.05.13 |
윤년 계산과 응용. (3) | 2011.05.12 |