设为首页收藏本站

小钿自留地

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 9908|回复: 1
打印 上一主题 下一主题

java万年历源码(求改进)

[复制链接]
  • TA的每日心情
    开心
    2022-5-13 17:03
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    26

    主题

    39

    帖子

    680

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    680
    跳转到指定楼层
    楼主
    发表于 2015-2-16 19:01:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    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. }
    复制代码
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-6-21 15:24
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    30

    主题

    48

    帖子

    650

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    650
    沙发
    发表于 2017-6-19 10:00:07 来自手机版 | 只看该作者
    赞, 上班正好用到  来看看思路
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|小钿自留地 ( 湘ICP备15002355号  

    GMT+8, 2026-3-7 20:12 , Processed in 1.170095 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表