6.34(打印日历)编程练习题3.21使用Zeller一致性原理来计算某天是星期几,使用Zeller的算法简化程序清单6-12以获得每月开始的第一天是星期几

  • 题目
    • 题目描述
    • 编程练习题3.21的Zeller一致性
    • 程序清单6-12原代码:英文解释已被更换为中文
  • 本题代码

题目

题目描述

6.34(打印日历)编程练习题3.21使用Zeller一致性原理来计算某天是星期几,使用Zeller的算法简化程序清单6-12以获得每月开始的第一天是星期几

编程练习题3.21的Zeller一致性

泽勒一致性是由克里斯汀·泽勒开发的用于计算某天是星期几的算法:
h = (q + (26 * (m + 1)) / 10 + k + k / 4 + j / 4 + 5 * j) % 7
其中:

  • h是一个星期中的某一天(0为星期六;1为星期天;2为星期一;3为星期二;4为星期三;5为星期四;6为星期五)
  • q是某月的第几天
  • m是月份(3为三月,4为四月,……,12为十二月),一月和二月分别记为上一年的13和14月
    1月转为13,2月转为14,同时年份减1
  • j是year / 100。
  • k是该世纪的第几年(即year%100)

程序清单6-12原代码:英文解释已被更换为中文

import java.util.Scanner;public class qingdan {public static void main(String[] args) {// 1. 获取用户输入Scanner input = new Scanner(System.in);// 获取用户输入年System.out.print("Enter full year (e.g. , 2012):");int year = input.nextInt();// 获取用户输入月System.out.print("Enter month as a number between 1 and 12:");int month = input.nextInt();// 打印printMonth(year, month);}// 打印日历public static void printMonth(int year, int month){// 打印表头printMonthTitle(year, month);// 打印表格内容printMonthBody(year, month);}// 打印表头的方法public static void printMonthTitle(int year, int month){System.out.println("         " + getMonthName(month) + " " + year);System.out.println("---------------------------");System.out.println(" Sun Mon Tue Wed Thu Fri Sat");}// 获取月份的英文名public static String getMonthName(int month){String monthName = "";switch (month){case 1: monthName = "January";break;case 2: monthName = "February";break;case 3: monthName = "March";break;case 4: monthName = "April";break;case 5: monthName = "May";break;case 6: monthName = "June";break;case 7: monthName = "July";break;case 8: monthName = "August";break;case 9: monthName = "September";break;case 10: monthName = "October";break;case 11: monthName = "November";break;case 12: monthName = "December";}return monthName;}// 打印表格内容public static void printMonthBody(int year, int month){// 获取该月第一天是周几int startDay = getStartDay(year, month);// 获取当月天数int numberOfDaysInMonths = getNumberOfDaysInMonth(year, month);// 输出+留空格+换行int i = 0;for (i = 0; i < startDay; i++)System.out.print("    ");for (i = 1;i <= numberOfDaysInMonths;i++){System.out.printf("%4d", i);if ((i+startDay) % 7 == 0)System.out.println();}System.out.println();}// 获取每月第一天是周几public static int getStartDay(int year, int month){final int START_DAY_FOR_JAN_1_1800 = 3;// 获取从1970年1月1日到这个月1号有多少天(原文:日本1800年1月1日到本月1日)int totalNumberOfDays = getTotalNumberOfDays(year, month);// 返回每月1号是周几return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;}// 获取从(日本1800年1月1日)到今年的总天数public static int getTotalNumberOfDays(int year, int month){int total = 0;// 获取总天数(以年为单位计算)for (int i = 1800; i < year;i++){if (isLeapYear(i))total += 366;elsetotal += 365;}// 获取总天数(以月为单位计算)for (int i = 1;i < month ; i++)total += getNumberOfDaysInMonth(year, i);return total;}// 获取一个月的天数public static int getNumberOfDaysInMonth(int year, int month){if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8|| month == 10 || month == 12)return 31;if (month == 4 || month == 6 || month == 9 || month == 11)return 30;if (month == 2) return isLeapYear(year) ? 29:28;return 0;       // 当月份数有误时返回0}// 判断是否是闰年public static boolean isLeapYear(int year){return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);}
}

本题代码

import java.util.Scanner;public class Test6_34 {public static void main(String[] args) {// 1. 获取用户输入Scanner input = new Scanner(System.in);// 获取用户输入年System.out.print("Enter full year (e.g. , 2012):");int year = input.nextInt();// 获取用户输入月System.out.print("Enter month as a number between 1 and 12:");int month = input.nextInt();// 打印printMonth(year, month);}// 打印日历public static void printMonth(int year, int month){// 打印表头printMonthTitle(year, month);// 打印表格内容printMonthBody(year, month);}// 打印表头的方法public static void printMonthTitle(int year, int month){System.out.println("         " + getMonthName(month) + " " + year);System.out.println("---------------------------");System.out.println(" Sun Mon Tue Wed Thu Fri Sat");}// 获取月份的英文名public static String getMonthName(int month){String monthName = "";switch (month){case 1: monthName = "January";break;case 2: monthName = "February";break;case 3: monthName = "March";break;case 4: monthName = "April";break;case 5: monthName = "May";break;case 6: monthName = "June";break;case 7: monthName = "July";break;case 8: monthName = "August";break;case 9: monthName = "September";break;case 10: monthName = "October";break;case 11: monthName = "November";break;case 12: monthName = "December";}return monthName;}// 打印表格内容public static void printMonthBody(int year, int month){// 获取该月第一天是周几//int startDay = getStartDay(year, month);// 获取当月天数int numberOfDaysInMonths = getNumberOfDaysInMonth(year, month);//转为公式内因子int q = 1;int m = month;if (month == 1 || month == 2){month += 12;year -= 1;}int k = year % 100;int j = year / 100;int startDay =  (q + (26 * (m + 1)) / 10 + k + k / 4 + j / 4 + 5 * j) % 7;startDay = (startDay + 6) % 7;// 输出+留空格+换行int i = 0;for (i = 0; i < startDay; i++)System.out.print("    ");for (i = 1;i <= numberOfDaysInMonths;i++){System.out.printf("%4d", i);if ((i+startDay) % 7 == 0)System.out.println();}System.out.println();}// 获取一个月的天数public static int getNumberOfDaysInMonth(int year, int month){if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8|| month == 10 || month == 12)return 31;if (month == 4 || month == 6 || month == 9 || month == 11)return 30;if (month == 2) return isLeapYear(year) ? 29:28;return 0;       // 当月份数有误时返回0}// 判断是否是闰年public static boolean isLeapYear(int year){return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);}
}

Java黑皮书课后题第6章:**6.34(打印日历)编程练习题3.21使用Zeller一致性原理来计算某天是星期几,使用Zeller的算法简化程序清单6-12以获得每月开始的第一天是星期几相关推荐

  1. Java黑皮书课后题第2章:2.9(物理:加速度)平均加速度定义为速度的变化量除以这个变化所用的时间,编写程序,提示用户输入以米/秒为单位的起始速度v0,以米/秒为单位的终止速度v1,显示平均加速度

    2.9(物理:加速度)平均加速度定义为速度的变化量除以这个变化所用的时间,编写程序,提示用户输入以米/秒为单位的起始速度v0,以米/秒为单位的终止速度v1,以秒为单位的经过时间t,显示平均加速度 题目 ...

  2. Java黑皮书课后题第6章:**6.30(游戏:双骰子)掷双骰子游戏是某场景中非常流行的骰子游戏。编写程序,玩这个游戏的变种

    6.30(游戏:双骰子)掷双骰子游戏是某场景中非常流行的骰子游戏.编写程序,玩这个游戏的变种 题目 题目描述 破题 代码 题目 题目描述 6.30(游戏:双骰子)掷双骰子游戏是某场境中非常流行的骰子游 ...

  3. Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类

    Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类) 题目 缺陷 UML图 代码 Test02_MyDate.java:用于参考的My ...

  4. Java黑皮书课后题第10章:**10.25(新的字符串split方法)String类中的split方法会返回一个字符串数组,该数组是由分隔符分隔开的子串构成的

    Java黑皮书课后题第10章:**10.25(新的字符串split方法) 题目 代码 运行实例 题目 代码 public class Test25 {public static String[] sp ...

  5. Java黑皮书课后题第10章:10.21(被5或6整除)找出能被5或6整除的大于Long.MAX_VALUE的前10个数字

    Java黑皮书课后题第10章:10.21(被5或6整除)找出能被5或6整除的大于Long.MAX_VALUE的前10个数字 题目 代码 结果 题目 都在上面 代码 import java.math.B ...

  6. Java黑皮书课后题第10章:*10.13(几何:MyRectangle2D类)定义MyRectangle2D类

    Java黑皮书课后题第10章:10.3 题目 程序 代码 Test13.java Test13_MyRectangle2D.java 运行 UML 题目 程序 Test13.java:测试程序 Tes ...

  7. Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中

    Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中 题目 程序说明 题目槽点 代码:Test2_BMI.java 运行实例 题目 程序说明 Test2_BMI.java ...

  8. Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))

    Java黑皮书课后题第10章:*10.1设计一个名为Time的类.编写一个测试程序,创建两个Time对象 题目 程序 代码 Test1.java Test1_Time.java 运行结果 UML 题目 ...

  9. Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置。

    Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置 题目 破题 代码 Test13 Test13_Location 运行结果 ...

  10. Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交。第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4)

    Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交.第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4) 题目 破题 ...

