Full-Stack 개발자가 되려는 작은 개발자의 블로그
Java를 이용한 달력 프로그램 본문
1.작성자의 소스코드
package test0306;
import java.util.Scanner;
public class CalendarProgram {
public static void main(String[] args) {
Scanner scan =new Scanner(System.in);
int startDay=1; //1은 월요일을 의미
System.out.println("년도 입력 :");
int year = scan.nextInt();
System.out.println("월 입력 :");
int month= scan.nextInt();
int preMonthDays=0;
int day=1;
boolean flag=false;
for(int i=1;i<=year;i++) {
for(int m=1;m<=12;m++) {
if(i==year&&flag) {
break;
}
switch(m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(m==month&&i==year) {
preMonthDays=31;
flag=true;
}else {
startDay=(startDay+31)%7;
}
break;
case 2:
if(m==month&&i==year) {
if(((i%4==0)&&(i%100!=0))||(i%400)==0) {
preMonthDays=29;
flag=true;
}else {
preMonthDays=28;
flag=true;
}
break;
}else {
if(((i%4==0)&&(i%100!=0))||(i%400)==0) {
startDay=(startDay+29)%7;
}else {
startDay=(startDay+28)%7;
}
break;
}
case 4:
case 6:
case 9:
case 11:
if(m==month&&i==year) {
preMonthDays=30;
flag=true;
}else {
startDay=(startDay+30)%7;
}
}
}
}
System.out.println(year+"년 "+month+"월");
System.out.println("======================");
System.out.println(" 일 월 화 수 목 금 토");
System.out.println("======================");
for(int j=0;j<startDay;j++) {
System.out.print(" ");
}
for(int d=1;d<=preMonthDays;d++) {
if(startDay==7) {
startDay=0;
System.out.println();
}
for(int i=0;i<7;i++) {
if(i==startDay){
System.out.printf("%3d",d);
day+=1;
}
}
startDay+=1;
}
}
}
2.교수님의 소스코드(분석)
import java.util.Scanner;
public class CalendarProgramSample {
public static void main(String[] args) {
//사용자의 입력을 받을 스캐너 객체 선언 및 생성
Scanner scan = new Scanner(System.in);
//출력할 년도와 달을 입력받을 변수를 선언 및 0으로 초기화 한다.
int year = 0, month = 0;
//총 일수를 담을 변수를 선언 및 0으로 초기화한다.
int totalDay = 0;
//해당 달의 날짜를 받을 변수를 선언 및 0으로 초기화 한다.
int dayOfMonth = 0;
//해당 달의 시작 날짜를 받을 변수를 선인 및 1로 초기화한다.(1년 1월 1일은 월요일)
int startDay = 1;
//년도와 달을 입력하라는 출력 문구 및 생성한 Scanner객체를 통해 year,month 변수에 값을 입력한다.
System.out.println("연도와 월을 입력하세요.");
System.out.print("연도 : ");
year = scan.nextInt();
System.out.print("월 : ");
month = scan.nextInt();
//변수 i는 1년부터 내가 입력한 년도 전까지 반복한다.(2020을 입력하면 2019년도까지 총 일수를 구한다.)
for (int i = 1; i < year; i++) {
//총 일수에 365일을 더한다.
totalDay += 365;
//만약 윤년 계산식을 통해 해당 년도가 윤년이라면
if (((i % 4) == 0) && ((i % 100) != 0) || ((i % 400) == 0)) {
//총 일수에 하루를 더 더해준다.(윤년은 29일까지 있으므로)
totalDay++;
}
}
//해당 년도 1월부터 입력 달 전까지 반복한다. ->전까지 반복해야 입력 달의 시작 날짜를 구할 수 있다.
for (int j = 1; j < month; j++) {
//4,6,9,11월이라면
if (j == 4 || j == 6 || j == 9 || j == 11) {
//총 일수에 30을 더한다.
totalDay += 30;
} else if (j == 2) { //2월이라면
//윤년인지 확인 후 윤년이라면
if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
//총 일수에 29를 더한다.
totalDay += 29;
} else { //윤년이 아니라면
//총 일수에 28을 더한다.
totalDay += 28;
}
} else { //그리고 나머지 월들은
//총 일수에 31을 더한다.
totalDay += 31;
}
}
//총 일수를 7로 나눈 후 나머지가 내가 입력한 연도의 해당 달의 시작일이다.
startDay =(startDay+ totalDay )% 7;
// --------------------------------------------------------------
//내가 입력한 달이 4,6,9,11월이면
if (month == 4 || month == 6 || month == 9 || month == 11) {
//해당 달의 일수를 30으로 저장
dayOfMonth = 30;
} else if (month == 2) { //2월이라면
//윤년이라면
if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
//해당 달의 일수를 29으로 저장
dayOfMonth = 29;
} else { //윤년이 아니라면
//해당 달의 일수를 28으로 저장
dayOfMonth = 28;
}
} else { //그 이외의 달이라면 31을 더한다.
dayOfMonth = 31;
}
// --------------------------------------------------------------
System.out.println();
System.out.println(year + "년\t\t\t\t\t\t" + month + "월");
System.out.println("===================================================");
System.out.println("일\t월\t화\t수\t목\t금\t토");
System.out.println("===================================================");
// --------------------------------------------------------------
//시작일이 일요일이 아닌 경우 해당 요일전까지 공백을 출력하기 위해
//일요일부터 해당 시작일 전까지 반복한다.
for (int k = 0; k < startDay; k++) {
//tab만큼 띄워준다.
System.out.print("\t");
}
// --------------------------------------------------------------
//1일부터 해당 달의 일수만큼 반복한다.
for (int l = 1; l <= dayOfMonth; l++) {
//날짜를 찍어준다.
System.out.printf("%2d", l);
//다음 요일로 위치를 증가시켜준다.
startDay++;
//만약 시작 위치가 7로 나눠떨어진다면(즉 토요일을 벗어난다면)
if (startDay % 7 == 0) {
//줄바꿈을 한다.
System.out.println();
} else { //아직 토요일이 되지 않았다면
//일마다 간격을 준다.
System.out.print("\t");
}
}
scan.close();
}// main 끝
}// 클래스 끝
'강의 정리 > Java' 카테고리의 다른 글
Java를 이용한 학생 관리 프로그램/가계부 프로그램 (0) | 2020.03.11 |
---|---|
Java 기초 실습5 (0) | 2020.03.09 |
Java 기초 실습4 (0) | 2020.03.05 |
Java 기초 실습3 (1) | 2020.03.04 |
Java 기초 실습2 (1) | 2020.03.03 |
Comments