hext 发表于 2015-2-16 19:01:27

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:07

赞, 上班正好用到来看看思路
页: [1]
查看完整版本: java万年历源码(求改进)