Jack初入java_week2 java 万年历 源代码 原创!!!

先给大家看下效果图

import java.util.Scanner;

public class RiLi {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] num = new int[31];
		for(int i=0;i<31;i++){
			num[i]=i+1;
		}
		System.out.println("请输入年份(>=1900):");
		int a = sc.nextInt();
		int b = 0,d = 0,c = 0;
		int h =0;//求空格的;
		b=a-1900;
		d = (b+(b-1)/4)%7+1;//每年元旦是星期几
		if(a%100==0&&a!=1900){
			d-=1;
		}
		if(a%400==0){
			d+=1;
		}
		int[] num1={28,29,30,31};
		System.out.println("请输入月份[1-12]:");
		int m = sc.nextInt();
		if(m==4||m==6||m==9||m==11){
			c = 2;
		}else if(m==2){
			if(a%400==0||(a%4==0&&a%100!=0)){
				c =1;
			}else{
				c =0;
			}
		}else{
			c = 3;
		}
		int e = 0;
		int f = 0;
		int g = 0;
		e =num1[c];//每月有多少天
		if(m>1){
			for(int i=1;i<m;i++){
				if(i==4||i==6||i==9||i==11){
					g = 2;
				}else if(i==2){
					if(a%400==0||(a%4==0&&a%100!=0)){
						g =1;
					}else{
						g =0;
					}
				}else{
					g = 3;
				}
				f += num1[g];//m月前有多少天
			}
		}else{f = 0;}//m月前有多少天
		h =((f%7)+(d-1))%7+1;
		System.out.println("日"+"\t"+"一"+"\t"+"二"+"\t"+"三"+"\t"+"四"+"\t"+"五"+"\t"+"六");
		for(int i1 = 1;i1<=h;i1++){
			System.out.print("\t");
			if(i1%7==0){System.out.println();}
		}
		for(int i2 = 0;i2<e;i2++){
			System.out.print(num[i2]+"\t");
			if((i2+1+h)%7==0){
				System.out.println();
			}
		}
		sc.close();
	}
}

下面和大家说下我编写的思路:

1.我先确定出我需要哪些值:

    (1)初始值,即1900年元旦是星期几;

    (2)分清闰年和平年,能确定出每年元旦是星期几,设值为d;

    (3)输入月份后,能获取该月份的天数,设置为e(需设置条件分清闰年平年);

    (4)输入月份后,能知道这个月之前有多少天,以便根据d可以推算出该月是从星期几开始的,设值为f。

    (5)取得f后,为了让下一月可以从正常的星期开始,根据需要补充"    ",至于多少个通过h算法得来,设置为h。

    (6)空格打印完之后就可以打印e了;

    (7)再打印天数时当打印7个的时候,要设置自动换行。

之后就完成了万年历的程序制作了。

接下来详细解释每一步的操作:

    (1)直接通过百度,等网络手段获取1900年元旦为星期一;

   

    (2)当获取了初始值后,就可以开始输入年份

System.out.println("请输入年份(>=1900):");
		int a = sc.nextInt();
		int b = 0,d = 0,c = 0;
		int h =0;//求空格的;
		b=a-1900;
		d = (b+(b-1)/4)%7+1;//每年元旦是星期几
		if(a%100==0&&a!=1900){
			d-=1;
		}
		if(a%400==0){
			d+=1;
		}

和大家说下d的公式怎么来的

平年的时候,一年之后元旦节会推迟一天:365%7=1

闰年的时候,一年之后元旦节会推迟两天:366%7=2

所以n年之后,会推迟n天+其中闰年的天数d=b+b/4

但1900特殊不是闰年。所以通过(b-1)来解决即d=b+(b-1)/4

但一旦满了一个星期后,应该再从星期1开始输出,所以最终

d = (b+(b-1)/4)%7+1;
但其中还有像1900年不是闰年的百年,又可能有闰年的百年,所以通过以下代码来解决
if(a%100==0&&a!=1900){
			d-=1;
		}
		if(a%400==0){
			d+=1;
		}

这样就完完全全的确定好了d的值,我们输入的年份,元旦节的开始就可以确定,自然一年的天数都能与星期对应,都可以定下来了。

    (3)定义个数组,通过输入的月份,判断取值e

int[] num1={28,29,30,31};
		System.out.println("请输入月份[1-12]:");
		int m = sc.nextInt();
		if(m==4||m==6||m==9||m==11){
			c = 2;
		}else if(m==2){
			if(a%400==0||(a%4==0&&a%100!=0)){
				c =1;
			}else{
				c =0;
			}
		}else{
			c = 3;
		}
		int e = 0;
		int f = 0;
		int g = 0;
		e =num1[c];//每月有多少天

  (4)获得f 通过以下代码

if(m>1){
    for(int i=1;i<m;i++){
	if(i==4||i==6||i==9||i==11){
			g = 2;
		}else if(i==2){
			if(a%400==0||(a%4==0&&a%100!=0)){
				g =1;
			}else{
				g =0;
			}
		}else{
			g = 3;
	        }    
		f += num1[g];//m月前有多少天
	    }
	}else{f = 0;}//m月前有多少天

(5)h取值也是关键,直接关系到让我们月份开始的天数是哪个星期天数

h =((f%7)+(d-1))%7+1;
 (6)空格打印完就可以开始打印e天数了

System.out.println("日"+"\t"+"一"+"\t"+"二"+"\t"+"三"+"\t"+"四"+"\t"+"五"+"\t"+"六");
		for(int i1 = 1;i1<=h;i1++){
			System.out.print("\t");
			if(i1%7==0){System.out.println();}
		}
		for(int i2 = 0;i2<e;i2++){
                        System.out.print(num[i2]+"\t");
			if((i2+1+h)%7==0){
				System.out.println();
			}
		}
这样万年历就制作完成了。

 

本人菜鸟,大家觉得好,多多点赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值