以此篇文章开始的连续两片文章将介绍利用JAVA基础知识制作一个万年历控制台程序。
先来看一下效果图
我们来分析一下万年历的业务:
1.用户输入信息-->进行信息判断(是否符合要求)
2.以1900年1月1日(星期一)为基准,计算1900年1月1日至当日的总天数
(1)先计算1900年至(用户输入的年 - 1)的总天数 -->注意平闰年之分
(2)计算用户输入年份的1月至(用户输入月份 - 1)的天数
3.计算输入月份的第一天是星期几
4.格式化输出
以下我们按照步骤一步一步进行代码解析
一、利用do-while循环接受用户输入信息,并利用if-else语句进行判断
- int year;
- int month;
- boolean xn = false;
- do
- {
- System.out.println("请输入年份:");
- year = input.nextInt();
- System.out.println("请输入月份:");
- month = input.nextInt();
- //利用boolean类型的表达式进行输入信息的判断
- xn = (month < 1) || (month > 12) ||(year < 1);
- if(xn)
- {
- System.out.println("输入信息错误,请重新输入!");
- }
- }while(xn);
二、判断平闰年,并计算1900年至(用户输入年 - 1)的总天数
- int everyYearDay = 0; //每年的天数
- int totalYearsDays = 0; //计算年的天数
- int inputYearDay = 0 //记录用户输入年的天数
- boolean yn = false; //标识平闰年
- //利用for循环计算天数
- for(int i = 1900;i < =year;i ++)
- {
- if(((i % 4 == 0)&&(i % 100 != 0))||(i % 400 == 0)) //闰年的判断条件
- {
- yn = true;
- everyYearDay = 366;
- }
- else
- {
- yn = false;
- everyYearDay = 365;
- }
- //如果循环中的年份小于用户输入的年份,则累积天数
- if(i < year)
- {
- totalYearsDays = totalYearsDays + everyYearDay;
- }
- else
- {
- inputYearDay = everyYearDay;
- System.out.println(year + "年共有:" + inputYearDay + "天");
- }
- }
三、判断月份的天数,并计算当年1月至(用户输入月份 -1)的天数
- int everyMonthDay = 0; //记录每月的天数
- int totalMonthsDays = 0; //总天数
- int inputMonthDay = 0; //记录用户输入的月份在用户输入年份的天数
- //利用for循环计算天数
- for(int i = 1;i <= month;i ++)
- {
- switch(i)
- {
- case 4:
- case 6:
- case 9:
- case 11:
- everyMonthDay = 30;
- break;
- case 2:
- if(xn) //xn是用来记录平闰年的boolean类型的变量
- {
- everyMonthDay = 29;
- }
- else
- {
- everyMonthDay = 28;
- }
- break;
- default:
- everyMonthDay = 31;
- break;
- }
- if(i < month)
- {
- totalMonthsDays = totalMonthsDays + everyMonthDay;
- }
- else
- {
- inputMonthDay = everyMonthDay;
- System.out.println(month + "月共有:" + inputMonthDay + "天");
- }
- }
四、计算总天数,并计算出用户输入的月份的第一天星期几
- int total = totalMonthsDays + totalYearsDays; //计算总天数
- int temp = (total + 1) % 7; //判断输入月份的第一天星期几
五、格式化输出
- //因为我们的输入格式是
- //星期日 星期一 星期二 星期三 星期四 星期五 星期六
- //当星期日时的时候,我们直接输出就好了,但是当
- //第一天是星期一的时候,我们就必须首先打印出空格
- //然后再输出日期,才能让号码和星期想对应
- //打印空格
- for(int spaceno = 0;spaceno < temp;spaceno ++)
- {
- System.out.print("/t");
- }
- //按照顺序打印号码
- for(int i = 1;i <= inputMonthDay;i ++)
- {
- if((total + i ) % 7) //判断是否该换行了
- {
- System.out.println(i );
- }
- else
- {
- System.out.print(i + "/t");
- }
- }