简单日历的代码实现

简单日历的实现思路

目录:

  1. 功能的描述与介绍。
  2. 分步对代码进行解析
  3. 完整代码以及样例输出的呈现

1.相关功能描述

在控制台上按提示输入要查询的年分,
输入完成后,按下回车键即可在控制台显示出本年的日历表。

2.分部对代码进行分析

  1. 首先:总体思路 获取输入年分—>判断并计算出本年每个月的天数—>计算出每个月第一天在本年的第几天—>显示日历

  2. 思路的分步以及代码介绍

    (1).获取输入

public void getDate() {
		System.out.println("请你输入要查询年份的日历表:");
		this.year = in.nextInt();
	}

​ (2).计算输入年分每个月份的天数

​ 用公式 year % 4 == 0 && year % 100 != 0 || year % 400 == 0判断输入年分是平年还是闰年:闰年二月有29天,平年有28天。

public int reDays(int month) {
		int days = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		case 2:
			if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
				days = 29;
			} else {
				days = 28;
			}
			break;
		}
		return days;
	}

​ (3).计算输入年分的第一天在本年中属于第几天,并由此计算出第一天的星期数

  1. 本段代码中int 型变量用于记录每个月份的第一天为输入年份中的第几天。

  2. 变量allDays初始化为1则是因为for循环语句块在执行过程中未能计算出一月份为本年中第一天

    则为后续计算方便规定allDays初始值为1;

  3. 某月分前所有天数总和+1的值即为该月份的第一天在输入年分的天数

  4. 根据公式((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7计算出某一月份第一天的星期数

public int getMonthFirst(int month) {
		int alldays = 1;
		for (int i = 0; i < month; i++) {
			alldays += reDays(i);
		}

		return ((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7;
	}

(4).完成日历的输出工作:

  1. 完成日历表头的输出

    查阅资料知悉日历表的样式:三行四列。

    用字符串数组存储每个月份的中文字符总共十二个。

    String[] str = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };

    根据日历表的样式:输出表头,并根据需要调整日历表表头的位置,使其更为美观。

 ```java
    System.out.println("\t\t\t\t\t\t\t\t2020年\n");
	for (int i = 0; i < str.length; i++) {
		if (i < 10) {
			System.out.printf("\t\t%s    月\t\t", str[i]);
		} else {
			System.out.printf("\t\t%s月\t\t", str[i]);
		}
    if ((i + 1) % 4 == 0) {

			System.out.println();
			for (int j = 1; j <= 4; j++) {
				System.out.print("\t一    二    三    四    五    六    日");
			}
            System.out.println()
    }
 ```

​ 跟据日历样式,每个月份天数的高度最多占六行,为保证所有日期正常输出,则选取最高行数:六行。

​ 每行输出四个月份的日历。

​ 随后根据 需要的定义成员变量 count 初始值为0

 ```java
int[] num = { 0, 0, 0, 0 };   //用于辅助日期的输出
	System.out.println("\t\t\t\t\t\t\t\t2020年\n");
	for (int i = 0; i < str.length; i++) {
		if (i < 10) {
			System.out.printf("\t\t%s    月\t\t", str[i]);
		} else {
			System.out.printf("\t\t%s月\t\t", str[i]);
		}

		if ((i + 1) % 4 == 0) {        // 判断是否到达四月份的整数倍
			System.out.println();
			for (int j = 1; j <= 4; j++) {
				System.out.print("\t一    二    三    四    五    六    日");
			}
			System.out.println();
			for (int j = 1; j <= 6; j++) {       //每个月份天数的高度最多占六行

				for (int s = 1 + (count * 4); s <= (4 + count * 4); s++) {//每行四个月份
					System.out.print("\t");   
					if (j == 1) {          //每一个月份第一行的日期根据距离制表符末尾的空格数确定所处星期位置
						for (int k = 1; k <= (getMonthFirst(s) != 0 ? (getMonthFirst(s) - 1) : 6); k++) {     
							System.out.print("    ");
						}
					}

					for (int m = 1+ num[(s - 1) % 4]; m <= 42/* reDays(s) */; m++) {
						if (m <= reDays(s)) {       //使每个月份的日期输出,满六行,不足的部分用空格代替
							if (m < 10)
								System.out.printf("0%d  ", m);
							else
								System.out.printf("%d  ", m);
						} else {
							System.out.print("    ");
						}

						num[(s - 1) % 4]++;

						if ((getMonthFirst(s) + m - 1) % 7 == 0) {    //每个月份输出一行结束后换行
							break;
						}

					}
				}
				System.out.println();
			}
			count += 1;                           //  if ((i + 1) % 4 == 0)  count自增
		}                                    //1循环,for (int s = 1 + (count * 4); s                                            //<= (4 + count * 4); s++)进入下一行的月份进行输出
		for (int j = 0; j < num.length; j++) {      //输出完一行月份的日历后,数组的每个元素
			num[j] = 0;                             //便于下一行月份日历的输出
		}
	}
}

 ```

3.完整代码以及样例输出的呈现

完整代码

import java.util.Scanner;

public class Calender2 {
	Scanner in = new Scanner(System.in);
	String[] str = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
	private int year;
	private int count;

	public Calender2() {
		getDate();

	}

	public void getDate() {
		System.out.println("请你输入要查询年份的日历表:");
		this.year = in.nextInt();
	}

	public int reDays(int month) {
		int days = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		case 2:
			if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
				days = 29;
			} else {
				days = 28;
			}
			break;
		}
		return days;
	}

	public int getMonthFirst(int month) {
		int alldays = 1;
		for (int i = 0; i < month; i++) {
			alldays += reDays(i);
		}

		return ((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7;
	}

	public void show() {
		int[] num = { 0, 0, 0, 0 };
		System.out.println("\t\t\t\t\t\t\t\t2020年\n");
		for (int i = 0; i < str.length; i++) {
			if (i < 10) {
				System.out.printf("\t\t%s    月\t\t", str[i]);
			} else {
				System.out.printf("\t\t%s月\t\t", str[i]);
			}

			if ((i + 1) % 4 == 0) {

				System.out.println();
				for (int j = 1; j <= 4; j++) {
					System.out.print("\t一    二    三    四    五    六    日");
				}
				System.out.println();
				for (int j = 1; j <= 6; j++) {

					for (int s = 1 + (count * 4); s <= (4 + count * 4); s++) {
						System.out.print("\t");
						if (j == 1) {
							for (int k = 1; k <= (getMonthFirst(s) != 0 ? (getMonthFirst(s) - 1) : 6); k++) {
								System.out.print("    ");
							}
						}

						for (int m = 1+ num[(s - 1) % 4]; m <= 42/* reDays(s) */; m++) {
							if (m <= reDays(s)) {
								if (m < 10)
									System.out.printf("0%d  ", m);
								else
									System.out.printf("%d  ", m);
							} else {
								System.out.print("    ");
							}

							num[(s - 1) % 4]++;

							if ((getMonthFirst(s) + m - 1) % 7 == 0) {
								break;
							}

						}
					}
					System.out.println();
				}
				count += 1;
			}
			for (int j = 0; j < num.length; j++) {
				num[j] = 0;
			}
		}
	}

	public static void main(String[] args) {
		Calender2 c = new Calender2();
		c.show();

	}
}

显示输出样例
输出样例

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Vue3 日历组件的实现示例: ```html <template> <div> <div class="calendar-header"> <button @click="prevMonth">上个月</button> <h3>{{ monthStr }}</h3> <button @click="nextMonth">下个月</button> </div> <div class="calendar-grid"> <div v-for="(day, index) in days" :key="index" :class="{ 'calendar-cell': true, 'calendar-cell-disabled': !day }"> {{ day }} </div> </div> </div> </template> <script> import { computed, reactive } from 'vue' export default { setup() { const state = reactive({ currentMonth: new Date(), days: [] }) const prevMonth = () => { state.currentMonth.setMonth(state.currentMonth.getMonth() - 1) } const nextMonth = () => { state.currentMonth.setMonth(state.currentMonth.getMonth() + 1) } const monthStr = computed(() => { return state.currentMonth.toLocaleString('default', { month: 'long', year: 'numeric' }) }) const generateCalendar = () => { const firstDay = new Date(state.currentMonth.getFullYear(), state.currentMonth.getMonth(), 1).getDay() const lastDay = new Date(state.currentMonth.getFullYear(), state.currentMonth.getMonth() + 1, 0).getDate() const days = new Array(35).fill(null) for (let i = 1; i <= lastDay; i++) { days[firstDay + i - 1] = i } state.days = days } generateCalendar() return { state, prevMonth, nextMonth, monthStr } } } </script> <style> .calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); } .calendar-cell { border: 1px solid #ccc; padding: 10px; text-align: center; } .calendar-cell-disabled { opacity: 0.3; } </style> ``` 这个组件使用了 Vue3 的 `reactive` 和 `computed` 函数来声明响应式状态和计算属性。它还使用了 JavaScript 的 `Date` 对象来计算日历表格中的日期。在 `setup` 函数中,我们定义了一些帮助函数来生成日历,并将它们绑定到组件的方法中。最后,我们通过使用 CSS Grid 布局来组织日历表格的每个单元格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值