万年历项目

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习OpenFeign学习Hystrix学习


前言

本文讲述了复习Java后进行的第一个项目实践,万年历的做法。再一次做一遍自我介绍:在下是攸攸太上,自称是不世出的大英雄,其实是二次元死宅家里蹲。本文旨于服务Java初学者,帮助他们快速熟练循环与选择的应用。


一、万年历的项目需求是什么?

功能:使用Java语言,接受用户键入的两个数字年、月(不考虑1900年以前,不考虑用户输入可能越界),输出当月日历。例如2024年08月:
在这里插入图片描述

二、项目分析

1.自己思考

不要着急看如何解决,请给自己一些思考时间,如何实现本功能,难点重点在哪里,这一过程非常重要,请务必不要忽略 !!!可以给自己掐表5分钟,全力思考如何实现。






2.重难点分析

相信思考了的人能发现,如何判断当月1日是周几,是本项目最重要最难实现的部分。只要知道1日为星期几,剩下大差不差30天跟着第一天,七天一换行就能实现。

3.重难点解决思路

在这里插入图片描述
如上图所示,只需求出1900.01.01距离要求年月的一号有多少天,问题解决了。那么要怎么求出这个天数呢?请读者思考,横线下会给出答案。


思路:先算要求的年份距离1900年有多少平年闰年,所有年的天数加在一起为a,然后算要求月份距离当年01.01的天数为b,注意对二月特殊计算,a + b的结果为1900.01.01距离要求年月的一号有多少天。
接下来我们的只需要把我们所想的改写成代码格式,项目就迎刃而解了!

三、项目代码及其分析

1.自行编写代码,实现项目需求

有一定Java基础的人可以尝试根据上面的解题思路,自行设计代码,会获得很大的成就感和对自己写代码的自信
没那么会的也要尽量尝试,写不完没关系,重要的是你写的时候产生的逻辑思维和项目分解的思维






2.定义类名主函数

整体的代码我会放在文章最下方,着急的可以直接翻到篇尾

import java.util.Scanner;

// take one 13.39 0error
// take two 12.12 2error
// take three 08.53 1error
// take four 08.40 0error
// take five 07.19 1error
// take six 10.09 2error
// take test 08:00 2error
public class SpeedTest {
    public static void main(String[] args) {
        
    }
}

代码说明:
最上方的Scanner类是我们输入时所需要的类。‘take 几’代表我背写着打(可以复制自己在此篇代码中编写的代码,可以使用tab键快速补全)所用时间以及bug数量。public class SpeedTest代表这个类的名字是SpeedTest,类名因人而异,public static void main(String[] args)是声明主函数的入口,所有程序的主函数入口都要写成这样,主函数名前篇一律。

评分标准:
10分钟打完分数为90;每减少半分钟+2分,7分30秒内完成100分;每增加半分钟-5分,13分内完成为及格。
13分没完成的多练几次,如果能在10次内达到13分钟以内,说明打字速度没问题,可能理解代码逻辑的部分做的不好,可以多想想画画代码的逻辑。
练10次还不能打进13分钟的话,说明打字速度过慢,可以下载金山打字通练练打字速度。
我们老师分享的我们练习打Java程序的课程我会放在片尾,可以下载‘金山打字通2016’与英文打字->文章练习->课程选择->添加->单个添加->粘贴在文本框内的方式进行导入。

2.获取输入、变量设置

		System.out.println("enter year");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        System.out.println("enter month");
        int month = scanner.nextInt();

        int count = 0;
        int sum = 0;

代码说明:
第一行:提示用户输入要求的年数
第二行:建立Scanner对象获取用户输入
第三行:获取用户输入的整数存入year变量中
第四行:提示用户输入要求的月数
第五行:获取用户输入的整数存入month变量中

第七行:设置count变量,作用:获取用户所需的那年那月有多少天。
第八行:设置sum变量,作用:获取用户所需的那年那月距离1900.01.01的天数总和。

3.if语句获取需求月的天数

		if (month == 1 || month == 3 || month ==5 || month == 7 || month == 8 || month == 10 || month == 12)
            count += 31;
        else if (month == 4 || month == 6 || month ==9 || month == 11)
            count += 30;
        else {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                count += 29;
            else
                count += 28;
        }

代码说明:
if语句:判断是否为大月,大月为31天
else if语句:不是大月判断是否为小月,小月为30天
else语句:是特殊的2月
…闰年2月29天;
…平年2月28天;

4.for循环获取距离基准天(1900.01.01)的总天数

分类两部分:
1、需求年1月1日距离基准天的天数
2、需求月距离需求年1月1日的天数

4.1需求年1月1日距离基准天的天数

		for (int i = 1900; i < year; i++){
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                sum += 366;
            else
                sum += 365;
        }

代码说明:
i用于记年数,从1900年开始往后算,算到用户需求的年份之前,每年进行判断是平年还是闰年,平年总天数+365天,闰年总天数+366天。

