小钿自留地

标题: java万年历源码(求改进) [打印本页]

作者: hext    时间: 2015-2-16 19:01
标题: java万年历源码(求改进)

  1. /*        万年历思路
  2.         1- 输入年份和月份
  3.         2-求出年份的相差天数(1900.1.1)-周一
  4.         3-求出月份的相差天数
  5.         4-算一下这年这月的1号是周几,求出1号以前该空几个格子
  6.         5-输出表头
  7.         6-按照空格数量输入多个空格
  8.         7-求出m月一共有多少天
  9.         8-循环输出这个月所有的天数,分清楚什么地方换行。*/
  10. import java.util.Scanner;
  11. //        *************************************************一个可以查看到1900年前的万年历(包括公元前)************************************************
  12. public class 万年历 {
  13. //        输入年月及定义变量部分
  14.         public static void main(String[] args) {
  15.                 Scanner input = new Scanner(System.in);
  16.                 System.out.println("请输入年份(公元前请加-号)");
  17.                 int y = input.nextInt();
  18.                 if (y==0) {
  19.                         System.out.println("年份无效");
  20.                         System.exit(0);                //退出程序语句(百度来的)
  21.                 }
  22.                 System.out.println("请输入月份(1~12)");
  23.                 int m = input.nextInt();
  24.                 if (m<0||m>12) {
  25.                         System.out.println("月份无效");
  26.                         System.exit(0);
  27.                 }
  28.                 int d;        //天数
  29.                 int t;                //tab的个数
  30. //                求输入月份的天数
  31.                 switch (m
  32.                                 ) {
  33.                 case 2:
  34.                         if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
  35.                                 d = 29;
  36.                         } else {
  37.                                 d = 28;
  38.                         }
  39.                         break;
  40.                 case 4:
  41.                 case 6:
  42.                 case 9:
  43.                 case 11:
  44.                         d = 30;
  45.                         break;
  46.                 default:
  47.                         d = 31;
  48.                 }
  49. //                判断输入的年份是否小于1900年
  50.                 if (y < 1900) {
  51.                         t = 小于1900(y, m, d);                //静态引用小于1900的方法 返回tab的个数(根据Eclipse的提示尝试另一种方法)
  52.                 } else {
  53. //                        引用年份大于等于1900的方法 返回tab的个数
  54.                         万年历 dy1900=new 万年历();
  55.                         t = dy1900.大于1900(y, m);
  56.                 }

  57.                 System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//输出表头
  58.                 for (int i = 1; i <= t; i++) {
  59.                         System.out.print("\t");//输出Tab
  60.                 }
  61.                 for (int i = 1; i <= d; i++) {
  62.                         System.out.print(i + "\t");//输出日期
  63.                         if ((i + t) % 7 == 0) {
  64.                                 System.out.println();//换行
  65.                         }
  66.                 }
  67.         }

  68.         //************************************************输入的年份大于等于1900的表头\t个数方法*****************************************************
  69.         public int 大于1900(int y, int m) {

  70.                 int sum = 0;
  71.                 int t;
  72. //                        累加相差整年的天数
  73.                 for (int i = 1900; i < y; i++) {
  74.                         if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
  75.                                 sum += 366;
  76.                         } else {
  77.                                 sum += 365;
  78.                         }
  79.                 }
  80. //                        累加相差整月的天数
  81.                 for (int i = 1; i < m; i++) {
  82.                         switch (i) {
  83.                         case 2:
  84.                                 if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
  85.                                         sum += 29;
  86.                                 } else {
  87.                                         sum += 28;
  88.                                 }
  89.                                 break;
  90.                         case 4:
  91.                         case 6:
  92.                         case 9:
  93.                         case 11:
  94.                                 sum += 30;
  95.                                 break;
  96.                         default:
  97.                                 sum += 31;
  98.                         }
  99.                 }

  100.                 t = (sum + 1) % 7;//计算1号的位置,也是Tab的个数
  101.                 return t;
  102.         }
  103. //************************************************输入的年份小于1900的表头\t个数方法*****************************************************
  104.         public static int 小于1900(int y, int m, int d) {
  105.                
  106.                 int sum = 0;
  107.                 int t;
  108. //                累加相差整年的天数
  109.                 for (int i = 1899; i > y; i--) {
  110.                         if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
  111.                                 sum += 366;
  112.                         } else {
  113.                                 sum += 365;
  114.                         }
  115.                 }
  116.                 if(y<0)sum-=366;//如果年份少于0(公元前),就减一个不存在的0年的天数,(按算法,0年是闰年)
  117.                
  118. //                累加相差整月的天数
  119.                 for (int i = 12; i > m; i--) {
  120.                         switch (i) {
  121.                         case 2:
  122.                                 if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
  123.                                         sum += 29;
  124.                                 } else {
  125.                                         sum += 28;
  126.                                 }
  127.                                 break;
  128.                         case 4:
  129.                         case 6:
  130.                         case 9:
  131.                         case 11:
  132.                                 sum += 30;
  133.                                 break;
  134.                         default:
  135.                                 sum += 31;
  136.                         }
  137.                 }
  138.                 //计算 1号到 第一个星期天 所占的位数     (sum + d)% 7,
  139.                 // (7 - (1号到第一个星期天所占的位数) +1) % 7     就是Tab的个数
  140.                 t = (7 - (sum + d)% 7 +1) % 7;
  141.                 return t;
  142.         }
  143. }
复制代码

作者: lzjstudy    时间: 2017-6-19 10:00
赞, 上班正好用到  来看看思路




欢迎光临 小钿自留地 (http://bbs.hexiaotian.cn/) Powered by Discuz! X3.2