코딩 이야기

[C언어] 날짜값을 넣으면 해당 요일을 출력하는 코딩예제 (윤년)

고주망고 2021. 7. 4. 15:32

해당 포스트는 개인적으로 코딩을 연습한 내용인데 여러분들이 만든 코드와 비교해보시라고 포스팅해봅니다.

 

코딩 목표:
1. 날짜값을 입력받고 해당요일을 출력하기
2. 해당 년도가 윤년이 있는 날인지 확인하여 윤년입니다/평년입니다 출력
3. 함수를 최대한 많이 사용하여 알고리즘적으로 만들기
4. 1년부터~4자리수의 년도까지 가능한 코딩 만들기
5. 메인함수를 최대한 깔끔하게 작업하기!!

코딩의 어려운 부분:
1. 윤년계산
2. 해당년도의 1월1일값 찾기
3. 윤년에 의하여 1년이 366일이 되는 날이 있는점

 

 


코딩 내용:
/* 날짜를 넣으면 무슨 요일인지 찾는 프로그램*/
/* 아이디어 : 규칙 찾기(7일 단위로 돌아오니까 7로 나눠서 나머지로 하기!!*/
/* 아이디어 : 윤년을 찾아서 29일 계산해야합니다(윤년:4의배수,100의배수제외,400의배수는 포함하는 년도)*/
/* 목표 : 메인 함수 최대한 깔끔하게 작업하기 */

/*1년 1월 1일:월*/
/*2년 1월 1일:화*/
/*K년 1월 1일:값은 무엇인지 확인해보기!!*/
/*2000년1월1일:토(윤년:366일)*/
/*2001년1월1일:월*/
/*2002년1월1일:화*/
/*2003년1월1일:수*/
/*2004년1월1일:목(윤년:366일)*/
/*2005년1월1일:토*/
/*2006년1월1일:일*/
/*2007년1월1일:월*/
/*2008년1월1일:화(윤년:366일)*/
/*2009년1월1일:목*/

/*연도의 규칙:
평년이면 1일씩 밀리고
윤년이 나오면 2일씩 밀린다*/

/*평년
1월:31일 2월:28일 3월:31일 4월:30일 5월:31일 6월:30일
7월:31일 8월:31일 9월:30일 10월:31일 11월:30일 12월:31일*/

/*윤년
1월:31일 2월:29일 3월:31일 4월:30일 5월:31일 6월:30일
7월:31일 8월:31일 9월:30일 10월:31일 11월:30일 12월:31일*/


/* ============코드의 시작 부분 =============*/
#include <stdio.h>
#define sum_day 365 //윤년 아닐경우
#define sum_yday 366 //윤년일 경우

#define Jan 31 //1월
#define Feb 28 //2월
#define YFeb 29 //2월(윤년)
#define Mar 31 //3월
#define Apr 30 //4월
#define May 31 //5월
#define Jun 30 //6월
#define Jul 31 //7월
#define Aug 31 //8월
#define Sep 30 //9월
#define Oct 31 //10월
#define Nov 30 //11월
#define Dec 31 //12월

int input_year(void); //입력받은 년도를 반환
int input_month(void); //입력받은 월을 반환
int input_day(void); //입력받은 날짜를 반환
void output(int year, int month, int day);
int Is_leap(int year); //윤년인지 아닌지 확인하는 함수
int sum_month(int leap, int month, int day);
void print_day(int year_day, int month_day);

int main(void) {
int year, month, day;

year = input_year();
month = input_month();
day = input_day();

output(year,month,day);

return 0;
}

int input_year(void) {
int input_year;
do {
printf("연도를 입력하세요(1년이상의 값) : ");
scanf_s("%d", &input_year);
} while (input_year <= 0);
return input_year;
}

int input_month(void) {
int input_month;
do {
printf("월을 입력하세요(1월이상 12월이하) : ");
scanf_s("%d", &input_month);
} while ((input_month < 1) || (input_month > 12));
return input_month;
}

int input_day(void) {
int input_day;
do {
printf("일을 입력하세요 : ");
scanf_s("%d", &input_day);
} while ((input_day < 1) || (input_day > 31));
return input_day;
}

int Is_leap(int year) { //윤년인지 아닌지 확인하는 함수
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { //4의배수지만 100의배수는 아니고 400의배수일경우
return sum_yday;
}
else {
return sum_day;
}
}