最新文章

  1. Python最常用的函数、基础语句有哪些?
  2. 网络七层协议_Nginx七层负载均衡原理解析
  3. Flask的快速入门详细笔记
  4. 力扣(LeetCode)31
  5. .net 使用阿里云RocketMQ
  6. elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽
  7. ossim系统下nagios监控机器可用性用rrd图形显示
  8. 《知识图谱》2020综述论文,18位作者, 130页pdf,547篇参考文献
  9. LitePal数据的存储
  10. Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台
  11. 企业上云,安全合规如何进阶 ——一文拆解亚马逊云科技云安全理念与实践
  12. 三分钟了解区块链AR游戏Triffic2.0版本
  13. win10杀毒防护已经关闭了还是删除文件解决方法
  14. Android微信hook
  15. Arista携手思科、瞻博网络 计划打造面向云的交换与路由设备
  16. matlab实验八,matlab实验八
  17. 泛微软件的CMMI配置管理实施法
  18. STM32F1系列超声波测距程序
  19. 解决打开Android sdk manger D:\BaiduNetdiskDownload\开发工具\android' 不是内部或外部命令,也不是可运行的程序问题
  20. 计算机物联网知识,计算机科学技术对物联网的5大作用分析

热门文章

  1. java 更新对象_java通过key-list和对应value更新当前对象
  2. 1732: 数花费(Kruscal)
  3. 大型企业多账号管理“安全心法”
  4. 2021阿里云开发者大会|【云原生数据库:一站式数据服务】分论坛即将开启
  5. 如何用Unity和Cardboard做一款VR游戏
  6. 《仙剑奇侠传online》游戏后台优化分析:CPU、内存与启动时间
  7. PMP每日三题(2022年2月14日)
  8. Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
  9. SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
  10. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“