달력 만들기

프로그래밍 2009. 11. 24. 22:33

#include stdio.h 

void cho1();                                                        //표준 입출력 작업을위한 헤더파일.
void cho2();

int main()                                                            
{
 int choice ;

 while(1)
 {
  printf("=======================\n");
        printf("만년달력 프로그램입니다\n");             //만년달력 프로그램 시작
        printf("    1. 달력출력\n");                                        //세개의 항목들
        printf("    2. 요일출력\n");
        printf("    3.   종료  \n");
        printf("=======================\n");
        printf("메뉴(1,2,3)를 입력하세요:");                                //사용자 입력
        scanf("%d", &choice);
  
     switch(choice)
  {
         case 1 : cho1();
       break;
            case 2 : cho2();
                break;
            case 3 : printf("종료 되었습니다\n");
       return 0;
  }
  if ( choice < 1 || choice > 3 ) printf("잘못된 입력입니다.\n");
 }

 return 0;
}

// 년, 월을 입력하면 해당년월의 시작요일을 구하는 함수
int find_first_yoil( int year, int month, int *mon_size )
{
 int temp_year = 1, start_yoil = 1, i;
 int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

 // 해당년의 1월 1일의 요일을 구하는 루틴
 while(1)
 {
  if ( temp_year == year ) break;
  if ( ( temp_year % 4 == 0 && temp_year % 100 != 0 ) || temp_year % 400 == 0 ) start_yoil++;
  start_yoil++;
  temp_year++;
 }

 // 입력한 년도가 윤년인 경우 2월달 하루 추가
 if ( ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 ) days[1] = 29;
 
 // 입력한 월까지 가서 시작요일을 구함
 for( i = 0; i < month - 1; i++ )
  start_yoil += days[i];

 // 해당월의 일수를 리턴
 *mon_size = days[month-1];
 
 // 구한 요일 리턴
 return start_yoil % 7;
}

void cho1()
{
 int year, month, start_yoil, mon_size, cal_garo, i, i2;
 int startlist[7] = { 1, 0, -1, -2, -3, -4, -5 };
 
 while(1)
 {
  printf("원하는 년도, 월을 입력하시오\n(단 년도는 1800-2200까지): ");
        scanf( "%d, %d" , &year, &month );
  
  if ( year >= 1800 && year <= 2200 && month >= 1 && month <= 12 ) break;                     //년도의 입력범위 지정
        else printf( "다시 입력 바랍니다.\n" );                        
 }

 start_yoil = find_first_yoil( year, month, &mon_size );

 // 달력 가로 줄수 구하기
 cal_garo = ( start_yoil + mon_size ) / 7 + 1;

 // 달력 출력
 printf("\n[%d년 %d월]\n  일   월   화   수   목   금   토   \n", year, month);
 for( i = 0; i < cal_garo; i++ )
 {
  i2 = startlist[start_yoil] + 7*i;
  // 달력의 첫줄 출력
  if ( i == 0 )
  {
   printf("  ");

   while(1)
   {
    if ( i2 > 0 ) printf( "%2d", i2 );
       else printf( "  " );
    printf( "   " );
    i2++;
    if ( i2 == startlist[start_yoil] + 7 ) break;
   }

   printf("\n");
  }
  // 달력의 마지막줄 출력
  else if ( i + 1 == cal_garo )
  {
   printf("  ");

   while(1)
   {
    if ( i2 > mon_size ) break;
    printf( "%2d   ", i2 );
    i2++;
   }
   printf("\n");
  }
  // 달력의 중간줄 출력
  else printf("  %2d   %2d   %2d   %2d   %2d   %2d   %2d\n", i2, i2 + 1, i2 + 2, i2 + 3, i2 + 4, i2 + 5, i2 + 6 );
 }
   
}

void cho2()
{
 int year, month, day, mon_size, yoil;
 char st[7][3] = { "일", "월", "화", "수", "목", "금", "토" };

 while(1)
 {
  printf( "원하는 년도, 월, 일을 입력하시오\n(단 년도는 1800-2200까지): ");
        scanf( "%d, %d, %d" , &year, &month, &day );
  
  if ( year >= 1800 && year <= 2200 && month >= 1 && month <= 12 && day >= 1 && day <= 31 ) break;                
        else printf("다시 입력 바랍니다.\n");                        
 }

 //첫달의 요일을 구한다.
 yoil = find_first_yoil( year, month, &mon_size );
    //구한 첫달의 요일에 (일수-1)를 더한다.
 yoil += (day - 1);
 //7로 나눠 요일을 구한다.
 yoil = yoil % 7;

 printf("%d년 %d월 %d일은 %s요일입니다.\n", year, month, day, st[yoil] );
}


'프로그래밍' 카테고리의 다른 글

파일 입출력3  (0) 2009.12.09
파일입출력2  (0) 2009.12.04
파일입출력  (1) 2009.11.30
카드게임  (0) 2009.11.17
자판기 프로그램  (0) 2009.11.10
운영체제 도서관리 프로그램  (0) 2009.10.18
운영체제 파일입출력2  (0) 2009.10.17
운영체제 파일입출력  (0) 2009.10.17
운영체제 자판기 프로그램  (1) 2009.10.17
운영체제 버블소트  (0) 2009.10.17

설정

트랙백

댓글