Java作业——找到休息日
题目:
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末。为此,你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天。(注:首次休息日是 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作业——找到休息日相关推荐
- Java习题-找到休息日
1. 任务概述 1.1 任务详情 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进 ...
- JAVA 知识----找到休息日训练任务
任务名称 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出 ...
- Java找到休息日问题
Java找到休息日问题 核心知识 日历类:Calendar 时间类:SimpleDateFormat.Date 集合类:ArrayList 字符串类:StringBuilder(不安全的) 问题描述: ...
- linux收缩java位置,找到linux中当前java的安装位置
先看java -version $java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111 ...
- JAVA作业——JAVA课程的总结及学习计划
JAVA作业--JAVA课程的总结及学习计划 NO.1 总结 在上一年的学习中,对JAVA语言比较陌生,英语基础不好,so学习起来有点困难,对JAVA的一些语法和编程记得比较少. NO.2 计划 对过 ...
- java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
我对端口扫描有一个分歧.我在 Java中扫描一些IP地址的UDP端口.在我的程序中(假设一切正常)我只能找到一个开放的UDP端口.在另一方面端口扫描"nmap"我得到4个开放的UD ...
- java作业 计算平均分和总成绩
java作业 计算平均分和总成绩 小数保留两位 计算器类 import java.util.Scanner;public class Computer {int score_java;int scor ...
- java作业 景区门票
java作业 景区门票 游人类 public class Player {String name; // 姓名int age; // 年龄int price; // 价格public void buy ...
- java 作业 老师与教员信息 类与对象
java 作业 老师与教员信息 类与对象 需求 逻辑图 学生类 public class Student {int age; // 年龄String className; // 班级名称String ...
最新文章
- 基于 OpenCV 的人脸追踪
- 枚举中关于toRaw()和fromRaw(3)编译出错
- opencv连通域去除小块面积_晋中市建成区面积排名,榆次区最大,榆社县最小,来了解一下?...
- 计组-控制器的功能和工作原理
- SVG.use/拖拽
- el-table中合并行加入图标
- Android游戏开发Android软件开发【教程三十篇】
- 人工智障学习笔记——深度学习(4)生成对抗网络
- c++date数据类型_PLC编程设涉及到的数据类型了解一下
- [转] PHP之soap: soap使用例子
- RHEL5.8系统裁减(内含做小Linux前的准备工作)
- NoteExpress导入题录失败
- 计算机音乐数字乐谱青芒,弱水三千(戏腔付)
- 如何对开发团队的人员进行绩效管理?
- 一文带你深入浅出C语言运算符、表达式和语句
- 1-2 认识905.4王国的交流规范
- PI实时数据库接口技术的应用
- c1灯光语言,c1科目三路考灯光口诀
- 《乔布斯传》圈点(7)
- 利用金山快盘和TortoiseSVN搭建自己的svn服务器