系列文章目录
文章目录
前言
本文讲述了复习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();
}
}
}