int sum_month(int leap,int month, int day) {
int sum = 0;
if (leap == sum_day) { //평년일 경우
switch (month) {
case 1: //1월인 경우
sum = 0;
break;
case 2:
sum = (Jan);
break;
case 3:
sum = (Jan +Feb);
break;
case 4:
sum = (Jan +Feb + Mar);
break;
case 5:
sum = (Jan +Feb + Mar + Apr);
break;
case 6:
sum = (Jan +Feb + Mar + Apr + May);
break;
case 7:
sum = (Jan +Feb + Mar + Apr + May + Jun);
break;
case 8:
sum = (Jan +Feb + Mar + Apr + May + Jun + Jul);
break;
case 9:
sum = (Jan +Feb + Mar + Apr + May + Jun + Jul + Aug);
break;
case 10:
sum = (Jan +Feb + Mar + Apr + May + Jun + Jul + Aug + Sep );
break;
case 11:
sum = (Jan +Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct);
break;
case 12:
sum = (Jan +Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov);
break;
default:
printf("오류발생\n");
break;
}
}
else if (leap == sum_yday) { //윤년일경우
switch (month) {
case 1: //1월인 경우
sum = 0;
break;
case 2:
sum = (Jan);
break;
case 3:
sum = (Jan + YFeb);
break;
case 4:
sum = (Jan + YFeb + Mar);
break;
case 5:
sum = (Jan + YFeb + Mar + Apr);
break;
case 6:
sum = (Jan + YFeb + Mar + Apr + May);
break;
case 7:
sum = (Jan + YFeb + Mar + Apr + May + Jun);
break;
case 8:
sum = (Jan + YFeb + Mar + Apr + May + Jun + Jul);
break;
case 9:
sum = (Jan + YFeb + Mar + Apr + May + Jun + Jul + Aug );
break;
case 10:
sum = (Jan + YFeb + Mar + Apr + May + Jun + Jul + Aug + Sep );
break;
case 11:
sum = (Jan + YFeb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct);
break;
case 12:
sum = (Jan + YFeb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov);
break;
default:
printf("오류발생\n");
break;
}
}
else{
printf("오류발생\n");
}
sum += day;
return sum;
}

int year_count(int year) { //0:일 1:월 2:화 3:수 4:목 5:금 6:토
int count = 1; //월요일
for (int i = 1; i < year; i++) {
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) { //윤년일 경우
count++;
count++;
}
else { //평년일경우
count++;
}
}
count %= 7;
return count;
}

void print_day(int year_day, int month_day) {//각 연도의 1월 1일의 요일 알아내기
if (year_day == 0) { //1월1일이 일요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 금요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 1) { //1월1일이 월요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 토요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 2) { //1월1일이 화요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 일요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 3) { //1월1일이 수요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 월요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 4) { //1월1일이 목요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 화요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 5) { //1월1일이 금요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 목요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 수요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else if (year_day == 6) { //1월1일이 토요일인 경우
switch (month_day % 7) {
case 0:
printf("입력받은 값의 요일은 금요일 입니다");
break;
case 1:
printf("입력받은 값의 요일은 토요일 입니다");
break;
case 2:
printf("입력받은 값의 요일은 일요일 입니다");
break;
case 3:
printf("입력받은 값의 요일은 월요일 입니다");
break;
case 4:
printf("입력받은 값의 요일은 화요일 입니다");
break;
case 5:
printf("입력받은 값의 요일은 수요일 입니다");
break;
case 6:
printf("입력받은 값의 요일은 목요일 입니다");
break;
default:
printf("오류 발생했습니당");
break;
}
}
else {
printf("오류발생");
}
return ;
}



void output(int year, int month, int day) {
int leap;
int month_day; //월을 일로 환산한값
int year_day; //각 연도의 1월 1일의 요일 알아내기

printf("=================================================================\n");
printf("==========================출력결과===============================\n");
printf("=================================================================\n");

printf("사용자에게 입력받은 날짜는 %d년 %d월 %d일 입니다\n", year, month, day); //여기서 연도와 월을 검사하는 프로그램을 만들어야함

leap=Is_leap(year);
year_day = year_count(year); //해당 연도의 1월 1일 요일을 알아내는것이 필요함(0:일 1:월 2:화 3:수 4:목 5:금 6:토 반환)
month_day = sum_month(leap,month, day);
if (leap == sum_day) { //평년인 경우
printf("평년입니다\n");
print_day(year_day, month_day);
}
else if (leap == sum_yday) { //윤년인 경우
printf("윤년입니다\n");
print_day(year_day, month_day);
}
else {
printf("오류발생.\n");
}
}







C언어/날짜를 넣으면/연도를 넣으면/출력/C언어 출력/C/연도 출력 함수/출력/함수/요일/윤년

감사합니다. 앞으로도 다양한 문제로 자주 올려보겠습니다.

 

 

C언어에 더 알고 싶다면?

👉C언어 마이크로 소프트 Visual Studio 2019 설치방법은?

👉C언어 알고리즘/순서도/프로그래밍 개념/디버깅이란?

👉C언어로 구사하는 알고리즘 1. 날짜값을 넣으면 해당 요일이 나오는 코딩 예제(윤년계산)

👉C언어로 구사하는 알고리즘 2. 형변환 그레이코드를 만드는 알고리즘

👉C언어로 구사하는 알고리즘 3. 성적 석차 구하기 알고리즘 구현하기

👉C언어로 구사하는 알고리즘 4. 정수 오름차순/내림차순을 구현하는 알고리즘(SORT)