找到当月的休息日(Java) 您所在的位置:网站首页 12月份休息日 找到当月的休息日(Java)

找到当月的休息日(Java)

2023-12-07 02:33| 来源: 网络整理| 查看: 265

题目大意

某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 2019 年 2 月 2 日) 在这里插入图片描述

注意: 1.闰年算法 2.日历格式输出 3.异常处理 4.打包可执行程序

实现过程

1.获得输入数据:年,月 2.通过计算进行展示 3.同步输出统计信息 4.程序回到下一次的输入数据状态

实现思路

view:视图分析 dao:数据存取 exception:调度逻辑 main:主函数

main主函数

写好view部分(welcome,input,bye) 通过循环进行连续计算,isContinue()实现退出 在循环中进行数据处理dao部分calculateDay()

//开始计算 view.welcome(); //持续计算,直到退出 while(true){ int year = view.getYear();//通过输入获取年份和月份 int month = view.getMonth(); dao.calculateDay(year,month);//进行数据处理,即日期计算 if(view.isContinue() == 2){//2.结束计算 break; } } //结束计算 view.bye(); exception自定义异常 数据输入过程中,输入年和月: ①孙工2019年开始休息,因此输入年份不得小于2019 ②一年12个月,因此月份应当在1~12之间 ③不能输入字符 public class OutNumberBoundException extends Throwable{ public OutNumberBoundException(String s) { super(s); } } view中自定义函数,来判断是否为有效输入 /** * 判断输入是否为有效输入 */ private static int validNumber(String s,int begin,int end) throws NumberFormatException, OutNumberBoundException { try{ int num = Integer.parseInt(s); if (num end){ throw new OutNumberBoundException("范围必须在" + begin + "和" + end +"之间"); } return num; }catch(NumberFormatException e){ throw new NumberFormatException("输入的必须是数字!"); } } view实现输入输出

[需要考虑的是,首次休息日是 2019 年 2 月 2 日,因此输入的年份和月份都需要进行判断]

进入系统:

/** * 进入系统 */ public static void welcome(){ System.out.println("欢迎使用!"); } /** * 退出系统 */ public static void bye(){ System.out.println("感谢使用!"); }

输入:year,month,是否继续进行日期判断,输入字符时判断是否符合输入标准or要求valueNumber(),自定义异常

