题目:

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

效果图如下:


首先我们得输入年份和月份,接着用两个int类型变量用parseInt()方法接收年和月,用try/catch包裹一下他们,还需要有提示信息:

 Scanner sc = new Scanner(System.in);System.out.println("请输入年:");String strYear = sc.nextLine();System.out.println("请输入月:");String strMonth = sc.nextLine();int year = -1;int month = -1;try{year = Integer.parseInt(strYear);month = Integer.parseInt(strMonth) - 1;//减一的原因:Calendar内月份是0-11代表1-12月}catch (NumberFormatException e){System.out.println("请输入正确数字");}

然后简单的思考一下,当要处理日期问题我们需要用到什么类型的数据?Calendar or Date?Date能表示特定的瞬间,精确到毫秒,对于这道题来说,我们用不到那么精确的计算,且主要处理的是日历,日期计算是其次,况且Calendar类可以将年月日单独set和get,还有当前天在一周内是第几天,所以果断用Calendar。
对于Calendar来说,因为是个抽象类,并不能直接实例化对象,所以用getInstance()方法获取当前时间,进而得到一个Calendar对象,然后就可以设置对象的年月日了。

 Calendar cal = Calendar.getInstance();//当前cal内装的是当前时间数据,有强迫症的可以调用clear()清空回1970cal.set(year, month, 1);//设置输入的年月,并将对象的初始为当月1日

接着就要考虑最重要的环节了,先看一下输出示例;我们分析一下输出顺序,第一得输出一大段空格,第二要输出数字。(如下图)

1、Calendar内有个字段DAY_OF_WEEK,用来获取当前日在这周是第几天,第n天就输出n-1段空白,直接拿来用。

 for(int i = 1; i < cal.get(DAY_OF_WEEK); i++){System.out.printf("%-8s", " ");//这个可以试出来}

2、Calendar类提供了add()方法,可进行对日期的加法运算,我们就可以用add()和get()方法来循环输出日,另外当该月的最后一天再进行加一天的运算,月份会自动加一(例如:cal存的是2020.2.29,通过加一天运算,会变成2020.3.1),所以第二个循环的条件就可以是cal.get(MONTH)和我们输入的month是否相等。

再接着分析休息日是从2号开始的,休息日为2、6、10、14……,可以从中间找到规律,他们除以4取余都是2,且当cal.get(DAY_OF_WEEK)等于7时换行,就可以得到:

 while (cl.get(MONTH) == month){if(cl.get(DATE) % 4 == 2){System.out.printf("%-8s","["+cl.get(DATE)+"]");}else {System.out.printf("%-8d",cl.get(DATE));}if (cl.get(DAY_OF_WEEK) == 7) System.out.println();cl.add(DATE,1);}

最后,加上休息日是否在周末的判断,设置两个变量计算总的休息天数和在周末的休息日天数,整理一下再进行输出,程序就写完了。

完整代码如下:

import java.util.Calendar;
import java.util.Scanner;public class FindRestDay {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(true) {int restDay = 0;int restDayOnWeekends = 0;System.out.println("请输入年:");String strYear = sc.nextLine();System.out.println("请输入月:");String strMonth = sc.nextLine();Calendar cl = Calendar.getInstance();cl.clear();int year = -1;int month = -1;try {year = Integer.parseInt(strYear);month = Integer.parseInt(strMonth) - 1;cl.set(year, month, 1);System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");for(int i = 1; i < cl.get(DAY_OF_WEEK); i++) System.out.printf("%-8s"," ");while (cl.get(MONTH) == month){if(cl.get(DATE) % 4 == 2){System.out.printf("%-8s","["+cl.get(DATE)+"]");restDay++;if (cl.get(DAY_OF_WEEK) == 7 || cl.get(DAY_OF_WEEK) == 1){restDayOnWeekends++;}}else {System.out.printf("%-8d",cl.get(DATE));}if (cl.get(DAY_OF_WEEK) == 7) System.out.println();cl.add(DATE,1);}}catch (NumberFormatException e){System.out.println("请输入正确数字");}System.out.println();System.out.println("本月休息天数有:" + restDay + "天");System.out.println("本月轮到周末休息天数是" + restDayOnWeekends);}}
}

Java作业——找到休息日相关推荐

  1. Java习题-找到休息日

    1. 任务概述 1.1 任务详情 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进 ...

  2. JAVA 知识----找到休息日训练任务

    任务名称 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出 ...

  3. Java找到休息日问题

    Java找到休息日问题 核心知识 日历类:Calendar 时间类:SimpleDateFormat.Date 集合类:ArrayList 字符串类:StringBuilder(不安全的) 问题描述: ...

  4. linux收缩java位置,找到linux中当前java的安装位置

    先看java -version $java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111 ...

  5. JAVA作业——JAVA课程的总结及学习计划

    JAVA作业--JAVA课程的总结及学习计划 NO.1 总结 在上一年的学习中,对JAVA语言比较陌生,英语基础不好,so学习起来有点困难,对JAVA的一些语法和编程记得比较少. NO.2 计划 对过 ...

  6. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口

    我对端口扫描有一个分歧.我在 Java中扫描一些IP地址的UDP端口.在我的程序中(假设一切正常)我只能找到一个开放的UDP端口.在另一方面端口扫描"nmap"我得到4个开放的UD ...

  7. java作业 计算平均分和总成绩

    java作业 计算平均分和总成绩 小数保留两位 计算器类 import java.util.Scanner;public class Computer {int score_java;int scor ...

  8. java作业 景区门票

    java作业 景区门票 游人类 public class Player {String name; // 姓名int age; // 年龄int price; // 价格public void buy ...

  9. java 作业 老师与教员信息 类与对象

    java 作业 老师与教员信息 类与对象 需求 逻辑图 学生类 public class Student {int age; // 年龄String className; // 班级名称String ...

最新文章

  1. 基于 OpenCV 的人脸追踪
  2. 枚举中关于toRaw()和fromRaw(3)编译出错
  3. opencv连通域去除小块面积_晋中市建成区面积排名,榆次区最大,榆社县最小,来了解一下?...
  4. 计组-控制器的功能和工作原理
  5. SVG.use/拖拽
  6. el-table中合并行加入图标
  7. Android游戏开发Android软件开发【教程三十篇】
  8. 人工智障学习笔记——深度学习(4)生成对抗网络
  9. c++date数据类型_PLC编程设涉及到的数据类型了解一下
  10. [转] PHP之soap: soap使用例子
  11. RHEL5.8系统裁减(内含做小Linux前的准备工作)
  12. NoteExpress导入题录失败
  13. 计算机音乐数字乐谱青芒,弱水三千(戏腔付)
  14. 如何对开发团队的人员进行绩效管理?
  15. 一文带你深入浅出C语言运算符、表达式和语句
  16. 1-2 认识905.4王国的交流规范
  17. PI实时数据库接口技术的应用
  18. c1灯光语言,c1科目三路考灯光口诀
  19. 《乔布斯传》圈点(7)
  20. 利用金山快盘和TortoiseSVN搭建自己的svn服务器

热门文章

  1. 计算机网络管理员 职业技能鉴定,计算机网络管理员中级职业技能鉴定 文档版...
  2. 谷歌身份验证器小白篇
  3. 微信小程序 蓝牙固件升级
  4. 乐视手机卷土重来,贾跃亭借华为东风!
  5. 读书无用论,是历史最大阴谋!
  6. 【安全知识分享】技能培训专题办公室安全及消防常识.pptx(附下载)
  7. Hurdles of 110m(类背包问题)
  8. java 动态卸载jar包_jar包 热加载/卸载 的初步实现
  9. php文件在线编码转换,php汉字转码 GBK到Big5编码转换
  10. Js常用方法:JS字符串截取、数组截取等