小钿自留地
标题:
java万年历源码(求改进)
[打印本页]
作者:
hext
时间:
2015-2-16 19:01
标题:
java万年历源码(求改进)
/* 万年历思路
1- 输入年份和月份
2-求出年份的相差天数(1900.1.1)-周一
3-求出月份的相差天数
4-算一下这年这月的1号是周几,求出1号以前该空几个格子
5-输出表头
6-按照空格数量输入多个空格
7-求出m月一共有多少天
8-循环输出这个月所有的天数,分清楚什么地方换行。*/
import java.util.Scanner;
// *************************************************一个可以查看到1900年前的万年历(包括公元前)************************************************
public class 万年历 {
// 输入年月及定义变量部分
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入年份(公元前请加-号)");
int y = input.nextInt();
if (y==0) {
System.out.println("年份无效");
System.exit(0); //退出程序语句(百度来的)
}
System.out.println("请输入月份(1~12)");
int m = input.nextInt();
if (m<0||m>12) {
System.out.println("月份无效");
System.exit(0);
}
int d; //天数
int t; //tab的个数
// 求输入月份的天数
switch (m
) {
case 2:
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
d = 29;
} else {
d = 28;
}
break;
case 4:
case 6:
case 9:
case 11:
d = 30;
break;
default:
d = 31;
}
// 判断输入的年份是否小于1900年
if (y < 1900) {
t = 小于1900(y, m, d); //静态引用小于1900的方法 返回tab的个数(根据Eclipse的提示尝试另一种方法)
} else {
// 引用年份大于等于1900的方法 返回tab的个数
万年历 dy1900=new 万年历();
t = dy1900.大于1900(y, m);
}
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//输出表头
for (int i = 1; i <= t; i++) {
System.out.print("\t");//输出Tab
}
for (int i = 1; i <= d; i++) {
System.out.print(i + "\t");//输出日期
if ((i + t) % 7 == 0) {
System.out.println();//换行
}
}
}
//************************************************输入的年份大于等于1900的表头\t个数方法*****************************************************
public int 大于1900(int y, int m) {
int sum = 0;
int t;
// 累加相差整年的天数
for (int i = 1900; i < y; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
sum += 366;
} else {
sum += 365;
}
}
// 累加相差整月的天数
for (int i = 1; i < m; i++) {
switch (i) {
case 2:
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
sum += 29;
} else {
sum += 28;
}
break;
case 4:
case 6:
case 9:
case 11:
sum += 30;
break;
default:
sum += 31;
}
}
t = (sum + 1) % 7;//计算1号的位置,也是Tab的个数
return t;
}
//************************************************输入的年份小于1900的表头\t个数方法*****************************************************
public static int 小于1900(int y, int m, int d) {
int sum = 0;
int t;
// 累加相差整年的天数
for (int i = 1899; i > y; i--) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
sum += 366;
} else {
sum += 365;
}
}
if(y<0)sum-=366;//如果年份少于0(公元前),就减一个不存在的0年的天数,(按算法,0年是闰年)
// 累加相差整月的天数
for (int i = 12; i > m; i--) {
switch (i) {
case 2:
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
sum += 29;
} else {
sum += 28;
}
break;
case 4:
case 6:
case 9:
case 11:
sum += 30;
break;
default:
sum += 31;
}
}
//计算 1号到 第一个星期天 所占的位数 (sum + d)% 7,
// (7 - (1号到第一个星期天所占的位数) +1) % 7 就是Tab的个数
t = (7 - (sum + d)% 7 +1) % 7;
return t;
}
}
复制代码
作者:
lzjstudy
时间:
2017-6-19 10:00
赞, 上班正好用到 来看看思路
欢迎光临 小钿自留地 (http://bbs.hexiaotian.cn/)
Powered by Discuz! X3.2