Java基础之打印万年历的简单实现(案例)

下面是“Java基础之打印万年历的简单实现(案例)”的完整攻略:

简介

本案例演示了如何使用Java打印万年历,通过计算出每个月的天数和星期几,并将其输出到控制台中。

实现步骤

第一步:输入年份

Scanner scanner = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scanner.nextInt();

这里使用Scanner类获取用户输入的年份,保存到year变量中。

第二步:计算是否为闰年

计算公元年份 Y 是否为闰年的公式:

  • Y % 4 == 0 && Y % 100 != 0
  • Y % 400 == 0
boolean isLeapYear = false;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
    isLeapYear = true;
}

如果是闰年,isLeapYear 的值为 true,否则为 false

第三步:输入月份

System.out.print("请输入月份:");
int month = scanner.nextInt();

这里使用Scanner类再次获取用户输入的月份,保存到month变量中。

第四步:计算每个月的天数

根据闰年和平年来确定每个月的天数:

  • 1、3、5、7、8、10、12月为31天;
  • 4、6、9、11月为30天;
  • 2月平年为28天,闰年为29天。
int days = 0;
switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days = 30;
        break;
    case 2:
        if (isLeapYear) {
            days = 29;
        } else {
            days = 28;
        }
        break;
    default:
        break;
}

这里使用switch语句根据用户输入的月份来计算出每个月的天数,保存到days变量中。

第五步:计算每个月的第一天是星期几

使用蔡勒公式,计算每个月的第一天是星期几:

  • W = (C / 4) - 2C + Y + (Y / 4) + (13 * (M + 1) / 5) + d - 1
  • W:星期几(0~6,0表示星期日,1表示星期一,以此类推);
  • C:世纪数(例如2000年属于20世纪,C=20,1900年属于19世纪,C=19);
  • Y:年份(后两位);
  • M:月份(3~14,3表示1月,4表示2月,以此类推);
  • d:日(1~31)。
int century = year / 100;
int y = year % 100;
int monthTemp = 0;
if (month <= 2) {
    monthTemp = month + 12;
    y--;
} else {
    monthTemp = month;
}
int week = (century / 4) - 2 * century + y + y / 4 + 13 * (monthTemp + 1) / 5 + 1;

week %= 7;
if (week < 0) {
    week += 7;
}

这里用到了取模运算,将计算得到的星期数转换为0~6之间的数,0表示星期日,1表示星期一,以此类推。

第六步:打印日历

接下来,我们就可以将日历打印出来啦,下面是代码:

System.out.printf("%d年%d月\n", year, month);
System.out.println("日 一 二 三 四 五 六");
for (int i = 0; i < week; i++) {
    System.out.print("   ");
}
for (int i = 1; i <= days; i++) {
    System.out.printf("%2d ", i);
    if ((i + week) % 7 == 0) {
        System.out.println();
    }
}

这里使用printf方法来格式化输出,最后通过循环输出每一个日期。注意,这里要根据每个月的第一天是星期几来决定每个月1号前要输出多少个空格。

示例

以下是一些示例,展示了程序的输出结果:

示例一

请输入年份:2019
请输入月份:5
2019年5月
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

示例二

请输入年份:2000
请输入月份:2
2000年2月
日 一 二 三 四 五 六
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29

以上就是本案例的完整攻略,希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础之打印万年历的简单实现(案例) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • SpringMVC如何自定义响应的HTTP状态码

    SpringMVC如何自定义响应的HTTP状态码 在 Spring MVC 中,我们可以自定义响应的 HTTP 状态码。自定义 HTTP 状态码可以帮助我们更好地处理请求和响应,提高 Web 应用程序的可读性和可维护性。本文将详细讲解 SpringMVC 如何自定义响应的 HTTP 状态码,包括如何使用 @ResponseStatus 注解和如何使用 Res…

    Java 2023年5月18日
    00
  • kotlin中数据类重写setter getter的正确方法

    当我们创建一个Kotlin数据类时,它会自动为每一个属性创建默认的 getter 和 setter 方法。但是如果我们需要对某个属性重写 getter 或 setter 方法,我们该怎么做呢? 首先,我们需要在数据类中定义属性并为其提供一个初始值。然后我们需要为该属性定义一个自定义的 setter 或 getter 方法。 下面是一些示例代码,可帮助您理解如…

    Java 2023年5月23日
    00
  • 深入浅出理解Java泛型的使用

    深入浅出理解Java泛型的使用 什么是Java泛型? Java泛型是Java SE 5(J2SE 5.0)版本引入的一项新特性,它可以用于在编译时检测和强制类型检查程序的类型安全性,并提供了在编译时检查类型的优势。 泛型可以被看作是Java的抽象类型,它可以在运行时接受不同类型的参数,提高了代码的复用性和可读性。泛型主要包含以下内容: 类型参数(Type P…

    Java 2023年5月26日
    00
  • java发送短信的实现步骤

    Java发送短信的实现步骤如下: 1. 选择短信服务商 短信服务商是提供短信发送服务的企业,根据自身需求选择适合自己的服务商。常用的国内短信服务商包括阿里云短信、腾讯云通信、网易云信等。 2. 注册并创建短信API 在选择好短信服务商后,需要进行注册和创建短信API。不同的短信服务商提供的注册和创建API的方法可能不同,需要按照相应的文档进行操作。 3. 在…

    Java 2023年5月18日
    00
  • spring boot教程之产生的背景及其优势

    Spring Boot教程之产生的背景及其优势 产生背景 在传统的Java Web开发过程中,我们需要编写大量的配置文件,比如web.xml、spring.xml等。而随着技术的不断发展,Java Web开发过程中出现了很多新的框架,比如Spring、Spring MVC、Hibernate等。但是这些框架的集成配置却比较麻烦,需要编写大量XML配置文件。因…

    Java 2023年5月15日
    00
  • JVM Tomcat性能实战(推荐)

    下面是针对“JVM Tomcat性能实战(推荐)”的完整攻略: 1. 了解JVM和Tomcat 在开始优化之前,需要了解JVM和Tomcat的基本知识。JVM是Java虚拟机,用于运行Java代码。Tomcat是一个流行的Web应用程序服务器,常用于运行Java Web应用程序。 2. 性能测试 在进行优化之前,需要先进行性能测试。可以使用各种工具进行测试,…

    Java 2023年5月20日
    00
  • java使用反射给对象属性赋值的两种方法

    当我们需要在运行时使用Java代码来处理类,或者动态地访问和修改类的成员时,反射成为一种非常重要的机制。其中一个反射的应用场景就是给对象属性赋值,在此介绍两种方法。 方法一:使用Class类的getMethod()和setAccessible()方法 首先,需要获得指定的方法,然后再反射到对象上进行调用。下面是一个示例,通过这种方法动态设置User对象的na…

    Java 2023年5月26日
    00
  • 如何解决线程间通信问题?

    以下是关于如何解决线程间通信问题的完整使用攻略: 如何解决线程间通信问题? 线程间通信问题是指多个线程之间共享资源时,由于访问顺序不确定或者访问时间不同步等原因,导致程序出现错误或者不稳定的情况。为了解决线程间通信问题,可以采用以下几种方式: 1. 使用同步机制 同步机制是指通过锁、信号量等方式来实现对共享资源的访问控制,避免线程之间的竞争和冲突。在 Jav…

    Java 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部