Test/C

년도와 월을 입력받아 달력을 출력, 윤달 반영

kiostory 2017. 8. 7. 21:31

반복문 실전 도전

----------------------------------------

년도와 월을 입력받아 달력을 출력, 윤달 반영

'서현우의 C프로그래밍 정복' 중에서 발췌.


-->

    연도가 4로 나누어 떨어지지 않으면 평년
    또는 연도가 100으로 나누어 떨어지지 않으면 윤년
    또는 연도가 400으로 나누어 떨어지면 윤년
    그외 나머지는 다 평년

    윤년/평년의 변화는 2월에만 있다



#include <stdio.h>


#include <stdlib.h>



 


int main(void)


{


     int year, mon, total;


     int i;


     int start, last;



 


     while (1)


     {


           printf("> 연월을 입력하세요(종료는 0) : ");


           scanf("%d", &year);



 


           if (year == 0) break;



 


           scanf("%d", &mon);



 


           // 1년 1월 1일 부터 year-1년 12월 31일까지 총 일수 누적


           total = 0;


           for (i = 1; i<year; i++)


           {


                if (i % 4 != 0) total += 365;


                else if (i % 100 != 0) total += 366;


                else if (i % 400 == 0) total += 366;


                else total += 365;


           }



 


           // year년 1월 1일부터 year년 mon-1월 말일까지 총 일수 누적


           switch (mon - 1)


           {


           case 11: total += 30;


           case 10: total += 31;


           case  9: total += 30;


           case  8: total += 31;


           case  7: total += 31;


           case  6: total += 30;


           case  5: total += 31;


           case  4: total += 30;


           case  3: total += 31;


           case  2:


                if (year % 4 != 0) total += 28;


                else if (year % 100 != 0) total += 29;


                else if (year % 400 == 0) total += 29;


                else total += 28;


           case  1: total += 31;


           }



 


           // year년 mon월 1일 누적


           total++;



 


           // title 출력


           printf("\n             %4d년 %2d월 \n", year, mon);


           printf("             ===========\n");


           printf("------------------------------------\n");


           printf("  SUN  MON  TUE  WED  THU  FRI  SAT\n");


           printf("------------------------------------\n");



 


           // 출력할 시작 위치(요일)를 계산하고 칸 띄움


           start = total % 7;


           for (i = 0; i<start; i++)


           {


                printf("     ");


           }



 


           // 입력한 월의 총 일수를 last에 저장


           switch (mon)


           {


           case 1: last = 31; break;


           case 2:


                if (year % 4 != 0) last = 28;


                else if (year % 100 != 0) last = 29;


                else if (year % 400 == 0) last = 29;


                else last = 28;


                break;


           case 3: last = 31; break;


           case 4: last = 30; break;


           case 5: last = 31; break;


           case 6: last = 30; break;


           case 7: last = 31; break;


           case 8: last = 31; break;


           case 9: last = 30; break;


           case 10: last = 31; break;


           case 11: last = 30; break;


           case 12: last = 31; break;


           }



 


           // 1일부터 마지막 날까지 출력


           for (i = 1; i <= last; i++)


           {


                printf("%5d", i);


                if ((start + i) % 7 == 0) printf("\n");


           }


           if ((start + i - 1) % 7 != 0) printf("\n");


           printf("\n");


     }



 


     return 0;


}