Java由键盘输入年份,编写一个程序显示当年的日历,用Application程序实现。

2022-07-27,,,,

Java实验六键盘输入年份编写一个程序显示当年的日历,用Application程序实现。

开始学习java有几个月了,实验报告难度也梯度增加,前几篇无论难度高低,终究能东搜西查整出来,唯独这篇,虽然在我写的时候,csdn上也有两篇同主题文章,但要么程序复杂看不懂,要么有bug,叫人头疼。写下这篇,算是给后来的朋友一个简单的参考吧。

实验指导书部分内容:
有关输出日历的两点说明
1. 求某一年的1月1日是星期几的方法
假设当前年份为y,并忽略闰年,则从公元元年1月1日到y-1年共有365
(y-1)天,加上闰年多出来的天数,即加上1((y-1)/4-(y-1)/100+(y-1)/400),"/"为整除,得:365
(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)。
补上一个x(x是与公元元年1月1日是星期几有关的一个0~6的整数),并将这个表达式赋给变量t,即:*
t=x+365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)再用t除以7,余几即为星期几(余0为星期日)。
下面讨论x的求法:

如果知道公元元年1月1日是星期几,就可以直接得到x的值,但现在公式还没有求出来,不知道公元元年1月1日是星期几。不过没关系,毕竟知道最近的日期是星期几。不妨看一下2001年1月1日是星期几,结果是星期一,代入公式得t=x+730516,用730516除以7,得104355,余数是1,则为了保证2001年1月1日是星期一,取x 为0,至此,得到了完整的公式
t=365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
再将它做一下改进,我们将公式变形为
t=(527+1)(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
利用星期的周期性,将527(y-1)从公式中删除,得
t=(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)
所以求某一年的1月1日是星期几的最常见的公式为
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] +1
*公式中的[…]指只取计算结果的整数部分。算出来的W除以7,余数是几就
是星期几。如果余数是0,则为星期日。

格式样例

虽然实验题目是数组,但实际写程序的时候,并没有用到二维数组,如果使用数组的目的是标记每个月月的天数,使用一维数组即可。
在考虑日历的格式化输出以及星期控制时,着实死了不少脑细胞。
一排三月目前没搞出来。

全部代码

import java.util.Scanner;
// 要求:熟练掌握一维及二维数组的使用
// 数组题  由键盘输入年份,编写一个程序显示当年的日历,用Application程序实现。

public class 日历6 {

    public static void main(String[] args) {
        //输入部分
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年份:");
        int year = scanner.nextInt();

        int yearDays = (year-1)+((year-1)/4-(year-1)/100+(year-1)/400)+1;
        int []monthDays=new int[13];
        //设置每月天数
        for (int i = 0; i < 13; i++) {
            if (i==2&&(year%400==0||(year%4==0&&year%100!=0))){//闰2月
                monthDays[i]=29;
            }
            else if (i==2){//平2月
                monthDays[i]=28;
            }
            else if (i==1||i==3||i==5||i==8||i==7||i==10||i==12){
                monthDays[i]=31;
            }
            else if (i==0){//为计算1月1日的星期,设置0月天数为0
                monthDays[i]=0;
            }
            else{
                monthDays[i]=30;
            }

        }


        //打印i
        int days=0;
        //单独打印1月,因为1月1日星期计算方法和后面的有不同
        System.out.println(year+"-"+1);
        System.out.println("日\t一\t二\t三\t四\t五\t六");

        int m =yearDays%7;
        for (int i1 = 0; i1 < m; i1++) {
            System.out.print("\t");
        }
        for (int i = 0; i < 31; i++) {
            System.out.print(i+1+"\t");
            if ((i+m+1)%7==0){//每7个换一行
                System.out.println("");
            }
        }
        System.out.println("");


        //开始打印2月
        for (int i = 2; i < 13; i++) {
            System.out.println(year+"-"+i);
            System.out.println("日\t一\t二\t三\t四\t五\t六");
            //设置空格
            days+=monthDays[i-1];
            int n =(yearDays+days)%7;//计算table个数
            //System.out.println("第"+i+"个前有"+n+"个table");
            for (int i1 = 0; i1 < n; i1++) {//
                System.out.print("\t");
            }

            for (int j = 0; j < monthDays[i]; j++) {
                //打印日期
                System.out.print(j+1+"\t");
                if ((j+n+1)%7==0){//每7个换一行
                    System.out.println("");
                }
            }
            System.out.println("");
        }
    }
}

输出样例一

输出样例二

第一次写博客,主要为了分享内容,思路啥的没去捋。

附其他两篇,或有参考价值:
https://blog.csdn.net/weixin_37407422/article/details/82596234

校友https://blog.csdn.net/wangshang4133/article/details/78629239
(确实从这篇中有收获,不过实际运行有bug,作者好像也没检查出或者懒得改了吧。)

本文地址:https://blog.csdn.net/qq_50948387/article/details/110247203

《Java由键盘输入年份,编写一个程序显示当年的日历,用Application程序实现。.doc》

下载本文的Word格式文档,以方便收藏与打印。