1일의 요일을 입력할 수 있는 달력 만들기
혼자 만든 것
package Javajigi.Calendar;
import java.util.Scanner;
public class PromptMaking_2 {
private final static String PROMPT="cal> ";
public void rumPrompt() {
Scanner scanner = new Scanner(System.in);
CalendarMaking_2 cal = new CalendarMaking_2();
while (true) {
System.out.println("년도를 입력해 주세요");
System.out.print(PROMPT);
int year = scanner.nextInt();
System.out.println("달을 입력해 주세요");
System.out.print(PROMPT);
int month = scanner.nextInt();
System.out.println("1일의 요일을 입력해 주세요");
System.out.print(PROMPT);
String day = scanner.next();
if (month == -1) {
break;
}
if (month > 12) {
continue;
}
cal.printCalendar(year, month, day);
}
System.out.println("반복이 종료되었습니다.");
scanner.close();
}
public static void main(String[] args) {
PromptMaking_2 p = new PromptMaking_2();
p.rumPrompt();
}
}
package Javajigi.Calendar;
public class CalendarMaking_2 {
private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public boolean isLeepYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
public int getMaxDaysOfMonth(int year, int month) {
if (isLeepYear(year)) {
return LEAP_MAX_DAYS[month - 1];
} else return MAX_DAYS[month - 1];
}
public void printCalendar(int year, int month, String day) {
System.out.printf(" <<%4d년%3d월>>\n", year, month);
System.out.println(" SU MO TU WE TH FR SA");
System.out.println("-----------------------");
int maxday = getMaxDaysOfMonth(year, month);
switch (day) {
case "SU":
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 0) {
System.out.println();
}
}
break;
case "MO":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 6) {
System.out.println();
}
}
break;
case "TU":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 5) {
System.out.println();
}
}
break;
case "WE":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 4) {
System.out.println();
}
}
break;
case "TH":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 3) {
System.out.println();
}
}
break;
case "FR":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 2) {
System.out.println();
}
}
break;
case "SA":
System.out.print(" ");
for (int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if (i % 7 == 1) {
System.out.println();
}
}
break;
default:
System.out.println("실패");
break;
}
System.out.println();
}
}
좋은 예시
package Javajigi.Calendar;
import java.util.Scanner;
public class Promptex {
public int parseDay(String week) {
switch (week) {
case "su":
return 0;
case "mo":
return 1;
case "tu":
return 2;
case "we":
return 3;
case "th":
return 4;
case "fr":
return 5;
case "sa":
return 6;
default:
return -1;
}
}
public void rumPrompt() {
Scanner scanner = new Scanner(System.in);
Calendarex cal = new Calendarex();
while (true) {
System.out.println("년도를 입력해 주세요.(exit : -1)");
System.out.print("YEAR> ");
int year = scanner.nextInt();
if (year == -1)
break;
System.out.println("달을 입력해 주세요.");
System.out.print("MONTH> ");
int month = scanner.nextInt();
if (month > 12 || month < 1) {
System.out.println("잘못된 입력입니다.");
break;
}
System.out.println("첫째 날의 요일을 입력하세요(su, mo, tu, we, th, fr, sa).");
String str_weekday = scanner.next();
int weekday = parseDay(str_weekday);
if (weekday == -1) {
System.out.println("잘못된 입력입니다.");
break;
}
cal.printCalendar(year, month, weekday);
}
System.out.println("반복이 종료되었습니다.");
scanner.close();
}
public static void main(String[] args) {
Promptex p = new Promptex();
p.rumPrompt();
}
}
package Javajigi.Calendar;
public class Calendarex {
private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public boolean isLeepYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
public int getMaxDaysOfMonth(int year, int month) {
if (isLeepYear(year)) {
return LEAP_MAX_DAYS[month - 1];
} else return MAX_DAYS[month - 1];
}
public void printCalendar(int year, int month, int weekday) {
System.out.printf(" <<%4d년%3d월>>\n", year, month);
System.out.println(" SU MO TU WE TH FR SA");
System.out.println("-----------------------");
for (int i = 0; i < weekday; i++) {
System.out.print(" ");
}
int maxday = getMaxDaysOfMonth(year, month);
for(int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if ((i+weekday)%7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
날짜와 달만 입력하면 실제 달력과 같이 나오는 달력 만들기
혼자 만든 것
package Javajigi.Calendar;
import java.util.Scanner;
public class PromptMaking_3 {
public void rumPrompt() {
Scanner scanner = new Scanner(System.in);
CalendarMaking_3 cal = new CalendarMaking_3();
while (true) {
System.out.println("년도를 입력해 주세요.(exit : -1)");
System.out.print("YEAR> ");
int year = scanner.nextInt();
if (year == -1)
break;
System.out.println("달을 입력해 주세요.");
System.out.print("MONTH> ");
int month = scanner.nextInt();
if (month > 12 || month < 1) {
System.out.println("잘못된 입력입니다.");
break;
}
cal.printCalendar(year, month);
}
System.out.println("반복이 종료되었습니다.");
scanner.close();
}
public static void main(String[] args) {
PromptMaking_3 p = new PromptMaking_3();
p.rumPrompt();
}
}
package Javajigi.Calendar;
public class CalendarMaking_3 {
private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final int[] LEAP_MAX_DAYS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public boolean isLeepYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
public int firstDayOfNextYear(int year, int month) {
int firstDayOfYear = 3;
for (int i = 0; i < (year - 1902); i++) {
if (isLeepYear((1902 + i + 1))) {
firstDayOfYear += 2;
} else {
firstDayOfYear += 1;
}
}
for (int j = 0; j < (month - 1); j++) {
firstDayOfYear += ((getMaxDaysOfMonth(year, (1 + j)))%7);
}
if (isLeepYear(year)) firstDayOfYear -= 1;
return (firstDayOfYear%7);
}
public int getMaxDaysOfMonth(int year, int month) {
if (isLeepYear(year)) {
return LEAP_MAX_DAYS[month - 1];
} else return MAX_DAYS[month - 1];
}
public void printCalendar(int year, int month) {
System.out.printf(" <<%4d년%3d월>>\n", year, month);
System.out.println(" SU MO TU WE TH FR SA");
System.out.println("-----------------------");
int weekday = firstDayOfNextYear(year,month);
for (int i = 0; i < weekday; i++) {
System.out.print(" ");
}
int maxday = getMaxDaysOfMonth(year, month);
for(int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if ((i+weekday)%7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
좋은 예시
package Javajigi.Calendar;
import java.util.Scanner;
public class Promptex {
public void rumPrompt() {
Scanner scanner = new Scanner(System.in);
Calendarex cal = new Calendarex();
while (true) {
System.out.println("년도를 입력해 주세요.(exit : -1)");
System.out.print("YEAR> ");
int year = scanner.nextInt();
if (year == -1)
break;
System.out.println("달을 입력해 주세요.");
System.out.print("MONTH> ");
int month = scanner.nextInt();
if (month > 12 || month < 1) {
System.out.println("잘못된 입력입니다.");
break;
}
cal.printCalendar(year, month);
}
System.out.println("반복이 종료되었습니다.");
scanner.close();
}
public static void main(String[] args) {
Promptex p = new Promptex();
p.rumPrompt();
}
}
package Javajigi.Calendar;
public class Calendarex {
private static final int[] MAX_DAYS = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final int[] LEAP_MAX_DAYS = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public boolean isLeepYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
public int getMaxDaysOfMonth(int year, int month) {
if (isLeepYear(year)) {
return LEAP_MAX_DAYS[month];
} else return MAX_DAYS[month];
}
public void printCalendar(int year, int month) {
System.out.printf(" <<%d년 %d월>>\n", year, month);
System.out.println(" SU MO TU WE TH FR SA");
System.out.println("-----------------------");
//get weekday automatically
int weekday = getWeekDay(year, month);
for (int i = 0; i < weekday; i++) {
System.out.print(" ");
}
int maxday = getMaxDaysOfMonth(year, month);
for(int i = 1; i <= maxday; i++) {
System.out.printf("%3d", i);
if ((i+weekday)%7 == 0) {
System.out.println();
}
}
System.out.println();
}
private int getWeekDay(int year, int month) {
int syear = 1970;
final int STANDARD_WEEKDAY = 4;
int count = 0;
for (int i = syear; i < year; i++) {
int delta = isLeepYear(i) ? 366 : 365;
count += delta;
}
for (int i = 1; i < month; i++) {
int delta = getMaxDaysOfMonth(year, i);
count += delta;
}
return (count + STANDARD_WEEKDAY)%7;
}
}
이후 강의에서는 아직 배우지 않은 내용이 들어가있어 추후 내배캠에서 학습을 마친 뒤 이어서 할 예정이다.