万年历
程序分析:输入一个年份,月份然后输出这个月的日历,首先应该先选择一天作为基准来推算,这里选择1900年一月一号作为基准,
1. 我需要计算的就是你输入的这个月一号距离1900.1.1多少天.这里分为两步,第一步:计算你输入的这一年的一月一号距离1900.1.1多少天.第二部:计算你输入的这个月距离你输入的这一年一月一距离多少天.
2.如果要计算距离天数就要判断闰年和平年,
3.然后就可以打印日历了 我们需要打印的月份并不一定是从星期一开始所以就需要在前面打印空格 需要打印的空格数=距离天数%7; 空格数加上第几天%7==0 就打印换行
判断平年闰年的方法如下:
//判断年份是否是闰年
public static boolean run(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
public static boolean run(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
判断这年一月一号距离1900.1.1的距离: 提供两种方法 第一种没有考虑小于1900的情况
//判断输入的年份的一月一日和1900.1.1相隔的天数
public static int distenceyearday(int year){
int sum=0;
for (int i=1;i<=Math.sqrt((year-1900)*(year-1900))||i<=1900-year ;i++ )
{
if(year>1900){
if(run(year-i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}else{
if(run(year+i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}
}
return sum;
/*
if(year!=1990){
if(year>1990){
if((year-1990)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(year-1990==1){
return 365;
}
else if(year-1990==2){
return 365+366;
}
}else{
if((1990-year)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(1990-year==1){
return 365;
}
else if(1990-year==2){
return 365+366;
}
}
}
return 0;*/
}
public static int distenceyearday(int year){
int sum=0;
for (int i=1;i<=Math.sqrt((year-1900)*(year-1900))||i<=1900-year ;i++ )
{
if(year>1900){
if(run(year-i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}else{
if(run(year+i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}
}
return sum;
/*
if(year!=1990){
if(year>1990){
if((year-1990)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(year-1990==1){
return 365;
}
else if(year-1990==2){
return 365+366;
}
}else{
if((1990-year)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(1990-year==1){
return 365;
}
else if(1990-year==2){
return 365+366;
}
}
}
return 0;*/
}
输入的月份距离输入一年的一月一号的距离 这里用for循环更加的简单
//判断这个月的一号里这一年的一号相差多少天
public static int diatencemonthday(int year,int month){
if(run(year)){
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 60;
case 4:return 91;
case 5:return 121;
case 6:return 152;
case 7:return 182;
case 8:return 213;
case 9:return 144;
case 10:return 274;
case 11:return 305;
case 12:return 335;
default :return 0;
}
}else{
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 59;
case 4:return 90;
case 5:return 120;
case 6:return 151;
case 7:return 181;
case 8:return 212;
case 9:return 143;
case 10:return 273;
case 11:return 304;
case 12:return 334;
default :return 0;
}
}
}
public static int diatencemonthday(int year,int month){
if(run(year)){
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 60;
case 4:return 91;
case 5:return 121;
case 6:return 152;
case 7:return 182;
case 8:return 213;
case 9:return 144;
case 10:return 274;
case 11:return 305;
case 12:return 335;
default :return 0;
}
}else{
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 59;
case 4:return 90;
case 5:return 120;
case 6:return 151;
case 7:return 181;
case 8:return 212;
case 9:return 143;
case 10:return 273;
case 11:return 304;
case 12:return 334;
default :return 0;
}
}
}
全部代码实现最后功能:
import java.util.Scanner;
import java.lang.Math;
class test
{
/*
以1990一月一日为星期一为起始点
*/
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
System.out.println("请输入年份");
int year = sc.nextInt(); //接收年份的变量
System.out.println("请输入月份");
int month = sc.nextInt(); //接收月份的变量
int m=monthday(year,month); //判断这个月有几天
System.out.println("这一月有"+m+"天");
int yearday=yearday(year); //计算一年多少天
System.out.println("这一年有"+yearday+"天");
int y=distenceyearday(year);
System.out.println("这一年和1900相差"+y);
head(); //头部(星期几)
shixian(year,month);
}
//实现函数
public static void shixian(int year,int month){
int m=monthday(year,month); //判断这个月有几天
int h= ((diatencemonthday(year,month) +distenceyearday(year))%7);//接收空格的数量
int j=0;
for (;j<h;j++ )
{
if(h!=7){
System.out.print("\t");
}
}
for (int i=1;i<=m;i++ )
{
int n=( ( j+i)%7);
if(n==0){
System.out.print(i);
System.out.println();
}else{
System.out.print(i+"\t");
}
}
}
//输出头部
public static void head(){
System.out.print("星期一\t");
System.out.print("星期二\t");
System.out.print("星期三\t");
System.out.print("星期四\t");
System.out.print("星期五\t");
System.out.print("星期六\t");
System.out.println("星期日\t\r\n");
}
//判断这一个月多少天
public static int monthday(int year,int month){
if(month==2){
if(run(year)){
return 29;
}else{
return 28;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
return 31;
}else{
return 30;
}
}
//判断年份是否是闰年
public static boolean run(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
//判断一年多少天
public static int yearday(int year){
if(run(year)){
return 366;
}else{
return 365;
}
}
//判断这个月的一号里这一年的一号相差多少天
public static int diatencemonthday(int year,int month){
if(run(year)){
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 60;
case 4:return 91;
case 5:return 121;
case 6:return 152;
case 7:return 182;
case 8:return 213;
case 9:return 144;
case 10:return 274;
case 11:return 305;
case 12:return 335;
default :return 0;
}
}else{
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 59;
case 4:return 90;
case 5:return 120;
case 6:return 151;
case 7:return 181;
case 8:return 212;
case 9:return 143;
case 10:return 273;
case 11:return 304;
case 12:return 334;
default :return 0;
}
}
}
//判断输入的年份的一月一日和1900.1.1相隔的天数
public static int distenceyearday(int year){
int sum=0;
for (int i=1;i<=Math.sqrt((year-1900)*(year-1900))||i<=1900-year ;i++ )
{
if(year>1900){
if(run(year-i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}else{
if(run(year+i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}
}
return sum;
/*
if(year!=1990){
if(year>1990){
if((year-1990)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(year-1990==1){
return 365;
}
else if(year-1990==2){
return 365+366;
}
}else{
if((1990-year)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(1990-year==1){
return 365;
}
else if(1990-year==2){
return 365+366;
}
}
}
return 0;*/
}
}
import java.lang.Math;
class test
{
/*
以1990一月一日为星期一为起始点
*/
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
System.out.println("请输入年份");
int year = sc.nextInt(); //接收年份的变量
System.out.println("请输入月份");
int month = sc.nextInt(); //接收月份的变量
int m=monthday(year,month); //判断这个月有几天
System.out.println("这一月有"+m+"天");
int yearday=yearday(year); //计算一年多少天
System.out.println("这一年有"+yearday+"天");
int y=distenceyearday(year);
System.out.println("这一年和1900相差"+y);
head(); //头部(星期几)
shixian(year,month);
}
//实现函数
public static void shixian(int year,int month){
int m=monthday(year,month); //判断这个月有几天
int h= ((diatencemonthday(year,month) +distenceyearday(year))%7);//接收空格的数量
int j=0;
for (;j<h;j++ )
{
if(h!=7){
System.out.print("\t");
}
}
for (int i=1;i<=m;i++ )
{
int n=( ( j+i)%7);
if(n==0){
System.out.print(i);
System.out.println();
}else{
System.out.print(i+"\t");
}
}
}
//输出头部
public static void head(){
System.out.print("星期一\t");
System.out.print("星期二\t");
System.out.print("星期三\t");
System.out.print("星期四\t");
System.out.print("星期五\t");
System.out.print("星期六\t");
System.out.println("星期日\t\r\n");
}
//判断这一个月多少天
public static int monthday(int year,int month){
if(month==2){
if(run(year)){
return 29;
}else{
return 28;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
return 31;
}else{
return 30;
}
}
//判断年份是否是闰年
public static boolean run(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
//判断一年多少天
public static int yearday(int year){
if(run(year)){
return 366;
}else{
return 365;
}
}
//判断这个月的一号里这一年的一号相差多少天
public static int diatencemonthday(int year,int month){
if(run(year)){
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 60;
case 4:return 91;
case 5:return 121;
case 6:return 152;
case 7:return 182;
case 8:return 213;
case 9:return 144;
case 10:return 274;
case 11:return 305;
case 12:return 335;
default :return 0;
}
}else{
switch(month){
case 1:return 0;
case 2:return 31;
case 3:return 59;
case 4:return 90;
case 5:return 120;
case 6:return 151;
case 7:return 181;
case 8:return 212;
case 9:return 143;
case 10:return 273;
case 11:return 304;
case 12:return 334;
default :return 0;
}
}
}
//判断输入的年份的一月一日和1900.1.1相隔的天数
public static int distenceyearday(int year){
int sum=0;
for (int i=1;i<=Math.sqrt((year-1900)*(year-1900))||i<=1900-year ;i++ )
{
if(year>1900){
if(run(year-i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}else{
if(run(year+i)){//防止year小于1990
sum=sum+366;
}else{
sum=sum+365;
}
}
}
return sum;
/*
if(year!=1990){
if(year>1990){
if((year-1990)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(year-1990==1){
return 365;
}
else if(year-1990==2){
return 365+366;
}
}else{
if((1990-year)>2){
int days=(366+365*3)*((year-1992)/4)+(366+(365*((year-1992-1)%4)))+365*2;
return days;
}
else if(1990-year==1){
return 365;
}
else if(1990-year==2){
return 365+366;
}
}
}
return 0;*/
}
}