欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-10 09:11:07
Java实验六由键盘输入年份,编写一个程序显示当年的日历,用Application程序实现。开始学习java有几个月了,实验报告难度也梯度增加,前几篇无论难度高低,终究能东搜西查整出来,唯独这篇,虽然在我写的时候,csdn上也有两篇同主题文章,但要么程序复杂看不懂,要么有bug,叫人头疼。写下这篇,算是给后来的朋友一个简单的参考吧。实验指导书部分内容:有关输出日历的两点说明1.求某一年的1月1日是星期几的方法假设当前年份为y,并忽略闰年,则从公元元年1月1日到y-1年共有365(y-1)天,加...

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,则为星期日。

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

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

全部代码

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("");
        }
    }
}

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

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

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

附其他两篇,或有参考价值:
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学习和实验