1. 입력형식에 상관없이 전역일을 계산해주는 프로그램

 

    1.1. Source Code

 

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

 

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

 

 

int main(void)

{

 

        char cEnter[20];

        int i = 0;

        int j = 0;

        int y = 0;

        int m = 0;

        int d = 0;

 

        int iMonth = 0;

        int iDay = 0;

        int iYear = 0;

        int iTotal = 0;

        int iTotal2 = 0;

        int iTotal3 = 0;

 

        int iMonthslist[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

 

        double dPercent = 0;

        double dTotal = 0;

        double dTotal2 = 0;

        double dTotal3 = 0;

        //현잰 날짜 출력

        time_t ct;

 

        struct tm tm;

        ct = time(NULL);

 

        tm = *localtime(&ct);

 

        printf("현재 날짜: %d%d %d \n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);

        printf("=========================================육군 군복무 계산기=========================================\n");

        printf("날짜를 입력하세요 : ");

       

        scanf("%[^\n]", cEnter); //space 를 누를경우 입력이 중지되는 문제가 발생하여 %[^\n] 사용, 엔터를 제외한 모든 문자열을 받는다는 뜻

 

        /*--------------------------------------날짜를 형식에 상관없이 입력----------------------------------------------*/

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

        {

               if ((cEnter[i] >= 48 && cEnter[i] <= 57) && (cEnter[i+1] >= 48 && cEnter[i+1] <= 57) && (cEnter[i+2] >= 48 && cEnter[i+2] <= 57) && (cEnter[i+3] >= 48 && cEnter[i+3] <= 57) && (cEnter[i+4] >= 48 && cEnter[i+4] <= 57))

               {//날짜가 숫자형 나열로 입력될경우 탈출

                       iYear = (atoi(&cEnter[0])- atoi(&cEnter[4]))/10000;

 

                       iMonth = (atoi(&cEnter[4])-atoi(&cEnter[6]))/100;

 

                       iDay = (atoi(&cEnter[6]));

                       break;

               }

 

               if (cEnter[i] >= 48 && cEnter[i] <= 57)

               {

 

                       //printf("숫자%d째 자리\n", i+1); // 한글은 2byte 를 먹는다

                       if (!(cEnter[i + 1] >= 48 && cEnter[i + 1] <= 57) && !(cEnter[i - 1] >= 48 && cEnter[i - 1] <= 57))

                       {//일 또는 월이 한자리 숫자일경우 판단

                              for (m; m <= i; m++)

                              {

                                      //printf("%c", cEnter[m]);

                              }

 

                              if (d == 0)

                              {

                                      //printf("");

                                      d++;//월 표시가 완료된 후에 일 표시를 하기 위해 d 값 상승

                                      iMonth = (atoi(&cEnter[m - 1]));

                                      m = i;//m d 판별후 다시 입력을 위해 i로 초기화

                              }

 

                              else

                              {

                                      iDay = (atoi(&cEnter[m - 1]));

                                      //printf("");

                              }

                       }

 

                       if (!(cEnter[i + 2] >= 48 && cEnter[i + 2] <= 57) && (cEnter[i + 1] >= 48 && cEnter[i + 1] <= 57) && !(cEnter[i - 1] >= 48 && cEnter[i - 1] <= 57))//뒷자리와 첫째 자리, 둘째자리는 숫자이나 셋째자리는 숫자가 아니어야함

                       {//일 또는 월이 두자리 숫자일경우 판단

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

                              {

                                      //printf("%c", cEnter[m]);                            

                              }

 

                              if (d == 0)

                              {

                                      //printf("");

                                      d++;//월 표시가 완료된 후에 일 표시를 하기 위해 d 값 상승

                                      iMonth = (atoi(&cEnter[m - 2]));//정상적으로 출력되나 이해가 가지않음 atoi(&cEnter[m-2])*10 +atoi(&cEnter[m-1]) 이 맞는표현이라고 생각함 m-2 에서 m 까지 입력하라는 뜻?

                                      m = i;//m d 판별후 다시 입력을 위해 i로 초기화

                              }

 

                              else

                              {

                                      iDay = (atoi(&cEnter[m - 2]));

                                      //printf("");

                              }

                       }

 

 

                       if ((cEnter[i + 3] >= 48 && cEnter[i + 3] <= 57) && (cEnter[i + 2] >= 48 && cEnter[i + 2] <= 57) && (cEnter[i + 1] >= 48 && cEnter[i + 1] <= 57)) //숫자가 걸렸을때 둘째 셋째 넷째 자리가 모두 숫자이면 년도로 판단

                       {//네자리 숫자로 입력되는 년도 판단

                              for (y; y <= i + 3; y++)

                              {

                              }

                              iYear = (atoi(&cEnter[y - 4]));

                              //printf("");

                       }

 

               }

               y++;

               m++;

        }

        printf("\n입력 값 :%d %d %d", iYear, iMonth, iDay);

 

 

        /*--------------------------------------날짜를 형식에 상관없이 입력----------------------------------------------*/

        //4로 나누어지면 윤년 그중 100으로 나누어지면 평년 400으로 나누어떨어지는년도는 무조건 윤년

 

               iTotal = (iYear - 1) * 365 + ((iYear - 1) / 4) - ((iYear - 1) / 100) + ((iYear - 1) / 400);

               //입력 년도 -1 까지 일수 계산. 4로 나누어지는 년도마다 +1일 그중 100으로 나누어지는 년도 -1 400으로 나누어지는 년도 +1

 

               if (!(iYear % 4) && iYear % 100 || !(iYear % 400))//올해가 윤년인지 판단

               {

                       iMonthslist[1]++;

               }

               for (i = 0; i < iMonth -1; i++)

               {

                       iTotal += iMonthslist[i];

               }

               iTotal += iDay;

 

        //0001년 부터 흐른 날짜 계산

 

               iMonth =iMonth + 18;

              

               while(iMonth>12)

               {

                       iMonth=iMonth - 12;

                       iYear++;

               }

 

               i = iMonth;

               iDay = iDay - 1;

               if (iDay == 0)

               {

                       iMonth--;

                       iDay = iMonthslist[iMonth - 1];

               }

 

               printf("\n전역일은 %d %d %d일 입니다.",iYear, iMonth,iDay);

 

               iTotal2 = (iYear - 1) * 365 + ((iYear - 1) / 4) - ((iYear - 1) / 100) + ((iYear - 1) / 400);

               //입력 년도 -1 까지 일수 계산. 4로 나누어지는 년도마다 +1일 그중 100으로 나누어지는 년도 -1 400으로 나누어지는 년도 +1

 

               if (!(iYear % 4) && iYear % 100 || !(iYear % 400))//올해가 윤년인지 판단

               {

                       iMonthslist[1]++;

               }

               for (i = 0; i < iMonth - 1; i++)

               {

                       iTotal2 += iMonthslist[i];

               }

               iTotal2 += iDay;

 

               iTotal3 = (tm.tm_year + 1900 - 1) * 365 + ((tm.tm_year + 1900 - 1) / 4) - ((tm.tm_year + 1900 - 1) / 100) + ((tm.tm_year + 1900 - 1) / 400);

               //입력 년도 -1 까지 일수 계산. 4로 나누어지는 년도마다 +1일 그중 100으로 나누어지는 년도 -1 400으로 나누어지는 년도 +1

 

               if (!(tm.tm_year + 1900 % 4) && tm.tm_year + 1900 % 100 || !(tm.tm_year + 1900 % 400))//올해가 윤년인지 판단

               {

                       iMonthslist[1]++;

               }

               for (i = 0; i < tm.tm_mon ; i++)

               {

                       iTotal3 += iMonthslist[i];

               }

               iTotal3 += tm.tm_mday;

 

               dTotal = iTotal2 - iTotal3;

               dTotal2 = iTotal2 - iTotal;

 

               dPercent = 100- ((dTotal) / (dTotal2) * 100);

 

 

 

 

               if (iTotal2 - iTotal3 < 0)

               {

                       printf(" 총 복무일은 %d일 이고 남은 복무일은 0일 입니다.", iTotal2 - iTotal);

                       printf(" 복무율 100 %%\n\n", dPercent);

                       printf("0%%                                   100%%\n");

 

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

                       {

                              printf("");

                       }

               }

 

               else if((iTotal2 - iTotal3)>(iTotal2 - iTotal))

               {

                       printf(" 총 복무일은 %d일 이고 남은 복무일은 %d일 입니다.", iTotal2 - iTotal, iTotal2 - iTotal);

 

                       printf(" 복무율 0 %%\n\n", dPercent);

                       printf("0%%                                   100%%\n");

                       for (i = 1; i < (dPercent / 5); i++)

                       {

                              printf("");

                       }

                       for (i = 0; i < ((100 - dPercent) / 5); i++)

                       {

                              printf("");

                       }

               }

 

               else

               {

                       printf(" 총 복무일은 %d일 이고 남은 복무일은 %d일 입니다.", iTotal2 - iTotal, iTotal2- iTotal3 );

 

                       printf(" 복무율 %.1f %%\n\n",dPercent);

                       printf("0%%                                   100%%\n");

                       for (i = 1; i < (dPercent / 5); i++)

                       {

                              printf("");

                       }

                       for (i = 0; i < ((100 - dPercent) / 5); i++)

                       {

                              printf("");

                       }

               }

 

               printf("\n\n");

 

               //전역일 month 6개월 플러스 -1

 

               //m.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);

        return 0;

}

 

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

1.2. 실행 image

 

1.PNG

 

2.PNG

 

3.PNG

 

6.PNG

 

 

 

 

5.PNG

 

형식에 상관없이 년도/달/일 값이 입력되고,

윤년 및 단축된 복무일 (1년 6개월) 을 고려하여

전역일과 총 복무일 ,현재 날짜로부터 계산된 남은 복무일, 복무율 및 시각화된 복무율을 표시하는 프로그램 입니다.