输入年和月 /** * 输入年 */ public static int getYear(){ int year = 2019; do{ System.out.print("请输入你需要查询的年份:"); String s = input.nextLine(); try{ year = validNumber(s, 2019, 2100); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return year; } /** * 输入月 */ public static int getMonth(){ int month = 1; do{ System.out.print("请输入你需要查询的月份:"); String s = input.nextLine(); try{ month = validNumber(s, 1, 12); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return month; } 是否继续查询:isContinue() /** * 是否继续查询计算 */ public static int isContinue(){ int f = 0; do{ System.out.println("\n是否继续进行计算?"); System.out.println("1.是"); System.out.println("2.否"); String s = input.nextLine(); try{ f = validNumber(s, 1, 2); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return f; } dao数据处理

在这里插入图片描述

判断本月有多少天休息calculateDay(); 添加日期 计算这个月的天数,找出这个月的第一天是周几,打印 由上图根据规律可知,每次休息的日期都是%4=2,因此通过循环来输出,确定是休息的日期了再进行判断是否为周六或周日 设置两个变量,进行休息日和在周末休息天数的统计

打印出日历列表的星期显示 public static void printCalenderOfWeek(){ System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t"); } 运行计算 public static void calculateDay(int year,int month){ if(year == 2019 && month == 1){ System.out.println("2019年计算的起始月份必须大于2,请重新输入!"); month = view.getMonth();//由于从2019年2月2日开始,因此排除2019年1月这种情况 } //添加日期 c.set(year,month - 1,1); //这个月的天数 int maxDay = c.getActualMaximum(Calendar.DAY_OF_MONTH); //判断这个月第一天是周几 int firstDayOfWeek = c.get(Calendar.DAY_OF_WEEK); //日历列表显示 view.printCalenderOfWeek(); //打印第一行的日历(1号可能不是第一天,因此要输出空格) for(int i = 1; i //从1号开始到本月结束,依次进行判断输出 if(c.get(Calendar.DATE) % 4 == 2){//通过观察规律可知,休息日的日期都是%4=2 System.out.printf("%-8s","["+c.get(Calendar.DATE)+"]"); restDay++;//休息日的天数 if (c.get(Calendar.DAY_OF_WEEK) == 7 || c.get(Calendar.DAY_OF_WEEK) == 1){//如果是周六或者周日 restDayOnWeekends++;//休息日在周末的天数 } }else { System.out.printf("%-8d",c.get(Calendar.DATE)); } if (c.get(Calendar.DAY_OF_WEEK) == 7) {//如果是一周中的最后一天,换行 System.out.println(); } c.add(Calendar.DATE,1); if(c.get(Calendar.DATE) == 1){ break; } }//end while System.out.println("\n本月休息天数有:" + restDay + "天"); System.out.println("本月轮到周末休息天数是" + restDayOnWeekends + "天"); } 代码实现 main public class Test { public static View view = new View(); public static CalenderDao dao = new CalenderDao(); public static void main(String[] args) throws OutNumberBoundException { //开始进行计算 view.welcome(); //持续计算,直到退出 while(true){ int year = view.getYear(); int month = view.getMonth(); dao.calculateDay(year,month); if(view.isContinue() == 2){ break; } } //结束计算 view.bye(); } } exception public class OutNumberBoundException extends Throwable{ public OutNumberBoundException(String s) { super(s); } } view public class View { public static Scanner input = new Scanner(System.in); /** * 进入系统 */ public static void welcome(){ System.out.println("欢迎使用!"); } /** * 退出系统 */ public static void bye(){ System.out.println("感谢使用!"); } /** * 输入年 */ public static int getYear(){ int year = 2019; do{ System.out.print("请输入你需要查询的年份:"); String s = input.nextLine(); try{ year = validNumber(s, 2019, 2100); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return year; } /** * 输入月 */ public static int getMonth(){ int month = 1; do{ System.out.print("请输入你需要查询的月份:"); String s = input.nextLine(); try{ month = validNumber(s, 1, 12); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return month; } /** * 是否继续计算 */ public static int isContinue(){ int f = 0; do{ System.out.println("\n是否继续进行计算?"); System.out.println("1.是"); System.out.println("2.否"); String s = input.nextLine(); try{ f = validNumber(s, 1, 2); break; }catch(NumberFormatException | OutNumberBoundException e){ System.out.println(e.getMessage()); } }while(true); return f; } /** * 判断输入是否为有效输入 */ private static int validNumber(String s,int begin,int end) throws NumberFormatException, OutNumberBoundException { try{ int num = Integer.parseInt(s); if (num end){ throw new OutNumberBoundException("范围必须在" + begin + "和" + end +"之间"); } return num; }catch(NumberFormatException e){ throw new NumberFormatException("输入的必须是数字!"); } } /** * 日历列表的星期显示 */ public static void printCalenderOfWeek(){ System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t"); } } dao public class CalenderDao { public static View view = new View(); public static Calendar c = Calendar.getInstance(); /** * 进行计算 */ public static void calculateDay(int year,int month){ if(year == 2019 && month == 1){ System.out.println("2019年计算的起始月份必须大于2,请重新输入!"); month = view.getMonth();//由于从2019年2月2日开始,因此排除2019年1月这种情况 } //添加日期 c.set(year,month - 1,1); //这个月的天数 int maxDay = c.getActualMaximum(Calendar.DAY_OF_MONTH); //判断这个月第一天是周几 int firstDayOfWeek = c.get(Calendar.DAY_OF_WEEK); //日历列表显示 view.printCalenderOfWeek(); //打印第一行的日历(1号可能不是第一天,因此要输出空格) for(int i = 1; i //从1号开始到本月结束,依次进行判断输出 if(c.get(Calendar.DATE) % 4 == 2){//通过观察规律可知,休息日的日期都是%4=2 System.out.printf("%-8s","["+c.get(Calendar.DATE)+"]"); restDay++;//休息日的天数 if (c.get(Calendar.DAY_OF_WEEK) == 7 || c.get(Calendar.DAY_OF_WEEK) == 1){//如果是周六或者周日 restDayOnWeekends++;//休息日在周末的天数 } }else { System.out.printf("%-8d",c.get(Calendar.DATE)); } if (c.get(Calendar.DAY_OF_WEEK) == 7) {//如果是一周中的最后一天,换行 System.out.println(); } c.add(Calendar.DATE,1); if(c.get(Calendar.DATE) == 1){ break; } }//end while System.out.println("\n本月休息天数有:" + restDay + "天"); System.out.println("本月轮到周末休息天数是" + restDayOnWeekends + "天"); } } 运行结果

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有