题目
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 2020 年 2 月 2 日)
不多说直接上代码
代码
一、Views
import java.util.Scanner;
public class Views {
Scanner input = new Scanner(System.in);
/**
* 欢迎界面
*/
public void hellow() {
System.out.println("你好,孙工");
}
/**
* 年份输入界面
*
* @return 用户输入的年份
*/
public int inputYear() {
System.out.println("请输入年:");
int year = -1;
try {
year = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
System.out.println("输入有误,请重新输入");
return inputYear();
}
if (year < 0) {
System.out.println("输入有误,请重新输入");
return inputYear();
}
return year;
}
/**
* 月份输入界面
*
* @return 用户输入的月份1-12
*/
public int inputMonth() {
System.out.println("请输入月:");
int month = -1;
try {
month = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
System.out.println("输入有误,请重新输入");
return inputMonth();
}
if (month < 1 || month > 12) {
System.out.println("输入有误,请重新输入");
return inputMonth();
}
return month;
}
/**
* 显示本月休息天数
*
* @param count 休息日计数
*/
public void showRelaxDay(int count) {
StringBuffer sb = new StringBuffer();
sb.append("本月休息天数有:");
sb.append(count);
sb.append("天");
//System.out.println("本月休息天数有:" + count + "天");
System.out.println(sb.toString());
}
/**
* 显示本月轮到周末休息天数
*
* @param count 休息周末计数
*/
public void showRelaxWeekends(int count) {
System.out.println("本月轮到周末休息天数是:" + count + "天");
}
/**
* 打印工作日历
*
* @param workcaleader 工作日历
*/
public void showWorkCalendar(StringBuffer workcaleader) {
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
System.out.println(workcaleader);
}
}
二、DateDao
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateDao {
private Calendar calendar = Calendar.getInstance();
public int relaxdaycount = 0;
public int relaxweekendscount = 0;
/**
* 设置年
*
* @param year
* @return
*/
public Calendar inputYear(int year) {
calendar.set(Calendar.YEAR, year);
return calendar;
}
/**
* 设置月
*
* @param month 用户输入为1-12,系统月份0-11
* @return
*/
public Calendar inputMonth(int month) {
calendar.set(Calendar.MONTH, (month - 1));
return calendar;
}
/**
* 设置日
*
* @return
*/
public Calendar inputDay(int day) {
calendar.set(Calendar.DATE, day);
return calendar;
}
/**
* 获取工作日历
*
* @return
*/
public StringBuffer getWorkCalendar() {
StringBuffer sb = new StringBuffer();
// calendar.set(Calendar.DATE,1);
for (int i = 0; i < calendar.get(Calendar.DAY_OF_WEEK) + 1; i++) {
sb.append("\t\t");
}
for (int a = 1; a <= calendar.getActualMaximum(Calendar.DATE); a++) {
calendar.set(Calendar.DAY_OF_MONTH, a);
if (getIntervalDay(calendar.getTime()) % 4 == 0) {
sb.append("[");
sb.append(a);
sb.append("] \t");
relaxdaycount++;
if (calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7) {
relaxweekendscount++;
}
} else {
sb.append(a);
sb.append("\t\t");
}
//周六,换行
if (calendar.get(Calendar.DAY_OF_WEEK) == 7) {
sb.append("\n");
}
}
return sb;
}
/**
* 获取间隔天数
*以便判断是否是休息日
* @param date 指定时间
* @return 指定时间与工作开始日2020-02-02的间隔天数,过早,返回-1
*/
public int getIntervalDay(Date date) {
Date date2 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//simpleDateFormat.setLenient(true);
//String s="2020-02-02";
try {
date2 = simpleDateFormat.parse("2020-02-02");
} catch (ParseException p) {
}
int intervalday = -1;
if (date.getTime() - date2.getTime() < 0) {
return intervalday;
} else {
intervalday = (int) ((date.getTime() - date2.getTime()) / 1000 / 60 / 60 / 24);
}
return intervalday;
}
}
三、Main
import kaikeba.chapter4.section2.dao.DateDao;
import kaikeba.chapter4.section2.view.Views;
import java.util.Date;
public class Main {
public static void main(String args[]){
Views v=new Views();
DateDao dao=new DateDao();
v.hellow();
dao.inputYear(v.inputYear());
dao.inputMonth(v.inputMonth());
v.showWorkCalendar(dao.getWorkCalendar());
v.showRelaxDay(dao.relaxdaycount);
v.showRelaxWeekends(dao.relaxweekendscount);
}
}
测试结果
总结
大晚上赶出来的练手作,代码规范和功能实现肯定还有所不足。思路是把工作日历用StringBuffer字符串表示出来,折折腾腾总算是实现了(2月)。如何与日历头对齐是个大问题,\t多一个少一个呈现出来的结果截然不同,不得不说靠这玩意对齐是真的邪门。日后肯定还会有底层已实现功能,使用起来体验糟的一塌糊涂的情况吧。卖相还是很重要的。不知实际日历是如何实现。夯实基础,进军前端,问题肯定有所改善。
也没讲什么需求分析总体设计勘误注释查漏补缺。
碎碎念。
共勉