Test100 만년달력
※ 서기 1년 1월 1일 : 월요일
※ 연도가 4의 배수이면서 100의 배수가 아니거나, 400의 배수이면 2월은 29일(윤년), 나머지 2월은 28일(평년)
※ 2018년 3월 달력을 그린다고 가정하면
1. 1. 1 ~ 2018. 2. 28 까지의 전체 날 수를 구한다.
그 날 수에 +1 연산을 수행하면... (2018년 3월 1일의 요일 확인) 3월의 달력 그릴 준비 끝.
※ 요일 = 전체날수 % 7
Test100.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test100
{
public static void main(String[] args) throws IOException
{
// 인스턴스 클래스 선언
Calendars cd = new Calendars();
// 입력받기(연도, 월)
cd.input();
// 연산
cd.data();
// 결과 출력
cd.print();
}
}
class Calendars
{
// BufferedReader 인스턴스 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 주요 변수 선언
int y, m, nalsu;
int[] months = {31, 0, 31, 30 ,31, 30, 31, 31, 30, 31, 30, 31};
String[] weekNames = {"일", "월", "화", "수", "목", "금", "토"};
int day; //-- 무슨요일부터인지 담을 변수
int[] days; // 해당 월에 며칠이 있는지 담을 변수
// 입력받기(연도, 월)
void input() throws IOException
{
do
{
System.out.print("『연도』를 입력하세요 : ");
y = Integer.parseInt(br.readLine());
}
while (y<1);
do
{
System.out.print("『월』을 입력하세요 : ");
m = Integer.parseInt(br.readLine());
}
while (m<1 || m>12);
}
// 연산
void data()
{
// 윤년인지 판단하기
if ((y%4==0 && y%100!=0) || y%400==0) //-- 윤년이라면
months[1] = 29;
else //-- 평년이라면
months[1] = 28;
// 이전 년도까지 날수 종합
nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400;
// 이전 월까지 날수 종합
for (int i=0; i<(m-1); i++)
nalsu += months[i];
// day에 잠깐 해당 월 날수 담기
day = months[m-1];
// days배열을 해당 월 날수만큼 칸만들기
days = new int[day];
// days배열에 1부터 마지막 일까지 담기
for (int i=0; i<days.length; i++)
days[i] = i+1;
// 무슨요일부터인지 day에 담기
day = nalsu%7+1;
}
// 결과 출력하기
void print()
{
System.out.printf("\n[%d년 %d월]\n\n", y, m);
System.out.println("일 월 화 수 목 금 토");
System.out.println("======================");
for (int i=0; i<day; i++)
System.out.print(" ");
for (int i=0; i<days.length; i++)
{
System.out.printf("%3d", days[i]);
if ((day+i+1)%7==0 && i!=days.length-1)
System.out.println();
}
System.out.println("\n======================");
}
}
cmd
『연도』를 입력하세요 : 2018
『월』을 입력하세요 : 5
[2018년 5월]
일 월 화 수 목 금 토
======================
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
======================
계속하려면 아무 키나 누르십시오 . . .
'Study Note > Java' 카테고리의 다른 글
JAVA_ Test102_ 정렬(sort) 알고리즘 / 선택정렬(Selection Sort) (0) | 2018.06.04 |
---|---|
JAVA_ Test101_ 주민번호 유효성 검사 공식 (0) | 2018.05.30 |
이클립스 에러해결 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path (21) | 2018.05.21 |
JAVA_ Test099_ 배열의 복사 / 임의의 배열(a, b)에 들어 있는 숫자들의 합집합을 출력하는 프로그램 (0) | 2018.05.13 |
JAVA_ Test098_ 배열 / 배열의 복사 (Test097 파일과 비교) / 데이터 복사 (0) | 2018.05.13 |
댓글