해당 포스트는 개인적으로 코딩을 연습한 내용인데 여러분들이 만든 코드와 비교해보시라고 포스팅해봅니다.
코딩 목표:
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언어로 구사하는 알고리즘 1. 날짜값을 넣으면 해당 요일이 나오는 코딩 예제(윤년계산)
👉C언어로 구사하는 알고리즘 2. 형변환 그레이코드를 만드는 알고리즘
'코딩 이야기' 카테고리의 다른 글
[C언어] 정수 오름차순/내림차순을 구현하는 알고리즘(SORT) (0) | 2021.07.13 |
---|---|
[C언어] 성적 석차 구하기 알고리즘 구현하기 (0) | 2021.07.11 |
[C언어] 형변환 그레이코드를 만드는 알고리즘 (0) | 2021.07.11 |
[C언어] 알고리즘/순서도/프로그래밍 개념/디버깅이란? (0) | 2021.07.07 |
[C언어] 마이크로 소프트 Visual Studio 2019 설치방법 (0) | 2021.07.04 |