[Linux] 실습 - 달력 출력하기

김동욱·2021년 12월 23일
0

실습

  • 년도와 월을 입력 받아 달력을 출력
  • 윤년 규칙
    1) 4년으로 나누어지는 해는 윤달(2월은 29일)이 있다
    2) 100년으로 나누어지는 해는 윤달이 없다.
    3) 400년으로 나누어지는 해는 윤달이 있다.
    이 규칙을 만족해야만 그 해가 윤년(2월은 29일)이고,
    아닌 경우에는 평년(2월은 28일)이다.

전체 코드

#!/bin/bash
startyear=1900
lastday=(31 28 31 30 31 30 31 31 30 31 30 31)

read -p "출력할 년,달 입력 ex)2018 03 : " year month

while [ $startyear -lt $year ] 
do 
    if [ `expr $startyear % 4` == 0 ]
    then                              
      if [ `expr $startyear % 400` == 0 ]
      then                      
          sum=`expr $sum + 366`  
      elif [ `expr $startyear % 100` == 0 ] 
          then 
            sum=`expr $sum + 365` 
      else
          sum=`expr $sum + 366` 
      fi 
    else
      sum=`expr $sum + 365` 
    fi
    startyear=`expr $startyear + 1`
done

if [ `expr $year % 4` == 0 ] 
then 
    if [ `expr $year % 400` == 0 ] 
    then
      lastday[1]=29 
    elif [ `expr $year % 100` == 0 ]
    then
      lastday[1]=28
    else 
      lastday[1]=29 
    fi
else
    month[1]=28
fi

i=0 
while [ $i -lt `expr $month - 1` ] 
do 
  sum=`expr $sum + ${lastday[$i]}` 
  i=`expr $i + 1`
done

##### 달력 표기 #####
echo -e "\t\t$year  $month\n" # N년 M월
echo -e "SUN \tMON \tTUS \tWED \tTHU \tFRI \tSAT \n" 
echo -e "=================================================== \n" 
    
# 일(0) 월(1) 화(2) 수(3) 목(4) 금(5) 토(6) 
cnt=`expr $sum + 1`
cnt=`expr $sum % 7`

temp=0 
while [ $temp -le $cnt ]
do
    if [ $cnt == 6 ] 
    then break; 
    else   
      echo -en "\t"
    fi
    temp=`expr $temp + 1` 
done

cnt=`expr $cnt + 1`
day=1
while [ $day -le ${lastday[$i]} ]
do 
    echo -en "$day\t"
    day=`expr $day + 1`
    cnt=`expr $cnt + 1`
    if [ `expr $cnt % 7` -eq 0 ] 
    then                      
      echo   
      cnt=0 
    fi
done
echo

과정

① 년도와 월 입력 받기


② 년까지의 일 수 구하기

  • 윤년 규칙의 첫 번째 조건을 충족시키기위해
    사용자가 입력한 년도의 4로 나누어 지는 여부를
    조건으로하여 if 문으로 만들었습니다.

  • 여기서, 4로 나누어 지지 않는 다면
    평년이므로 sum 변수에 365 를 씩 더합니다.

  • 그안에
    윤년의 2번째 조건, 3번째 조건에 맞게 if 문을 추가로 작성해주었습니다.


③ 2월

  • astday 배열에 각 월의 일 수 인
    (31 28 31 30 31 30 31 31 30 31 30 31) 를 넣고

위와 동일한 조건으로,

윤년일때 lastday 배열의 index 1 을
29로 바꿔주었습니다.


④ 달까지의 일 수 구하기

  • 0부터 입력 받은 달의 -1 한 값을 반복합니다.

  • 이때 i 의 값을 하나씩 올려주면서
    배열 인덱스를 하나씩 올려갑니다.

  • 배열의 인덱스가 올라가면서
    기존의 sum 에 더해
    사용자가 원하는 최종 달의 일 수를 구합니다.


⑤ 요일 출력하기

  • 1900년 1월 1일은 월요일로 시작하기 때문에 1을 더해주고, 합계된 일 수를 7로 나누어 나머지를 구해 달의 시작 요일을 알아냅니다.


⑥ 공백 출력하기

  • 첫 주의 1일이 알맞은 위치에 표시될 수 있도록
    사용할 변수 temp=0 을 선언.

  • 만약 달의 1일의 요일이 토 (6) 일 경우
    공백이 6번 출력되지 못하도록
    $cnt == 6 에 break 문을 넣습니다.

  • echo 의 옵션 n 을 사용하여 출력 후 다음 줄로 넘어가지 못하게 합니다.

  • 마지막으로 temp 를 1씩 늘려주어
    공백을 출력합니다.


⑥ 마무리

  • 공백 출력 후 1 출력 해줍니다.

  • day 를 1로 초기화하고,
    1부터 해당 월의 일 수 보다 작거나 같을 때까지
    반복하여 출력합니다

  • cnt가 7로 나누어 떨어지면 모두 출력하였으므로
    echo 를 사용하여 한줄 개행합니다.

  • 시작 요일을 0 (일요일) 로 초기화.


⑦ 결과!

profile
웹 개발 관련 공부한 내용 기록하는 블로그입니다.

0개의 댓글