4.2需求月距离需求年1月1日的天数

		for (int i = 1; i < month; i++){
            if (i == 1 || i == 3 || i ==5 || i == 7 || i == 8 || i == 10 || i == 12)
                sum += 31;
            else if (i == 4 || i == 6 || i ==9 || i == 11)
                sum += 30;
            else {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                    sum += 29;
                else
                    sum += 28;
            }
        }

代码说明:
i用于几月数,从一月开始往后算,算到用户需求的月份之前,每月进行判断:
是大月总天数+31;
是小月总天数+30;
是二月:
…闰年二月总天数+29;
…平年二月总天数+28;

5.输出万年历

		int wd = (sum + 1) % 7;
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i < wd; i++)
            System.out.print("\t");
        for (int i = 1; i <= count; i++){
            System.out.print(i + "\t");
            if ((sum + i) % 7 == 0)
                System.out.println();

代码说明:
第一行使用wd变量记录需求年需求月的一号是星期几,加1的原因:sum是整年加整月天数,例如客户要求的是2024.07,不加1求的就是1900.01.01——2024.06.30的天数,再加1就是2024.07.01的总天数。
第二行输出日历的表头
for语句判断第一行开头需要空几个格
第二个for语句内从一号开始在之前打印的空格后开始打印日期,从一到当月天数(count)顺序打印
if语句包含在第二个for语句中,作用:如果碰到周日,进行换行操作,为什么是(sum + i)% 7,例如客户要求的是2024.07,i= 22时sum表示了1900.01.01——2024.06.30的天数,i表示2024.07.01——2024.07.22的天数,两者加在一起就成为了1900.01.01——2024.07.22的总天数,此上再进行%7操作就能求出2024.07.22是周几,是周日时进行换行。

总结

本文介绍了如何使用Java语言编写万年历项目,确实有更好的办法解决代码的冗余度,例如求二月部分代码可以归结成一个方法(函数),求月数有几天的代码可以归结成一个方法(函数)(包括了求二月的方法),但本文旨于服务Java初学者,帮助他们快速熟练循环与选择的应用。各位客官,还请移步评论区发表高谈阔论。

下方为金山打字通2016可导入课程:

public class HelloWorld{   }
public static void main
(String[] args)
System.out.println("hello java");
public public public public  
class  class  class  class    
static static static static  
void   void   void   void    
main   main   main   main   
String String String String  
{} {} {} {} {}
; ; ; ; ; ; ; 
"" ""  ""  ""  ""
[]  []  []  []   []
() () () () ()
byte byte byte byte
short short short short 
int  int  int  int
long  long long long
float float float float
double double double double
char char char char
boolean boolean boolean
final final final
Scanner Scanner Scanner
import import import
if  if  if  if
switch switch switch
for  for  for 
while while while
do do  do
public  class  static  void  byte  short  int  long  char  float  double  boolean  if  else switch  case  break  default  import  while  do  for  new  true  false null  return  this package  continue  catch  final  try  throw  finally  private  interface  transient implements  synchronized  protected  native  super   extends  instanceof  thread  abstract
public  class  static  void  byte  short  int  long  char  float  double  boolean  if  else switch  case  break  default  import  while  do  for  new  true  false null  return  this package  continue  catch  final  try  throw  finally  private  interface  transient implements  synchronized  protected  native  super   extends  instanceof  thread  abstract
public  class  static  void  byte  short  int  long  char  float  double  boolean  if  else switch  case  break  default  import  while  do  for  new  true  false null  return  this package  continue  catch  final  try  throw  finally  private  interface  transient implements  synchronized  protected  native  super   extends  instanceof  thread  abstract

下方为整体代码:

import java.util.Scanner;

// take one 13.39 0error
// take two 12.12 2error
// take three 08.53 1error
// take four 08.40 0error
// take five 07.19 1error
// take six 10.09 2error
// take test 08:00 2error
public class SpeedTest {
    public static void main(String[] args) {
        System.out.println("enter year");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        System.out.println("enter month");
        int month = scanner.nextInt();

        int count = 0;
        int sum = 0;

        if (month == 1 || month == 3 || month ==5 || month == 7 || month == 8 || month == 10 || month == 12)
            count += 31;
        else if (month == 4 || month == 6 || month ==9 || month == 11)
            count += 30;
        else {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                count += 29;
            else
                count += 28;
        }

        for (int i = 1900; i < year; i++){
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                sum += 366;
            else
                sum += 365;
        }

        for (int i = 1; i < month; i++){
            if (i == 1 || i == 3 || i ==5 || i == 7 || i == 8 || i == 10 || i == 12)
                sum += 31;
            else if (i == 4 || i == 6 || i ==9 || i == 11)
                sum += 30;
            else {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                    sum += 29;
                else
                    sum += 28;
            }
        }

        int wd = (sum + 1) % 7;
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i < wd; i++)
            System.out.print("\t");
        for (int i = 1; i <= count; i++){
            System.out.print(i + "\t");
            if ((sum + i) % 7 == 0)
                System.out.println();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攸攸太上

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值