- 년도와 월을 입력 받아 달력을 출력
- 윤년 규칙
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월
위와 동일한 조건으로,
윤년일때 lastday 배열의 index 1 을
29로 바꿔주었습니다.
④ 달까지의 일 수 구하기
0부터 입력 받은 달의 -1 한 값을 반복합니다.
이때 i 의 값을 하나씩 올려주면서
배열 인덱스를 하나씩 올려갑니다.
배열의 인덱스가 올라가면서
기존의 sum 에 더해
사용자가 원하는 최종 달의 일 수를 구합니다.
⑤ 요일 출력하기
⑥ 공백 출력하기
첫 주의 1일이 알맞은 위치에 표시될 수 있도록
사용할 변수 temp=0 을 선언.
만약 달의 1일의 요일이 토 (6) 일 경우
공백이 6번 출력되지 못하도록
$cnt == 6 에 break 문을 넣습니다.
echo 의 옵션 n 을 사용하여 출력 후 다음 줄로 넘어가지 못하게 합니다.
마지막으로 temp 를 1씩 늘려주어
공백을 출력합니다.
⑥ 마무리
공백 출력 후 1 출력 해줍니다.
day 를 1로 초기화하고,
1부터 해당 월의 일 수 보다 작거나 같을 때까지
반복하여 출력합니다
cnt가 7로 나누어 떨어지면 모두 출력하였으므로
echo 를 사용하여 한줄 개행합니다.
시작 요일을 0 (일요일) 로 초기화.
⑦ 결과!