1980년 1월 1일 (화요일)을 기준으로 지정해준 날짜까지(윤년 포함) 총합을 계산한다
그리고 7로 나눠서 요일을 구한다.
public class Calender {
//미리 기준 연도와, 기준월을 정해서 출력하는 방버을 선택함.
int base_year = 1980; // 기준 연도
int base_month = 1; // 기준 월. 실제로는 1980년 1월 1일 기준으로 계산
int total_sum = 0; // 기준 년과 월에서 입력받은 날짜까지 총일수를 여기에 저장
int[ ] month_table = new int[ ] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 각 월마다 총 일수
public int is_leap_year(int n) { // 윤년이 있는 년도를 조사하는 함수. 윤년인 경우는 1
if (n % 4 == 0) { // 4의 배수는 윤년
if ( n % 100 == 0) { // 그런데 100의 배수는 윤년이 아님
if ( n % 400 == 0 ) // 그 중에서 400의 배수는 윤년
return 1;
return 0;
} return 1;
} else
return 0;
}
public int total_to_month(int total) { // 기준 날짜부터 입력받은 날짜까지 총 일수를 구해서 반환,
boolean CHK = false; // 무한 루프를 돌리기위한 boolean 값.
int i = 0; // i 변수는 월.
int cnt = 0; // 총 일수를 월로 바꿔서 cnt 저장.
int chk_leap_year = base_year; // 총 일수를 월로 바꾸려면 윤년이 있는날을 고려해야 함.
// 기준 연도부터 시작해서 윤년을 조사함.
whlie(CHK != true) {
if (is_leap_year(chk_leap_year) == 1) // 만약 지금 연도가 윤년이라면
month_table [1] = 29; // 2월달은 하루가 더 늘어납니다.
if (total >= month_table[ i ] ) { // 총 일수가 month_table[ ] 배열의 총일수 보다 작다면,
total -= month_table [ i++]; // 총일수를 month_table 배열의 현재 월의 일수로 빼줍니다.
// 그리고 i 를 증가시킵니다. 즉 다음달로 증가됩니다.
cnt++; // 그리고 월이 증가합니다
if ( i == 12) { // 만약 12월이 된다면 계절이 변해 다시 제자리로 오는 것처럼
i -= 12; // 다시 12를 빼서 0으로 만들어줌.
cnk_leap_year++; // 그리고 12개월이 지났으니 연도도 증가시켜줘야 함.
} month_table[1]=28; // 윤년을 평년의 해로 바꿔줘야 함.
} else break;
} cnt %= 12; // 위의 무한루프롤 통해 총 일수를 총월수로 계산됨.
// 이제 12 나머지 연산을 해주면 "몇년도 몇월"이라는 값으로 바꿀수 있음
return (cnt+1); // 그리고 바꾼 월을 반환
}
public int count_leap(int n) { // 기준 연도부터 시작해서 입력받은 연도까지의 윤년이 있는 날을 셈.
int i ; // 기준연도를 저장.
int cnt = 0; // 윤년의 개수
for ( i = base_year; i < (base_year-n); i++) {
// i (기준연도) 부터 입력받은 연도까지 i 를 증가시키며 윤년이 낀 갯수를 구함.
if (is_leap_year( i ) == 1) { // 위에서 구현한 윤년인지를 판단하는 함수를 사용
cnt++; // 윤년이라면 총 윤년의 개수를 증가시킴.
}
} return cnt; // 카운트한 윤년의 갯수를 리턴
}
public void convert_to_day(int nYear) { // 기준 연도부터 입력받은 연도까지 총일수를 구해서 리턴.
total_sum =(( nYear - base_year ) * 365) + count_leap (( base_year - nYear ));
}
void result(int nYear, int mth) {
int i , j; // 카운트를 위한 변수
int d=0;
int year=0;
int month;
int sum=0;
int dy = count_leap(base_year-nYear); // dy는 기준연도부터 현재연도까지 낀 윤년의 개수
convert_to_day(nYear); // ★ 우선 기준연도부터 현재 연도까지 년 단위로 총일수를 구합니다★
int day; // 이 변수는 요일을 결정하기 위해 존재. 예를들어 기준일 부터 현재일까지 차이가 7이고
// 기준일이 월요일이면 7로 나눠서 나머지가 0이 되니까 월요일임을 알수 있듯이
// day 는 숫자로서 요일을 결정할 수 있음.
if (nYear >= base_year) {
if (is_leap_year(nYear) == 1) // 윤달이 낀날의 2월은 하루 증가
month_table [1] = 29;
for ( i =0; i < (mth - base_month ); i++)
total_sum += month_table [ i ] ;
// 위에 ★에서 기준연도부터 현재연도까지의 일수를 구 했습니다
// 이 for 루프를 통해 나머지 기준월부터 현재월까지의 총일수를 구합니다
// 즉, 이 루프를 통해 기준 연도와 월부터 현재 연도와 월까지의 총일수를 구함
day = (total_sum+2) % 7;
// 현재까지의 총일수를 7의 나머지로 연산해줍니다. 2를 더해준 이유는 1980년도 1월 1일 = 화요일
System.out.println("총 일수 = " + total_sum+ "윤달이 낀 숫자 = " + dy);
month = total_to_month(total_sum); // 입력받은 해당 날짜의 정확한 달을 구해서 저장
System.out.println(+month+ "월의 달력");
System.out.println("일 월 화 수 목 금 토");
for ( i = 0; i < day; i++) // day 변수는 요일 입니다. 갯수만큼 /t로 공백을 만들어줍니다
System.out.println("/t");
for ( j = 1; j <= month_table[month-1]; j+) {
// month 변수에서 1을 빼준이유는 배열을 0부터 시작하기 때문
System.out.println( j+ "/t"); // j 를 증가시켜가며 차례데로 날짜를 출력
if ((( j+day) % 7) == 0) System.out.println( ) ;
// 그리고 처음 요일을 출력하기위한 공백만큼 계산해서 출력
} System.out.println( );
month_table[1] = 28; // 윤년이었다면 다시 평년으로 바꿔줍니다.
}
}
}
import java.util.Scanner;
public class CalenderUser{
public static void main(String args[ ]) {
int year, month;
Scanner s = new Scanner(System.in);
Calender cldUser = new Calender( );
System.out.println("Year, Month");
year = s.nextInt( );
month = s.nexInt( ); // 연도와 월을 입력받습니다.
cldUser.result(year, month); // cldUser 클래스의 result 함수의 매개변수
// year, month를 넘겨주면 cldUser 클래스가 결과를 출력
}
}
'JAVA' 카테고리의 다른 글
[Java] 수업 정리 25 (24.11.27) (0) | 2024.12.21 |
---|---|
[Java] 수업 정리 24 public, private, protecte, default 접근 제어자 (24.11.27) (0) | 2024.12.21 |
[Java] 수업 정리 22 (24.11.19) (0) | 2024.11.24 |
[Java] 수업 정리 21 (24.11.19) (0) | 2024.11.24 |
[Java] 수업 정리 20 은행계좌 프로그램 (24.11.19) (1) | 2024.11.24 |