일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 정보처리기사
- mysql docker
- c
- C언어
- 코딩
- 도커 시작하기
- elk stack
- 자바
- 도커 mysql
- 파이썬
- 스트림셋이란?
- MySQL
- 데이트
- 데이터베이스
- 도커
- 스트림셋
- 도커 elk
- 백준
- nvidia docker
- docker
- 푸시푸시
- python
- 클라우드
- streamsets 강의
- java
- ansible install
- 알고리즘
- 앤서블 설치
- c++
- mysql on docker
- Today
- Total
리그캣의 개발놀이터
만년 달력 만들기[c++] 본문
■ 만년달력 프로그램?
년도와 월의 입력으로 그 년도의 월이 출력되는 프로그램
■ Calendar
-Ex :
■ Hint
-오늘이 목요일이면, 내년 오늘은 무슨요일?
· 365 % 7 = 1
· 일반적으로 1년 후엔 요일이 하루씩 밀려감
· 즉, 0년 1/1이 일요일이면 1400년 1/1일은 일요일?
· 윤년, 윤달 고려
- 4로 나누어지는 해는 윤년으로 2월이 29일 -> 1년:366일
- 100으로 나누어지는 해는 윤년이 아님.
- 400으로 나누어지는 해는 윤년.
-0년 1월 1일: 일요일?
-(0년 1월 1일 ~ 2004년 4월 1일까지 날수)%7=?
■ 알고리즘
·각 월의 최대 날짜를 담을 수 있는 배열 선언
1월:31 2월:28or29 3월:31일 4월:30일 5월:31일 6월:30일 7월:31 8월:31 9월:30 10월:31
11월:30 12월:31
int endday[13] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(year==윤년){
endday[1]=29;}// 만약 윤년이면 2월은 29일 설정
·년도와 월을 받을 수 있는 변수 선언
int year, month;
·while문 작성(answer 값이 N이면 프로그램 종료)
do{ }while(answer!='N')
·year의 기준일은 2000년도 1월 1일 토요일
·month의 값은 month>=1&&month<=12 어야 함.
if(month>=1&&month<=12)
{for(i=0;i<7;i++) cout << week[i] << "\t"}
*만약 month가 1에서 12사이가 아니면 어떻게 표현하나 고민을 하다가 else인 경우는 다시 년도와
moth를 입력하게끔 프로그램 짜기로 하였음.
·윤년 구하는 방법
-4로 나누어지는 해는 윤년으로 2월이 29일
-100으로 나누어지는 해는 윤년이아님
-400으로 나누어지는 해는 윤년
(year%4==0&&year%100!=0||year%400==0)
메인함수에서 year가 윤년이면 endday[1]//2월 = 29로 설정
프로그램 구현상 윤년이 많이 쓰임으로 윤년이면 참 윤년이 아니면 거짓을 출력하는 함수를 사용
bool yoonyear(int year)
{ if(x%4 != 0) // 만약 y의 값을 4로 나누어서 나머지가 0이 되지않으면 거짓반환
return false
if(x%100!=0) // 만약 y의 값을 100으로 나누어서 나머지가 0이되지 않으면 참을반환
return true;
if(y%400==0) // 만약 y의 값을 400으로 나누어서 나머지가 0이되면 참을 반환한다
return true;
return false; } //나머지는 거짓으로 반환한다
·달력 출력 함수
달력출력함수 void printcalendar(int year,int month) 설정
출력하여 시작년도와 시작월를 2000년도 01월 01일로 기준일로 잡음
startday를 1로 설정 endday를 마지막 일수로 하여 for문출력
for(startday=1;startday<=endday[month-1];startday++)
cout << " " << startday << " ";
int enter를 선언 enter는 토요일이 넘어가면 다음줄 생성
enter=0부터 enter==6이되는순간 cout << endl; 출력
if(enter == 6)
{ cout <<endl; enter =0;// 초기화 필요}그다음 enter++; for문 실행도중에
enter 값 증가연산
*여기서 문제가 발생한다 만약 연도에 따라서 그리고 월에 따라서 시작 일수가
달라진다. 그래서 firstMonth, firstyear 함수를 선언하기로 했다.
space=(firstyear(year)+firstMonth(year,month))%7
·firstyear();
int firstyear(int year)
{ int basic=4 // 2000년 1월 1일 : 토요일을 기준으로 정수형 함수 basic =4를 설정
for(int y = 2000; y >= year; y--)
//정수형 함수 y의값으로 2000을 넣고 y가 year보다 크거나 같으면 y값을 1씩감소시킴
그와동시에 basic값 = +6씩 증가 // 만약 윤년이면 +6더증가 그후 basic%7의값을
basic에 저장시킴
·firstMonth();
int basic=0; //basic 0으로 초기화
for(int I=1;i<month;i++)basic+=endday[i-1]%7;
endday[i-1]를 나눈 값의 나머지를 basic와 함한후 basic에 넣는다.
만약 month의 값이 2보다 크고 윤년이면 basic값을 1증가시킴
basic값을 7로 나눈 나머지 반환
■ 실행화면
■ 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <iostream> using namespace std; void printcalendar(int year,int month); bool yoonyear(int year); int firstMonth(int year,int month); int firstyear(int year); int endday[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main() { int year, month, i; char answer; char week[7][4] = {{"Sun"},{"Mon"},{"Tue"},{"Wed"},{"Thu"},{"Fri"},{"Sat"}}; //[0]="Sun,"[1]="Mon"[2]="Tue"..... do { cout << "Input year & month: "; //기준일 2000년 1월 1일 cin >> year >> month; if(yoonyear(year)) endday[1]=29; else endday[1]=28; cout << "\n------------------------------\n" << endl; if(month>=1&&month<=12) { for(i=0;i<7;i++) cout << week[i] << " "; } cout << endl; printcalendar(year,month); //calendar 출력함수 cout << "\n------------------------------\n" << endl; cout << "다시 입력하시겠습니까??(Y/N): "; cin >> answer ; }while(answer!='N'||answer!='n'); return 0; } void printcalendar(int year, int month) { int startday, enter; int space = (firstyear(year) + firstMonth(year,month)) % 7; enter = space; // enter 변수의 값은 space 변수의 값이다 for (startday = 0 ; startday < space ; startday++) // 정수 startday에 0을 넣고 startday가 curMonthDay의 값보다 작으면 startday는 1씩 증가 cout << " "; // " "을 출력 for (startday = 1 ; startday <= endday[month-1] ; startday++) // startday=1 일때 startday가 endday[month-1]의 값보다 작거나 같으면 startday는 1씩 증가 { cout << " " << startday << " " ; if (startday < 10) cout << " "; if (enter == 6){cout << endl; enter = 0; } else enter++; } } int firstyear(int year) { int basic = 4; // 2000년 1월 1일 : 토요일을 기준으로 정수형 함수 basic = 4을 선언 for (int y = 2000; y >= year; y--) { basic += 6; if (yoonyear(y)) basic += 6; } basic %= 7; return basic; } int firstMonth(int year,int month) { int basic = 0; for (int i = 1; i < month; i++) basic += endday[i-1] % 7; if (month > 2 && yoonyear(year)) // 만약 month의 값이 2보다 크고 yoonyear()값이 true이면 basic++; // basic의 값 1증가시킨다 return basic % 7; // basic의 값을 7로 나눈 나머지 값을 반환한다 } bool yoonyear(int y) // 부울 함수 yoonyear(int y) 의 내용 { if (y % 4 != 0) // 만약 y의 값을 4로 나누어서 나머지가 0이 되지 않으면 return false; // 거짓을 반환한다 if (y % 100 != 0) // 만약 y의 값을 100으로 나누어서 나머지가 0이 되지 않으면 return true; // 참을 반환한다 if (y % 400 == 0) // 만약 y의 값을 400으로 나누어서 나머지가 0이 되면 return true; // 참을 반환한다 return false; // 나머지들은 거짓을 반환한다 } | cs |
'프로그래밍 언어 > C++' 카테고리의 다른 글
c++ 문법 공부하기 5 (0) | 2018.01.21 |
---|---|
c++ 문법 공부하기 4 (0) | 2018.01.21 |
c++ 문법 공부하기 3 (0) | 2018.01.21 |
c++ 문법 공부하기 2 (0) | 2018.01.21 |
c++ 문법 공부하기 1 (0) | 2018.01.21 |