코딩 이야기

[C언어] 연도, 월, 일 날짜를 입력하면 요일을 반환하는 함수를 구현해보자( 문자열, 배열 사용)

고주망고 2021. 8. 15. 13:25

학습목표: 연도, 월, 일을 입력하면 해당 요일을 출력해주는 프로그램 구현


목표 1. 윤년에 대하여 알아보자

윤년이란?
1. 4로 나누어 떨어지는 년도
2. 4로 나누어 떨어지더라도 100으로도 나누어 떨어지면 평년
3. 100으로 나누어떨어져도 400으로 나누어 떨어지면 윤년
결론. 윤년:(year%4==0)&&((year%400==0)||(year%100!=0))

 

목표 2. 매년 1월 1일의 요일의 규칙 찾기

1년 : 월요일 (윤년)
2년 : 화요일 (윤년)
...
2016년 : 금요일 (윤년)
2017년 : 일요일 (평년)
2018년 : 월요일 (평년)
2019년 : 화요일 (평년)
2020년 : 수요일 (윤년)
2021년 : 금요일 (평년)

결론. 윤년이 나오면 다음연도의 1월 1일 요일이 하루 밀린다.
아이디어: char*str[]={월요일,화요일,수요일,목요일,금요일,토요일,일요일}이런식으로 문자열 포인터 변수를 사용해보자

목표 3. 메인 함수는 최대한 간략하게 사용하기

<함수를 최대한 써서 깔끔하게 사용>

함수 설명
int Is_Leap_Year(int year); => 연도를 받아 윤년(반환값: 1)인지 평년(반환값: 0)인지 검사를 한다.
int Print_Day(); => 무슨 요일인지 출력해주는 함수


실습예시

실습 예시1

 

실습 예시2
실습 예시3


 

주석
메인 함수
함수


/* 학습목표: 연도, 월, 일을 입력하면 해당 요일을 출력해주는 프로그램 구현
목표 1.윤년의 계산
윤년이란?
1. 4로 나누어 떨어지는 년도
2. 4로 나누어 떨어지더라도 100으로도 나누어 떨어지면 평년
3. 100으로 나누어떨어져도 400으로 나누어 떨어지면 윤년
결론. 윤년:(year%4==0)&&((year%400==0)||(year%100!=0))

목표 2.매년 1월 1일의 요일의 규칙 찾기
1년 : 월요일 (윤년)
2년 : 화요일 (윤년)
...
2016년 : 금요일 (윤년)
2017년 : 일요일 (평년)
2018년 : 월요일 (평년)
2019년 : 화요일 (평년)
2020년 : 수요일 (윤년)
2021년 : 금요일 (평년)

결론. 윤년이 나오면 다음연도의 1월 1일 요일이 하루 밀린다.
아이디어: 문자열 배열을 사용해서 CHAR DAY[]={월요일,화요일,수요일,목요일,금요일,토요일,일요일}을 사용해보자

목표 3. 메인 함수는 최대한 간략하게 사용하기
1. 함수를 최대한 써서 깔끔하게 사용

함수 설명
int Is_Leap_Year(int year); => 연도를 받아 윤년(반환값: 1)인지 평년(반환값: 0)인지 검사를 한다.
int Print_Day(); => 무슨 요일인지 출력해주는 함수
*/


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Is_Leap_Year(int year);
void Print_Day(int year, int month, int day);

void main() {
int year = 0, month = 0, day = 0; //연도, 월, 일
printf("연도, 월, 일을 입력해주세요:");
scanf_s("%d %d %d", &year, &month, &day);

if (Is_Leap_Year(year) == 1) { //윤년
printf("윤년입니다\n");
Print_Day(year, month, day);
}
else if (Is_Leap_Year(year) == 0) { //평년
printf("평년입니다\n");
Print_Day(year, month, day);
}
else {
printf("오류 발생"); //오류
}
}

int Is_Leap_Year(int year) {
if ((year!=0)&&(year % 4 == 0) && ((year % 400 == 0) || (year % 100 != 0))) { 
return 1; //0년이 아닌 동시에 윤년이어야한다
}
else {
return 0;
}
}

void Print_Day(int year, int month, int day) {
char* days[7] = { "일요일","월요일","화요일","수요일","목요일","금요일" ,"토요일"};
int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int index = 0; //days를 계산하는 변수 <0: 일요일부터 시작>
int count = 0; //year까지 가면서 중간에 윤년이 나오면 2칸을 미룬다
int sum_days = 0;

while (count != year) { //해당 연도의 1월 1일의 요일 계산
count++;
if (Is_Leap_Year(count-1) == 1) { //주의:윤년의 다음 요일이 밀린다
index++; //윤년인 경우 2칸 미룸
index++;
}
else { //평년인 경우
index++;
}
}

for (int i = 0; i < month-1; i++) { //해당 연도의 월, 일의 총합일수를 구한다
sum_days += months[i];
}
if ((month >= 3) && (Is_Leap_Year(year) == 1)) {
sum_days += day + index;
}
else {
sum_days += day + index-1;//0일부터 시작하는것이 아니기때문에 -1을 해주어야한다
}

printf("%d년 %d월 %d일은 %s 입니다", year,month,day,days[sum_days % 7]);
}